diff --git a/404.html b/404.html index c4b2bce75..517cf0acd 100644 --- a/404.html +++ b/404.html @@ -2,21 +2,18 @@ - -Page Not Found | Routr Docs + +Page Not Found | Routr Docs - - - + + + -
-
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.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/css/styles.9c6cd2dc.css b/assets/css/styles.9c6cd2dc.css new file mode 100644 index 000000000..3c6a63a04 --- /dev/null +++ b/assets/css/styles.9c6cd2dc.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)}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-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:#0a3622;--ifm-color-primary-dark:#0a3622;--ifm-color-primary-darker:#0a3622;--ifm-color-primary-darkest:#0a3622;--ifm-color-primary-light:#0a3622;--ifm-color-primary-lighter:#0a3622;--ifm-color-primary-lightest:#0a3622;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--ifm-color-secondary:#5fcfce;--ifm-color-white:#fff;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}.footer--dark,.navbar a{--ifm-footer-link-hover-color:var(--ifm-color-secondary)}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #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{list-style:none;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--link,p a{color:var(--ifm-link-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;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;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-background-color:#333;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-white);--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,.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{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;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}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.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{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#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:#fff;--ifm-color-primary-dark:#fff;--ifm-color-primary-darker:#fff;--ifm-color-primary-darkest:#fff;--ifm-color-primary-light:#fff;--ifm-color-primary-lighter:#fff;--ifm-color-primary-lightest:#fff;--docusaurus-highlighted-code-line-bg:#0000004d;--ifm-color-secondary:#5fcfce}.navbar,.navbar-sidebar__back,.navbar-sidebar__brand{background-color:#0d3231}.navbar,.navbar a{color:var(--ifm-color-white)}.navbar a:hover,p a:hover{color:var(--ifm-color-secondary)}.navbar ul li a,.navbar ul li a:hover{color:#000}p a{text-decoration:underline}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius: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}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{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%}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.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}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;border:0;cursor:pointer}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j,svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.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}.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}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.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}@supports selector(:has(*)){.navbarSearchContainer_Bca1:not(:has(>*)){display:none}}.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}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.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%}.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{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;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}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;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)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.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{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.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}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}: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);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_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)}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@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 screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);animation:none;-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@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/assets/css/styles.de5d1268.css b/assets/css/styles.de5d1268.css deleted file mode 100644 index 4c1356299..000000000 --- a/assets/css/styles.de5d1268.css +++ /dev/null @@ -1 +0,0 @@ -.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,.hash-link{-webkit-user-select:none}.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}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}: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-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:#0a3622;--ifm-color-primary-dark:#0a3622;--ifm-color-primary-darker:#0a3622;--ifm-color-primary-darkest:#0a3622;--ifm-color-primary-light:#0a3622;--ifm-color-primary-lighter:#0a3622;--ifm-color-primary-lightest:#0a3622;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--ifm-color-secondary:#5fcfce;--ifm-color-white:#fff;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base)}.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}.footer--dark,.navbar a{--ifm-footer-link-hover-color:var(--ifm-color-secondary)}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #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_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;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;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--link,p a{color:var(--ifm-link-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;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}.content_knG7 a,p a{text-decoration:underline}.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;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-background-color:#333;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-white);--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_S0QG>:last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;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{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.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:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);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{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#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:#fff;--ifm-color-primary-dark:#fff;--ifm-color-primary-darker:#fff;--ifm-color-primary-darkest:#fff;--ifm-color-primary-light:#fff;--ifm-color-primary-lighter:#fff;--ifm-color-primary-lightest:#fff;--docusaurus-highlighted-code-line-bg:#0000004d;--ifm-color-secondary:#5fcfce}.navbar,.navbar-sidebar__back,.navbar-sidebar__brand{background-color:#0d3231}.navbar,.navbar a{color:var(--ifm-color-white)}.navbar a:hover,p a:hover{color:var(--ifm-color-secondary)}.navbar ul li a,.navbar ul li a:hover{color:#000}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.DocSearch-Container a,.tag_zVej:hover{text-decoration:none}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.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] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA,html:not([data-theme]) .themedComponent--light_NU7w{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.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}.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%}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.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}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{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}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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);user-select:none}.hash-link:before{content:"#"}.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{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;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}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;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)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.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}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite a;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes a{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docSidebarContainer_b6E3,.sidebarLogo_isFc{display:none}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards b;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}@keyframes b{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container{z-index:calc(var(--ifm-z-index-fixed) + 1)}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}.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_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;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_m80_{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_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@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 screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@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/assets/js/017ddd06.8c6b78cd.js b/assets/js/017ddd06.8c6b78cd.js deleted file mode 100644 index b85dd234c..000000000 --- a/assets/js/017ddd06.8c6b78cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7468],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(r),m=a,f=u["".concat(l,".").concat(m)]||u[m]||p[m]||i;return r?n.createElement(f,o(o({ref:t},d),{},{components:r})):n.createElement(f,o({ref:t},d))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={},o="Users",s={unversionedId:"configuration/users",id:"version-1.x.x/configuration/users",title:"Users",description:"Users exist in Routr to perform administrative actions on a Routr instance.",source:"@site/versioned_docs/version-1.x.x/configuration/users.md",sourceDirName:"configuration",slug:"/configuration/users",permalink:"/docs/1.x.x/configuration/users",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/users.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"},next:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"}},l={},c=[{value:"User Resource",id:"user-resource",level:2},{value:"Example",id:"example",level:2},{value:"Changing the password? (Redis)",id:"changing-the-password-redis",level:2}],d={toc:c},u="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"users"},"Users"),(0,a.kt)("p",null,"Users exist in Routr to perform administrative actions on a Routr instance.\nThe Users configuration can be provided using the file ",(0,a.kt)("inlineCode",{parentName:"p"},"config/users.yml")," located at the root of your Routr installation."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"If using Redis this configuration gets stored in the database.")),(0,a.kt)("h2",{id:"user-resource"},"User Resource"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,a.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"kind"),(0,a.kt)("td",{parentName:"tr",align:null},"Defines the type of resource"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.name"),(0,a.kt)("td",{parentName:"tr",align:null},"Friendly name for the User device"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.credentials.username"),(0,a.kt)("td",{parentName:"tr",align:null},"User's credential username"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.credentials.secret"),(0,a.kt)("td",{parentName:"tr",align:null},"User's credential secret"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: User\n metadata:\n name: Administrator\n spec:\n credentials:\n username: admin\n secret: changeit\n")),(0,a.kt)("h2",{id:"changing-the-password-redis"},"Changing the password? (Redis)"),(0,a.kt)("p",null,"First, run the command ",(0,a.kt)("inlineCode",{parentName:"p"},"redis-cli smembers users")," to obtain the reference to the user. Here is an example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'$ redis-cli smembers users\n1) "5aa69ead8fd6861d92385bac"\n')),(0,a.kt)("p",null,"Then, retrieve the document for reference running ",(0,a.kt)("inlineCode",{parentName:"p"},"redis-cli get {REF}"),". For example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'$ redis-cli get 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"oldpass\\"}}}"\n')),(0,a.kt)("p",null,"Finally, search and change the old password and update your document using ",(0,a.kt)("inlineCode",{parentName:"p"},"redis-cli set {REF} {DOCUMENT}"),". Like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'$ redis-cli set 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"newpass\\"}}}"\n')),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"A new token is issued after your next login with ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/017ddd06.bd7758e0.js b/assets/js/017ddd06.bd7758e0.js new file mode 100644 index 000000000..519d9bdb8 --- /dev/null +++ b/assets/js/017ddd06.bd7758e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9845],{6740:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var r=n(4848),t=n(8453);const i={},d="Users",c={id:"configuration/users",title:"Users",description:"Users exist in Routr to perform administrative actions on a Routr instance.",source:"@site/versioned_docs/version-1.x.x/configuration/users.md",sourceDirName:"configuration",slug:"/configuration/users",permalink:"/docs/1.x.x/configuration/users",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/users.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"},next:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"}},a={},o=[{value:"User Resource",id:"user-resource",level:2},{value:"Example",id:"example",level:2},{value:"Changing the password? (Redis)",id:"changing-the-password-redis",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"users",children:"Users"}),"\n",(0,r.jsxs)(s.p,{children:["Users exist in Routr to perform administrative actions on a Routr instance.\nThe Users configuration can be provided using the file ",(0,r.jsx)(s.code,{children:"config/users.yml"})," located at the root of your Routr installation."]}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"user-resource",children:"User Resource"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"apiVersion"}),(0,r.jsx)(s.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"kind"}),(0,r.jsx)(s.td,{children:"Defines the type of resource"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"metadata.name"}),(0,r.jsx)(s.td,{children:"Friendly name for the User device"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"spec.credentials.username"}),(0,r.jsx)(s.td,{children:"User's credential username"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"spec.credentials.secret"}),(0,r.jsx)(s.td,{children:"User's credential secret"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: User\n metadata:\n name: Administrator\n spec:\n credentials:\n username: admin\n secret: changeit\n"})}),"\n",(0,r.jsx)(s.h2,{id:"changing-the-password-redis",children:"Changing the password? (Redis)"}),"\n",(0,r.jsxs)(s.p,{children:["First, run the command ",(0,r.jsx)(s.code,{children:"redis-cli smembers users"})," to obtain the reference to the user. Here is an example:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli smembers users\n1) "5aa69ead8fd6861d92385bac"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Then, retrieve the document for reference running ",(0,r.jsx)(s.code,{children:"redis-cli get {REF}"}),". For example"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli get 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"oldpass\\"}}}"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Finally, search and change the old password and update your document using ",(0,r.jsx)(s.code,{children:"redis-cli set {REF} {DOCUMENT}"}),". Like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli set 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"newpass\\"}}}"\n'})}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsxs)(s.p,{children:["A new token is issued after your next login with ",(0,r.jsx)(s.code,{children:"rctl"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>c});var r=n(6540);const t={},i=r.createContext(t);function d(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/02617853.a016c4b2.js b/assets/js/02617853.a016c4b2.js deleted file mode 100644 index 2bd87c512..000000000 --- a/assets/js/02617853.a016c4b2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9949],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=p(n),u=a,h=d["".concat(l,".").concat(u)]||d[u]||m[u]||s;return n?r.createElement(h,o(o({ref:t},c),{},{components:n})):r.createElement(h,o({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,o=new Array(s);o[0]=u;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const s={},o="Message Dispatcher",i={unversionedId:"development/components/dispatcher",id:"development/components/dispatcher",title:"Message Dispatcher",description:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.",source:"@site/docs/development/components/dispatcher.md",sourceDirName:"development/components",slug:"/development/components/dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/dispatcher.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"},next:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"}},l={},p=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Dispatcher with Docker",id:"launching-the-dispatcher-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}],c={toc:p},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"message-dispatcher"},"Message Dispatcher"),(0,a.kt)("p",null,"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware."),(0,a.kt)("p",null,"The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor."),(0,a.kt)("p",null,"The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-text"},"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502gRPC request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502findProcessor() & forwardMessage()\u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502 Processed Message \u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502gRPC response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n")),(0,a.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,a.kt)("p",null,"To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure."),(0,a.kt)("p",null,"You can configure the Dispatcher using a YAML or JSON file that has the following structure:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"ref")),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to the Dispatcher"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.bindAddr")),(0,a.kt)("td",{parentName:"tr",align:null},"Ipv4 interface to accept requests on"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processors")),(0,a.kt)("td",{parentName:"tr",align:null},"List of Processors"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processors[*].ref")),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to the Processor"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processors[*].matchFunc")),(0,a.kt)("td",{parentName:"tr",align:null},"Matching function"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processors[*].addr")),(0,a.kt)("td",{parentName:"tr",align:null},"Address of the Processor"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processors[*].methods")),(0,a.kt)("td",{parentName:"tr",align:null},"List of SIP Methods supported by the Processor"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.middlewares")),(0,a.kt)("td",{parentName:"tr",align:null},"List of Middlewares"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.middlewares[*].ref")),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to the Middleware"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.middlewares[*].addr")),(0,a.kt)("td",{parentName:"tr",align:null},"Address of the Middleware"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.middlewares[*].postProcessor")),(0,a.kt)("td",{parentName:"tr",align:null},"Whether to process the SIP Message after the Processor"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,a.kt)("p",null,"Here is an example of a configuration file:"),(0,a.kt)("p",null,"Filename: ",(0,a.kt)("inlineCode",{parentName:"p"},"dispatcher.yaml")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"dispatcher.json")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n")),(0,a.kt)("p",null,"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing. "),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"matchFunc")," is a javascript function that leverages the JSON representation of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto"},"SIPMessage")," protobuf. "),(0,a.kt)("p",null,"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n')),(0,a.kt)("p",null,"The following examples show typical matching functions:"),(0,a.kt)("p",null,"Match all SIP Messages."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},"req => true\n")),(0,a.kt)("p",null,"Match SIP Messages with a specific method."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'req => req.method === "MESSAGE"\n')),(0,a.kt)("p",null,"Match SIP Messages with a specific method and a specific header."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n')),(0,a.kt)("p",null,"Match SIP Messages with a specific ",(0,a.kt)("inlineCode",{parentName:"p"},"User-Agent")," header."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n')),(0,a.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,a.kt)("p",null,"The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n')),(0,a.kt)("p",null,"Link to the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto"},"protobuf definition.")),(0,a.kt)("h2",{id:"launching-the-dispatcher-with-docker"},"Launching the Dispatcher with Docker"),(0,a.kt)("p",null,"The Message Dispatcher is available as a Docker image from ",(0,a.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-dispatcher"},"Docker Hub"),". To launch the Dispatcher with Docker, you can use the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher\n")),(0,a.kt)("p",null,"The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port ",(0,a.kt)("inlineCode",{parentName:"p"},"51901")," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,a.kt)("inlineCode",{parentName:"p"},"51901"),"."),(0,a.kt)("h2",{id:"quick-test-with-grpcurl"},"Quick Test with gRPCurl"),(0,a.kt)("p",null,"One easy way to interact with the Dispatcher for testing and development is to use ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fullstorydev/grpcurl"},"gRPCurl"),". The following example shows how to send a SIP Message to the Dispatcher."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02617853.a06ae3cb.js b/assets/js/02617853.a06ae3cb.js new file mode 100644 index 000000000..f87844db5 --- /dev/null +++ b/assets/js/02617853.a06ae3cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3191],{2744:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(4848),t=n(8453);const o={},c="Message Dispatcher",i={id:"development/components/dispatcher",title:"Message Dispatcher",description:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.",source:"@site/docs/development/components/dispatcher.md",sourceDirName:"development/components",slug:"/development/components/dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/dispatcher.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"},next:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Dispatcher with Docker",id:"launching-the-dispatcher-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware."}),"\n",(0,r.jsx)(s.p,{children:"The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor."}),"\n",(0,r.jsx)(s.p,{children:"The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502gRPC request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502findProcessor() & forwardMessage()\u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502 Processed Message \u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502gRPC response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,r.jsx)(s.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(s.p,{children:"To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,r.jsx)(s.p,{children:"You can configure the Dispatcher using a YAML or JSON file that has the following structure:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Dispatcher"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.bindAddr"})}),(0,r.jsx)(s.td,{children:"Ipv4 interface to accept requests on"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors"})}),(0,r.jsx)(s.td,{children:"List of Processors"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].matchFunc"})}),(0,r.jsx)(s.td,{children:"Matching function"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].methods"})}),(0,r.jsx)(s.td,{children:"List of SIP Methods supported by the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares"})}),(0,r.jsx)(s.td,{children:"List of Middlewares"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].postProcessor"})}),(0,r.jsx)(s.td,{children:"Whether to process the SIP Message after the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here is an example of a configuration file:"}),"\n",(0,r.jsxs)(s.p,{children:["Filename: ",(0,r.jsx)(s.code,{children:"dispatcher.yaml"})," or ",(0,r.jsx)(s.code,{children:"dispatcher.json"})]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n"})}),"\n",(0,r.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,r.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,r.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,r.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,r.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,r.jsx)(s.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Link to the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(s.h2,{id:"launching-the-dispatcher-with-docker",children:"Launching the Dispatcher with Docker"}),"\n",(0,r.jsxs)(s.p,{children:["The Message Dispatcher is available as a Docker image from ",(0,r.jsx)(s.a,{href:"https://hub.docker.com/r/fonoster/routr-dispatcher",children:"Docker Hub"}),". To launch the Dispatcher with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port ",(0,r.jsx)(s.code,{children:"51901"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,r.jsx)(s.code,{children:"51901"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(s.p,{children:["One easy way to interact with the Dispatcher for testing and development is to use ",(0,r.jsx)(s.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the Dispatcher."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function l(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>i});var r=n(6540);const t={},o=r.createContext(t);function c(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06896101.5deb77fe.js b/assets/js/06896101.5deb77fe.js new file mode 100644 index 000000000..e12606535 --- /dev/null +++ b/assets/js/06896101.5deb77fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3738],{2007:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(4848),r=o(8453);const s={},i="Deploy with Docker",c={id:"overview/deploy-with-docker",title:"Deploy with Docker",description:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.",source:"@site/docs/overview/deploy-with-docker.md",sourceDirName:"overview",slug:"/overview/deploy-with-docker",permalink:"/docs/2.0.0/overview/deploy-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/deploy-with-docker.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"},next:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"}},a={},l=[{value:"Deploying Routr",id:"deploying-routr",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-with-docker",children:"Deploy with Docker"}),"\n",(0,t.jsx)(n.p,{children:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker."}),"\n",(0,t.jsxs)(n.p,{children:["You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"here."})]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"deploying-routr",children:"Deploying Routr"}),"\n",(0,t.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,t.jsx)(n.p,{children:"Filename: compose.yaml"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n volumes:\n - shared:/var/lib/postgresql/data\n\nvolumes:\n shared:\n'})}),"\n",(0,t.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,t.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,t.jsx)(n.p,{children:"You should see something like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,t.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,t.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,t.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is an example of creating an SIP Domain:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For additional examples, refer to the command-line ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.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:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06896101.d45a6bbc.js b/assets/js/06896101.d45a6bbc.js deleted file mode 100644 index 3748df775..000000000 --- a/assets/js/06896101.d45a6bbc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3185],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=o.createContext({}),c=function(e){var t=o.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),m=n,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||a;return r?o.createElement(h,l(l({ref:t},u),{},{components:r})):o.createElement(h,l({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,l=new Array(a);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var o=r(7462),n=(r(7294),r(3905));const a={},l="Deploy with Docker",i={unversionedId:"overview/deploy-with-docker",id:"overview/deploy-with-docker",title:"Deploy with Docker",description:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.",source:"@site/docs/overview/deploy-with-docker.md",sourceDirName:"overview",slug:"/overview/deploy-with-docker",permalink:"/docs/2.0.0/overview/deploy-with-docker",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/deploy-with-docker.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"},next:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"}},s={},c=[{value:"Deploying Routr",id:"deploying-routr",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"deploy-with-docker"},"Deploy with Docker"),(0,n.kt)("p",null,"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker."),(0,n.kt)("p",null,"You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions ",(0,n.kt)("a",{parentName:"p",href:"https://docs.docker.com/get-docker/"},"here.")),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later.")),(0,n.kt)("h2",{id:"deploying-routr"},"Deploying Routr"),(0,n.kt)("p",null,'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'),(0,n.kt)("p",null,"Filename: compose.yaml"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},'version: "3"\n\nservices:\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n volumes:\n - shared:/var/lib/postgresql/data\n\nvolumes:\n shared:\n')),(0,n.kt)("p",null,"Then, start the server with:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n")),(0,n.kt)("p",null,"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n")),(0,n.kt)("p",null,"You should see something like this:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n")),(0,n.kt)("p",null,'If the status of your service is "Up," you are ready to go.'),(0,n.kt)("p",null,"Finally, install the command-line tool and start building your SIP Network."),(0,n.kt)("p",null,"You can install the tool with npm as follows:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"npm install --location=global @routr/ctl\n")),(0,n.kt)("p",null,"Here is an example of creating an SIP Domain:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"rctl domains create --insecure\n")),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"The --insecure flag is required as we did not set up the TLS settings.")),(0,n.kt)("p",null,"For additional examples, refer to the command-line ",(0,n.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@routr/ctl"},"documentation"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/093b4e4f.b05d61ed.js b/assets/js/093b4e4f.b05d61ed.js new file mode 100644 index 000000000..3b7d2030d --- /dev/null +++ b/assets/js/093b4e4f.b05d61ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4714],{2357:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=t(4848),s=t(8453);const r={},i="WebUI",a={id:"administration/webconsole",title:"WebUI",description:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.",source:"@site/versioned_docs/version-1.x.x/administration/webconsole.md",sourceDirName:"administration",slug:"/administration/webconsole",permalink:"/docs/1.x.x/administration/webconsole",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/webconsole.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"},next:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"}},l={},c=[{value:"How to install the Web Console?",id:"how-to-install-the-web-console",level:2},{value:"Launching the Web Console",id:"launching-the-web-console",level:2},{value:"Does the WC affect the server's performance?",id:"does-the-wc-affect-the-servers-performance",level:2}];function h(e){const o={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"webui",children:"WebUI"}),"\n",(0,n.jsx)(o.p,{children:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"WebUI Animation",src:t(6462).A+"",width:"2880",height:"1586"})}),"\n",(0,n.jsx)(o.h2,{id:"how-to-install-the-web-console",children:"How to install the Web Console?"}),"\n",(0,n.jsx)(o.p,{children:"The WC ships with the Command-Line tool. You do not need to install it separately."}),"\n",(0,n.jsx)(o.h2,{id:"launching-the-web-console",children:"Launching the Web Console"}),"\n",(0,n.jsx)(o.p,{children:"To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"rctl proxy\n"})}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"The WC re-uses the credentials of your Command-Line Tool"}),"\n"]}),"\n",(0,n.jsx)(o.h2,{id:"does-the-wc-affect-the-servers-performance",children:"Does the WC affect the server's performance?"}),"\n",(0,n.jsx)(o.p,{children:"No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance."})]})}function d(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},6462:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/routr_ui_animation-08da33f511e04a6bd6349b610d7098ab.gif"},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>a});var n=t(6540);const s={},r=n.createContext(s);function i(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/093b4e4f.dce8db0c.js b/assets/js/093b4e4f.dce8db0c.js deleted file mode 100644 index cdda4700d..000000000 --- a/assets/js/093b4e4f.dce8db0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9710],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>m});var n=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(o),f=r,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||a;return o?n.createElement(m,i(i({ref:t},u),{},{components:o})):n.createElement(m,i({ref:t},u))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=o(7462),r=(o(7294),o(3905));const a={},i="WebUI",s={unversionedId:"administration/webconsole",id:"version-1.x.x/administration/webconsole",title:"WebUI",description:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.",source:"@site/versioned_docs/version-1.x.x/administration/webconsole.md",sourceDirName:"administration",slug:"/administration/webconsole",permalink:"/docs/1.x.x/administration/webconsole",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/webconsole.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"},next:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"}},l={},c=[{value:"How to install the Web Console?",id:"how-to-install-the-web-console",level:2},{value:"Launching the Web Console",id:"launching-the-web-console",level:2},{value:"Does the WC affect the server's performance?",id:"does-the-wc-affect-the-servers-performance",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"webui"},"WebUI"),(0,r.kt)("p",null,"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"WebUI Animation",src:o(8248).Z,width:"2880",height:"1586"})),(0,r.kt)("h2",{id:"how-to-install-the-web-console"},"How to install the Web Console?"),(0,r.kt)("p",null,"The WC ships with the Command-Line tool. You do not need to install it separately."),(0,r.kt)("h2",{id:"launching-the-web-console"},"Launching the Web Console"),(0,r.kt)("p",null,"To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rctl proxy\n")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"The WC re-uses the credentials of your Command-Line Tool")),(0,r.kt)("h2",{id:"does-the-wc-affect-the-servers-performance"},"Does the WC affect the server's performance?"),(0,r.kt)("p",null,"No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance."))}d.isMDXComponent=!0},8248:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/routr_ui_animation-08da33f511e04a6bd6349b610d7098ab.gif"}}]); \ No newline at end of file diff --git a/assets/js/09b719bb.105201e4.js b/assets/js/09b719bb.105201e4.js new file mode 100644 index 000000000..bd97081b4 --- /dev/null +++ b/assets/js/09b719bb.105201e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6541],{5722:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=s(4848),t=s(8453);const r={},o="Routr as Asterisk frontend",a={id:"guides/routr-as-asterisk-frontend",title:"Routr as Asterisk frontend",description:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:",source:"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",sourceDirName:"guides",slug:"/guides/routr-as-asterisk-frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"},next:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"}},c={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Configuration Overview",id:"configuration-overview",level:2},{value:"Configuring Asterisk",id:"configuring-asterisk",level:2},{value:"Calling Asterisk from John's device",id:"calling-asterisk-from-johns-device",level:2},{value:"What's Next?",id:"whats-next",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"routr-as-asterisk-frontend",children:"Routr as Asterisk frontend"}),"\n",(0,i.jsx)(n.p,{children:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:"}),"\n",(0,i.jsx)("img",{src:"/img/peering_ilustration.png",width:"600",vspace:"50"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Content"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#requirements",children:"Requirements"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configuration-overview",children:"Configuration Overview"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configuring-asterisk",children:"Configuring Asterisk"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#calling-asterisk-from-johns-device",children:"Calling Asterisk from John\u2019s device"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#whats-next",children:"What\u2019s Next?"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsx)(n.p,{children:"This tutorial assumes the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"You have a SIP phone connected to the same LAN as Routr and Asterisk"}),"\n",(0,i.jsx)(n.li,{children:"If using a hardware phone, this can reach Asterisk and Routr and the other way around"}),"\n",(0,i.jsx)(n.li,{children:"You have a fresh installation of Routr and Asterisk"}),"\n"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Before starting this guide make sure to have a fresh installation of ",(0,i.jsx)(n.strong,{children:"Routr"})," server."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"configuration-overview",children:"Configuration Overview"}),"\n",(0,i.jsxs)(n.p,{children:["With a fresh installation of ",(0,i.jsx)(n.strong,{children:"Routr"}),", you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario."]}),"\n",(0,i.jsxs)(n.p,{children:["The first file we need to examine and change is ",(0,i.jsx)(n.code,{children:"config/peers.yml"}),'. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field ',(0,i.jsx)(n.code,{children:"spec.device"})," and change it to match the Agents domain(",(0,i.jsx)(n.code,{children:"sip.local"}),"). The file now looks similar to this:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"config/peers.yml"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk PBX\n spec:\n device: 'sip.local'\n credentials:\n username: ast\n secret: '1234'\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Head to the console and run the command ",(0,i.jsx)(n.code,{children:"rctl -- get peers"})," to confirm that the Peer exist. The result should be as follows:"]}),"\n",(0,i.jsx)("img",{src:"/img/get_peers_cmd_output.png",width:"600"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we focus our attention on ",(0,i.jsx)(n.code,{children:"domains.yml"})," and ",(0,i.jsx)(n.code,{children:"agents.yml"}),". With a fresh installation, we don't need to make any changes to these files. However, you could run the commands ",(0,i.jsx)(n.code,{children:"get domains"})," and ",(0,i.jsx)(n.code,{children:"get agents"})," to ensure that both, the Agent and the Domain, exist on the server. Your output should look similar to:"]}),"\n",(0,i.jsx)("img",{src:"/img/get_domains_and_agents.png",width:"600"}),"\n",(0,i.jsxs)(n.p,{children:["Use the information in ",(0,i.jsx)(n.code,{children:"agents.yml"})," to configure your SIP phone. The relevant information is found in ",(0,i.jsx)(n.code,{children:"spec.credentials"}),". Mine looks like this:"]}),"\n",(0,i.jsx)("img",{src:"/img/john_telephone_setup_general.png",width:"500"}),"\n",(0,i.jsx)("img",{src:"/img/john_telephone_setup_advanced.png",width:"500"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Make the adjustments based on your prefer SIP phone."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can verify that your device registered correctly with ",(0,i.jsx)(n.strong,{children:"Routr"})," by running the ",(0,i.jsx)(n.code,{children:"locate"})," command:"]}),"\n",(0,i.jsx)("img",{src:"/img/locate_john.png",width:"600"}),"\n",(0,i.jsx)(n.h2,{id:"configuring-asterisk",children:"Configuring Asterisk"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Using PJSIP"})}),"\n",(0,i.jsxs)(n.p,{children:["Backup your ",(0,i.jsx)(n.code,{children:"pjsip.conf"})," and ",(0,i.jsx)(n.code,{children:"pjsip_wizard.conf"}),". Update your pjsip.conf with the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[transport-tcp]\ntype=transport\nprotocol=tcp\nbind=0.0.0.0:6060\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then, in your pjsip_wizard.conf:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[routr]\ntype = wizard\nsends_auth = yes\nsends_registrations = yes\nremote_hosts = 192.168.1.2\noutbound_auth/username = ast\noutbound_auth/password = 1234\nregistration/retry_interval = 10\nregistration/expiration = 900\nendpoint/allow = ulaw\nendpoint/allow = alaw\nendpoint/allow = opus\nendpoint/context = default\ntransport = transport-tcp\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:'Using the "old" Chan SIP'})}),"\n",(0,i.jsxs)(n.p,{children:["First backup your ",(0,i.jsx)(n.code,{children:"sip.conf"}),". Then, replace your configuration and edit the file to reflect the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[general]\nudpbindaddr=0.0.0.0:6060\ncontext=default\nregister => ast:1234@192.168.1.2:5060/1001 ; This information must match the credentials in `config/peers.yml`\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Configuring the Dialplan"})}),"\n",(0,i.jsx)(n.p,{children:"We are going to use a very simple dialplan to play a sound file. Again, make a backup of your configuration and replace its content with this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[default]\nexten => 1001,1,Answer\nexten => 1001,n,Playback(tt-monkeys)\nexten => 1001,n,Hangup\n"})}),"\n",(0,i.jsx)(n.p,{children:"Restart your Asterisk and check the location service. A new device now appears."}),"\n",(0,i.jsx)("img",{src:"/img/locate_john_and_ast.png",width:"600"}),"\n",(0,i.jsx)(n.h2,{id:"calling-asterisk-from-johns-device",children:"Calling Asterisk from John's device"}),"\n",(0,i.jsxs)(n.p,{children:["We can now call ",(0,i.jsx)(n.code,{children:"ast@sip.local"})," and if everything went well listen to a group of really annoying monkeys :)."]}),"\n",(0,i.jsx)(n.h2,{id:"whats-next",children:"What's Next?"}),"\n",(0,i.jsxs)(n.p,{children:["You can check out the ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster../wiki/Home",children:"wiki"})," to see more examples. If you have any questions start an issue or contact us via:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Twitter: ",(0,i.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@fonoster"})]}),"\n",(0,i.jsxs)(n.li,{children:["Email: ",(0,i.jsx)(n.a,{href:"mailto:fonosterteam@fonoster.com",children:"fonosterteam@fonoster.com"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>a});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 a(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/assets/js/09b719bb.fe491b53.js b/assets/js/09b719bb.fe491b53.js deleted file mode 100644 index d12345737..000000000 --- a/assets/js/09b719bb.fe491b53.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4295],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(n),m=a,k=c["".concat(l,".").concat(m)]||c[m]||d[m]||o;return n?r.createElement(k,i(i({ref:t},p),{},{components:n})):r.createElement(k,i({ref:t},p))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=n(7462),a=(n(7294),n(3905));const o={},i="Routr as Asterisk frontend",s={unversionedId:"guides/routr-as-asterisk-frontend",id:"version-1.x.x/guides/routr-as-asterisk-frontend",title:"Routr as Asterisk frontend",description:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:",source:"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",sourceDirName:"guides",slug:"/guides/routr-as-asterisk-frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"},next:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"}},l={},u=[{value:"Requirements",id:"requirements",level:2},{value:"Configuration Overview",id:"configuration-overview",level:2},{value:"Configuring Asterisk",id:"configuring-asterisk",level:2},{value:"Calling Asterisk from John's device",id:"calling-asterisk-from-johns-device",level:2},{value:"What's Next?",id:"whats-next",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"routr-as-asterisk-frontend"},"Routr as Asterisk frontend"),(0,a.kt)("p",null,"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:"),(0,a.kt)("img",{src:"/img/peering_ilustration.png",width:"600",vspace:"50"}),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Content")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"#requirements"},"Requirements")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"#configuration-overview"},"Configuration Overview")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"#configuring-asterisk"},"Configuring Asterisk")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"#calling-asterisk-from-johns-device"},"Calling Asterisk from John\u2019s device")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"#whats-next"},"What\u2019s Next?"))),(0,a.kt)("h2",{id:"requirements"},"Requirements"),(0,a.kt)("p",null,"This tutorial assumes the following:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"You have a SIP phone connected to the same LAN as Routr and Asterisk"),(0,a.kt)("li",{parentName:"ul"},"If using a hardware phone, this can reach Asterisk and Routr and the other way around"),(0,a.kt)("li",{parentName:"ul"},"You have a fresh installation of Routr and Asterisk")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Before starting this guide make sure to have a fresh installation of ",(0,a.kt)("strong",{parentName:"p"},"Routr")," server.")),(0,a.kt)("h2",{id:"configuration-overview"},"Configuration Overview"),(0,a.kt)("p",null,"With a fresh installation of ",(0,a.kt)("strong",{parentName:"p"},"Routr"),", you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario."),(0,a.kt)("p",null,"The first file we need to examine and change is ",(0,a.kt)("inlineCode",{parentName:"p"},"config/peers.yml"),'. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field ',(0,a.kt)("inlineCode",{parentName:"p"},"spec.device")," and change it to match the Agents domain(",(0,a.kt)("inlineCode",{parentName:"p"},"sip.local"),"). The file now looks similar to this:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"config/peers.yml")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yml"},"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk PBX\n spec:\n device: 'sip.local'\n credentials:\n username: ast\n secret: '1234'\n")),(0,a.kt)("p",null,"Head to the console and run the command ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl -- get peers")," to confirm that the Peer exist. The result should be as follows:"),(0,a.kt)("img",{src:"/img/get_peers_cmd_output.png",width:"600"}),(0,a.kt)("p",null,"Next, we focus our attention on ",(0,a.kt)("inlineCode",{parentName:"p"},"domains.yml")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"agents.yml"),". With a fresh installation, we don't need to make any changes to these files. However, you could run the commands ",(0,a.kt)("inlineCode",{parentName:"p"},"get domains")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"get agents")," to ensure that both, the Agent and the Domain, exist on the server. Your output should look similar to:"),(0,a.kt)("img",{src:"/img/get_domains_and_agents.png",width:"600"}),(0,a.kt)("p",null,"Use the information in ",(0,a.kt)("inlineCode",{parentName:"p"},"agents.yml")," to configure your SIP phone. The relevant information is found in ",(0,a.kt)("inlineCode",{parentName:"p"},"spec.credentials"),". Mine looks like this:"),(0,a.kt)("img",{src:"/img/john_telephone_setup_general.png",width:"500"}),(0,a.kt)("img",{src:"/img/john_telephone_setup_advanced.png",width:"500"}),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Make the adjustments based on your prefer SIP phone.")),(0,a.kt)("p",null,"You can verify that your device registered correctly with ",(0,a.kt)("strong",{parentName:"p"},"Routr")," by running the ",(0,a.kt)("inlineCode",{parentName:"p"},"locate")," command:"),(0,a.kt)("img",{src:"/img/locate_john.png",width:"600"}),(0,a.kt)("h2",{id:"configuring-asterisk"},"Configuring Asterisk"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Using PJSIP")),(0,a.kt)("p",null,"Backup your ",(0,a.kt)("inlineCode",{parentName:"p"},"pjsip.conf")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"pjsip_wizard.conf"),". Update your pjsip.conf with the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"[transport-tcp]\ntype=transport\nprotocol=tcp\nbind=0.0.0.0:6060\n")),(0,a.kt)("p",null,"Then, in your pjsip_wizard.conf:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"[routr]\ntype = wizard\nsends_auth = yes\nsends_registrations = yes\nremote_hosts = 192.168.1.2\noutbound_auth/username = ast\noutbound_auth/password = 1234\nregistration/retry_interval = 10\nregistration/expiration = 900\nendpoint/allow = ulaw\nendpoint/allow = alaw\nendpoint/allow = opus\nendpoint/context = default\ntransport = transport-tcp\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},'Using the "old" Chan SIP')),(0,a.kt)("p",null,"First backup your ",(0,a.kt)("inlineCode",{parentName:"p"},"sip.conf"),". Then, replace your configuration and edit the file to reflect the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"[general]\nudpbindaddr=0.0.0.0:6060\ncontext=default\nregister => ast:1234@192.168.1.2:5060/1001 ; This information must match the credentials in `config/peers.yml`\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Configuring the Dialplan")),(0,a.kt)("p",null,"We are going to use a very simple dialplan to play a sound file. Again, make a backup of your configuration and replace its content with this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"[default]\nexten => 1001,1,Answer\nexten => 1001,n,Playback(tt-monkeys)\nexten => 1001,n,Hangup\n")),(0,a.kt)("p",null,"Restart your Asterisk and check the location service. A new device now appears."),(0,a.kt)("img",{src:"/img/locate_john_and_ast.png",width:"600"}),(0,a.kt)("h2",{id:"calling-asterisk-from-johns-device"},"Calling Asterisk from John's device"),(0,a.kt)("p",null,"We can now call ",(0,a.kt)("inlineCode",{parentName:"p"},"ast@sip.local")," and if everything went well listen to a group of really annoying monkeys :)."),(0,a.kt)("h2",{id:"whats-next"},"What's Next?"),(0,a.kt)("p",null,"You can check out the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster../wiki/Home"},"wiki")," to see more examples. If you have any questions start an issue or contact us via:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Twitter: ",(0,a.kt)("a",{parentName:"li",href:"https://twitter.com/fonoster"},"@fonoster")),(0,a.kt)("li",{parentName:"ul"},"Email: ",(0,a.kt)("a",{parentName:"li",href:"mailto:fonosterteam@fonoster.com"},"fonosterteam@fonoster.com"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0abf3980.abb8d247.js b/assets/js/0abf3980.d6c002e8.js similarity index 65% rename from assets/js/0abf3980.abb8d247.js rename to assets/js/0abf3980.d6c002e8.js index c06aec57a..ae6432067 100644 --- a/assets/js/0abf3980.abb8d247.js +++ b/assets/js/0abf3980.d6c002e8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7235],{5745:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3690],{4061:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/0f2bd920.1ab834b7.js b/assets/js/0f2bd920.1ab834b7.js new file mode 100644 index 000000000..74bd96c8d --- /dev/null +++ b/assets/js/0f2bd920.1ab834b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2506],{1270:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>x,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=n(4848),i=n(8453);const r={},l="listEndpoints",o={id:"api/location/list",title:"listEndpoints",description:"Gets a list of registered devices.",source:"@site/versioned_docs/version-1.x.x/api/location/list.md",sourceDirName:"api/location",slug:"/api/location/list",permalink:"/docs/1.x.x/api/location/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"},next:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"}},d={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listendpoints",children:"listEndpoints"}),"\n",(0,s.jsx)(t.p,{children:"Gets a list of registered devices."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list with registered devices in\nthe response body."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/location\n{\n\n}\n\nHTTP/1.1 200 OK\n{ \n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data":[{ \n "addressOfRecord": "sip:1001@sip.local",\n "contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"\n }]\n}\n'})})]})}function x(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.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:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0f2bd920.703591af.js b/assets/js/0f2bd920.703591af.js deleted file mode 100644 index b49cac4c9..000000000 --- a/assets/js/0f2bd920.703591af.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2361],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(f,i(i({ref:t},c),{},{components:n})):r.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},i="listEndpoints",l={unversionedId:"api/location/list",id:"version-1.x.x/api/location/list",title:"listEndpoints",description:"Gets a list of registered devices.",source:"@site/versioned_docs/version-1.x.x/api/location/list.md",sourceDirName:"api/location",slug:"/api/location/list",permalink:"/docs/1.x.x/api/location/list",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"},next:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"}},p={},s=[],c={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"listendpoints"},"listEndpoints"),(0,a.kt)("p",null,"Gets a list of registered devices."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/location")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"This method returns a list with registered devices in\nthe response body."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/location\n{\n\n}\n\nHTTP/1.1 200 OK\n{ \n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data":[{ \n "addressOfRecord": "sip:1001@sip.local",\n "contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"\n }]\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/118e913f.22aac4d7.js b/assets/js/118e913f.22aac4d7.js new file mode 100644 index 000000000..1b1ec1515 --- /dev/null +++ b/assets/js/118e913f.22aac4d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1],{9279:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=r(4848),n=r(8453);const o={},i="Concepts",a={id:"overview/concepts",title:"Concepts",description:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.",source:"@site/docs/overview/concepts.md",sourceDirName:"overview",slug:"/overview/concepts",permalink:"/docs/2.0.0/overview/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"},next:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"}},c={},d=[{value:"EdgePort",id:"edgeport",level:2},{value:"Location service",id:"location-service",level:2},{value:"Middlewares",id:"middlewares",level:2},{value:"Processors",id:"processors",level:2},{value:"Alterations",id:"alterations",level:2},{value:"Registry service",id:"registry-service",level:2},{value:"Requester",id:"requester",level:2}];function l(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"concepts",children:"Concepts"}),"\n",(0,t.jsx)(s.p,{children:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture."}),"\n",(0,t.jsx)(s.p,{children:"The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections."}),"\n",(0,t.jsx)(s.h2,{id:"edgeport",children:"EdgePort"}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages."}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly."}),"\n",(0,t.jsx)(s.p,{children:"Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr."}),"\n",(0,t.jsx)(s.p,{children:"Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher"}),"\n",(0,t.jsx)("img",{src:"/img/edgeport.png",alt:"EdgePort diagram",width:"500"}),"\n",(0,t.jsxs)(s.p,{children:["One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as ",(0,t.jsx)(s.code,{children:"TCP"}),",",(0,t.jsx)(s.code,{children:"TLS"}),", ",(0,t.jsx)(s.code,{children:"WS"}),", or ",(0,t.jsx)(s.code,{children:"WSS"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality."}),"\n",(0,t.jsx)(s.p,{children:"A minimal EdgePort configuration looks as follows:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"# Example EdgePort configuration\nkind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n processor:\n addr: dispatcher:51901\n methods:\n - REGISTER\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: udp\n port: 5060\n"})}),"\n",(0,t.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,t.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor."}),"\n",(0,t.jsx)(s.p,{children:"The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor."}),"\n",(0,t.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,t.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,t.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,t.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,t.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,t.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,t.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,t.jsx)(s.h2,{id:"location-service",children:"Location service"}),"\n",(0,t.jsx)(s.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,t.jsx)(s.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,t.jsx)(s.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,t.jsxs)(s.p,{children:["Two balancing algorithms are available. The first is ",(0,t.jsx)(s.code,{children:"round-robin"}),", and the second is ",(0,t.jsx)(s.code,{children:"least-sessions"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,t.jsx)(s.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Notice that the load balancing section sets the ",(0,t.jsx)(s.code,{children:"withSessionAffinity"})," to ",(0,t.jsx)(s.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,t.jsxs)(s.p,{children:["Every Asterisk server that registers using the ",(0,t.jsx)(s.code,{children:"asterisk"})," username will join the same group under the ",(0,t.jsx)(s.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,t.jsx)(s.h2,{id:"middlewares",children:"Middlewares"}),"\n",(0,t.jsx)(s.p,{children:"Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc."}),"\n",(0,t.jsx)(s.p,{children:"Some use cases for Middlewares include:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Authentication and Authorization"}),"\n",(0,t.jsx)(s.li,{children:"Rate limiting"}),"\n",(0,t.jsx)(s.li,{children:"Circuit breaking"}),"\n",(0,t.jsx)(s.li,{children:"Logging, Metrics, and Tracing"}),"\n",(0,t.jsx)(s.li,{children:"Request and response validation"}),"\n",(0,t.jsx)(s.li,{children:"Data transformation and normalization"}),"\n",(0,t.jsx)(s.li,{children:"CDRs generation"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor."}),"\n",(0,t.jsx)(s.h2,{id:"processors",children:"Processors"}),"\n",(0,t.jsxs)(s.p,{children:["Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the ",(0,t.jsx)(s.a,{href:"#alterations",children:"Alterations API"})," to modify SIP messages."]}),"\n",(0,t.jsx)(s.p,{children:'The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.'}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'const Processor = require("@routr/processor").default;\nconst { MessageRequest, Response } = require("@routr/processor");\n\nnew Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(\n (req: MessageRequest, res: Response) => {\n logger.verbose("got new request: ")\n logger.verbose(JSON.stringify(req, null, " "))\n res.sendOk()\n }\n)\n'})}),"\n",(0,t.jsx)(s.h2,{id:"alterations",children:"Alterations"}),"\n",(0,t.jsx)(s.p,{children:"Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes."}),"\n",(0,t.jsx)(s.p,{children:"The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-typescript",children:"const { Alterations } = require('@routr/processor')\nconst { pipe } = require(\"fp-ts/function\");\n\nfunction messageProcessing(req: MessageRequest, route: Route): MessageRequest {\n const requestOut = pipe(\n reqIn,\n //example of an Alteration method with two arities\n Alterations.addSelfVia(route),\n Alterations.addSelfRecordRoute(route),\n Alterations.addRouteToPeerEdgePort(route),\n Alterations.addRouteToNextHop(route),\n //example of an Alteration method with one arity\n Alterations.addXEdgePortRef,\n Alterations.decreaseMaxForwards\n )\n\n return requestOut\n}\n"})}),"\n",(0,t.jsx)(s.p,{children:"If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output."}),"\n",(0,t.jsx)(s.h2,{id:"registry-service",children:"Registry service"}),"\n",(0,t.jsx)(s.p,{children:"The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service."}),"\n",(0,t.jsx)(s.p,{children:"Available configurations include the following:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Property"}),(0,t.jsx)(s.th,{children:"Description"}),(0,t.jsx)(s.th,{children:"Required"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"requesterAddr"}),(0,t.jsx)(s.td,{children:"Address of service to send requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"apiAddr"}),(0,t.jsx)(s.td,{children:"Address of API service"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"registerInterval"}),(0,t.jsx)(s.td,{children:"Interval to send registration requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"cache"}),(0,t.jsx)(s.td,{children:"Cache configuration"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"methods"}),(0,t.jsx)(s.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts"}),(0,t.jsx)(s.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.address"}),(0,t.jsx)(s.td,{children:"Address of EdgePort"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.region"}),(0,t.jsx)(s.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Here is an example of a Trunk configuration that requires registration:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n registerInterval: 20\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(s.h2,{id:"requester",children:"Requester"}),"\n",(0,t.jsx)(s.p,{children:"The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service."})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>a});var t=r(6540);const n={},o=t.createContext(n);function i(e){const s=t.useContext(o);return t.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(n):e.components||n:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/118e913f.8a938d1c.js b/assets/js/118e913f.8a938d1c.js deleted file mode 100644 index c2385dfc0..000000000 --- a/assets/js/118e913f.8a938d1c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7979],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,h=d["".concat(l,".").concat(m)]||d[m]||p[m]||o;return r?n.createElement(h,s(s({ref:t},u),{},{components:r})):n.createElement(h,s({ref:t},u))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={},s="Concepts",i={unversionedId:"overview/concepts",id:"overview/concepts",title:"Concepts",description:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.",source:"@site/docs/overview/concepts.md",sourceDirName:"overview",slug:"/overview/concepts",permalink:"/docs/2.0.0/overview/concepts",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"},next:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"}},l={},c=[{value:"EdgePort",id:"edgeport",level:2},{value:"Location service",id:"location-service",level:2},{value:"Middlewares",id:"middlewares",level:2},{value:"Processors",id:"processors",level:2},{value:"Alterations",id:"alterations",level:2},{value:"Registry service",id:"registry-service",level:2},{value:"Requester",id:"requester",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"concepts"},"Concepts"),(0,a.kt)("p",null,"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture."),(0,a.kt)("p",null,"The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections."),(0,a.kt)("h2",{id:"edgeport"},"EdgePort"),(0,a.kt)("p",null,"The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages."),(0,a.kt)("p",null,"The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly."),(0,a.kt)("p",null,"Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr."),(0,a.kt)("p",null,"Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher"),(0,a.kt)("img",{src:"/img/edgeport.png",alt:"EdgePort diagram",width:"500"}),(0,a.kt)("p",null,"One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as ",(0,a.kt)("inlineCode",{parentName:"p"},"TCP"),",",(0,a.kt)("inlineCode",{parentName:"p"},"TLS"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"WS"),", or ",(0,a.kt)("inlineCode",{parentName:"p"},"WSS"),"."),(0,a.kt)("p",null,"Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality."),(0,a.kt)("p",null,"A minimal EdgePort configuration looks as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"# Example EdgePort configuration\nkind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n processor:\n addr: dispatcher:51901\n methods:\n - REGISTER\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: udp\n port: 5060\n")),(0,a.kt)("h1",{id:"message-dispatcher"},"Message Dispatcher"),(0,a.kt)("p",null,"The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor."),(0,a.kt)("p",null,"The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor. "),(0,a.kt)("p",null,"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing. "),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"matchFunc")," is a javascript function that leverages the JSON representation of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto"},"SIPMessage")," protobuf. "),(0,a.kt)("p",null,"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n')),(0,a.kt)("p",null,"The following examples show typical matching functions:"),(0,a.kt)("p",null,"Match all SIP Messages."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},"req => true\n")),(0,a.kt)("p",null,"Match SIP Messages with a specific method."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'req => req.method === "MESSAGE"\n')),(0,a.kt)("p",null,"Match SIP Messages with a specific method and a specific header."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n')),(0,a.kt)("p",null,"Match SIP Messages with a specific ",(0,a.kt)("inlineCode",{parentName:"p"},"User-Agent")," header."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n')),(0,a.kt)("h2",{id:"location-service"},"Location service"),(0,a.kt)("p",null,"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."),(0,a.kt)("p",null,"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."),(0,a.kt)("p",null,"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."),(0,a.kt)("p",null,"Two balancing algorithms are available. The first is ",(0,a.kt)("inlineCode",{parentName:"p"},"round-robin"),", and the second is ",(0,a.kt)("inlineCode",{parentName:"p"},"least-sessions"),"."),(0,a.kt)("p",null,"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."),(0,a.kt)("p",null,"To do this, create a Peer configuration for your Asterisk server similar to the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n")),(0,a.kt)("p",null,"Notice that the load balancing section sets the ",(0,a.kt)("inlineCode",{parentName:"p"},"withSessionAffinity")," to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server. "),(0,a.kt)("p",null,"Every Asterisk server that registers using the ",(0,a.kt)("inlineCode",{parentName:"p"},"asterisk")," username will join the same group under the ",(0,a.kt)("inlineCode",{parentName:"p"},"sip:conference@sip.local")," Address of Record (AOR)."),(0,a.kt)("h2",{id:"middlewares"},"Middlewares"),(0,a.kt)("p",null,"Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc."),(0,a.kt)("p",null,"Some use cases for Middlewares include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Authentication and Authorization"),(0,a.kt)("li",{parentName:"ul"},"Rate limiting"),(0,a.kt)("li",{parentName:"ul"},"Circuit breaking"),(0,a.kt)("li",{parentName:"ul"},"Logging, Metrics, and Tracing"),(0,a.kt)("li",{parentName:"ul"},"Request and response validation"),(0,a.kt)("li",{parentName:"ul"},"Data transformation and normalization"),(0,a.kt)("li",{parentName:"ul"},"CDRs generation")),(0,a.kt)("p",null,"Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor."),(0,a.kt)("h2",{id:"processors"},"Processors"),(0,a.kt)("p",null,"Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the ",(0,a.kt)("a",{parentName:"p",href:"/docs/overview/concepts#alterations"},"Alterations API")," to modify SIP messages."),(0,a.kt)("p",null,'The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.'),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript"},'const Processor = require("@routr/processor").default;\nconst { MessageRequest, Response } = require("@routr/processor");\n\nnew Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(\n (req: MessageRequest, res: Response) => {\n logger.verbose("got new request: ")\n logger.verbose(JSON.stringify(req, null, " "))\n res.sendOk()\n }\n)\n')),(0,a.kt)("h2",{id:"alterations"},"Alterations"),(0,a.kt)("p",null,"Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes."),(0,a.kt)("p",null,"The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-typescript"},"const { Alterations } = require('@routr/processor')\nconst { pipe } = require(\"fp-ts/function\");\n\nfunction messageProcessing(req: MessageRequest, route: Route): MessageRequest {\n const requestOut = pipe(\n reqIn,\n //example of an Alteration method with two arities\n Alterations.addSelfVia(route),\n Alterations.addSelfRecordRoute(route),\n Alterations.addRouteToPeerEdgePort(route),\n Alterations.addRouteToNextHop(route),\n //example of an Alteration method with one arity\n Alterations.addXEdgePortRef,\n Alterations.decreaseMaxForwards\n )\n\n return requestOut\n}\n")),(0,a.kt)("p",null,"If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output."),(0,a.kt)("h2",{id:"registry-service"},"Registry service"),(0,a.kt)("p",null,"The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service."),(0,a.kt)("p",null,"Available configurations include the following:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"requesterAddr"),(0,a.kt)("td",{parentName:"tr",align:null},"Address of service to send requests"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"apiAddr"),(0,a.kt)("td",{parentName:"tr",align:null},"Address of API service"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"registerInterval"),(0,a.kt)("td",{parentName:"tr",align:null},"Interval to send registration requests"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"cache"),(0,a.kt)("td",{parentName:"tr",align:null},"Cache configuration"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"methods"),(0,a.kt)("td",{parentName:"tr",align:null},"Acceptable SIP Methods (reserved for future use)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"edgePorts"),(0,a.kt)("td",{parentName:"tr",align:null},"List of EdgePorts for outbound registrations"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"edgePorts.address"),(0,a.kt)("td",{parentName:"tr",align:null},"Address of EdgePort"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"edgePorts.region"),(0,a.kt)("td",{parentName:"tr",align:null},"Region of EdgePort (reserved for future use)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")))),(0,a.kt)("p",null,"Here is an example of a Trunk configuration that requires registration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n registerInterval: 20\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n")),(0,a.kt)("h2",{id:"requester"},"Requester"),(0,a.kt)("p",null,"The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/129db88c.13220621.js b/assets/js/129db88c.13220621.js new file mode 100644 index 000000000..3c802655a --- /dev/null +++ b/assets/js/129db88c.13220621.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2692],{7480:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=n(4848),r=n(8453);const s={},i="WebRTC Support",a={id:"connect/webrtc-support",title:"WebRTC Support",description:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.",source:"@site/docs/connect/webrtc-support.md",sourceDirName:"connect",slug:"/connect/webrtc-support",permalink:"/docs/2.0.0/connect/webrtc-support",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/webrtc-support.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"},next:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"}},c={},l=[];function u(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"webrtc-support",children:"WebRTC Support"}),"\n",(0,o.jsx)(t.p,{children:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server."}),"\n",(0,o.jsx)(t.p,{children:"Let\u2019s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients."}),"\n",(0,o.jsx)(t.p,{children:"Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step."}),"\n",(0,o.jsxs)(t.p,{children:["To enable WebRTC interoperability, you will need to update your compose.yaml file to include the ",(0,o.jsx)(t.code,{children:"RTPENGINE_HOST"})," environment variable. Here is an example:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n RTPENGINE_HOST: ${RTPE_HOST} \n ports:\n - 51908:51908\n - 5060:5060/udp\n\n-- snip --\n'})}),"\n",(0,o.jsxs)(t.p,{children:["If using Helm, you will need to add the following configuration to your ",(0,o.jsx)(t.code,{children:"values.yaml"})," file:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:"rtprelay:\n enabled: true\n rtpeHost: /* rtpengine */ \n rtpPort: 22222\n"})}),"\n",(0,o.jsx)(t.p,{children:"Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/129db88c.eddd5deb.js b/assets/js/129db88c.eddd5deb.js deleted file mode 100644 index 8e3028f02..000000000 --- a/assets/js/129db88c.eddd5deb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4058],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),f=o,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return n?r.createElement(m,i(i({ref:t},p),{},{components:n})):r.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var l=2;l{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={},i="WebRTC Support",c={unversionedId:"connect/webrtc-support",id:"connect/webrtc-support",title:"WebRTC Support",description:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.",source:"@site/docs/connect/webrtc-support.md",sourceDirName:"connect",slug:"/connect/webrtc-support",permalink:"/docs/2.0.0/connect/webrtc-support",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/webrtc-support.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"},next:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"}},s={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"webrtc-support"},"WebRTC Support"),(0,o.kt)("p",null,"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server."),(0,o.kt)("p",null,"Let\u2019s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients."),(0,o.kt)("p",null,"Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step."),(0,o.kt)("p",null,"To enable WebRTC interoperability, you will need to update your compose.yaml file to include the ",(0,o.kt)("inlineCode",{parentName:"p"},"RTPENGINE_HOST")," environment variable. Here is an example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n RTPENGINE_HOST: ${RTPE_HOST} \n ports:\n - 51908:51908\n - 5060:5060/udp\n\n-- snip --\n')),(0,o.kt)("p",null,"If using Helm, you will need to add the following configuration to your ",(0,o.kt)("inlineCode",{parentName:"p"},"values.yaml")," file:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"rtprelay:\n enabled: true\n rtpeHost: /* rtpengine */ \n rtpPort: 22222\n")),(0,o.kt)("p",null,"Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/144994e6.12bed236.js b/assets/js/144994e6.12bed236.js new file mode 100644 index 000000000..36e0e5e59 --- /dev/null +++ b/assets/js/144994e6.12bed236.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1171],{8162:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="RTPRelay",a={id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/docs/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.0.0/development/components/rtprelay",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/rtprelay.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"rtprelay",children:"RTPRelay"}),"\n",(0,s.jsx)(n.p,{children:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The IP address and port to bind the gRPC server. Defaults to ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_HOST"})," - The IP address or hostname of the RTPEngine service. Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_PORT"})," - The port of the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"22222"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_TIMEOUT"})," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"5000"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-rtprelay-with-docker",children:"Launching the RTPRelay with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The RTPRelay is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-rtprelay",children:"Docker Hub"}),". To launch the RTPRelay with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with the RTPRelay for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the RTPRelay."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.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:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/144994e6.86e74c64.js b/assets/js/144994e6.86e74c64.js deleted file mode 100644 index 736ab8577..000000000 --- a/assets/js/144994e6.86e74c64.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1668],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,h=u["".concat(l,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(h,s(s({ref:t},p),{},{components:n})):r.createElement(h,s({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={},s="RTPRelay",i={unversionedId:"development/components/rtprelay",id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/docs/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.0.0/development/components/rtprelay",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/rtprelay.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"}},l={},c=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"rtprelay"},"RTPRelay"),(0,o.kt)("p",null,"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."),(0,o.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,o.kt)("p",null,"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"BIND_ADDR")," - The IP address and port to bind the gRPC server. Defaults to ",(0,o.kt)("inlineCode",{parentName:"li"},"0.0.0.0:51903")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"RTPENGINE_HOST")," - The IP address or hostname of the RTPEngine service. Required."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"RTPENGINE_PORT")," - The port of the RTPEngine service. Defaults to ",(0,o.kt)("inlineCode",{parentName:"li"},"22222"),"."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"RTPENGINE_TIMEOUT")," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,o.kt)("inlineCode",{parentName:"li"},"5000"),".")),(0,o.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,o.kt)("p",null,'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n')),(0,o.kt)("p",null,"Link to the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto"},"protobuf definition.")),(0,o.kt)("h2",{id:"launching-the-rtprelay-with-docker"},"Launching the RTPRelay with Docker"),(0,o.kt)("p",null,"The RTPRelay is available as a Docker image from ",(0,o.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-rtprelay"},"Docker Hub"),". To launch the RTPRelay with Docker, you can use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n')),(0,o.kt)("p",null,"The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,o.kt)("inlineCode",{parentName:"p"},"51903"),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."),(0,o.kt)("h2",{id:"quick-test-with-grpcurl"},"Quick Test with gRPCurl"),(0,o.kt)("p",null,"One easy way to interact with the RTPRelay for testing and development is to use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fullstorydev/grpcurl"},"gRPCurl"),". The following example shows how to send a SIP Message to the RTPRelay."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17896441.04422b2e.js b/assets/js/17896441.04422b2e.js new file mode 100644 index 000000000..27bd84671 --- /dev/null +++ b/assets/js/17896441.04422b2e.js @@ -0,0 +1 @@ +(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8401],{6766:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>qt});var s=n(6540),a=n(9024),o=n(9532),i=n(4848);const l=s.createContext(null);function c(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,i.jsx)(l.Provider,{value:a,children:t})}function r(){const e=(0,s.useContext)(l);if(null===e)throw new o.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=r();return(0,i.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(8215),m=n(4581),h=n(1312),p=n(8774);function f(e){const{permalink:t,title:n,subLabel:s,isNext:a}=e;return(0,i.jsxs)(p.A,{className:(0,u.A)("pagination-nav__link",a?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}function x(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(f,{...t,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(f,{...n,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function b(){const{metadata:e}=r();return(0,i.jsx)(x,{previous:e.previous,next:e.next})}var g=n(4586),j=n(4070),v=n(7559),N=n(5597),C=n(2252);const A={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.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,i.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,i.jsx)(h.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,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function k(e){const t=A[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function L(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(p.A,{to:n,onClick:s,children:(0,i.jsx)(h.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 y(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,j.vT)({failfast:!0}),{savePreferredVersionName:o}=(0,N.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:c}=(0,j.HW)(a),r=l??(d=c).docs.find((e=>e.id===d.mainDocId));var d;return(0,i.jsxs)("div",{className:(0,u.A)(t,v.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(k,{siteTitle:s,versionMetadata:n})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(L,{versionLabel:c.label,to:r.path,onClick:()=>o(c.name)})})]})}function _(e){let{className:t}=e;const n=(0,C.r)();return n.banner?(0,i.jsx)(y,{className:t,versionMetadata:n}):null}function B(e){let{className:t}=e;const n=(0,C.r)();return n.badge?(0,i.jsx)("span",{className:(0,u.A)(t,v.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}function w(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:new Date(1e3*t).toISOString(),children:n})})},children:" on {date}"})}function T(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function E(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:s}=e;return(0,i.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,i.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?(0,i.jsx)(w,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:s?(0,i.jsx)(T,{lastUpdatedBy:s}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const H={iconEdit:"iconEdit_Z9Sw"};function M(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(H.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.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 I(e){let{editUrl:t}=e;return(0,i.jsxs)(p.A,{to:t,className:v.G.common.editThisPage,children:[(0,i.jsx)(M,{}),(0,i.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}const S={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:n,count:s}=e;return(0,i.jsxs)(p.A,{href:t,className:(0,u.A)(S.tag,s?S.tagWithCount:S.tagRegular),children:[n,s&&(0,i.jsx)("span",{children:s})]})}const V={tags:"tags_jXut",tag:"tag_QGVx"};function R(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,u.A)(V.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,i.jsx)("li",{className:V.tag,children:(0,i.jsx)(U,{label:t,permalink:n})},n)}))})]})}const z={lastUpdated:"lastUpdated_vwxv"};function O(e){return(0,i.jsx)("div",{className:(0,u.A)(v.G.docs.docFooterTagsRow,"row margin-bottom--sm"),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(R,{...e})})})}function P(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:a}=e;return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docFooterEditMetaRow,"row"),children:[(0,i.jsx)("div",{className:"col",children:t&&(0,i.jsx)(I,{editUrl:t})}),(0,i.jsx)("div",{className:(0,u.A)("col",z.lastUpdated),children:(n||s)&&(0,i.jsx)(E,{lastUpdatedAt:n,formattedLastUpdatedAt:a,lastUpdatedBy:s})})]})}function G(){const{metadata:e}=r(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:s,lastUpdatedBy:a,tags:o}=e,l=o.length>0,c=!!(t||n||a);return l||c?(0,i.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[l&&(0,i.jsx)(O,{tags:o}),c&&(0,i.jsx)(P,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:a,formattedLastUpdatedAt:s})]}):null}var D=n(1422),W=n(6342);function $(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 F(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function Z(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>q(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 J(e){const t=(0,s.useRef)(void 0),n=Y();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:i}=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:o,maxHeadingLevel:i}),c=Z(l,{anchorTopOffset:n.current}),r=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===r)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function K(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,i.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,i.jsxs)("li",{children:[(0,i.jsx)(p.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,i.jsx)(K,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const Q=s.memo(K);function X(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:l,maxHeadingLevel:c,...r}=e;const d=(0,W.p)(),u=l??d.tableOfContents.minHeadingLevel,m=c??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>F({toc:$(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:u,maxHeadingLevel:m});return J((0,s.useMemo)((()=>{if(a&&o)return{linkClassName:a,linkActiveClassName:o,minHeadingLevel:u,maxHeadingLevel:m}}),[a,o,u,m])),(0,i.jsx)(Q,{toc:h,className:n,linkClassName:a,...r})}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function te(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const ne={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function se(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:o,toggleCollapsed:l}=(0,D.u)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.A)(ne.tocCollapsible,!o&&ne.tocCollapsibleExpanded,n),children:[(0,i.jsx)(te,{collapsed:o,onClick:l}),(0,i.jsx)(D.N,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:o,children:(0,i.jsx)(X,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const ae={tocMobile:"tocMobile_ITEo"};function oe(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(se,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,ae.tocMobile)})}const ie={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},le="table-of-contents__link toc-highlight",ce="table-of-contents__link--active";function re(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,u.A)(ie.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(X,{...n,linkClassName:le,linkActiveClassName:ce})})}function de(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(re,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var ue=n(1107),me=n(8453),he=n(5260),pe=n(2303),fe=n(5293);function xe(){const{prism:e}=(0,W.p)(),{colorMode:t}=(0,fe.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var be=n(8426),ge=n.n(be);const je=/title=(?["'])(?.*?)\1/,ve=/\{(?<range>[\d,-]+)\}/,Ne={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},Ce={...Ne,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:""}},Ae=Object.keys(Ne);function ke(e,t){const n=e.map((e=>{const{start:n,end:s}=Ce[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 Le(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&ve.test(o)){const e=o.match(ve).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=ge()(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 i=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return ke(["js","jsBlock"],t);case"jsx":case"tsx":return ke(["js","jsBlock","jsx"],t);case"html":return ke(["js","jsBlock","html"],t);case"python":case"py":case"bash":return ke(["bash"],t);case"markdown":case"md":return ke(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return ke(["tex"],t);case"lua":case"haskell":case"sql":return ke(["lua"],t);case"wasm":return ke(["wasm"],t);case"vb":case"vba":case"visual-basic":return ke(["vb","rem"],t);case"vbnet":return ke(["vbnet","rem"],t);case"batch":return ke(["rem"],t);case"basic":return ke(["rem","f90"],t);case"fsharp":return ke(["js","ml"],t);case"ocaml":case"sml":return ke(["ml"],t);case"fortran":return ke(["f90"],t);case"cobol":return ke(["cobol"],t);default:return ke(Ae,t)}}(s,a),l=n.split("\n"),c=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),r=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<l.length;){const e=l[h].match(i);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));r[t]?c[r[t]].range+=`${h},`:d[t]?c[d[t]].start=h:u[t]&&(c[u[t]].range+=`${c[u[t]].start}-${h-1},`),l.splice(h,1)}n=l.join("\n");const m={};return Object.entries(c).forEach((e=>{let[t,{range:n}]=e;ge()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const ye={codeBlockContainer:"codeBlockContainer_Ckt0"};function _e(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}(xe());return(0,i.jsx)(t,{...n,style:s,className:(0,u.A)(n.className,ye.codeBlockContainer,v.G.common.codeBlock)})}const Be={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function we(e){let{children:t,className:n}=e;return(0,i.jsx)(_e,{as:"pre",tabIndex:0,className:(0,u.A)(Be.codeBlockStandalone,"thin-scrollbar",n),children:(0,i.jsx)("code",{className:Be.codeBlockLines,children:t})})}const Te={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Ee(e,t){const[n,a]=(0,s.useState)(),i=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{i()}),[i]),function(e,t,n){void 0===n&&(n=Te);const a=(0,o._q)(t),i=(0,o.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,i),()=>t.disconnect()}),[e,a,i])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),i())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var He=n(8181);const Me={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function Ie(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const l=a({line:t,className:(0,u.A)(n,s&&Me.codeLine)}),c=t.map(((e,t)=>(0,i.jsx)("span",{...o({token:e,key:t})},t)));return(0,i.jsxs)("span",{...l,children:[s?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("span",{className:Me.codeLineNumber}),(0,i.jsx)("span",{className:Me.codeLineContent,children:c})]}):c,(0,i.jsx)("br",{})]})}function Se(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.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 Ue(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const Ve={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function Re(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),l=(0,s.useRef)(void 0),c=(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(),i=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}s.remove(),i&&(o.removeAllRanges(),o.addRange(i)),a&&a.focus()}(t),o(!0),l.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(l.current)),[]),(0,i.jsx)("button",{type:"button","aria-label":a?(0,h.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,h.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,h.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.A)("clean-btn",n,Ve.copyButton,a&&Ve.copyButtonCopied),onClick:c,children:(0,i.jsxs)("span",{className:Ve.copyButtonIcons,"aria-hidden":"true",children:[(0,i.jsx)(Se,{className:Ve.copyButtonIcon}),(0,i.jsx)(Ue,{className:Ve.copyButtonSuccessIcon})]})})}function ze(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.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 Oe={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Pe(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,h.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,i.jsx)("button",{type:"button",onClick:n,className:(0,u.A)("clean-btn",t,s&&Oe.wordWrapButtonEnabled),"aria-label":a,title:a,children:(0,i.jsx)(ze,{className:Oe.wordWrapButtonIcon,"aria-hidden":"true"})})}function Ge(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:l,language:c}=e;const{prism:{defaultLanguage:r,magicComments:d}}=(0,W.p)(),m=function(e){return e?.toLowerCase()}(c??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??r),h=xe(),p=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),i=(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]),l=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return Ee(o,l),(0,s.useEffect)((()=>{l()}),[e,l]),(0,s.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:i}}(),f=function(e){return e?.match(je)?.groups.title??""}(a)||o,{lineClassNames:x,code:b}=Le(t,{metastring:a,language:m,magicComments:d}),g=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,i.jsxs)(_e,{as:"div",className:(0,u.A)(n,m&&!n.includes(`language-${m}`)&&`language-${m}`),children:[f&&(0,i.jsx)("div",{className:Be.codeBlockTitle,children:f}),(0,i.jsxs)("div",{className:Be.codeBlockContent,children:[(0,i.jsx)(He.f4,{theme:h,code:b,language:m??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,i.jsx)("pre",{tabIndex:0,ref:p.codeBlockRef,className:(0,u.A)(t,Be.codeBlock,"thin-scrollbar"),style:n,children:(0,i.jsx)("code",{className:(0,u.A)(Be.codeBlockLines,g&&Be.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,i.jsx)(Ie,{line:e,getLineProps:a,getTokenProps:o,classNames:x[t],showLineNumbers:g},t)))})})}}),(0,i.jsxs)("div",{className:Be.buttonGroup,children:[(p.isEnabled||p.isCodeScrollable)&&(0,i.jsx)(Pe,{className:Be.codeButton,onClick:()=>p.toggle(),isEnabled:p.isEnabled}),(0,i.jsx)(Re,{className:Be.codeButton,code:b})]})]})]})}function De(e){let{children:t,...n}=e;const a=(0,pe.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof o?Ge:we;return(0,i.jsx)(l,{...n,children:o},String(a))}function We(e){return(0,i.jsx)("code",{...e})}var $e=n(5066),Fe=n(3427);const qe={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Ze(e){return!!e&&("SUMMARY"===e.tagName||Ze(e.parentElement))}function Ye(e,t){return!!e&&(e===t||Ye(e.parentElement,t))}function Je(e){let{summary:t,children:n,...a}=e;(0,Fe.A)().collectAnchor(a.id);const o=(0,pe.A)(),l=(0,s.useRef)(null),{collapsed:c,setCollapsed:r}=(0,D.u)({initialState:!a.open}),[d,u]=(0,s.useState)(a.open),m=s.isValidElement(t)?t:(0,i.jsx)("summary",{children:t??"Details"});return(0,i.jsxs)("details",{...a,ref:l,open:d,"data-collapsed":c,className:(0,$e.A)(qe.details,o&&qe.isBrowser,a.className),onMouseDown:e=>{Ze(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Ze(t)&&Ye(t,l.current)&&(e.preventDefault(),c?(r(!1),u(!0)):r(!0))},children:[m,(0,i.jsx)(D.N,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{r(e),u(!e)},children:(0,i.jsx)("div",{className:qe.collapsibleContent,children:n})})]})}const Ke={details:"details_b_Ee"},Qe="alert alert--info";function Xe(e){let{...t}=e;return(0,i.jsx)(Je,{...t,className:(0,u.A)(Qe,Ke.details,t.className)})}function et(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,i.jsx)(i.Fragment,{children:t.filter((e=>e!==n))});return(0,i.jsx)(Xe,{...e,summary:n,children:a})}function tt(e){return(0,i.jsx)(ue.A,{...e})}const nt={containsTaskList:"containsTaskList_mC6p"};function st(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&nt.containsTaskList)}const at={img:"img_ev3q"};function ot(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),o=n?.props.children;return{mdxAdmonitionTitle:o,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}const it={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function lt(e){let{type:t,className:n,children:s}=e;return(0,i.jsx)("div",{className:(0,u.A)(v.G.common.admonition,v.G.common.admonitionType(t),it.admonition,n),children:s})}function ct(e){let{icon:t,title:n}=e;return(0,i.jsxs)("div",{className:it.admonitionHeading,children:[(0,i.jsx)("span",{className:it.admonitionIcon,children:t}),n]})}function rt(e){let{children:t}=e;return t?(0,i.jsx)("div",{className:it.admonitionContent,children:t}):null}function dt(e){const{type:t,icon:n,title:s,children:a,className:o}=e;return(0,i.jsxs)(lt,{type:t,className:o,children:[(0,i.jsx)(ct,{title:s,icon:n}),(0,i.jsx)(rt,{children:a})]})}function ut(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.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 mt={icon:(0,i.jsx)(ut,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function ht(e){return(0,i.jsx)(dt,{...mt,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function pt(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.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 ft={icon:(0,i.jsx)(pt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function xt(e){return(0,i.jsx)(dt,{...ft,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function bt(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.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 gt={icon:(0,i.jsx)(bt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function jt(e){return(0,i.jsx)(dt,{...gt,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function vt(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.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 Nt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Ct(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.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 At={icon:(0,i.jsx)(Ct,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const kt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const Lt={...{note:ht,tip:xt,info:jt,warning:function(e){return(0,i.jsx)(dt,{...Nt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(dt,{...At,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(ht,{title:"secondary",...e}),important:e=>(0,i.jsx)(jt,{title:"important",...e}),success:e=>(0,i.jsx)(xt,{title:"success",...e}),caution:function(e){return(0,i.jsx)(dt,{...kt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function yt(e){const t=ot(e),n=(s=t.type,Lt[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),Lt.info));var s;return(0,i.jsx)(n,{...t})}const _t={Head:he.A,details:et,Details:et,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,i.jsx)(We,{...e}):(0,i.jsx)(De,{...e})},a:function(e){return(0,i.jsx)(p.A,{...e})},pre:function(e){return(0,i.jsx)(i.Fragment,{children:e.children})},ul:function(e){return(0,i.jsx)("ul",{...e,className:st(e.className)})},li:function(e){return(0,Fe.A)().collectAnchor(e.id),(0,i.jsx)("li",{...e})},img:function(e){return(0,i.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,u.A)(t,at.img))});var t},h1:e=>(0,i.jsx)(tt,{as:"h1",...e}),h2:e=>(0,i.jsx)(tt,{as:"h2",...e}),h3:e=>(0,i.jsx)(tt,{as:"h3",...e}),h4:e=>(0,i.jsx)(tt,{as:"h4",...e}),h5:e=>(0,i.jsx)(tt,{as:"h5",...e}),h6:e=>(0,i.jsx)(tt,{as:"h6",...e}),admonition:yt,mermaid:()=>null};function Bt(e){let{children:t}=e;return(0,i.jsx)(me.x,{components:_t,children:t})}function wt(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=r();return t.hide_title||void 0!==n?null:e.title}();return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(ue.A,{as:"h1",children:n})}),(0,i.jsx)(Bt,{children:t})]})}var Tt=n(1754),Et=n(9169),Ht=n(6025);function Mt(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.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 It={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function St(){const e=(0,Ht.A)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(p.A,{"aria-label":(0,h.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,i.jsx)(Mt,{className:It.breadcrumbHomeIcon})})})}const Ut={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Vt(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,i.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,i.jsx)(p.A,{className:a,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:a,children:t})}function Rt(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,i.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function zt(){const e=(0,Tt.OF)(),t=(0,Et.Dt)();return e?(0,i.jsx)("nav",{className:(0,u.A)(v.G.docs.docBreadcrumbs,Ut.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(St,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)(Rt,{active:s,index:n,addMicrodata:!!a,children:(0,i.jsx)(Vt,{href:a,isLast:s,children:t.label})},n)}))]})}):null}function Ot(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function Pt(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.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 Gt(){return(0,i.jsx)(he.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Dt(e){let{className:t}=e;return(0,i.jsx)(yt,{type:"caution",title:(0,i.jsx)(Ot,{}),className:(0,u.A)(t,v.G.common.unlistedBanner),children:(0,i.jsx)(Pt,{})})}function Wt(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(Gt,{}),(0,i.jsx)(Dt,{...e})]})}const $t={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Ft(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=r(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,i.jsx)(oe,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,i.jsx)(de,{})}}(),{metadata:{unlisted:s}}=r();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&$t.docItemCol),children:[s&&(0,i.jsx)(Wt,{}),(0,i.jsx)(_,{}),(0,i.jsxs)("div",{className:$t.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(zt,{}),(0,i.jsx)(B,{}),n.mobile,(0,i.jsx)(wt,{children:t}),(0,i.jsx)(G,{})]}),(0,i.jsx)(b,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function qt(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,i.jsx)(c,{content:e.content,children:(0,i.jsxs)(a.e3,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(Ft,{children:(0,i.jsx)(n,{})})]})})}},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:()=>i,x:()=>l});var s=n(6540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.bbe201c0.js b/assets/js/17896441.bbe201c0.js deleted file mode 100644 index 6fd9c5685..000000000 --- a/assets/js/17896441.bbe201c0.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7918],{3905:(e,t,n)=>{"use strict";n.d(t,{Zo:()=>d,kt:()=>f});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),i=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=i(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),m=i(n),p=o,f=m["".concat(s,".").concat(p)]||m[p]||u[p]||r;return n?a.createElement(f,l(l({ref:t},d),{},{components:n})):a.createElement(f,l({ref:t},d))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[m]="string"==typeof e?e:o,l[1]=c;for(var i=2;i<r;i++)l[i]=n[i];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},4700:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>Ot});var a=n(7294),o=n(833),r=n(902);const l=a.createContext(null);function c(e){let{children:t,content:n}=e;const o=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(l.Provider,{value:o},t)}function s(){const e=(0,a.useContext)(l);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=s();return a.createElement(o.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(6010),m=n(7524),u=n(7462),p=n(5999),f=n(9960);function h(e){const{permalink:t,title:n,subLabel:o,isNext:r}=e;return a.createElement(f.Z,{className:(0,d.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},o&&a.createElement("div",{className:"pagination-nav__sublabel"},o),a.createElement("div",{className:"pagination-nav__label"},n))}function g(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,p.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&a.createElement(h,(0,u.Z)({},t,{subLabel:a.createElement(p.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(h,(0,u.Z)({},n,{subLabel:a.createElement(p.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function b(){const{metadata:e}=s();return a.createElement(g,{previous:e.previous,next:e.next})}var v=n(2263),E=n(143),y=n(5281),k=n(373),N=n(4477);const C={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(p.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(p.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function L(e){const t=C[e.versionMetadata.banner];return a.createElement(t,e)}function T(e){let{versionLabel:t,to:n,onClick:o}=e;return a.createElement(p.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(f.Z,{to:n,onClick:o},a.createElement(p.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function _(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:o}}=(0,v.Z)(),{pluginId:r}=(0,E.gA)({failfast:!0}),{savePreferredVersionName:l}=(0,k.J)(r),{latestDocSuggestion:c,latestVersionSuggestion:s}=(0,E.Jo)(r),i=c??(m=s).docs.find((e=>e.id===m.mainDocId));var m;return a.createElement("div",{className:(0,d.Z)(t,y.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(L,{siteTitle:o,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(T,{versionLabel:s.label,to:i.path,onClick:()=>l(s.name)})))}function w(e){let{className:t}=e;const n=(0,N.E)();return n.banner?a.createElement(_,{className:t,versionMetadata:n}):null}function Z(e){let{className:t}=e;const n=(0,N.E)();return n.badge?a.createElement("span",{className:(0,d.Z)(t,y.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(p.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function x(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(p.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function B(e){let{lastUpdatedBy:t}=e;return a.createElement(p.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function O(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:o}=e;return a.createElement("span",{className:y.k.common.lastUpdated},a.createElement(p.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(x,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:o?a.createElement(B,{lastUpdatedBy:o}):""}},"Last updated{atDate}{byUser}"),!1)}const H={iconEdit:"iconEdit_Z9Sw"};function A(e){let{className:t,...n}=e;return a.createElement("svg",(0,u.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,d.Z)(H.iconEdit,t),"aria-hidden":"true"},n),a.createElement("g",null,a.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function j(e){let{editUrl:t}=e;return a.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:y.k.common.editThisPage},a.createElement(A,null),a.createElement(p.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}const S={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function I(e){let{permalink:t,label:n,count:o}=e;return a.createElement(f.Z,{href:t,className:(0,d.Z)(S.tag,o?S.tagWithCount:S.tagRegular)},n,o&&a.createElement("span",null,o))}const M={tags:"tags_jXut",tag:"tag_QGVx"};function P(e){let{tags:t}=e;return a.createElement(a.Fragment,null,a.createElement("b",null,a.createElement(p.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),a.createElement("ul",{className:(0,d.Z)(M.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return a.createElement("li",{key:n,className:M.tag},a.createElement(I,{label:t,permalink:n}))}))))}const U={lastUpdated:"lastUpdated_vwxv"};function z(e){return a.createElement("div",{className:(0,d.Z)(y.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(P,e)))}function V(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:o,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.Z)(y.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(j,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",U.lastUpdated)},(n||o)&&a.createElement(O,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:o})))}function D(){const{metadata:e}=s(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:r,tags:l}=e,c=l.length>0,i=!!(t||n||r);return c||i?a.createElement("footer",{className:(0,d.Z)(y.k.docs.docFooter,"docusaurus-mt-lg")},c&&a.createElement(z,{tags:l}),i&&a.createElement(V,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:o})):null}var R=n(6043),W=n(6668);function $(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,...o}=e;n>=0?t[n].children.push(o):a.push(o)})),a}function F(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function G(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>q(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(q(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function Y(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:t}}=(0,W.L)();return(0,a.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function J(e){const t=(0,a.useRef)(void 0),n=Y();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:o,minHeadingLevel:r,maxHeadingLevel:l}=e;function c(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),c=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let o=t;o<=n;o+=1)a.push(`h${o}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:l}),s=G(c,{anchorTopOffset:n.current}),i=e.find((e=>s&&s.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(o),e.classList.add(o),t.current=e):e.classList.remove(o)}(e,e===i)}))}return document.addEventListener("scroll",c),document.addEventListener("resize",c),c(),()=>{document.removeEventListener("scroll",c),document.removeEventListener("resize",c)}}),[e,n])}function Q(e){let{toc:t,className:n,linkClassName:o,isChild:r}=e;return t.length?a.createElement("ul",{className:r?void 0:n},t.map((e=>a.createElement("li",{key:e.id},a.createElement("a",{href:`#${e.id}`,className:o??void 0,dangerouslySetInnerHTML:{__html:e.value}}),a.createElement(Q,{isChild:!0,toc:e.children,className:n,linkClassName:o}))))):null}const X=a.memo(Q);function K(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:l,maxHeadingLevel:c,...s}=e;const i=(0,W.L)(),d=l??i.tableOfContents.minHeadingLevel,m=c??i.tableOfContents.maxHeadingLevel,p=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return(0,a.useMemo)((()=>F({toc:$(t),minHeadingLevel:n,maxHeadingLevel:o})),[t,n,o])}({toc:t,minHeadingLevel:d,maxHeadingLevel:m});return J((0,a.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:d,maxHeadingLevel:m}}),[o,r,d,m])),a.createElement(X,(0,u.Z)({toc:p,className:n,linkClassName:o},s))}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function te(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,u.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className)}),a.createElement(p.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const ne={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function ae(e){let{toc:t,className:n,minHeadingLevel:o,maxHeadingLevel:r}=e;const{collapsed:l,toggleCollapsed:c}=(0,R.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(ne.tocCollapsible,!l&&ne.tocCollapsibleExpanded,n)},a.createElement(te,{collapsed:l,onClick:c}),a.createElement(R.z,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:l},a.createElement(K,{toc:t,minHeadingLevel:o,maxHeadingLevel:r})))}const oe={tocMobile:"tocMobile_ITEo"};function re(){const{toc:e,frontMatter:t}=s();return a.createElement(ae,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(y.k.docs.docTocMobile,oe.tocMobile)})}const le={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},ce="table-of-contents__link toc-highlight",se="table-of-contents__link--active";function ie(e){let{className:t,...n}=e;return a.createElement("div",{className:(0,d.Z)(le.tableOfContents,"thin-scrollbar",t)},a.createElement(K,(0,u.Z)({},n,{linkClassName:ce,linkActiveClassName:se})))}function de(){const{toc:e,frontMatter:t}=s();return a.createElement(ie,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:y.k.docs.docTocDesktop})}const me={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function ue(e){let{as:t,id:n,...o}=e;const{navbar:{hideOnScroll:r}}=(0,W.L)();if("h1"===t||!n)return a.createElement(t,(0,u.Z)({},o,{id:void 0}));const l=(0,p.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof o.children?o.children:n});return a.createElement(t,(0,u.Z)({},o,{className:(0,d.Z)("anchor",r?me.anchorWithHideOnScrollNavbar:me.anchorWithStickyNavbar,o.className),id:n}),o.children,a.createElement(f.Z,{className:"hash-link",to:`#${n}`,"aria-label":l,title:l},"\u200b"))}var pe=n(3905),fe=n(5742);var he=n(2389),ge=n(2949);function be(){const{prism:e}=(0,W.L)(),{colorMode:t}=(0,ge.I)(),n=e.theme,a=e.darkTheme||n;return"dark"===t?a:n}var ve=n(7594),Ee=n.n(ve);const ye=/title=(?<quote>["'])(?<title>.*?)\1/,ke=/\{(?<range>[\d,-]+)\}/,Ne={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function Ce(e,t){const n=e.map((e=>{const{start:n,end:a}=Ne[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${a})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function Le(e,t){let n=e.replace(/\n$/,"");const{language:a,magicComments:o,metastring:r}=t;if(r&&ke.test(r)){const e=r.match(ke).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${r}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,a=Ee()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(a),code:n}}if(void 0===a)return{lineClassNames:{},code:n};const l=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return Ce(["js","jsBlock"],t);case"jsx":case"tsx":return Ce(["js","jsBlock","jsx"],t);case"html":return Ce(["js","jsBlock","html"],t);case"python":case"py":case"bash":return Ce(["bash"],t);case"markdown":case"md":return Ce(["html","jsx","bash"],t);default:return Ce(Object.keys(Ne),t)}}(a,o),c=n.split("\n"),s=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<c.length;){const e=c[p].match(l);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));i[t]?s[i[t]].range+=`${p},`:d[t]?s[d[t]].start=p:m[t]&&(s[m[t]].range+=`${s[m[t]].start}-${p-1},`),c.splice(p,1)}n=c.join("\n");const u={};return Object.entries(s).forEach((e=>{let[t,{range:n}]=e;Ee()(n).forEach((e=>{u[e]??=[],u[e].push(t)}))})),{lineClassNames:u,code:n}}const Te={codeBlockContainer:"codeBlockContainer_Ckt0"};function _e(e){let{as:t,...n}=e;const o=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[a,o]=e;const r=t[a];r&&"string"==typeof o&&(n[r]=o)})),n}(be());return a.createElement(t,(0,u.Z)({},n,{style:o,className:(0,d.Z)(n.className,Te.codeBlockContainer,y.k.common.codeBlock)}))}const we={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function Ze(e){let{children:t,className:n}=e;return a.createElement(_e,{as:"pre",tabIndex:0,className:(0,d.Z)(we.codeBlockStandalone,"thin-scrollbar",n)},a.createElement("code",{className:we.codeBlockLines},t))}const xe={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Be(e,t){const[n,o]=(0,a.useState)(),l=(0,a.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,a.useEffect)((()=>{l()}),[l]),function(e,t,n){void 0===n&&(n=xe);const o=(0,r.zX)(t),l=(0,r.Ql)(n);(0,a.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,l),()=>t.disconnect()}),[e,o,l])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),l())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const Oe={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"}}]};var He={Prism:n(7410).Z,theme:Oe};function Ae(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function je(){return je=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},je.apply(this,arguments)}var Se=/\r\n|\r|\n/,Ie=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},Me=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function Pe(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&-1===t.indexOf(a)&&(n[a]=e[a]);return n}var Ue=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),Ae(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,a=Object.create(null),o=e.styles.reduce((function(e,n){var a=n.languages,o=n.style;return a&&!a.includes(t)||n.types.forEach((function(t){var n=je({},e[t],o);e[t]=n})),e}),a);return o.root=n,o.plain=je({},n,{backgroundColor:null}),o}(e.theme,e.language):void 0;return t.themeDict=n})),Ae(this,"getLineProps",(function(e){var n=e.key,a=e.className,o=e.style,r=je({},Pe(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),l=t.getThemeDict(t.props);return void 0!==l&&(r.style=l.plain),void 0!==o&&(r.style=void 0!==r.style?je({},r.style,o):o),void 0!==n&&(r.key=n),a&&(r.className+=" "+a),r})),Ae(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,o=n.length,r=t.getThemeDict(t.props);if(void 0!==r){if(1===o&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===o&&!a)return r[n[0]];var l=a?{display:"inline-block"}:{},c=n.map((function(e){return r[e]}));return Object.assign.apply(Object,[l].concat(c))}})),Ae(this,"getTokenProps",(function(e){var n=e.key,a=e.className,o=e.style,r=e.token,l=je({},Pe(e,["key","className","style","token"]),{className:"token "+r.types.join(" "),children:r.content,style:t.getStyleForToken(r),key:void 0});return void 0!==o&&(l.style=void 0!==l.style?je({},l.style,o):o),void 0!==n&&(l.key=n),a&&(l.className+=" "+a),l})),Ae(this,"tokenize",(function(e,t,n,a){var o={code:t,grammar:n,language:a,tokens:[]};e.hooks.run("before-tokenize",o);var r=o.tokens=e.tokenize(o.code,o.grammar,o.language);return e.hooks.run("after-tokenize",o),r}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,a=e.code,o=e.children,r=this.getThemeDict(this.props),l=t.languages[n];return o({tokens:function(e){for(var t=[[]],n=[e],a=[0],o=[e.length],r=0,l=0,c=[],s=[c];l>-1;){for(;(r=a[l]++)<o[l];){var i=void 0,d=t[l],m=n[l][r];if("string"==typeof m?(d=l>0?d:["plain"],i=m):(d=Me(d,m.type),m.alias&&(d=Me(d,m.alias)),i=m.content),"string"==typeof i){var u=i.split(Se),p=u.length;c.push({types:d,content:u[0]});for(var f=1;f<p;f++)Ie(c),s.push(c=[]),c.push({types:d,content:u[f]})}else l++,t.push(d),n.push(i),a.push(0),o.push(i.length)}l--,t.pop(),n.pop(),a.pop(),o.pop()}return Ie(c),s}(void 0!==l?this.tokenize(t,a,l,n):[a]),className:"prism-code language-"+n,style:void 0!==r?r.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(a.Component);const ze=Ue,Ve={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function De(e){let{line:t,classNames:n,showLineNumbers:o,getLineProps:r,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=r({line:t,className:(0,d.Z)(n,o&&Ve.codeLine)}),s=t.map(((e,t)=>a.createElement("span",(0,u.Z)({key:t},l({token:e,key:t})))));return a.createElement("span",c,o?a.createElement(a.Fragment,null,a.createElement("span",{className:Ve.codeLineNumber}),a.createElement("span",{className:Ve.codeLineContent},s)):s,a.createElement("br",null))}function Re(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("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 We(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const $e={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function Fe(e){let{code:t,className:n}=e;const[o,r]=(0,a.useState)(!1),l=(0,a.useRef)(void 0),c=(0,a.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 a=document.createElement("textarea"),o=document.activeElement;a.value=e,a.setAttribute("readonly",""),a.style.contain="strict",a.style.position="absolute",a.style.left="-9999px",a.style.fontSize="12pt";const r=document.getSelection(),l=r.rangeCount>0&&r.getRangeAt(0);n.append(a),a.select(),a.selectionStart=0,a.selectionEnd=e.length;let c=!1;try{c=document.execCommand("copy")}catch{}a.remove(),l&&(r.removeAllRanges(),r.addRange(l)),o&&o.focus()}(t),r(!0),l.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,a.useEffect)((()=>()=>window.clearTimeout(l.current)),[]),a.createElement("button",{type:"button","aria-label":o?(0,p.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,p.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,p.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,d.Z)("clean-btn",n,$e.copyButton,o&&$e.copyButtonCopied),onClick:c},a.createElement("span",{className:$e.copyButtonIcons,"aria-hidden":"true"},a.createElement(Re,{className:$e.copyButtonIcon}),a.createElement(We,{className:$e.copyButtonSuccessIcon})))}function qe(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"}))}const Ge={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Ye(e){let{className:t,onClick:n,isEnabled:o}=e;const r=(0,p.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return a.createElement("button",{type:"button",onClick:n,className:(0,d.Z)("clean-btn",t,o&&Ge.wordWrapButtonEnabled),"aria-label":r,title:r},a.createElement(qe,{className:Ge.wordWrapButtonIcon,"aria-hidden":"true"}))}function Je(e){let{children:t,className:n="",metastring:o,title:r,showLineNumbers:l,language:c}=e;const{prism:{defaultLanguage:s,magicComments:i}}=(0,W.L)(),m=c??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??s,p=be(),f=function(){const[e,t]=(0,a.useState)(!1),[n,o]=(0,a.useState)(!1),r=(0,a.useRef)(null),l=(0,a.useCallback)((()=>{const n=r.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[r,e]),c=(0,a.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=r.current,n=e>t||r.current.querySelector("code").hasAttribute("style");o(n)}),[r]);return Be(r,c),(0,a.useEffect)((()=>{c()}),[e,c]),(0,a.useEffect)((()=>(window.addEventListener("resize",c,{passive:!0}),()=>{window.removeEventListener("resize",c)})),[c]),{codeBlockRef:r,isEnabled:e,isCodeScrollable:n,toggle:l}}(),h=function(e){return e?.match(ye)?.groups.title??""}(o)||r,{lineClassNames:g,code:b}=Le(t,{metastring:o,language:m,magicComments:i}),v=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return a.createElement(_e,{as:"div",className:(0,d.Z)(n,m&&!n.includes(`language-${m}`)&&`language-${m}`)},h&&a.createElement("div",{className:we.codeBlockTitle},h),a.createElement("div",{className:we.codeBlockContent},a.createElement(ze,(0,u.Z)({},He,{theme:p,code:b,language:m??"text"}),(e=>{let{className:t,tokens:n,getLineProps:o,getTokenProps:r}=e;return a.createElement("pre",{tabIndex:0,ref:f.codeBlockRef,className:(0,d.Z)(t,we.codeBlock,"thin-scrollbar")},a.createElement("code",{className:(0,d.Z)(we.codeBlockLines,v&&we.codeBlockLinesWithNumbering)},n.map(((e,t)=>a.createElement(De,{key:t,line:e,getLineProps:o,getTokenProps:r,classNames:g[t],showLineNumbers:v})))))})),a.createElement("div",{className:we.buttonGroup},(f.isEnabled||f.isCodeScrollable)&&a.createElement(Ye,{className:we.codeButton,onClick:()=>f.toggle(),isEnabled:f.isEnabled}),a.createElement(Fe,{className:we.codeButton,code:b}))))}function Qe(e){let{children:t,...n}=e;const o=(0,he.Z)(),r=function(e){return a.Children.toArray(e).some((e=>(0,a.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof r?Je:Ze;return a.createElement(l,(0,u.Z)({key:String(o)},n),r)}const Xe={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Ke(e){return!!e&&("SUMMARY"===e.tagName||Ke(e.parentElement))}function et(e,t){return!!e&&(e===t||et(e.parentElement,t))}function tt(e){let{summary:t,children:n,...o}=e;const r=(0,he.Z)(),l=(0,a.useRef)(null),{collapsed:c,setCollapsed:s}=(0,R.u)({initialState:!o.open}),[i,m]=(0,a.useState)(o.open),p=a.isValidElement(t)?t:a.createElement("summary",null,t??"Details");return a.createElement("details",(0,u.Z)({},o,{ref:l,open:i,"data-collapsed":c,className:(0,d.Z)(Xe.details,r&&Xe.isBrowser,o.className),onMouseDown:e=>{Ke(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Ke(t)&&et(t,l.current)&&(e.preventDefault(),c?(s(!1),m(!0)):s(!0))}}),p,a.createElement(R.z,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{s(e),m(!e)}},a.createElement("div",{className:Xe.collapsibleContent},n)))}const nt={details:"details_b_Ee"},at="alert alert--info";function ot(e){let{...t}=e;return a.createElement(tt,(0,u.Z)({},t,{className:(0,d.Z)(at,nt.details,t.className)}))}function rt(e){return a.createElement(ue,e)}const lt={containsTaskList:"containsTaskList_mC6p"};function ct(e){if(void 0!==e)return(0,d.Z)(e,e?.includes("contains-task-list")&<.containsTaskList)}const st={img:"img_ev3q"};const it="admonition_LlT9",dt="admonitionHeading_tbUL",mt="admonitionIcon_kALy",ut="admonitionContent_S0QG";const pt={note:{infimaClassName:"secondary",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:a.createElement(p.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:a.createElement(p.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:a.createElement(p.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:a.createElement(p.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 16 16"},a.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:a.createElement(p.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},ft={secondary:"note",important:"info",success:"tip",warning:"danger"};function ht(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=a.Children.toArray(e),n=t.find((e=>a.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),o=a.createElement(a.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:o}}(e.children);return{...e,title:e.title??t,children:n}}const gt={head:function(e){const t=a.Children.map(e.children,(e=>a.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...o}=e.props;return a.createElement(e.props.originalType,o)}return e}(e):e));return a.createElement(fe.Z,e,t)},code:function(e){const t=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return a.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,a.isValidElement)(e)&&t.includes(e.props?.mdxType)))?a.createElement("code",e):a.createElement(Qe,e)},a:function(e){return a.createElement(f.Z,e)},pre:function(e){return a.createElement(Qe,(0,a.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=a.Children.toArray(e.children),n=t.find((e=>a.isValidElement(e)&&"summary"===e.props?.mdxType)),o=a.createElement(a.Fragment,null,t.filter((e=>e!==n)));return a.createElement(ot,(0,u.Z)({},e,{summary:n}),o)},ul:function(e){return a.createElement("ul",(0,u.Z)({},e,{className:ct(e.className)}))},img:function(e){return a.createElement("img",(0,u.Z)({loading:"lazy"},e,{className:(t=e.className,(0,d.Z)(t,st.img))}));var t},h1:e=>a.createElement(rt,(0,u.Z)({as:"h1"},e)),h2:e=>a.createElement(rt,(0,u.Z)({as:"h2"},e)),h3:e=>a.createElement(rt,(0,u.Z)({as:"h3"},e)),h4:e=>a.createElement(rt,(0,u.Z)({as:"h4"},e)),h5:e=>a.createElement(rt,(0,u.Z)({as:"h5"},e)),h6:e=>a.createElement(rt,(0,u.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:o,icon:r}=ht(e),l=function(e){const t=ft[e]??e,n=pt[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),pt.info)}(n),c=o??l.label,{iconComponent:s}=l,i=r??a.createElement(s,null);return a.createElement("div",{className:(0,d.Z)(y.k.common.admonition,y.k.common.admonitionType(e.type),"alert",`alert--${l.infimaClassName}`,it)},a.createElement("div",{className:dt},a.createElement("span",{className:mt},i),c),a.createElement("div",{className:ut},t))},mermaid:()=>null};function bt(e){let{children:t}=e;return a.createElement(pe.Zo,{components:gt},t)}function vt(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=s();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(y.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(ue,{as:"h1"},n)),a.createElement(bt,null,t))}var Et=n(2802),yt=n(8596),kt=n(4996);function Nt(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const Ct={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function Lt(){const e=(0,kt.Z)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(f.Z,{"aria-label":(0,p.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},a.createElement(Nt,{className:Ct.breadcrumbHomeIcon})))}const Tt={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function _t(e){let{children:t,href:n,isLast:o}=e;const r="breadcrumbs__link";return o?a.createElement("span",{className:r,itemProp:"name"},t):n?a.createElement(f.Z,{className:r,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:r},t)}function wt(e){let{children:t,active:n,index:o,addMicrodata:r}=e;return a.createElement("li",(0,u.Z)({},r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,d.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(o+1)}))}function Zt(){const e=(0,Et.s1)(),t=(0,yt.Ns)();return e?a.createElement("nav",{className:(0,d.Z)(y.k.docs.docBreadcrumbs,Tt.breadcrumbsContainer),"aria-label":(0,p.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement(Lt,null),e.map(((t,n)=>{const o=n===e.length-1;return a.createElement(wt,{key:n,active:o,index:n,addMicrodata:!!t.href},a.createElement(_t,{href:t.href,isLast:o},t.label))})))):null}const xt={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Bt(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=s(),n=(0,m.i)(),o=e.hide_table_of_contents,r=!o&&t.length>0;return{hidden:o,mobile:r?a.createElement(re,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(de,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&xt.docItemCol)},a.createElement(w,null),a.createElement("div",{className:xt.docItemContainer},a.createElement("article",null,a.createElement(Zt,null),a.createElement(Z,null),n.mobile,a.createElement(vt,null,t),a.createElement(D,null)),a.createElement(b,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function Ot(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(c,{content:e.content},a.createElement(o.FG,{className:t},a.createElement(i,null),a.createElement(Bt,null,a.createElement(n,null))))}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>c,q:()=>l});var a=n(7294),o=n(902);const r=a.createContext(null);function l(e){let{children:t,version:n}=e;return a.createElement(r.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(r);if(null===e)throw new o.i6("DocsVersionProvider");return e}},7594:(e,t)=>{function n(e){let t,n=[];for(let a of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(a))n.push(parseInt(a,10));else if(t=a.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,a,o,r]=t;if(a&&r){a=parseInt(a),r=parseInt(r);const e=a<r?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(r+=e);for(let t=a;t!==r;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/19dd4331.7d3b5d29.js b/assets/js/19dd4331.7d3b5d29.js deleted file mode 100644 index 755cc7839..000000000 --- a/assets/js/19dd4331.7d3b5d29.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3516],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=l(n),f=a,g=c["".concat(s,".").concat(f)]||c[f]||d[f]||o;return n?r.createElement(g,p(p({ref:t},u),{},{components:n})):r.createElement(g,p({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=f;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:a,p[1]=i;for(var l=2;l<o;l++)p[l]=n[l];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},4169:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(7462),a=(n(7294),n(3905));const o={},p="updateAgent",i={unversionedId:"api/agents/update",id:"version-1.x.x/api/agents/update",title:"updateAgent",description:"Updates an existing Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/update.md",sourceDirName:"api/agents",slug:"/api/agents/update",permalink:"/docs/1.x.x/api/agents/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"},next:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"}},s={},l=[],u={toc:l},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"updateagent"},"updateAgent"),(0,a.kt)("p",null,"Updates an existing Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/agents/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"PUT")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing an ",(0,a.kt)("a",{parentName:"p",href:"/api/configuration/agents"},"Agent")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method updates an Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'PUT /api/v1beta1/agents/ag3f77f6\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n "credentials": {\n "username": "1001",\n "secret": "1234"\n },\n "domains": [\n "sip.local"\n ]\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/19dd4331.92fe643f.js b/assets/js/19dd4331.92fe643f.js new file mode 100644 index 000000000..bb23db4dd --- /dev/null +++ b/assets/js/19dd4331.92fe643f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4126],{5624:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=t(4848),r=t(8453);const i={},o="updateAgent",a={id:"api/agents/update",title:"updateAgent",description:"Updates an existing Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/update.md",sourceDirName:"api/agents",slug:"/api/agents/update",permalink:"/docs/1.x.x/api/agents/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"},next:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"}},c={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updateagent",children:"updateAgent"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing an ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/agents",children:"Agent"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates an Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/agents/ag3f77f6\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.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:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a1a9e3d.25a9d97e.js b/assets/js/1a1a9e3d.25a9d97e.js new file mode 100644 index 000000000..502a91d6e --- /dev/null +++ b/assets/js/1a1a9e3d.25a9d97e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8512],{332:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>u,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Intercom System with Routr and Kubernetes",u={id:"tutorials/intercom-system-with-routr-and-kubernetes",title:"Intercom System with Routr and Kubernetes",description:"Coming soon.",source:"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",sourceDirName:"tutorials",slug:"/tutorials/intercom-system-with-routr-and-kubernetes",permalink:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",tags:[],version:"current",frontMatter:{}},c={},a=[];function m(t){const e={h1:"h1",p:"p",...(0,o.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"intercom-system-with-routr-and-kubernetes",children:"Intercom System with Routr and Kubernetes"}),"\n",(0,r.jsx)(e.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(m,{...t})}):m(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>u});var r=n(6540);const o={},s=r.createContext(o);function i(t){const e=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:i(t.components),r.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a1a9e3d.e90b3a1d.js b/assets/js/1a1a9e3d.e90b3a1d.js deleted file mode 100644 index d280187c2..000000000 --- a/assets/js/1a1a9e3d.e90b3a1d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1407],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),m=u(r),f=o,d=m["".concat(c,".").concat(f)]||m[f]||p[f]||i;return r?n.createElement(d,a(a({ref:t},l),{},{components:r})):n.createElement(d,a({ref:t},l))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[m]="string"==typeof e?e:o,a[1]=s;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},8394:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={},a="Intercom System with Routr and Kubernetes",s={unversionedId:"tutorials/intercom-system-with-routr-and-kubernetes",id:"tutorials/intercom-system-with-routr-and-kubernetes",title:"Intercom System with Routr and Kubernetes",description:"Coming soon.",source:"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",sourceDirName:"tutorials",slug:"/tutorials/intercom-system-with-routr-and-kubernetes",permalink:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",tags:[],version:"current",frontMatter:{}},c={},u=[],l={toc:u},m="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"intercom-system-with-routr-and-kubernetes"},"Intercom System with Routr and Kubernetes"),(0,o.kt)("p",null,"Coming soon."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.9432810d.js b/assets/js/1a4e3797.9432810d.js new file mode 100644 index 000000000..06badd98a --- /dev/null +++ b/assets/js/1a4e3797.9432810d.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.9432810d.js.LICENSE.txt */ +(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2138],{2733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(o=s.slice()).length,u=0;u<a;u++)o[u].apply(this,c);return!0},t.prototype.addListener=function(e,s){var a;if(!r(s))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(s.listener)?s.listener:s),this._events[e]?n(this._events[e])?this._events[e].push(s):this._events[e]=[this._events[e],s]:this._events[e]=s,n(this._events[e])&&!this._events[e].warned&&(a=i(this._maxListeners)?t.defaultMaxListeners:this._maxListeners)&&a>0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},4103:(e,t,r)=>{"use strict";var n=r(6571),i=r(3371),s=r(7691);function a(e,t,r,i){return new n(e,t,r,i)}a.version=r(6938),a.AlgoliaSearchHelper=n,a.SearchParameters=i,a.SearchResults=s,e.exports=a},6732:(e,t,r)=>{"use strict";var n=r(2733);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(3014)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},1673:(e,t,r)=>{"use strict";var n=r(9110),i=r(317),s=r(1383),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},3371:(e,t,r)=>{"use strict";var n=r(9110),i=r(849),s=r(4843),a=r(4728),c=r(317),u=r(1383),o=r(7507),h=r(2208),f=r(1673);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=o(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,o(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=o(r),u=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m<f;){var d=l&&Array.isArray(l.data)?l.data:[];l=i(d,(function(e){return e.isRefined})),m++}}if(l){var p=Object.keys(h.data).map((function(e){return[e,h.data[e]]})).filter((function(e){return function(e,t,r,n,i,s){if(i&&(0!==e.indexOf(i)||i===e))return!1;return!i&&-1===e.indexOf(n)||i&&e.split(n).length-i.split(n).length==1||-1===e.indexOf(n)&&-1===r.indexOf(n)||0===r.indexOf(e)||0===e.indexOf(t+n)&&(s||0===e.indexOf(r))}(e[0],l.path||r,s,t,r,n)}));l.data=a(p.map((function(e){var r=e[0];return function(e,t,r,n,i){var s=t.split(r);return{name:s[s.length-1].trim(),path:t,escapedValue:c(t),count:e,isRefined:n===t||0===n.indexOf(t+r),exhaustive:i,data:null}}(e[1],r,t,u(s),h.exhaustive)})),e[0],e[1])}return o}}(m,h,f,l,o),v=t;return f&&(v=t.slice(f.split(h).length)),v.reduce(p,{name:e.hierarchicalFacets[r].name,count:null,isRefined:!0,path:null,escapedValue:null,exhaustive:d,data:null})}};var n=r(2909),i=r(849),s=r(7577),a=r(8601),c=n.escapeFacetValue,u=n.unescapeFacetValue},7691:(e,t,r)=>{"use strict";var n=r(8965),i=r(9110),s=r(2909),a=r(849),c=r(3917),u=r(7577),o=r(4728),h=r(8601),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(6673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var s=t[0];this._rawResults=t;var u=this;Object.keys(s).forEach((function(e){u[e]=s[e]}));var h=o({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){u[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),v=d(e.facets),g=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],o=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=g[t],u.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(u.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=v[t],u.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(u.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(u.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;u.hierarchicalFacets[r][m].data=o({},u.hierarchicalFacets[r][m].data,f)}else{r=g[t];var d=s.facets&&s.facets[t]||{};u.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(u.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!u.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(u.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var o=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(u.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!u.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=v[t];u.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){u.facets[n]=u.facets[n]||{name:t},u.facets[n].data=u.facets[n].data||{},u.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),u=e._state._getHierarchicalFacetSeparator(c),o=l(e._state.getHierarchicalRefinement(t)[0]||"");0===o.indexOf(c.rootPath)&&(o=o.replace(c.rootPath+u,""));var h=o.split(u);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,u=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var s,a=t.sortRemainingBy;return"hidden"===a?r:(s="alpha"===a?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,s[0],s[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=u(s.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),u=a(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},6571:(e,t,r)=>{"use strict";var n=r(2733),i=r(6732),s=r(2909).escapeFacetValue,a=r(3014),c=r(4728),u=r(317),o=r(1383),h=r(9228),f=r(3371),l=r(7691),m=r(6938);function d(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var i=r||{};i.index=t,this.state=f.make(i),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._searchResultsOptions=n}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}a(d,n),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return h._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=h._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new l(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new l(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:o(h._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=h.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var f,l=this;return i?f=this.client.searchForFacetValues([{indexName:c.index,params:o}]):a?f=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,f=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),f.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:f.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new f(e),this},d.prototype.hasRefinements=function(e){return!!u(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=h._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?h._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t<this._lastQueryIdReceived)){this._currentNbQueries-=t-this._lastQueryIdReceived,this._lastQueryIdReceived=t,0===this._currentNbQueries&&this.emit("searchQueueEmpty");var i=r.results.slice();e.forEach((function(e){var t=e.state,r=e.queriesCount,s=e.helper,a=i.splice(0,r);t.index?(s.lastResults=new l(t,a,n._searchResultsOptions),s.emit("result",{results:s.lastResults,state:t})):s.emit("result",{results:null,state:t})}))}},d.prototype._dispatchAlgoliaError=function(e,t){e<this._lastQueryIdReceived||(this._currentNbQueries-=e-this._lastQueryIdReceived,this._lastQueryIdReceived=e,this.emit("error",{error:t}),0===this._currentNbQueries&&this.emit("searchQueueEmpty"))},d.prototype.containsRefinement=function(e,t,r,n){return e||0!==t.length||0!==r.length||0!==n.length},d.prototype._hasDisjunctiveRefinements=function(e){return this.state.disjunctiveRefinements[e]&&this.state.disjunctiveRefinements[e].length>0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new i(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},8965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},9110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r<e.length;r++)if(t(e[r]))return e[r]}},3917:e=>{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r<e.length;r++)if(t(e[r]))return r;return-1}},7577:(e,t,r)=>{"use strict";var n=r(849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},3014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},4843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},4728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n<i;n++){var s=arguments[n];t(s)&&r(e,s)}return e}},317:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}},8601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e<t||s&&r||!i)return-1}return 0}e.exports=function(e,r,n){if(!Array.isArray(e))return[];Array.isArray(n)||(n=[]);var i=e.map((function(e,t){return{criteria:r.map((function(t){return e[t]})),index:t,value:e}}));return i.sort((function(e,r){for(var i=-1;++i<e.criteria.length;){var s=t(e.criteria[i],r.criteria[i]);if(s)return i>=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},7507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},9228:(e,t,r)=>{"use strict";var n=r(4728);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var u=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[a-1];c.facetFilters=a>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),a.length>0&&(u.numericFilters=a),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),u=s._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),a.length>0&&(o.facetFilters=a),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(u=f.split(h).length-1,s=f):(u=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=o.attributes[u]}else u=s.split(h).length-1,a=o.attributes[u];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),u))}};e.exports=s},2208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},6938:e=>{"use strict";e.exports="3.16.3"},3643:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){e(r,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))}))}return r}function n(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t<e.length;t++)r[t]=e[t];return r}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function a(e){var t,r="algoliasearch-client-js-".concat(e.key),n=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},s=function(){return JSON.parse(n().getItem(r)||"{}")},a=function(e){n().setItem(r,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,r=s(),n=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==i(e,2)[1].timestamp})));if(a(n),t){var c=Object.fromEntries(Object.entries(n).filter((function(e){var r=i(e,2)[1],n=(new Date).getTime();return!(r.timestamp+t<n)})));a(c)}};return{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];var i=0;return e.replace(/%s/g,(function(){return encodeURIComponent(r[i++])}))}var l={WithinQueryParameters:0,WithinHeaders:1};function m(e,t){var r=e||{},n=r.data||{};return Object.keys(r).forEach((function(e){-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(a)};var m={data:c,headers:u,method:o,url:_(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function x(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function _(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var A=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},N=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,u=n(s,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:D}}).searchForFacetValues(a,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},D=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},I=1,k=2,q=3;function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return I>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.22.1","-").concat(e)}),u()]}),userAgent:x("4.22.1").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return A(r(r(r({},s),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:N,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:D,findAnswers:Q}})}}}}))}return V.version="4.22.1",V}()},2672:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>T});var n=r(6540);function i(e){var t,r,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(r=i(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}const s=function(){for(var e,t,r=0,n="",s=arguments.length;r<s;r++)(e=arguments[r])&&(t=i(e))&&(n&&(n+=" "),n+=t);return n};var a=r(4103),c=r.n(a),u=r(3643),o=r.n(u),h=r(8193),f=r(5260),l=r(8774),m=r(4070),d=r(4586);const p=["zero","one","two","few","many","other"];function v(e){return p.filter((t=>e.includes(t)))}const g={locale:"en",pluralForms:v(["one","other"]),select:e=>1===e?"one":"other"};function y(){const{i18n:{currentLocale:e}}=(0,d.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:v(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`),g}}),[e])}function R(){const e=y();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}var F=r(4255),b=r(9532),j=r(9024),P=r(481),x=r(1312),_=r(8126),E=r(1062),O=r(9201),w=r(1107);const A={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};var N=r(4848);function H(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return(0,N.jsx)("div",{className:s("col","col--3","padding-left--none",A.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,N.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:A.searchVersionInput,children:i.versions.map(((e,t)=>(0,N.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function S(){const{i18n:{currentLocale:e}}=(0,d.A)(),{algolia:{appId:t,apiKey:r,indexName:i}}=(0,_.c)(),a=(0,E.C)(),u=function(){const{selectMessage:e}=R();return t=>e(t,(0,x.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". 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 document found|{count} documents found"},{count:t}))}(),p=function(){const e=(0,m.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,g]=(0,F.b)(),y={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[j,S]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return y;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),y),T=o()(t,r),Q=c()(T,i,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});Q.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void S({type:"reset"});const c=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>c(r[e].value)));return{title:i.pop(),url:a(t),summary:n.content?`${c(n.content.value)}...`:"",breadcrumbs:i}}));S({type:"update",value:{items:u,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[C,D]=(0,n.useState)(null),I=(0,n.useRef)(0),k=(0,n.useRef)(h.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&I.current>r&&S({type:"advance"}),I.current=r}),{threshold:1})),q=()=>v?(0,x.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,x.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),V=(0,b._q)((function(t){void 0===t&&(t=0),Q.addDisjunctiveFacetRefinement("docusaurus_tag","default"),Q.addDisjunctiveFacetRefinement("language",e),Object.entries(p.searchVersions).forEach((e=>{let[t,r]=e;Q.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),Q.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!C)return;const e=k.current;return e?(e.observe(C),()=>e.unobserve(C)):()=>!0}),[C]),(0,n.useEffect)((()=>{S({type:"reset"}),v&&(S({type:"loading"}),setTimeout((()=>{V()}),300))}),[v,p.searchVersions,V]),(0,n.useEffect)((()=>{j.lastPage&&0!==j.lastPage&&V(j.lastPage)}),[V,j.lastPage]),(0,N.jsxs)(O.A,{children:[(0,N.jsxs)(f.A,{children:[(0,N.jsx)("title",{children:(0,P.s)(q())}),(0,N.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,N.jsxs)("div",{className:"container margin-vert--lg",children:[(0,N.jsx)(w.A,{as:"h1",children:q()}),(0,N.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,N.jsx)("div",{className:s("col",A.searchQueryColumn,{"col--9":p.versioningEnabled,"col--12":!p.versioningEnabled}),children:(0,N.jsx)("input",{type:"search",name:"q",className:A.searchQueryInput,placeholder:(0,x.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,x.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>g(e.target.value),value:v,autoComplete:"off",autoFocus:!0})}),p.versioningEnabled&&(0,N.jsx)(H,{docsSearchVersionsHelpers:p})]}),(0,N.jsxs)("div",{className:"row",children:[(0,N.jsx)("div",{className:s("col","col--8",A.searchResultsColumn),children:!!j.totalResults&&u(j.totalResults)}),(0,N.jsx)("div",{className:s("col","col--4","text--right",A.searchLogoColumn),children:(0,N.jsx)(l.A,{to:"https://www.algolia.com/","aria-label":(0,x.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,N.jsx)("svg",{viewBox:"0 0 168 24",className:A.algoliaLogo,children:(0,N.jsxs)("g",{fill:"none",children:[(0,N.jsx)("path",{className:A.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,N.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,N.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),j.items.length>0?(0,N.jsx)("main",{children:j.items.map(((e,t)=>{let{title:r,url:n,summary:i,breadcrumbs:a}=e;return(0,N.jsxs)("article",{className:A.searchResultItem,children:[(0,N.jsx)(w.A,{as:"h2",className:A.searchResultItemHeading,children:(0,N.jsx)(l.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,N.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,N.jsx)("ul",{className:s("breadcrumbs",A.searchResultItemPath),children:a.map(((e,t)=>(0,N.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),i&&(0,N.jsx)("p",{className:A.searchResultItemSummary,dangerouslySetInnerHTML:{__html:i}})]},t)}))}):[v&&!j.loading&&(0,N.jsx)("p",{children:(0,N.jsx)(x.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!j.loading&&(0,N.jsx)("div",{className:A.loadingSpinner},"spinner")],j.hasMore&&(0,N.jsx)("div",{className:A.loader,ref:D,children:(0,N.jsx)(x.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function T(){return(0,N.jsx)(j.e3,{className:"search-page-wrapper",children:(0,N.jsx)(S,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.9432810d.js.LICENSE.txt b/assets/js/1a4e3797.9432810d.js.LICENSE.txt new file mode 100644 index 000000000..9caab8b19 --- /dev/null +++ b/assets/js/1a4e3797.9432810d.js.LICENSE.txt @@ -0,0 +1 @@ +/*! algoliasearch-lite.umd.js | 4.22.1 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1a4e3797.e0927861.js b/assets/js/1a4e3797.e0927861.js deleted file mode 100644 index 4d9c06303..000000000 --- a/assets/js/1a4e3797.e0927861.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1a4e3797.e0927861.js.LICENSE.txt */ -(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7920],{7331:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,a,s,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(a=this._events[e]))return!1;if(r(a))switch(arguments.length){case 1:a.call(this);break;case 2:a.call(this,arguments[1]);break;case 3:a.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),a.apply(this,c)}else if(n(a))for(c=Array.prototype.slice.call(arguments,1),s=(o=a.slice()).length,u=0;u<s;u++)o[u].apply(this,c);return!0},t.prototype.addListener=function(e,a){var s;if(!r(a))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(a.listener)?a.listener:a),this._events[e]?n(this._events[e])?this._events[e].push(a):this._events[e]=[this._events[e],a]:this._events[e]=a,n(this._events[e])&&!this._events[e].warned&&(s=i(this._maxListeners)?t.defaultMaxListeners:this._maxListeners)&&s>0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,a,s,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(i=this._events[e]).length,a=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=s;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){a=c;break}if(a<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},8131:(e,t,r)=>{"use strict";var n=r(9374),i=r(7775),a=r(3076);function s(e,t,r){return new n(e,t,r)}s.version=r(4336),s.AlgoliaSearchHelper=n,s.SearchParameters=i,s.SearchResults=a,e.exports=s},8078:(e,t,r)=>{"use strict";var n=r(7331);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(4853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},2437:(e,t,r)=>{"use strict";var n=r(2344),i=r(116),a=r(9803),s={addRefinement:function(e,t,r){if(s.isRefined(e,t,r))return e;var i=""+r,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return s.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return s.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return s.isRefined(e,t,r)?s.removeRefinement(e,t,r):s.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return a(e,[t]);if("function"==typeof t){var n=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,r)}));return c.length!==s.length&&(n=!0),i[a]=c,i}),{});return n?s:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=s},7775:(e,t,r)=>{"use strict";var n=r(2344),i=r(7888),a=r(2686),s=r(185),c=r(116),u=r(9803),o=r(8023),h=r(6801),f=r(2437);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return s({},e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=o(r);if(this.isNumericRefined(e,t,n))return this;var i=s({},this.numericRefinements);return i[e]=s({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,o(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var a=r[i],s={};return a=a||{},Object.keys(a).forEach((function(r){var n=a[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),s[r]=c})),n[i]=s,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var a,s,c=o(r),u=void 0!==(a=this.numericRefinements[e][t],s=c,i(a,(function(e){return l(e,s)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return a(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),a=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(a)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},210:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=a(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,a){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m<f;){var d=l&&Array.isArray(l.data)?l.data:[];l=i(d,(function(e){return e.isRefined})),m++}}if(l){var p=Object.keys(h.data).map((function(e){return[e,h.data[e]]})).filter((function(e){return function(e,t,r,n,i,a){if(i&&(0!==e.indexOf(i)||i===e))return!1;return!i&&-1===e.indexOf(n)||i&&e.split(n).length-i.split(n).length==1||-1===e.indexOf(n)&&-1===r.indexOf(n)||0===r.indexOf(e)||0===e.indexOf(t+n)&&(a||0===e.indexOf(r))}(e[0],l.path||r,a,t,r,n)}));l.data=s(p.map((function(e){var r=e[0];return function(e,t,r,n,i){var a=t.split(r);return{name:a[a.length-1].trim(),path:t,escapedValue:c(t),count:e,isRefined:n===t||0===n.indexOf(t+r),exhaustive:i,data:null}}(e[1],r,t,u(a),h.exhaustive)})),e[0],e[1])}return o}}(m,h,f,l,o),v=t;return f&&(v=t.slice(f.split(h).length)),v.reduce(p,{name:e.hierarchicalFacets[r].name,count:null,isRefined:!0,path:null,escapedValue:null,exhaustive:d,data:null})}};var n=r(4039),i=r(7888),a=r(2293),s=r(2148),c=n.escapeFacetValue,u=n.unescapeFacetValue},3076:(e,t,r)=>{"use strict";var n=r(4587),i=r(2344),a=r(4039),s=r(7888),c=r(9725),u=r(2293),o=r(185),h=r(2148),f=a.escapeFacetValue,l=a.unescapeFacetValue,m=r(210);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var a=t[0];this._rawResults=t;var u=this;Object.keys(a).forEach((function(e){u[e]=a[e]})),Object.keys(r||{}).forEach((function(e){u[e]=r[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var h=e.getRefinedDisjunctiveFacets(),f=d(e.facets),v=d(e.disjunctiveFacets),g=1,y=a.facets||{};Object.keys(y).forEach((function(t){var r,n,i=y[t],o=(r=e.hierarchicalFacets,n=t,s(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),l=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[l][h]={attribute:t,data:i,exhaustive:a.exhaustiveFacetsCount}}else{var m,d=-1!==e.disjunctiveFacets.indexOf(t),g=-1!==e.facets.indexOf(t);d&&(m=v[t],u.disjunctiveFacets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.disjunctiveFacets[m],a.facets_stats,t)),g&&(m=f[t],u.facets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.facets[m],a.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),h.forEach((function(r){var n=t[g],s=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(s).forEach((function(t){var r,f=s[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(u.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;u.hierarchicalFacets[r][m].data=o({},u.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=a.facets&&a.facets[t]||{};u.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(u.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!u.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(u.disjunctiveFacets[r].data[n]=0)}))}})),g++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),a=e._getHierarchicalFacetSeparator(n),s=e.getHierarchicalRefinement(r);0===s.length||s[0].split(a).length<2||t.slice(g).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var o=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(u.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(s.length>0){var m=s[0].split(a)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),g++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=f[t];u.facets[n]={name:t,data:y[t],exhaustive:a.exhaustiveFacetsCount},r.forEach((function(e){u.facets[n]=u.facets[n]||{name:t},u.facets[n].data=u.facets[n].data||{},u.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=s(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=s(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var a=s(e.hierarchicalFacets,r);if(!a)return a;var c=e._state.getHierarchicalFacetByName(t),u=e._state._getHierarchicalFacetSeparator(c),o=l(e._state.getHierarchicalRefinement(t)[0]||"");0===o.indexOf(c.rootPath)&&(o=o.replace(c.rootPath+u,""));var h=o.split(u);return h.unshift(t),y(a,h,0),a}}function y(e,t,r){e.isRefined=e.name===t[r],e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var a=t.data.map((function(t){return R(e,t,r,n+1)})),s=e(a,r[n]);return i({data:s},t)}function F(e,t){var r=s(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var a=s(i,(function(e){return e.name===r})),c=a&&a.data&&a.data[n]?a.data[n]:0,u=a&&a.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return s(this.facets,t)||s(this.disjunctiveFacets,t)||s(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,a=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),s=this;if(Array.isArray(r))n=[e];else n=s._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(a.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(s,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var a,s=t.sortRemainingBy;return"hidden"===s?r:(a="alpha"===s?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(a.sortBy)){var n=u(a.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof a.sortBy)return function(e,t){return t.sort(e)}(a.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),a=e._getHierarchicalFacetSeparator(i),c=r.split(a),u=s(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&s(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},9374:(e,t,r)=>{"use strict";var n=r(7331),i=r(8078),a=r(4039).escapeFacetValue,s=r(4853),c=r(185),u=r(116),o=r(9803),h=r(6394),f=r(7775),l=r(3076),m=r(4336);function d(e,t,r){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var n=r||{};n.index=t,this.state=f.make(n),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}s(d,n),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return h._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=h._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new l(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new l(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:o(h._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),a="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(a);var s=this.client.initIndex(n.index);if("function"!=typeof s.findAnswers)throw new Error(a);return s.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,s="function"==typeof this.client.initIndex;if(!i&&!s&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=h.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var f,l=this;return i?f=this.client.searchForFacetValues([{indexName:c.index,params:o}]):s?f=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,f=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),f.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=a(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:f.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new f(e),this},d.prototype.hasRefinements=function(e){return!!u(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=h._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?h._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),a=Array.prototype.concat.apply(n,i),s=this._queryId++;if(this._currentNbQueries++,!a.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,s));try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,r,s)).catch(this._dispatchAlgoliaError.bind(this,s))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){if(!(t<this._lastQueryIdReceived)){this._currentNbQueries-=t-this._lastQueryIdReceived,this._lastQueryIdReceived=t,0===this._currentNbQueries&&this.emit("searchQueueEmpty");var n=r.results.slice();e.forEach((function(e){var t=e.state,r=e.queriesCount,i=e.helper,a=n.splice(0,r);t.index?(i.lastResults=new l(t,a),i.emit("result",{results:i.lastResults,state:t})):i.emit("result",{results:null,state:t})}))}},d.prototype._dispatchAlgoliaError=function(e,t){e<this._lastQueryIdReceived||(this._currentNbQueries-=e-this._lastQueryIdReceived,this._lastQueryIdReceived=e,this.emit("error",{error:t}),0===this._currentNbQueries&&this.emit("searchQueueEmpty"))},d.prototype.containsRefinement=function(e,t,r,n){return e||0!==t.length||0!==r.length||0!==n.length},d.prototype._hasDisjunctiveRefinements=function(e){return this.state.disjunctiveRefinements[e]&&this.state.disjunctiveRefinements[e].length>0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new i(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},4587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},2344:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},4039:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r<e.length;r++)if(t(e[r]))return e[r]}},9725:e=>{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r<e.length;r++)if(t(e[r]))return r;return-1}},2293:(e,t,r)=>{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},4853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},2686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},185:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var a=n[i],s=e[i];void 0!==s&&void 0===a||(t(s)&&t(a)?e[i]=r(s,a):e[i]="object"==typeof(c=a)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n<i;n++){var a=arguments[n];t(a)&&r(e,a)}return e}},116:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},9803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}},2148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||n&&i||!r)return 1;if(!n&&e<t||a&&r||!i)return-1}return 0}e.exports=function(e,r,n){if(!Array.isArray(e))return[];Array.isArray(n)||(n=[]);var i=e.map((function(e,t){return{criteria:r.map((function(t){return e[t]})),index:t,value:e}}));return i.sort((function(e,r){for(var i=-1;++i<e.criteria.length;){var a=t(e.criteria[i],r.criteria[i]);if(a)return i>=n.length?a:"desc"===n[i]?-a:a}return e.index-r.index})),i.map((function(e){return e.value}))}},8023:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},6394:(e,t,r)=>{"use strict";var n=r(185);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var a={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:a._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:a._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),s=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(s.length>0&&s[0].split(c).length>1){var u=s[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,s){var c=a._getDisjunctiveFacetSearchParams(t,n.attribute,0===s);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[s-1];c.facetFilters=s>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(a._getHitsHierarchicalFacetsAttributes(e)).sort(),r=a._getFacetFilters(e),s=a._getNumericFilters(e),c=a._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),s.length>0&&(u.numericFilters=s),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var s=a._getFacetFilters(e,t,r),c=a._getNumericFilters(e,t),u=a._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?a._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),s.length>0&&(o.facetFilters=s),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var a=i[e]||[];t!==n&&a.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).sort().forEach((function(t){n.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).sort().forEach((function(e){(a[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).sort().forEach((function(e){var r=s[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(h)||!f&&!0===r||f&&f.split(h).length===a.split(h).length)return;f?(u=f.split(h).length-1,a=f):(u=a.split(h).length-2,a=a.slice(0,a.lastIndexOf(h))),s=o.attributes[u]}else u=a.split(h).length-1,s=o.attributes[u];s&&n.push([s+":"+a])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),a=n.split(i).length,s=r.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(n).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,r,s){var c=s.isDisjunctiveFacet(e)?s.clearRefinements(e):s,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},a._getHitsSearchParams(c),u))}};e.exports=a},6801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},4336:e=>{"use strict";e.exports="3.14.2"},290:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){e(r,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))}))}return r}function n(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(n=(s=c.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){i=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw a}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t<e.length;t++)r[t]=e[t];return r}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function s(e){var t,r="algoliasearch-client-js-".concat(e.key),n=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},a=function(){return JSON.parse(n().getItem(r)||"{}")},s=function(e){n().setItem(r,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,r=a(),n=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==i(e,2)[1].timestamp})));if(s(n),t){var c=Object.fromEntries(Object.entries(n).filter((function(e){var r=i(e,2)[1],n=(new Date).getTime();return!(r.timestamp+t<n)})));s(c)}};return{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return a()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],a=t[1];return Promise.all([n,a||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=a();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=a(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=n(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];var i=0;return e.replace(/%s/g,(function(){return encodeURIComponent(r[i++])}))}var l={WithinQueryParameters:0,WithinHeaders:1};function m(e,t){var r=e||{},n=r.data||{};return Object.keys(r).forEach((function(e){-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function P(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(a(r),a(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function j(e,t,n,i){var s=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,a){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(s)};var m={data:c,headers:u,method:o,url:E(h,n.path,f),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return s.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,a)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(s))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return P(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function E(e,t,r){var n=x(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function x(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var N=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),a=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:a,responsesCache:s,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var a={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(a,(function(){return f.requestsCache.get(a,(function(){return f.requestsCache.set(a,n()).then((function(e){return Promise.all([f.requestsCache.delete(a),e])}),(function(e){return Promise.all([f.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(a,e)}})},write:function(e,t){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:x(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var a=t.params,s=a.facetName,c=a.facetQuery,u=n(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(s,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},k=1,D=2,q=3;function V(e,t,n){var i,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},a=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(a),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(a),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(a),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return k>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return D>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[s({key:"".concat("4.20.0","-").concat(e)}),u()]}),userAgent:_("4.20.0").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return N(r(r(r({},a),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:A,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}}}}))}return V.version="4.20.0",V}()},6675:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>A});var n=r(7294),i=r(6010),a=r(8131),s=r.n(a),c=r(290),u=r.n(c),o=r(412),h=r(5742),f=r(9960),l=r(143),m=r(2263);const d=["zero","one","two","few","many","other"];function p(e){return d.filter((t=>e.includes(t)))}const v={locale:"en",pluralForms:p(["one","other"]),select:e=>1===e?"one":"other"};function g(){const{i18n:{currentLocale:e}}=(0,m.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:p(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`),v}}),[e])}function y(){const e=g();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),a=r.pluralForms.indexOf(i);return n[Math.min(a,n.length-1)]}(r,t,e)}}var R=r(6177),F=r(902),b=r(833),P=r(2128),j=r(5999),_=r(6278),E=r(239),x=r(7452);const O={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};function w(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return n.createElement("div",{className:(0,i.Z)("col","col--3","padding-left--none",O.searchVersionColumn)},r.map((e=>{let[i,a]=e;const s=r.length>1?`${i}: `:"";return n.createElement("select",{key:i,onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:O.searchVersionInput},a.versions.map(((e,t)=>n.createElement("option",{key:t,label:`${s}${e.label}`,value:e.name}))))})))}function N(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{algolia:{appId:t,apiKey:r,indexName:a}}=(0,_.L)(),c=(0,E.l)(),d=function(){const{selectMessage:e}=y();return t=>e(t,(0,j.I)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". 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 document found|{count} documents found"},{count:t}))}(),p=function(){const e=(0,l._r)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,g]=(0,R.K)(),b={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[N,A]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return b;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),b),H=u()(t,r),S=s()(H,a,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});S.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:a}}=e;if(""===t||!Array.isArray(r))return void A({type:"reset"});const s=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>s(r[e].value)));return{title:i.pop(),url:c(t),summary:n.content?`${s(n.content.value)}...`:"",breadcrumbs:i}}));A({type:"update",value:{items:u,query:t,totalResults:i,totalPages:a,lastPage:n,hasMore:a>n+1,loading:!1}})}));const[T,Q]=(0,n.useState)(null),C=(0,n.useRef)(0),I=(0,n.useRef)(o.Z.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&C.current>r&&A({type:"advance"}),C.current=r}),{threshold:1})),k=()=>v?(0,j.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,j.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),D=(0,F.zX)((function(t){void 0===t&&(t=0),S.addDisjunctiveFacetRefinement("docusaurus_tag","default"),S.addDisjunctiveFacetRefinement("language",e),Object.entries(p.searchVersions).forEach((e=>{let[t,r]=e;S.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),S.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!T)return;const e=I.current;return e?(e.observe(T),()=>e.unobserve(T)):()=>!0}),[T]),(0,n.useEffect)((()=>{A({type:"reset"}),v&&(A({type:"loading"}),setTimeout((()=>{D()}),300))}),[v,p.searchVersions,D]),(0,n.useEffect)((()=>{N.lastPage&&0!==N.lastPage&&D(N.lastPage)}),[D,N.lastPage]),n.createElement(x.Z,null,n.createElement(h.Z,null,n.createElement("title",null,(0,P.p)(k())),n.createElement("meta",{property:"robots",content:"noindex, follow"})),n.createElement("div",{className:"container margin-vert--lg"},n.createElement("h1",null,k()),n.createElement("form",{className:"row",onSubmit:e=>e.preventDefault()},n.createElement("div",{className:(0,i.Z)("col",O.searchQueryColumn,{"col--9":p.versioningEnabled,"col--12":!p.versioningEnabled})},n.createElement("input",{type:"search",name:"q",className:O.searchQueryInput,placeholder:(0,j.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,j.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>g(e.target.value),value:v,autoComplete:"off",autoFocus:!0})),p.versioningEnabled&&n.createElement(w,{docsSearchVersionsHelpers:p})),n.createElement("div",{className:"row"},n.createElement("div",{className:(0,i.Z)("col","col--8",O.searchResultsColumn)},!!N.totalResults&&d(N.totalResults)),n.createElement("div",{className:(0,i.Z)("col","col--4","text--right",O.searchLogoColumn)},n.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":(0,j.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"})},n.createElement("svg",{viewBox:"0 0 168 24",className:O.algoliaLogo},n.createElement("g",{fill:"none"},n.createElement("path",{className:O.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),n.createElement("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),n.createElement("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})))))),N.items.length>0?n.createElement("main",null,N.items.map(((e,t)=>{let{title:r,url:a,summary:s,breadcrumbs:c}=e;return n.createElement("article",{key:t,className:O.searchResultItem},n.createElement("h2",{className:O.searchResultItemHeading},n.createElement(f.Z,{to:a,dangerouslySetInnerHTML:{__html:r}})),c.length>0&&n.createElement("nav",{"aria-label":"breadcrumbs"},n.createElement("ul",{className:(0,i.Z)("breadcrumbs",O.searchResultItemPath)},c.map(((e,t)=>n.createElement("li",{key:t,className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}}))))),s&&n.createElement("p",{className:O.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}}))}))):[v&&!N.loading&&n.createElement("p",{key:"no-results"},n.createElement(j.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result"},"No results were found")),!!N.loading&&n.createElement("div",{key:"spinner",className:O.loadingSpinner})],N.hasMore&&n.createElement("div",{className:O.loader,ref:Q},n.createElement(j.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results"},"Fetching new results..."))))}function A(){return n.createElement(b.FG,{className:"search-page-wrapper"},n.createElement(N,null))}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.e0927861.js.LICENSE.txt b/assets/js/1a4e3797.e0927861.js.LICENSE.txt deleted file mode 100644 index 8c17e740e..000000000 --- a/assets/js/1a4e3797.e0927861.js.LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -/*! algoliasearch-lite.umd.js | 4.20.0 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1ad9bfe0.3711034a.js b/assets/js/1ad9bfe0.3711034a.js deleted file mode 100644 index 55626cc60..000000000 --- a/assets/js/1ad9bfe0.3711034a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3809],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),l=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,c=e.originalType,p=e.parentName,s=a(e,["components","mdxType","originalType","parentName"]),u=l(r),f=o,m=u["".concat(p,".").concat(f)]||u[f]||d[f]||c;return r?n.createElement(m,i(i({ref:t},s),{},{components:r})):n.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var c=r.length,i=new Array(c);i[0]=f;var a={};for(var p in t)hasOwnProperty.call(t,p)&&(a[p]=t[p]);a.originalType=e,a[u]="string"==typeof e?e:o,i[1]=a;for(var l=2;l<c;l++)i[l]=r[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},5004:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const c={},i="Orchestration with Docker",a={unversionedId:"development/orchestration-with-docker",id:"development/orchestration-with-docker",title:"Orchestration with Docker",description:"Coming soon.",source:"@site/docs/development/orchestration-with-docker.md",sourceDirName:"development",slug:"/development/orchestration-with-docker",permalink:"/docs/2.0.0/development/orchestration-with-docker",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-docker.md",tags:[],version:"current",frontMatter:{}},p={},l=[],s={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"orchestration-with-docker"},"Orchestration with Docker"),(0,o.kt)("p",null,"Coming soon."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ad9bfe0.ba73e09d.js b/assets/js/1ad9bfe0.ba73e09d.js new file mode 100644 index 000000000..fe5065bef --- /dev/null +++ b/assets/js/1ad9bfe0.ba73e09d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3383],{6807:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>a});var n=o(4848),r=o(8453);const c={},s="Orchestration with Docker",i={id:"development/orchestration-with-docker",title:"Orchestration with Docker",description:"Coming soon.",source:"@site/docs/development/orchestration-with-docker.md",sourceDirName:"development",slug:"/development/orchestration-with-docker",permalink:"/docs/2.0.0/development/orchestration-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-docker.md",tags:[],version:"current",frontMatter:{}},d={},a=[];function h(t){const e={h1:"h1",p:"p",...(0,r.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"orchestration-with-docker",children:"Orchestration with Docker"}),"\n",(0,n.jsx)(e.p,{children:"Coming soon."})]})}function u(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},8453:(t,e,o)=>{o.d(e,{R:()=>s,x:()=>i});var n=o(6540);const r={},c=n.createContext(r);function s(t){const e=n.useContext(c);return n.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),n.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b166456.afa392b3.js b/assets/js/1b166456.afa392b3.js new file mode 100644 index 000000000..bf05d0a67 --- /dev/null +++ b/assets/js/1b166456.afa392b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[208],{9778:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=s(4848),r=s(8453);const o={},i="getServerInfo",a={id:"api/sys/info",title:"getServerInfo",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/sys/info.md",sourceDirName:"api/sys",slug:"/api/sys/info",permalink:"/docs/1.x.x/api/sys/info",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/info.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"},next:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},c={},d=[];function l(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"getserverinfo",children:"getServerInfo"}),"\n",(0,t.jsx)(n.p,{children:"This method returns information about the server."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/system/info"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"GET"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsx)(n.p,{children:"Do not supply a request body with this method."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful this method returns relevant information about the server."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'GET /api/{apiversion}/system/info\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":{\n "version":"v1.0",\n "apiVersion":"v1beta1",\n "apiPath":"/api/v1beta1",\n "env":[\n {\n "var":"EXTERN_ADDR",\n "value":"172.220.246.46"\n },\n {\n "var":"LOCALNETS",\n "value": "192.168.1.149/31"\n },\n {\n "var":"REGISTRAR_INTF",\n "value": "External"\n }\n ]\n }\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var t=s(6540);const r={},o=t.createContext(r);function i(e){const n=t.useContext(o);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(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b166456.ccf891d9.js b/assets/js/1b166456.ccf891d9.js deleted file mode 100644 index 4c48b7691..000000000 --- a/assets/js/1b166456.ccf891d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8643],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),l=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=l(n),m=o,d=c["".concat(p,".").concat(m)]||c[m]||f[m]||a;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<a;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},2271:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={},s="getServerInfo",i={unversionedId:"api/sys/info",id:"version-1.x.x/api/sys/info",title:"getServerInfo",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/sys/info.md",sourceDirName:"api/sys",slug:"/api/sys/info",permalink:"/docs/1.x.x/api/sys/info",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/info.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"},next:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},p={},l=[],u={toc:l},c="wrapper";function f(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"getserverinfo"},"getServerInfo"),(0,o.kt)("p",null,"This method returns information about the server."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"URL")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"/system/info")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Method")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"GET")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Parameters")),(0,o.kt)("p",null,"This method does not receive any parameters."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Request body")),(0,o.kt)("p",null,"Do not supply a request body with this method."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Response")),(0,o.kt)("p",null,"If successful this method returns relevant information about the server."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Sample Call")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/system/info\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":{\n "version":"v1.0",\n "apiVersion":"v1beta1",\n "apiPath":"/api/v1beta1",\n "env":[\n {\n "var":"EXTERN_ADDR",\n "value":"172.220.246.46"\n },\n {\n "var":"LOCALNETS",\n "value": "192.168.1.149/31"\n },\n {\n "var":"REGISTRAR_INTF",\n "value": "External"\n }\n ]\n }\n}\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1be78505.8faf5f23.js b/assets/js/1be78505.8faf5f23.js deleted file mode 100644 index 4e5c787c1..000000000 --- a/assets/js/1be78505.8faf5f23.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ge});var a=n(7294),o=n(6010),l=n(833),r=n(5281),c=n(3320),i=n(2802),s=n(4477),d=n(1116),m=n(7452),u=n(5999),b=n(2466),p=n(5936);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),l=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(l.current?l.current=!1:a>=r?(c(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,p.S)((e=>{e.location.hash&&(l.current=!0,o(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(1442),g=n(6550),v=n(7524),k=n(6668),_=n(1327),C=n(7462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function N(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),x=n(902);const Z=Symbol("EmptyContext"),B=a.createContext(Z);function w(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),l=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return a.createElement(B.Provider,{value:l},t)}var y=n(6043),L=n(8596),A=n(9960),M=n(2389);function F(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function H(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,k.L)(),f=function(e){const t=(0,M.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),g=(0,i._F)(t,l),v=(0,L.Mg)(h,l),{collapsed:_,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===Z)throw new x.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!_),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const l=(0,x.D9)(t);(0,a.useEffect)((()=>{t&&!l&&n&&o(!1)}),[t,l,n,o])}({isActive:g,collapsed:_,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":_},p)},a.createElement("div",{className:(0,o.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v})},a.createElement(A.Z,(0,C.Z)({className:(0,o.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":v?"page":void 0,"aria-expanded":b?!_:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(F,{categoryLabel:u,onClick:e=>{e.preventDefault(),T()}})),a.createElement(y.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:_},a.createElement(j,{items:m,tabIndex:_?-1:0,onItemClick:n,activePath:l,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,l),E=(0,P.Z)(m);return a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(A.Z,(0,C.Z)({className:(0,o.Z)("menu__link",!E&&D.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const V={menuHtmlItem:"menuHtmlItem_M9Kj"};function U(e){let{item:t,level:n,index:l}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[V.menuHtmlItem,"menu__list-item"],s),key:l,dangerouslySetInnerHTML:{__html:c}})}function z(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(H,(0,C.Z)({item:t},n));case"html":return a.createElement(U,(0,C.Z)({item:t},n));default:return a.createElement(R,(0,C.Z)({item:t},n))}}function K(e){let{items:t,...n}=e;return a.createElement(w,null,t.map(((e,t)=>a.createElement(z,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),q={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function G(e){let{path:t,sidebar:n,className:l}=e;const c=function(){const{isActive:e}=(0,T.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.Z)("menu thin-scrollbar",q.menu,c&&q.menuWithAnnouncementBar,l)},a.createElement("ul",{className:(0,o.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const Y="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:l,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,o.Z)(Y,c&&O,r&&X)},c&&a.createElement(_.Z,{tabIndex:-1,className:J}),a.createElement(G,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:l}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const l=(0,te.e)();return a.createElement("ul",{className:(0,o.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&l.toggle(),"link"===e.type&&l.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const oe=a.memo(ae);function le(e){const t=(0,v.i)(),n="desktop"===t||"ssr"===t,o="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),o&&a.createElement(oe,e))}const re={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function ce(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:re.expandButton,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:re.expandButtonIcon}))}const ie={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function se(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function de(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:l}=e;const{pathname:c}=(0,g.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,f.n)()&&s(!0),l((e=>!e))}),[l,i]);return a.createElement("aside",{className:(0,o.Z)(r.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&s(!0)}},a.createElement(se,null,a.createElement("div",{className:(0,o.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(le,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(ce,{toggleSidebar:d}))))}const me={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const l=(0,d.V)();return a.createElement("main",{className:(0,o.Z)(me.docMainContainer,(t||!l)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,o.Z)("container padding-top--md padding-bottom--lg",me.docItemWrapper,t&&me.docItemWrapperEnhanced)},n))}const be={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX","themedComponent--light":"themedComponent--light_NU7w"};function pe(e){let{children:t}=e;const n=(0,d.V)(),[o,l]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:be.docsWrapper},a.createElement(E,null),a.createElement("div",{className:be.docPage},n&&a.createElement(de,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:l}),a.createElement(ue,{hiddenSidebarContainer:o},t)))}var he=n(4972),Ee=n(197);function fe(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(Ee.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(l.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function ge(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(he.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(fe,e),a.createElement(l.FG,{className:(0,o.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(pe,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(7294),o=n(5999),l=n(833),r=n(7452);function c(){return a.createElement(a.Fragment,null,a.createElement(l.d,{title:(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},4477:(e,t,n)=>{n.d(t,{E:()=>c,q:()=>r});var a=n(7294),o=n(902);const l=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(l.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(l);if(null===e)throw new o.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1cd31f12.a5a94d63.js b/assets/js/1cd31f12.a5a94d63.js new file mode 100644 index 000000000..4bfc95b5e --- /dev/null +++ b/assets/js/1cd31f12.a5a94d63.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5056],{5622:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=n(4848),r=n(8453);const i={},d="deleteAgent",l={id:"api/agents/delete",title:"deleteAgent",description:"Removes an Agent resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/agents/delete.md",sourceDirName:"api/agents",slug:"/api/agents/delete",permalink:"/docs/1.x.x/api/agents/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"},next:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"}},o={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deleteagent",children:"deleteAgent"}),"\n",(0,s.jsx)(t.p,{children:"Removes an Agent resource from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>l});var s=n(6540);const r={},i=s.createContext(r);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1cd31f12.a9208342.js b/assets/js/1cd31f12.a9208342.js deleted file mode 100644 index 9b521dbde..000000000 --- a/assets/js/1cd31f12.a9208342.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6127],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),i=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=i(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=i(n),d=a,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[u]="string"==typeof e?e:a,l[1]=p;for(var i=2;i<o;i++)l[i]=n[i];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},5616:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>i});var r=n(7462),a=(n(7294),n(3905));const o={},l="deleteAgent",p={unversionedId:"api/agents/delete",id:"version-1.x.x/api/agents/delete",title:"deleteAgent",description:"Removes an Agent resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/agents/delete.md",sourceDirName:"api/agents",slug:"/api/agents/delete",permalink:"/docs/1.x.x/api/agents/delete",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"},next:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"}},s={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deleteagent"},"deleteAgent"),(0,a.kt)("p",null,"Removes an Agent resource from a persistent database."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/agents/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"DELETE")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method removes an Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'DELETE /api/v1beta1/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ea220c7.4d9064f9.js b/assets/js/1ea220c7.4d9064f9.js deleted file mode 100644 index 4517c5920..000000000 --- a/assets/js/1ea220c7.4d9064f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4807],{3905:(e,n,r)=>{r.d(n,{Zo:()=>l,kt:()=>f});var t=r(7294);function o(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function u(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function i(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?u(Object(r),!0).forEach((function(n){o(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):u(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function s(e,n){if(null==e)return{};var r,t,o=function(e,n){if(null==e)return{};var r,t,o={},u=Object.keys(e);for(t=0;t<u.length;t++)r=u[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(t=0;t<u.length;t++)r=u[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var a=t.createContext({}),c=function(e){var n=t.useContext(a),r=n;return e&&(r="function"==typeof e?e(n):i(i({},n),e)),r},l=function(e){var n=c(e.components);return t.createElement(a.Provider,{value:n},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},b=t.forwardRef((function(e,n){var r=e.components,o=e.mdxType,u=e.originalType,a=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(r),b=o,f=p["".concat(a,".").concat(b)]||p[b]||d[b]||u;return r?t.createElement(f,i(i({ref:n},l),{},{components:r})):t.createElement(f,i({ref:n},l))}));function f(e,n){var r=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var u=r.length,i=new Array(u);i[0]=b;var s={};for(var a in n)hasOwnProperty.call(n,a)&&(s[a]=n[a]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<u;c++)i[c]=r[c];return t.createElement.apply(null,i)}return t.createElement.apply(null,r)}b.displayName="MDXCreateElement"},4239:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>d,frontMatter:()=>u,metadata:()=>s,toc:()=>c});var t=r(7462),o=(r(7294),r(3905));const u={},i="Running on Kubernetes",s={unversionedId:"guides/running-on-kubernetes",id:"version-1.x.x/guides/running-on-kubernetes",title:"Running on Kubernetes",description:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.",source:"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",sourceDirName:"guides",slug:"/guides/running-on-kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"},next:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"}},a={},c=[{value:"Run in Kubernetes",id:"run-in-kubernetes",level:2}],l={toc:c},p="wrapper";function d(e){let{components:n,...r}=e;return(0,o.kt)(p,(0,t.Z)({},l,r,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"running-on-kubernetes"},"Running on Kubernetes"),(0,o.kt)("p",null,"This document is a short guide about running the dockerized version of Routr Server on Kubernetes."),(0,o.kt)("h2",{id:"run-in-kubernetes"},"Run in Kubernetes"),(0,o.kt)("p",null,"To run Routr in Kubernetes, you must set your EXTERN_ADDR in ",(0,o.kt)("inlineCode",{parentName:"p"},".k8s/routr.yml"),"."),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"This variable must be set to the public address(if running Routr locally, use your host address)")),(0,o.kt)("p",null,"Additionally, you must create the following Kubernetes resources:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl create -f k8s/configmaps.yml\nkubectl create -f k8s/redis.yml\nkubectl create -f k8s/routr.yml\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ea220c7.919e9360.js b/assets/js/1ea220c7.919e9360.js new file mode 100644 index 000000000..e26bbaa39 --- /dev/null +++ b/assets/js/1ea220c7.919e9360.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6792],{1009:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var t=r(4848),s=r(8453);const o={},u="Running on Kubernetes",i={id:"guides/running-on-kubernetes",title:"Running on Kubernetes",description:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.",source:"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",sourceDirName:"guides",slug:"/guides/running-on-kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"},next:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"}},c={},d=[{value:"Run in Kubernetes",id:"run-in-kubernetes",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"running-on-kubernetes",children:"Running on Kubernetes"}),"\n",(0,t.jsx)(n.p,{children:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes."}),"\n",(0,t.jsx)(n.h2,{id:"run-in-kubernetes",children:"Run in Kubernetes"}),"\n",(0,t.jsxs)(n.p,{children:["To run Routr in Kubernetes, you must set your EXTERN_ADDR in ",(0,t.jsx)(n.code,{children:".k8s/routr.yml"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This variable must be set to the public address(if running Routr locally, use your host address)"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Additionally, you must create the following Kubernetes resources:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl create -f k8s/configmaps.yml\nkubectl create -f k8s/redis.yml\nkubectl create -f k8s/routr.yml\n"})})]})}function a(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>u,x:()=>i});var t=r(6540);const s={},o=t.createContext(s);function u(e){const n=t.useContext(o);return t.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(s):e.components||s:u(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ffdd7de.43072233.js b/assets/js/1ffdd7de.43072233.js new file mode 100644 index 000000000..4f796393f --- /dev/null +++ b/assets/js/1ffdd7de.43072233.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7782],{3437:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>n,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var o=r(4848),s=r(8453);const i={},n="FAQs",a={id:"faqs",title:"FAQs",description:"What is Routr?",source:"@site/docs/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/docs/2.0.0/faqs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/faqs.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"},next:{title:"Changelog",permalink:"/docs/2.0.0/changelog"}},c={},u=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:2},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:2},{value:"Is Routr a Media Server?",id:"is-routr-a-media-server",level:2},{value:"Which language is the team using to build Routr?",id:"which-language-is-the-team-using-to-build-routr",level:2},{value:"What license does Routr use?",id:"what-license-does-routr-use",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"faqs",children:"FAQs"}),"\n",(0,o.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,o.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,o.jsx)(t.h2,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,o.jsx)(t.p,{children:"The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache."}),"\n",(0,o.jsx)(t.p,{children:"In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes."}),"\n",(0,o.jsx)(t.h2,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,o.jsx)(t.p,{children:"Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently."}),"\n",(0,o.jsx)(t.p,{children:"For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one."}),"\n",(0,o.jsx)(t.h2,{id:"is-routr-a-media-server",children:"Is Routr a Media Server?"}),"\n",(0,o.jsx)(t.p,{children:"Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk."}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"This is useful when you need load balancing"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"which-language-is-the-team-using-to-build-routr",children:"Which language is the team using to build Routr?"}),"\n",(0,o.jsx)(t.p,{children:"The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS."}),"\n",(0,o.jsx)(t.h2,{id:"what-license-does-routr-use",children:"What license does Routr use?"}),"\n",(0,o.jsxs)(t.p,{children:["We release Routr under the ",(0,o.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/LICENSE",children:"MIT license"}),"."]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>n,x:()=>a});var o=r(6540);const s={},i=o.createContext(s);function n(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ffdd7de.fd67ff6a.js b/assets/js/1ffdd7de.fd67ff6a.js deleted file mode 100644 index 3baac9c78..000000000 --- a/assets/js/1ffdd7de.fd67ff6a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3211],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=o.createContext({}),l=function(e){var t=o.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=l(e.components);return o.createElement(u.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,u=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=l(r),h=n,m=d["".concat(u,".").concat(h)]||d[h]||p[h]||a;return r?o.createElement(m,i(i({ref:t},c),{},{components:r})):o.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=h;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[d]="string"==typeof e?e:n,i[1]=s;for(var l=2;l<a;l++)i[l]=r[l];return o.createElement.apply(null,i)}return o.createElement.apply(null,r)}h.displayName="MDXCreateElement"},1150:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=r(7462),n=(r(7294),r(3905));const a={},i="FAQs",s={unversionedId:"faqs",id:"faqs",title:"FAQs",description:"What is Routr?",source:"@site/docs/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/docs/2.0.0/faqs",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/faqs.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"},next:{title:"Changelog",permalink:"/docs/2.0.0/changelog"}},u={},l=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:2},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:2},{value:"Is Routr a Media Server?",id:"is-routr-a-media-server",level:2},{value:"Which language is the team using to build Routr?",id:"which-language-is-the-team-using-to-build-routr",level:2},{value:"What license does Routr use?",id:"what-license-does-routr-use",level:2}],c={toc:l},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"faqs"},"FAQs"),(0,n.kt)("h2",{id:"what-is-routr"},"What is Routr?"),(0,n.kt)("p",null,"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."),(0,n.kt)("h2",{id:"what-dependencies-does-routr-have"},"What dependencies does Routr have?"),(0,n.kt)("p",null,"The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache."),(0,n.kt)("p",null,"In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes."),(0,n.kt)("h2",{id:"how-does-routr-compare-with-other-sip-servers"},"How does Routr compare with other SIP servers"),(0,n.kt)("p",null,"Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently. "),(0,n.kt)("p",null,"For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one."),(0,n.kt)("h2",{id:"is-routr-a-media-server"},"Is Routr a Media Server?"),(0,n.kt)("p",null,"Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk. "),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"This is useful when you need load balancing")),(0,n.kt)("h2",{id:"which-language-is-the-team-using-to-build-routr"},"Which language is the team using to build Routr?"),(0,n.kt)("p",null,"The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS."),(0,n.kt)("h2",{id:"what-license-does-routr-use"},"What license does Routr use?"),(0,n.kt)("p",null,"We release Routr under the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/LICENSE"},"MIT license"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/210b7c69.a893dcf4.js b/assets/js/210b7c69.a893dcf4.js deleted file mode 100644 index cb445e3e3..000000000 --- a/assets/js/210b7c69.a893dcf4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4569],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(n),h=o,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||a;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var p=2;p<a;p++)s[p]=n[p];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}h.displayName="MDXCreateElement"},820:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var r=n(7462),o=(n(7294),n(3905));const a={},s="SimpleAuth Service",i={unversionedId:"development/components/simpleauth",id:"development/components/simpleauth",title:"SimpleAuth Service",description:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.",source:"@site/docs/development/components/simpleauth.md",sourceDirName:"development/components",slug:"/development/components/simpleauth",permalink:"/docs/2.0.0/development/components/simpleauth",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/simpleauth.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"},next:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"}},l={},p=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the SimpleAuth with Docker",id:"launching-the-simpleauth-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"simpleauth-service"},"SimpleAuth Service"),(0,o.kt)("p",null,"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments."),(0,o.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,o.kt)("p",null,"The SimpleAuth provides the following environment variables for configuration:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"BIND_ADDR")," - The address where the service will listen for gRPC requests. Default: ",(0,o.kt)("inlineCode",{parentName:"li"},"0.0.0.0:51903")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ALLOWLIST")," - A comma-separated list of Users allowed to bypass authentication"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"METHODS")," - A comma-separated list of SIP methods that require authentication (e.g., ",(0,o.kt)("inlineCode",{parentName:"li"},"INVITE, REGISTER, MESSAGE"),"). Required."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"PATH_TO_AUTH")," - The path to a file containing the credentials for the users")),(0,o.kt)("p",null,"Example of the authentication file:"),(0,o.kt)("p",null,"Filename ",(0,o.kt)("inlineCode",{parentName:"p"},"auth.json")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'[\n { \n "username": "1001", \n "secret": "1234" \n },\n { \n "username": "john",\n "secret": "1234" \n }\n]\n')),(0,o.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,o.kt)("p",null,"The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid. "),(0,o.kt)("p",null,"The following is the protobuf definition for the SimpleAuth service:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-protobuf"},'\n```protobuf\nsyntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n')),(0,o.kt)("p",null,"Link to the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto"},"protobuf definition.")),(0,o.kt)("h2",{id:"launching-the-simpleauth-with-docker"},"Launching the SimpleAuth with Docker"),(0,o.kt)("p",null,"The SimpleAuth is available as a Docker image from ",(0,o.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-simpleauth"},"Docker Hub"),". To launch the SimpleAuth with Docker, you can use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it \\\n -p 51903:51903 \\\n -e ALLOWLIST=anonymous,1001 \\\n -e METHODS=INVITE,REGISTER,MESSAGE \\\n -e PATH_TO_AUTH=/path/to/auth.json \\\n -v /path/to/auth.json:/path/to/auth.json \\\n fonoster/routr-simpleauth\n")),(0,o.kt)("p",null,"The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, ",(0,o.kt)("inlineCode",{parentName:"p"},"51903"),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."),(0,o.kt)("h2",{id:"quick-test-with-grpcurl"},"Quick Test with gRPCurl"),(0,o.kt)("p",null,"One easy way to interact with SimpleAuth for testing and development is to use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fullstorydev/grpcurl"},"gRPCurl"),". The following example shows how to send a SIP Message to the SimpleAuth."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/210b7c69.f12cb937.js b/assets/js/210b7c69.f12cb937.js new file mode 100644 index 000000000..4d99389dc --- /dev/null +++ b/assets/js/210b7c69.f12cb937.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1703],{9633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="SimpleAuth Service",a={id:"development/components/simpleauth",title:"SimpleAuth Service",description:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.",source:"@site/docs/development/components/simpleauth.md",sourceDirName:"development/components",slug:"/development/components/simpleauth",permalink:"/docs/2.0.0/development/components/simpleauth",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/simpleauth.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"},next:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the SimpleAuth with Docker",id:"launching-the-simpleauth-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"simpleauth-service",children:"SimpleAuth Service"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth provides the following environment variables for configuration:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the service will listen for gRPC requests. Default: ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ALLOWLIST"})," - A comma-separated list of Users allowed to bypass authentication"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"METHODS"})," - A comma-separated list of SIP methods that require authentication (e.g., ",(0,s.jsx)(n.code,{children:"INVITE, REGISTER, MESSAGE"}),"). Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"PATH_TO_AUTH"})," - The path to a file containing the credentials for the users"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of the authentication file:"}),"\n",(0,s.jsxs)(n.p,{children:["Filename ",(0,s.jsx)(n.code,{children:"auth.json"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n { \n "username": "1001", \n "secret": "1234" \n },\n { \n "username": "john",\n "secret": "1234" \n }\n]\n'})}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:"The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid."}),"\n",(0,s.jsx)(n.p,{children:"The following is the protobuf definition for the SimpleAuth service:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'\n```protobuf\nsyntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-simpleauth-with-docker",children:"Launching the SimpleAuth with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The SimpleAuth is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-simpleauth",children:"Docker Hub"}),". To launch the SimpleAuth with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -p 51903:51903 \\\n -e ALLOWLIST=anonymous,1001 \\\n -e METHODS=INVITE,REGISTER,MESSAGE \\\n -e PATH_TO_AUTH=/path/to/auth.json \\\n -v /path/to/auth.json:/path/to/auth.json \\\n fonoster/routr-simpleauth\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with SimpleAuth for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the SimpleAuth."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.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:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21169ea0.35b2402c.js b/assets/js/21169ea0.35b2402c.js deleted file mode 100644 index 6c2916f19..000000000 --- a/assets/js/21169ea0.35b2402c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4859],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),l=u(r),m=o,d=l["".concat(s,".").concat(m)]||l[m]||f[m]||i;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=m;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[l]="string"==typeof e?e:o,c[1]=a;for(var u=2;u<i;u++)c[u]=r[u];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},6789:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>f,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={},c="Orchestration with Kubernetes",a={unversionedId:"development/orchestration-with-kubernetes",id:"development/orchestration-with-kubernetes",title:"Orchestration with Kubernetes",description:"Coming soon.",source:"@site/docs/development/orchestration-with-kubernetes.md",sourceDirName:"development",slug:"/development/orchestration-with-kubernetes",permalink:"/docs/2.0.0/development/orchestration-with-kubernetes",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-kubernetes.md",tags:[],version:"current",frontMatter:{}},s={},u=[],p={toc:u},l="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"orchestration-with-kubernetes"},"Orchestration with Kubernetes"),(0,o.kt)("p",null,"Coming soon."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/21169ea0.41ddd5b2.js b/assets/js/21169ea0.41ddd5b2.js new file mode 100644 index 000000000..5e84fe411 --- /dev/null +++ b/assets/js/21169ea0.41ddd5b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9504],{7235:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=n(4848),r=n(8453);const s={},i="Orchestration with Kubernetes",c={id:"development/orchestration-with-kubernetes",title:"Orchestration with Kubernetes",description:"Coming soon.",source:"@site/docs/development/orchestration-with-kubernetes.md",sourceDirName:"development",slug:"/development/orchestration-with-kubernetes",permalink:"/docs/2.0.0/development/orchestration-with-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-kubernetes.md",tags:[],version:"current",frontMatter:{}},u={},a=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"orchestration-with-kubernetes",children:"Orchestration with Kubernetes"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2237.09ea1ac9.js b/assets/js/2237.09ea1ac9.js new file mode 100644 index 000000000..a21a5fd25 --- /dev/null +++ b/assets/js/2237.09ea1ac9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2237],{3363:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var o=n(8215),i=n(1312),s=n(1107),r=n(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,o.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)(i.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.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)(i.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 o=n(1312),i=n(9024),s=n(9201),r=n(3363),a=n(4848);function d(){const e=(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/23efd64d.663a4a48.js b/assets/js/23efd64d.663a4a48.js deleted file mode 100644 index 5b11066b1..000000000 --- a/assets/js/23efd64d.663a4a48.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4277],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>g});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function u(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var a=n.createContext({}),s=function(e){var r=n.useContext(a),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},p=function(e){var r=s(e.components);return n.createElement(a.Provider,{value:r},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,p=u(e,["components","mdxType","originalType","parentName"]),l=s(t),f=o,g=l["".concat(a,".").concat(f)]||l[f]||d[f]||i;return t?n.createElement(g,c(c({ref:r},p),{},{components:t})):n.createElement(g,c({ref:r},p))}));function g(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var i=t.length,c=new Array(i);c[0]=f;var u={};for(var a in r)hasOwnProperty.call(r,a)&&(u[a]=r[a]);u.originalType=e,u[l]="string"==typeof e?e:o,c[1]=u;for(var s=2;s<i;s++)c[s]=t[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},4588:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>u,toc:()=>s});var n=t(7462),o=(t(7294),t(3905));const i={},c="Running with Docker",u={unversionedId:"guides/running-with-docker-or-compose",id:"version-1.x.x/guides/running-with-docker-or-compose",title:"Running with Docker",description:"Please refer to Docker Hub for a detail guide on how to use Routr's docker image.",source:"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",sourceDirName:"guides",slug:"/guides/running-with-docker-or-compose",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"},next:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"}},a={},s=[],p={toc:s},l="wrapper";function d(e){let{components:r,...t}=e;return(0,o.kt)(l,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"running-with-docker"},"Running with Docker"),(0,o.kt)("p",null,"Please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://hub.docker.com/repository/docker/fonoster/routr"},"Docker Hub")," for a detail guide on how to use Routr's docker image."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/23efd64d.69bca8aa.js b/assets/js/23efd64d.69bca8aa.js new file mode 100644 index 000000000..27fe33b57 --- /dev/null +++ b/assets/js/23efd64d.69bca8aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7225],{2575:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>g,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const i={},s="Running with Docker",c={id:"guides/running-with-docker-or-compose",title:"Running with Docker",description:"Please refer to Docker Hub for a detail guide on how to use Routr's docker image.",source:"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",sourceDirName:"guides",slug:"/guides/running-with-docker-or-compose",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"},next:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"}},u={},d=[];function a(e){const n={a:"a",h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"running-with-docker",children:"Running with Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Please refer to ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/repository/docker/fonoster/routr",children:"Docker Hub"})," for a detail guide on how to use Routr's docker image."]})]})}function g(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var t=o(6540);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.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:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26da1a01.05e77ca2.js b/assets/js/26da1a01.05e77ca2.js deleted file mode 100644 index 23fc3e1ff..000000000 --- a/assets/js/26da1a01.05e77ca2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4011],{3905:(e,r,t)=>{t.d(r,{Zo:()=>l,kt:()=>m});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function a(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=n.createContext({}),p=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},l=function(e){var r=p(e.components);return n.createElement(s.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),u=p(t),f=o,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||i;return t?n.createElement(m,c(c({ref:r},l),{},{components:t})):n.createElement(m,c({ref:r},l))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var i=t.length,c=new Array(i);c[0]=f;var a={};for(var s in r)hasOwnProperty.call(r,s)&&(a[s]=r[s]);a.originalType=e,a[u]="string"==typeof e?e:o,c[1]=a;for(var p=2;p<i;p++)c[p]=t[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},220:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>p});var n=t(7462),o=(t(7294),t(3905));const i={},c="Building a SCAIP Processor",a={unversionedId:"development/building-a-scaip-processor",id:"development/building-a-scaip-processor",title:"Building a SCAIP Processor",description:"Comin soon.",source:"@site/docs/development/building-a-scaip-processor.md",sourceDirName:"development",slug:"/development/building-a-scaip-processor",permalink:"/docs/2.0.0/development/building-a-scaip-processor",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-scaip-processor.md",tags:[],version:"current",frontMatter:{}},s={},p=[],l={toc:p},u="wrapper";function d(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},l,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"building-a-scaip-processor"},"Building a SCAIP Processor"),(0,o.kt)("p",null,"Comin soon."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/26da1a01.3be03227.js b/assets/js/26da1a01.3be03227.js new file mode 100644 index 000000000..7d3205cca --- /dev/null +++ b/assets/js/26da1a01.3be03227.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2401],{1080:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=o(4848),s=o(8453);const r={},i="Building a SCAIP Processor",c={id:"development/building-a-scaip-processor",title:"Building a SCAIP Processor",description:"Comin soon.",source:"@site/docs/development/building-a-scaip-processor.md",sourceDirName:"development",slug:"/development/building-a-scaip-processor",permalink:"/docs/2.0.0/development/building-a-scaip-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-scaip-processor.md",tags:[],version:"current",frontMatter:{}},d={},a=[];function u(e){const n={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"building-a-scaip-processor",children:"Building a SCAIP Processor"}),"\n",(0,t.jsx)(n.p,{children:"Comin soon."})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const s={},r=t.createContext(s);function i(e){const n=t.useContext(r);return t.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(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a36568f.02fc9beb.js b/assets/js/2a36568f.02fc9beb.js deleted file mode 100644 index c7c36a8a1..000000000 --- a/assets/js/2a36568f.02fc9beb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5490],{3905:(e,t,r)=>{r.d(t,{Zo:()=>f,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},f=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,c=e.originalType,p=e.parentName,f=a(e,["components","mdxType","originalType","parentName"]),s=u(r),m=o,d=s["".concat(p,".").concat(m)]||s[m]||l[m]||c;return r?n.createElement(d,i(i({ref:t},f),{},{components:r})):n.createElement(d,i({ref:t},f))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var c=r.length,i=new Array(c);i[0]=m;var a={};for(var p in t)hasOwnProperty.call(t,p)&&(a[p]=t[p]);a.originalType=e,a[s]="string"==typeof e?e:o,i[1]=a;for(var u=2;u<c;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7740:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>l,frontMatter:()=>c,metadata:()=>a,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const c={},i="Home or Office Setup",a={unversionedId:"connect/home-or-office-setup",id:"connect/home-or-office-setup",title:"Home or Office Setup",description:"Coming soon.",source:"@site/docs/connect/home-or-office-setup.md",sourceDirName:"connect",slug:"/connect/home-or-office-setup",permalink:"/docs/2.0.0/connect/home-or-office-setup",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/home-or-office-setup.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"},next:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"}},p={},u=[],f={toc:u},s="wrapper";function l(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"home-or-office-setup"},"Home or Office Setup"),(0,o.kt)("p",null,"Coming soon."))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2a36568f.d948f060.js b/assets/js/2a36568f.d948f060.js new file mode 100644 index 000000000..69f95a821 --- /dev/null +++ b/assets/js/2a36568f.d948f060.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2964],{7173:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=o(4848),c=o(8453);const r={},s="Home or Office Setup",i={id:"connect/home-or-office-setup",title:"Home or Office Setup",description:"Coming soon.",source:"@site/docs/connect/home-or-office-setup.md",sourceDirName:"connect",slug:"/connect/home-or-office-setup",permalink:"/docs/2.0.0/connect/home-or-office-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/home-or-office-setup.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"},next:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"}},u={},p=[];function f(e){const t={h1:"h1",p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"home-or-office-setup",children:"Home or Office Setup"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function d(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>i});var n=o(6540);const c={},r=n.createContext(c);function s(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(c):e.components||c:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/321dfeeb.57976d5f.js b/assets/js/321dfeeb.57976d5f.js deleted file mode 100644 index 37e94a2a8..000000000 --- a/assets/js/321dfeeb.57976d5f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8827],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,k=c["".concat(s,".").concat(m)]||c[m]||d[m]||o;return n?r.createElement(k,i(i({ref:t},u),{},{components:n})):r.createElement(k,i({ref:t},u))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},8995:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={},i=void 0,l={unversionedId:"api/overview",id:"version-1.x.x/api/overview",title:"overview",description:"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.",source:"@site/versioned_docs/version-1.x.x/api/overview.md",sourceDirName:"api",slug:"/api/overview",permalink:"/docs/1.x.x/api/overview",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"},next:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"}},s={},p=[{value:"Authentication",id:"authentication",level:2},{value:"Error Responses",id:"error-responses",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Routr API version is currently ",(0,a.kt)("inlineCode",{parentName:"p"},"v1beta1"),". We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document."),(0,a.kt)("p",null,"The endpoint for the API is:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/api/{apiversion}")),(0,a.kt)("h2",{id:"authentication"},"Authentication"),(0,a.kt)("p",null,"A JWT token is used to authenticate the server. To obtain the token, use the ",(0,a.kt)("inlineCode",{parentName:"p"},"/api/{apiversion}/token")," endpoint with basic authentication. Use the information from the ",(0,a.kt)("a",{parentName:"p",href:"/configuration/user"},"User")," resource."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"You must append the ",(0,a.kt)("inlineCode",{parentName:"p"},"token")," to all requests as a query parameter.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample call")),(0,a.kt)("p",null,"To obtain the token"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token\n\n# Resulted in\n{\n "status":200,\n "message":"Successful request",\n "data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n')),(0,a.kt)("p",null,"To use the token"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...\n\n# Resulted in\n{ \n "status":200,\n "message":"Successful request",\n "data":[ \n { \n "addressOfRecord":"sip:1001@sip.local",\n "contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"\n }\n ]\n}\n')),(0,a.kt)("h2",{id:"error-responses"},"Error Responses"),(0,a.kt)("p",null,"The following are general errors we might have to account for:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Code"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Content"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"400 BAD_REQUEST"),(0,a.kt)("td",{parentName:"tr",align:"left"},(0,a.kt)("inlineCode",{parentName:"td"},'{ status: "400", message : "Bad Request" }'))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"401 UNAUTHORIZED"),(0,a.kt)("td",{parentName:"tr",align:"left"},(0,a.kt)("inlineCode",{parentName:"td"},'{ status: "401", message : "You are unauthorized to make this request." }'))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"405 NOT_SUPPORTED"),(0,a.kt)("td",{parentName:"tr",align:"left"},(0,a.kt)("inlineCode",{parentName:"td"},'{ status: "405", message : "Operation not supported by data source provider" }'))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"409 CONFLICT"),(0,a.kt)("td",{parentName:"tr",align:"left"},(0,a.kt)("inlineCode",{parentName:"td"},'{ status: "409", message : "An attempt was made to create an object that already exists" }'))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"4091 UNFULFILLED_DEPENDENCY_RESPONSE"),(0,a.kt)("td",{parentName:"tr",align:"left"},(0,a.kt)("inlineCode",{parentName:"td"},'{ status: "4091", message : "Found one or more unfulfilled dependencies" }'))))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/321dfeeb.607289a8.js b/assets/js/321dfeeb.607289a8.js new file mode 100644 index 000000000..efe3b32f0 --- /dev/null +++ b/assets/js/321dfeeb.607289a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[537],{9683:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),i=n(8453);const r={},o=void 0,a={id:"api/overview",title:"overview",description:"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.",source:"@site/versioned_docs/version-1.x.x/api/overview.md",sourceDirName:"api",slug:"/api/overview",permalink:"/docs/1.x.x/api/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"},next:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"}},c={},d=[{value:"Authentication",id:"authentication",level:2},{value:"Error Responses",id:"error-responses",level:2}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Routr API version is currently ",(0,s.jsx)(t.code,{children:"v1beta1"}),". We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document."]}),"\n",(0,s.jsx)(t.p,{children:"The endpoint for the API is:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/api/{apiversion}"})}),"\n",(0,s.jsx)(t.h2,{id:"authentication",children:"Authentication"}),"\n",(0,s.jsxs)(t.p,{children:["A JWT token is used to authenticate the server. To obtain the token, use the ",(0,s.jsx)(t.code,{children:"/api/{apiversion}/token"})," endpoint with basic authentication. Use the information from the ",(0,s.jsx)(t.a,{href:"/docs/1.x.x/configuration/users",children:"User"})," resource."]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:["You must append the ",(0,s.jsx)(t.code,{children:"token"})," to all requests as a query parameter."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample call"})}),"\n",(0,s.jsx)(t.p,{children:"To obtain the token"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token\n\n# Resulted in\n{\n "status":200,\n "message":"Successful request",\n "data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"To use the token"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...\n\n# Resulted in\n{ \n "status":200,\n "message":"Successful request",\n "data":[ \n { \n "addressOfRecord":"sip:1001@sip.local",\n "contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"\n }\n ]\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"error-responses",children:"Error Responses"}),"\n",(0,s.jsx)(t.p,{children:"The following are general errors we might have to account for:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Code"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Content"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"400 BAD_REQUEST"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "400", message : "Bad Request" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"401 UNAUTHORIZED"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "401", message : "You are unauthorized to make this request." }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"405 NOT_SUPPORTED"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "405", message : "Operation not supported by data source provider" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"409 CONFLICT"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "409", message : "An attempt was made to create an object that already exists" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"4091 UNFULFILLED_DEPENDENCY_RESPONSE"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "4091", message : "Found one or more unfulfilled dependencies" }'})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3325c53c.6802c0f0.js b/assets/js/3325c53c.6802c0f0.js deleted file mode 100644 index e1ec57456..000000000 --- a/assets/js/3325c53c.6802c0f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8654],{3905:(t,e,r)=>{r.d(e,{Zo:()=>p,kt:()=>h});var n=r(7294);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function l(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?o(Object(r),!0).forEach((function(e){a(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function i(t,e){if(null==t)return{};var r,n,a=function(t,e){if(null==t)return{};var r,n,a={},o=Object.keys(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||(a[r]=t[r]);return a}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}var s=n.createContext({}),u=function(t){var e=n.useContext(s),r=e;return t&&(r="function"==typeof t?t(e):l(l({},e),t)),r},p=function(t){var e=u(t.components);return n.createElement(s.Provider,{value:e},t.children)},c="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var r=t.components,a=t.mdxType,o=t.originalType,s=t.parentName,p=i(t,["components","mdxType","originalType","parentName"]),c=u(r),m=a,h=c["".concat(s,".").concat(m)]||c[m]||d[m]||o;return r?n.createElement(h,l(l({ref:e},p),{},{components:r})):n.createElement(h,l({ref:e},p))}));function h(t,e){var r=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in e)hasOwnProperty.call(e,s)&&(i[s]=e[s]);i.originalType=t,i[c]="string"==typeof t?t:a,l[1]=i;for(var u=2;u<o;u++)l[u]=r[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},1543:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const o={},l="Installation",i={unversionedId:"introduction/installation",id:"version-1.x.x/introduction/installation",title:"Installation",description:"Instant Server Installation with Snaps",source:"@site/versioned_docs/version-1.x.x/introduction/installation.md",sourceDirName:"introduction",slug:"/introduction/installation",permalink:"/docs/1.x.x/introduction/installation",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/installation.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"},next:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"}},s={},u=[{value:"Instant Server Installation with Snaps",id:"instant-server-installation-with-snaps",level:2},{value:"DigitalOcean droplet",id:"digitalocean-droplet",level:2},{value:"Docker",id:"docker",level:2},{value:"Kubernetes",id:"kubernetes",level:2},{value:"Google Cloud Shell",id:"google-cloud-shell",level:2},{value:"Custom",id:"custom",level:2}],p={toc:u},c="wrapper";function d(t){let{components:e,...r}=t;return(0,a.kt)(c,(0,n.Z)({},p,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"installation"},"Installation"),(0,a.kt)("h2",{id:"instant-server-installation-with-snaps"},"Instant Server Installation with Snaps"),(0,a.kt)("p",null,"Install Routr in seconds on Linux (Ubuntu and others) with:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"sudo snap install routr-server\n")),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://snapcraft.io/routr-server"},(0,a.kt)("img",{parentName:"a",src:"https://snapcraft.io/static/images/badges/en/snap-store-black.svg",alt:"Get it from the Snap Store"}))),(0,a.kt)("p",null,"Routr Snap is recommended for Linux deployments"),(0,a.kt)("p",null,"Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions."),(0,a.kt)("h2",{id:"digitalocean-droplet"},"DigitalOcean droplet"),(0,a.kt)("p",null,"Build and Deploy to a DigitalOcean droplet"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/tree/master/.digitalocean/README.md"},(0,a.kt)("img",{parentName:"a",src:"https://user-images.githubusercontent.com/51996/58146107-50512580-7c1a-11e9-8ec9-e032ba387c2a.png",alt:"do-btn-blue"}))),(0,a.kt)("h2",{id:"docker"},"Docker"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://routr.io/docs/guides/running-with-docker-or-compose/"},"Deploy with docker compose")),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr/"},(0,a.kt)("img",{parentName:"a",src:"https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png",alt:"Docker logo"}))),(0,a.kt)("p",null,"OR Use the automated build image of our ",(0,a.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr/"},"most recent release")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"docker pull fonoster/routr:latest\n")),(0,a.kt)("p",null,"OR select a specific release (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/releases"},"details of releases available"),"):"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"docker pull fonoster/routr:vX.X.X\n")),(0,a.kt)("h2",{id:"kubernetes"},"Kubernetes"),(0,a.kt)("p",null,"Deploy to Kubernetes in ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/tree/master/.k8s/README.md"},"few easy steps")),(0,a.kt)("h2",{id:"google-cloud-shell"},"Google Cloud Shell"),(0,a.kt)("p",null,"Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface."),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/fonoster/routr-walkthrough-tutorial&tutorial=tutorial.md"},(0,a.kt)("img",{parentName:"a",src:"https://gstatic.com/cloudssh/images/open-btn.svg",alt:"Open in Cloud Shell"}))),(0,a.kt)("h2",{id:"custom"},"Custom"),(0,a.kt)("p",null,"There are no special requirements to install and run the server. Just follow this easy steps:"),(0,a.kt)("p",null,"\u278a"," Download the server for your platform"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Platform"),(0,a.kt)("th",{parentName:"tr",align:null},"Download"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Linux"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_linux-x64_bin.tar.gz"},"tar.gz"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"macOS"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_osx-x64_bin.tar.gz"},"tar.gz"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Windows"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.tar.gz"},"tar.gz"),", ",(0,a.kt)("a",{parentName:"td",href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.zip"},"zip"))))),(0,a.kt)("p",null,"\u278b"," Then extract it:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"tar xvfz routr-*.tar.gz\ncd routr-*\n")),(0,a.kt)("p",null,"\u278c"," Run the server using the ",(0,a.kt)("inlineCode",{parentName:"p"},"routr")," command"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"./routr\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3325c53c.f6a55c0f.js b/assets/js/3325c53c.f6a55c0f.js new file mode 100644 index 000000000..d2f608dbb --- /dev/null +++ b/assets/js/3325c53c.f6a55c0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6944],{7496:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=n(4848),s=n(8453);const o={},i="Installation",l={id:"introduction/installation",title:"Installation",description:"Instant Server Installation with Snaps",source:"@site/versioned_docs/version-1.x.x/introduction/installation.md",sourceDirName:"introduction",slug:"/introduction/installation",permalink:"/docs/1.x.x/introduction/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/installation.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"},next:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"}},a={},d=[{value:"Instant Server Installation with Snaps",id:"instant-server-installation-with-snaps",level:2},{value:"DigitalOcean droplet",id:"digitalocean-droplet",level:2},{value:"Docker",id:"docker",level:2},{value:"Kubernetes",id:"kubernetes",level:2},{value:"Google Cloud Shell",id:"google-cloud-shell",level:2},{value:"Custom",id:"custom",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(t.h2,{id:"instant-server-installation-with-snaps",children:"Instant Server Installation with Snaps"}),"\n",(0,r.jsx)(t.p,{children:"Install Routr in seconds on Linux (Ubuntu and others) with:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo snap install routr-server\n"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://snapcraft.io/routr-server",children:(0,r.jsx)(t.img,{src:"https://snapcraft.io/static/images/badges/en/snap-store-black.svg",alt:"Get it from the Snap Store"})})}),"\n",(0,r.jsx)(t.p,{children:"Routr Snap is recommended for Linux deployments"}),"\n",(0,r.jsx)(t.p,{children:"Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions."}),"\n",(0,r.jsx)(t.h2,{id:"digitalocean-droplet",children:"DigitalOcean droplet"}),"\n",(0,r.jsx)(t.p,{children:"Build and Deploy to a DigitalOcean droplet"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/tree/master/.digitalocean/README.md",children:(0,r.jsx)(t.img,{src:"https://user-images.githubusercontent.com/51996/58146107-50512580-7c1a-11e9-8ec9-e032ba387c2a.png",alt:"do-btn-blue"})})}),"\n",(0,r.jsx)(t.h2,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://routr.io/docs/guides/running-with-docker-or-compose/",children:"Deploy with docker compose"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr/",children:(0,r.jsx)(t.img,{src:"https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png",alt:"Docker logo"})})}),"\n",(0,r.jsxs)(t.p,{children:["OR Use the automated build image of our ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr/",children:"most recent release"})]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"docker pull fonoster/routr:latest\n"})}),"\n",(0,r.jsxs)(t.p,{children:["OR select a specific release (",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases",children:"details of releases available"}),"):"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"docker pull fonoster/routr:vX.X.X\n"})}),"\n",(0,r.jsx)(t.h2,{id:"kubernetes",children:"Kubernetes"}),"\n",(0,r.jsxs)(t.p,{children:["Deploy to Kubernetes in ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/tree/master/.k8s/README.md",children:"few easy steps"})]}),"\n",(0,r.jsx)(t.h2,{id:"google-cloud-shell",children:"Google Cloud Shell"}),"\n",(0,r.jsx)(t.p,{children:"Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/fonoster/routr-walkthrough-tutorial&tutorial=tutorial.md",children:(0,r.jsx)(t.img,{src:"https://gstatic.com/cloudssh/images/open-btn.svg",alt:"Open in Cloud Shell"})})}),"\n",(0,r.jsx)(t.h2,{id:"custom",children:"Custom"}),"\n",(0,r.jsx)(t.p,{children:"There are no special requirements to install and run the server. Just follow this easy steps:"}),"\n",(0,r.jsx)(t.p,{children:"\u278a Download the server for your platform"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Platform"}),(0,r.jsx)(t.th,{children:"Download"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Linux"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_linux-x64_bin.tar.gz",children:"tar.gz"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"macOS"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_osx-x64_bin.tar.gz",children:"tar.gz"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Windows"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.tar.gz",children:"tar.gz"}),", ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.zip",children:"zip"})]})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"\u278b Then extract it:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"tar xvfz routr-*.tar.gz\ncd routr-*\n"})}),"\n",(0,r.jsxs)(t.p,{children:["\u278c Run the server using the ",(0,r.jsx)(t.code,{children:"routr"})," command"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./routr\n"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var r=n(6540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33664cb1.cd324040.js b/assets/js/33664cb1.cd324040.js deleted file mode 100644 index 910fa0007..000000000 --- a/assets/js/33664cb1.cd324040.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8445],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,g=c["".concat(s,".").concat(m)]||c[m]||u[m]||o;return n?r.createElement(g,l(l({ref:t},d),{},{components:n})):r.createElement(g,l({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var p=2;p<o;p++)l[p]=n[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6578:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={},l="EdgePort",i={unversionedId:"development/components/edgeport",id:"development/components/edgeport",title:"EdgePort",description:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.",source:"@site/docs/development/components/edgeport.md",sourceDirName:"development/components",slug:"/development/components/edgeport",permalink:"/docs/2.0.0/development/components/edgeport",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/edgeport.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"},next:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"}},s={},p=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the EdgePort with Docker",id:"launching-the-edgeport-with-docker",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"edgeport"},"EdgePort"),(0,a.kt)("p",null,"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop."),(0,a.kt)("p",null,"The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-text"},"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502SIP request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC request \u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC response\u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502SIP response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n")),(0,a.kt)("p",null,"While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware."),(0,a.kt)("p",null,"For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher."),(0,a.kt)("p",null,"If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster."),(0,a.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,a.kt)("p",null,"To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"ref")),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to the EdgePort"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"metadata.region")),(0,a.kt)("td",{parentName:"tr",align:null},"Region where the EdgePort is located (reserved for future use)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.unknownMethodAction")),(0,a.kt)("td",{parentName:"tr",align:null},"What to do if an incoming request type is not allowed (reserved for future use)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.transport")),(0,a.kt)("td",{parentName:"tr",align:null},"Enabled Transport Protocols"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.transport[*].protocol")),(0,a.kt)("td",{parentName:"tr",align:null},"Transport protocol"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.transport[*].bindAddr")),(0,a.kt)("td",{parentName:"tr",align:null},"Ipv4 interface to accept requests on"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.transport[*].port")),(0,a.kt)("td",{parentName:"tr",align:null},"Port to listen on"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.methods")),(0,a.kt)("td",{parentName:"tr",align:null},"Acceptable SIP Methods"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processor")),(0,a.kt)("td",{parentName:"tr",align:null},"Adjacent service for message routing"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.processor.addr")),(0,a.kt)("td",{parentName:"tr",align:null},"Address of the adjacent service"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.localnets")),(0,a.kt)("td",{parentName:"tr",align:null},"Networks considered to be in the same local network"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.externalAddrs")),(0,a.kt)("td",{parentName:"tr",align:null},"EdgePort external ip addresses"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.bindAddr")),(0,a.kt)("td",{parentName:"tr",align:null},"Ipv4 interface to accept requests on"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext")),(0,a.kt)("td",{parentName:"tr",align:null},"Security context"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.client")),(0,a.kt)("td",{parentName:"tr",align:null},"Client security context"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.client.protocols")),(0,a.kt)("td",{parentName:"tr",align:null},"TLS protocols used by the client (e.g., SSLv3, TLSv1.2)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.client.authType")),(0,a.kt)("td",{parentName:"tr",align:null},"Client authentication type (e.g., Disabled, DisabledAll, Required, Wanted)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.keyStore")),(0,a.kt)("td",{parentName:"tr",align:null},"Path to the key store file"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.trustStore")),(0,a.kt)("td",{parentName:"tr",align:null},"Path to the trust store file"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.keyStorePassword")),(0,a.kt)("td",{parentName:"tr",align:null},"Password for the key store"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.trustStorePassword")),(0,a.kt)("td",{parentName:"tr",align:null},"Password for the trust store"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"spec.securityContext.keyStoreType")),(0,a.kt)("td",{parentName:"tr",align:null},"Type of the key store (e.g., pkcs12)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")))),(0,a.kt)("p",null,"The security context is required if the EdgePort is configured to use a secure protocol such as ",(0,a.kt)("inlineCode",{parentName:"p"},"TLS")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"WSS"),". "),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Please see JAINSIP docs for details on the security context ",(0,a.kt)("a",{parentName:"p",href:"https://javadoc.io/doc/javax.sip/jain-sip-ri/1.2.220/gov/nist/javax/sip/SipStackImpl.html"},"properties.")," ")),(0,a.kt)("p",null,"Here is an example of a configuration file:"),(0,a.kt)("p",null,"Filename: ",(0,a.kt)("inlineCode",{parentName:"p"},"dispatcher.yaml")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"dispatcher.json")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'kind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n unknownMethodAction: Discard\n processor:\n addr: dispatcher:51901 \n securityContext:\n client:\n protocols:\n - SSLv3\n - TLSv1.2\n authType: DisabledAll\n keyStorePassword: changeme\n trustStorePassword: changeme\n keyStore: "/etc/routr/certs/signaling.p12"\n trustStore: "/etc/routr/certs/signaling.p12"\n keyStoreType: pkcs12\n externalAddrs:\n - 10.111.220.2\n - sip01.edgeport.net\n localnets:\n - 127.0.0.1/8\n - 10.111.221.2/24\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n - protocol: tls\n port: 5061\n - protocol: ws \n port: 5062\n - protocol: wss\n port: 5063\n')),(0,a.kt)("p",null,"The EdgePort requires the ",(0,a.kt)("inlineCode",{parentName:"p"},"spec.externalAddrs")," field to function properly in NATed environments like Docker. When provided, the ",(0,a.kt)("inlineCode",{parentName:"p"},"spec.externalAddrs")," is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Environment Variables")),(0,a.kt)("p",null,"The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"PROCESSOR_ADDR")," - Overwrites the ",(0,a.kt)("inlineCode",{parentName:"li"},"spec.processor.addr")," property"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"HOSTNAME")," - Overwrites the ",(0,a.kt)("inlineCode",{parentName:"li"},"ref")," property. If running in K8s, ",(0,a.kt)("inlineCode",{parentName:"li"},"ref")," will be set to the pod's hostname."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"IGNORE_LOOPBACK_FROM_LOCALNETS")," - If set to ",(0,a.kt)("inlineCode",{parentName:"li"},"true"),", the EdgePort will ignore the loopback address from the ",(0,a.kt)("inlineCode",{parentName:"li"},"localnets")," property. In Docker deployments, this is set to ",(0,a.kt)("inlineCode",{parentName:"li"},"true")," by default."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"CONSOLE_PUBLISHER_ENABLED")," - If set to ",(0,a.kt)("inlineCode",{parentName:"li"},"true"),", the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"NATS_PUBLISHER_ENABLED")," - If set to ",(0,a.kt)("inlineCode",{parentName:"li"},"true"),", the EdgePort will publish SIP messages to the NATS publisher."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"NATS_PUBLISHER_SUBJECT")," - Overwrites the default subject the NATS publisher uses. The default subject is ",(0,a.kt)("inlineCode",{parentName:"li"},"routr"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"NATS_PUBLISHER_URL")," - This is required if ",(0,a.kt)("inlineCode",{parentName:"li"},"NATS_PUBLISHER_ENABLED")," is set to ",(0,a.kt)("inlineCode",{parentName:"li"},"true"),". It should contain the NATS server URL. For example: ",(0,a.kt)("inlineCode",{parentName:"li"},"nats://nats:4222"),".")),(0,a.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,a.kt)("p",null,"While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n')),(0,a.kt)("p",null,"Link to the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto"},"protobuf definition.")),(0,a.kt)("h2",{id:"launching-the-edgeport-with-docker"},"Launching the EdgePort with Docker"),(0,a.kt)("p",null,"The EdgePort is available as a Docker image from ",(0,a.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-edgeport"},"Docker Hub"),". To launch the EdgePort with Docker, you can use the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport\n")),(0,a.kt)("p",null,"The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port ",(0,a.kt)("inlineCode",{parentName:"p"},"5060")," for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port ",(0,a.kt)("inlineCode",{parentName:"p"},"5061")," for TLS traffic, you must add the following flag to the ",(0,a.kt)("inlineCode",{parentName:"p"},"docker run")," command: ",(0,a.kt)("inlineCode",{parentName:"p"},"-p 5061:5061"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/33664cb1.e1df95ca.js b/assets/js/33664cb1.e1df95ca.js new file mode 100644 index 000000000..f846c0a5b --- /dev/null +++ b/assets/js/33664cb1.e1df95ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9953],{4987:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=s(4848),r=s(8453);const o={},d="EdgePort",i={id:"development/components/edgeport",title:"EdgePort",description:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.",source:"@site/docs/development/components/edgeport.md",sourceDirName:"development/components",slug:"/development/components/edgeport",permalink:"/docs/2.0.0/development/components/edgeport",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/edgeport.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"},next:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the EdgePort with Docker",id:"launching-the-edgeport-with-docker",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"edgeport",children:"EdgePort"}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop."}),"\n",(0,n.jsx)(t.p,{children:"The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502SIP request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC request \u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC response\u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502SIP response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,n.jsx)(t.p,{children:"While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware."}),"\n",(0,n.jsx)(t.p,{children:"For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher."}),"\n",(0,n.jsx)(t.p,{children:"If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster."}),"\n",(0,n.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,n.jsx)(t.p,{children:"To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"ref"})}),(0,n.jsx)(t.td,{children:"Reference to the EdgePort"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"metadata.region"})}),(0,n.jsx)(t.td,{children:"Region where the EdgePort is located (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.unknownMethodAction"})}),(0,n.jsx)(t.td,{children:"What to do if an incoming request type is not allowed (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport"})}),(0,n.jsx)(t.td,{children:"Enabled Transport Protocols"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].protocol"})}),(0,n.jsx)(t.td,{children:"Transport protocol"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].port"})}),(0,n.jsx)(t.td,{children:"Port to listen on"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.methods"})}),(0,n.jsx)(t.td,{children:"Acceptable SIP Methods"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor"})}),(0,n.jsx)(t.td,{children:"Adjacent service for message routing"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor.addr"})}),(0,n.jsx)(t.td,{children:"Address of the adjacent service"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.localnets"})}),(0,n.jsx)(t.td,{children:"Networks considered to be in the same local network"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.externalAddrs"})}),(0,n.jsx)(t.td,{children:"EdgePort external ip addresses"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext"})}),(0,n.jsx)(t.td,{children:"Security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client"})}),(0,n.jsx)(t.td,{children:"Client security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.protocols"})}),(0,n.jsx)(t.td,{children:"TLS protocols used by the client (e.g., SSLv3, TLSv1.2)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.authType"})}),(0,n.jsx)(t.td,{children:"Client authentication type (e.g., Disabled, DisabledAll, Required, Wanted)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStore"})}),(0,n.jsx)(t.td,{children:"Path to the key store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStore"})}),(0,n.jsx)(t.td,{children:"Path to the trust store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the key store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the trust store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStoreType"})}),(0,n.jsx)(t.td,{children:"Type of the key store (e.g., pkcs12)"}),(0,n.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["The security context is required if the EdgePort is configured to use a secure protocol such as ",(0,n.jsx)(t.code,{children:"TLS"})," or ",(0,n.jsx)(t.code,{children:"WSS"}),"."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["Please see JAINSIP docs for details on the security context ",(0,n.jsx)(t.a,{href:"https://javadoc.io/doc/javax.sip/jain-sip-ri/1.2.220/gov/nist/javax/sip/SipStackImpl.html",children:"properties."})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Here is an example of a configuration file:"}),"\n",(0,n.jsxs)(t.p,{children:["Filename: ",(0,n.jsx)(t.code,{children:"dispatcher.yaml"})," or ",(0,n.jsx)(t.code,{children:"dispatcher.json"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'kind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n unknownMethodAction: Discard\n processor:\n addr: dispatcher:51901 \n securityContext:\n client:\n protocols:\n - SSLv3\n - TLSv1.2\n authType: DisabledAll\n keyStorePassword: changeme\n trustStorePassword: changeme\n keyStore: "/etc/routr/certs/signaling.p12"\n trustStore: "/etc/routr/certs/signaling.p12"\n keyStoreType: pkcs12\n externalAddrs:\n - 10.111.220.2\n - sip01.edgeport.net\n localnets:\n - 127.0.0.1/8\n - 10.111.221.2/24\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n - protocol: tls\n port: 5061\n - protocol: ws \n port: 5062\n - protocol: wss\n port: 5063\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort requires the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," field to function properly in NATed environments like Docker. When provided, the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Environment Variables"})}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"PROCESSOR_ADDR"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"spec.processor.addr"})," property"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"HOSTNAME"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"ref"})," property. If running in K8s, ",(0,n.jsx)(t.code,{children:"ref"})," will be set to the pod's hostname."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"IGNORE_LOOPBACK_FROM_LOCALNETS"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will ignore the loopback address from the ",(0,n.jsx)(t.code,{children:"localnets"})," property. In Docker deployments, this is set to ",(0,n.jsx)(t.code,{children:"true"})," by default."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"CONSOLE_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the NATS publisher."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_SUBJECT"})," - Overwrites the default subject the NATS publisher uses. The default subject is ",(0,n.jsx)(t.code,{children:"routr"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_URL"})," - This is required if ",(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," is set to ",(0,n.jsx)(t.code,{children:"true"}),". It should contain the NATS server URL. For example: ",(0,n.jsx)(t.code,{children:"nats://nats:4222"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,n.jsx)(t.p,{children:"While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Link to the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,n.jsx)(t.h2,{id:"launching-the-edgeport-with-docker",children:"Launching the EdgePort with Docker"}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort is available as a Docker image from ",(0,n.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-edgeport",children:"Docker Hub"}),". To launch the EdgePort with Docker, you can use the following command:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port ",(0,n.jsx)(t.code,{children:"5060"})," for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port ",(0,n.jsx)(t.code,{children:"5061"})," for TLS traffic, you must add the following flag to the ",(0,n.jsx)(t.code,{children:"docker run"})," command: ",(0,n.jsx)(t.code,{children:"-p 5061:5061"}),"."]})]})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>i});var n=s(6540);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);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(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35bee977.e12c0329.js b/assets/js/35bee977.e12c0329.js new file mode 100644 index 000000000..7962ce201 --- /dev/null +++ b/assets/js/35bee977.e12c0329.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1304],{5644:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});var s=i(4848),o=i(8453);const t={sidebar_position:2},r="Concepts",a={id:"concepts",title:"Concepts",description:"The following are some key concepts, including some of the essential routing strategies implemented in Routr.",source:"@site/versioned_docs/version-1.x.x/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/docs/1.x.x/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/concepts.md",tags:[],version:"1.x.x",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"},next:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"}},l={},c=[{value:"Intra-Domain Routing",id:"intra-domain-routing",level:2},{value:"Double Agents",id:"double-agents",level:3},{value:"Single Domain Example",id:"single-domain-example",level:3},{value:"Domain Ingress Routing",id:"domain-ingress-routing",level:2},{value:"Domain Egress Routing",id:"domain-egress-routing",level:2},{value:"Peers Routing",id:"peers-routing",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,s.jsx)(n.p,{children:"The following are some key concepts, including some of the essential routing strategies implemented in Routr."}),"\n",(0,s.jsx)(n.h2,{id:"intra-domain-routing",children:"Intra-Domain Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Intra-Domain Routing(IDR)"})," offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not."]}),"\n",(0,s.jsxs)(n.p,{children:["For a small company with less than 50 users, you may define a domain ",(0,s.jsx)(n.code,{children:"sip.domain.com"}),". Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames."]}),"\n",(0,s.jsxs)(n.p,{children:["A multinational company like ",(0,s.jsx)(n.em,{children:"Walmart"})," have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains ",(0,s.jsx)(n.code,{children:"sip.0001.walmart.com"})," and ",(0,s.jsx)(n.code,{children:"sip.0002.walmart.com"}),", and... you get the idea."]}),"\n",(0,s.jsx)(n.h3,{id:"double-agents",children:"Double Agents"}),"\n",(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/wiki/fonoster/routr/images/double_agent.png",width:"400"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsxs)(n.p,{children:["Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's ",(0,s.jsx)(n.code,{children:"spec.domain[*]"})," list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain."]}),"\n",(0,s.jsx)(n.h3,{id:"single-domain-example",children:"Single Domain Example"}),"\n",(0,s.jsx)(n.p,{children:"The following yaml configuration shows a simple setup, involving one Domain and two Agents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n- kind: Agent\n apiVersion: v1beta1\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: janie\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsx)(n.p,{children:'Voila! That\'s all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["To configure your sip devices use the information found in ",(0,s.jsx)(n.code,{children:"config/agents.yml"}),". Also, you must use the Host/IP of Routr server as\nthe OUTBOUND PROXY of your sip device."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"The following rules apply to Intra-Domain Routing:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Agents can only call other Agents in the same Domain"}),"\n",(0,s.jsx)(n.li,{children:"Agents must belong to a Domain"}),"\n",(0,s.jsxs)(n.li,{children:["Agents Are not allowed to send a Digest username different than the username in the ",(0,s.jsx)(n.code,{children:"From-Header"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"domain-ingress-routing",children:"Domain Ingress Routing"}),"\n",(0,s.jsxs)(n.p,{children:["In Routr, the process of receiving a call from PSTN to a Domain is as ",(0,s.jsx)(n.em,{children:"Domain Ingress Routing(DIR)"})," and it is done using a Gateway resource. The yaml file ",(0,s.jsx)(n.code,{children:"config/gateways.yml"})," contains the Gateways. The following example shows a typical Gateway configuration."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Plain Old Phone Service Provider\n spec:\n regService:\n host: sip.provider.net\n credentials:\n username: 'gwuser'\n secret: gwsecret\n transport: udp\n registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network\n"})}),"\n",(0,s.jsx)(n.p,{children:"You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected."}),"\n",(0,s.jsx)(n.p,{children:"Please examine the following example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: dd50baa4\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUri: 'tel:17066041487'\n aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in\n"})}),"\n",(0,s.jsx)(n.p,{children:'Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"spec.location"})," block of a ",(0,s.jsx)(n.code,{children:"Number"})," resource configuration, determines the path of an inbound call from the PSTN. The ",(0,s.jsx)(n.code,{children:"aorLink"})," refers to an Address of Record(Agent or Peer) that is available in the ",(0,s.jsx)(n.code,{children:"location service"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"domain-egress-routing",children:"Domain Egress Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Domain Egress Routing(DER)"})," is the way that ",(0,s.jsx)(n.strong,{children:"Routr"})," deals with a call request to a ",(0,s.jsx)(n.em,{children:"callee"})," that exists in the Public Switched Telephone Network(PSTN) and not in the ",(0,s.jsx)(n.em,{children:"callers'"})," Domain. The EgressPolicy consists of a ",(0,s.jsx)(n.code,{children:"rule"}),", and a ",(0,s.jsx)(n.code,{children:"numberRef"})," defined in the ",(0,s.jsx)(n.code,{children:"spec.context"})," section of ",(0,s.jsx)(n.code,{children:"Domains"})," resources."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"rule"})," and ",(0,s.jsx)(n.code,{children:"numberRef"})," is defined as follows:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rule"})," is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"numberRef"})," is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["Agents can only perform outbound calls using the ",(0,s.jsx)(n.code,{children:"Egress Policy"})," of their Domains."]}),"\n",(0,s.jsx)(n.h2,{id:"peers-routing",children:"Peers Routing"}),"\n",(0,s.jsx)(n.p,{children:"Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling."}),"\n",(0,s.jsxs)(n.p,{children:["Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the ",(0,s.jsx)(n.em,{children:"Location Service"})," just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent."]}),"\n",(0,s.jsxs)(n.p,{children:["The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the ",(0,s.jsx)(n.code,{children:"spec.location"})," settings in the ",(0,s.jsx)(n.code,{children:"numbers.yml"})," configuration file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"Agents are not allowed to call Peers."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["A future version of the ",(0,s.jsx)(n.code,{children:"Peer resource"})," might feature a ",(0,s.jsx)(n.code,{children:"spec.acceptFrom.*"})," field to allow calls from Domains or specific Agents."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.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:()=>r,x:()=>a});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.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),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35bee977.fed7fa83.js b/assets/js/35bee977.fed7fa83.js deleted file mode 100644 index 8f320263e..000000000 --- a/assets/js/35bee977.fed7fa83.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1790],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>g});var a=t(7294);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){o(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,o=function(e,n){if(null==e)return{};var t,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},u=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(t),d=o,g=m["".concat(s,".").concat(d)]||m[d]||c[d]||i;return t?a.createElement(g,r(r({ref:n},u),{},{components:t})):a.createElement(g,r({ref:n},u))}));function g(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[m]="string"==typeof e?e:o,r[1]=l;for(var p=2;p<i;p++)r[p]=t[p];return a.createElement.apply(null,r)}return a.createElement.apply(null,t)}d.displayName="MDXCreateElement"},7010:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(7462),o=(t(7294),t(3905));const i={sidebar_position:2},r="Concepts",l={unversionedId:"concepts",id:"version-1.x.x/concepts",title:"Concepts",description:"The following are some key concepts, including some of the essential routing strategies implemented in Routr.",source:"@site/versioned_docs/version-1.x.x/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/docs/1.x.x/concepts",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/concepts.md",tags:[],version:"1.x.x",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"},next:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"}},s={},p=[{value:"Intra-Domain Routing",id:"intra-domain-routing",level:2},{value:"Double Agents",id:"double-agents",level:3},{value:"Single Domain Example",id:"single-domain-example",level:3},{value:"Domain Ingress Routing",id:"domain-ingress-routing",level:2},{value:"Domain Egress Routing",id:"domain-egress-routing",level:2},{value:"Peers Routing",id:"peers-routing",level:2}],u={toc:p},m="wrapper";function c(e){let{components:n,...t}=e;return(0,o.kt)(m,(0,a.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"concepts"},"Concepts"),(0,o.kt)("p",null,"The following are some key concepts, including some of the essential routing strategies implemented in Routr."),(0,o.kt)("h2",{id:"intra-domain-routing"},"Intra-Domain Routing"),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Intra-Domain Routing(IDR)")," offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not."),(0,o.kt)("p",null,"For a small company with less than 50 users, you may define a domain ",(0,o.kt)("inlineCode",{parentName:"p"},"sip.domain.com"),". Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames."),(0,o.kt)("p",null,"A multinational company like ",(0,o.kt)("em",{parentName:"p"},"Walmart")," have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains ",(0,o.kt)("inlineCode",{parentName:"p"},"sip.0001.walmart.com")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"sip.0002.walmart.com"),", and... you get the idea."),(0,o.kt)("h3",{id:"double-agents"},"Double Agents"),(0,o.kt)("img",{src:"https://raw.githubusercontent.com/wiki/fonoster/routr/images/double_agent.png",width:"400"}),(0,o.kt)("br",null),(0,o.kt)("br",null),(0,o.kt)("p",null,"Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's ",(0,o.kt)("inlineCode",{parentName:"p"},"spec.domain[*]")," list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain."),(0,o.kt)("h3",{id:"single-domain-example"},"Single Domain Example"),(0,o.kt)("p",null,"The following yaml configuration shows a simple setup, involving one Domain and two Agents:"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Domain configuration")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Agents configuration")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n- kind: Agent\n apiVersion: v1beta1\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: janie\n secret: '1234'\n domains: [sip.local]\n")),(0,o.kt)("p",null,' Voila! That\'s all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."'),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"To configure your sip devices use the information found in ",(0,o.kt)("inlineCode",{parentName:"p"},"config/agents.yml"),". Also, you must use the Host/IP of Routr server as\nthe OUTBOUND PROXY of your sip device.")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Routing Rules")),(0,o.kt)("p",null,"The following rules apply to Intra-Domain Routing:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Agents can only call other Agents in the same Domain"),(0,o.kt)("li",{parentName:"ul"},"Agents must belong to a Domain"),(0,o.kt)("li",{parentName:"ul"},"Agents Are not allowed to send a Digest username different than the username in the ",(0,o.kt)("inlineCode",{parentName:"li"},"From-Header"))),(0,o.kt)("h2",{id:"domain-ingress-routing"},"Domain Ingress Routing"),(0,o.kt)("p",null,"In Routr, the process of receiving a call from PSTN to a Domain is as ",(0,o.kt)("em",{parentName:"p"},"Domain Ingress Routing(DIR)")," and it is done using a Gateway resource. The yaml file ",(0,o.kt)("inlineCode",{parentName:"p"},"config/gateways.yml")," contains the Gateways. The following example shows a typical Gateway configuration."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Plain Old Phone Service Provider\n spec:\n regService:\n host: sip.provider.net\n credentials:\n username: 'gwuser'\n secret: gwsecret\n transport: udp\n registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network\n")),(0,o.kt)("p",null,"You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected."),(0,o.kt)("p",null,"Please examine the following example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: dd50baa4\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUri: 'tel:17066041487'\n aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in\n")),(0,o.kt)("p",null,'Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.'),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Routing Rules")),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"spec.location")," block of a ",(0,o.kt)("inlineCode",{parentName:"p"},"Number")," resource configuration, determines the path of an inbound call from the PSTN. The ",(0,o.kt)("inlineCode",{parentName:"p"},"aorLink")," refers to an Address of Record(Agent or Peer) that is available in the ",(0,o.kt)("inlineCode",{parentName:"p"},"location service"),"."),(0,o.kt)("h2",{id:"domain-egress-routing"},"Domain Egress Routing"),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Domain Egress Routing(DER)")," is the way that ",(0,o.kt)("strong",{parentName:"p"},"Routr")," deals with a call request to a ",(0,o.kt)("em",{parentName:"p"},"callee")," that exists in the Public Switched Telephone Network(PSTN) and not in the ",(0,o.kt)("em",{parentName:"p"},"callers'")," Domain. The EgressPolicy consists of a ",(0,o.kt)("inlineCode",{parentName:"p"},"rule"),", and a ",(0,o.kt)("inlineCode",{parentName:"p"},"numberRef")," defined in the ",(0,o.kt)("inlineCode",{parentName:"p"},"spec.context")," section of ",(0,o.kt)("inlineCode",{parentName:"p"},"Domains")," resources."),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"rule")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"numberRef")," is defined as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"rule")," is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"numberRef")," is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway."))),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Routing Rules")),(0,o.kt)("p",null,"Agents can only perform outbound calls using the ",(0,o.kt)("inlineCode",{parentName:"p"},"Egress Policy")," of their Domains."),(0,o.kt)("h2",{id:"peers-routing"},"Peers Routing"),(0,o.kt)("p",null,"Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling."),(0,o.kt)("p",null,"Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the ",(0,o.kt)("em",{parentName:"p"},"Location Service")," just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent."),(0,o.kt)("p",null,"The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the ",(0,o.kt)("inlineCode",{parentName:"p"},"spec.location")," settings in the ",(0,o.kt)("inlineCode",{parentName:"p"},"numbers.yml")," configuration file."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Routing Rules")),(0,o.kt)("p",null,"Agents are not allowed to call Peers."),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"A future version of the ",(0,o.kt)("inlineCode",{parentName:"p"},"Peer resource")," might feature a ",(0,o.kt)("inlineCode",{parentName:"p"},"spec.acceptFrom.*")," field to allow calls from Domains or specific Agents.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/39d73575.2275c69d.js b/assets/js/39d73575.2275c69d.js new file mode 100644 index 000000000..cc777bfc3 --- /dev/null +++ b/assets/js/39d73575.2275c69d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1780],{2655:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=o(4848),r=o(8453);const s={},i="Alteration Methods",a={id:"development/alterations/methods",title:"Alteration Methods",description:"Coming soon.",source:"@site/docs/development/alterations/methods.md",sourceDirName:"development/alterations",slug:"/development/alterations/methods",permalink:"/docs/2.0.0/development/alterations/methods",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/methods.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"},next:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"}},d={},c=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"alteration-methods",children:"Alteration Methods"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>a});var n=o(6540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/39d73575.a5784d74.js b/assets/js/39d73575.a5784d74.js deleted file mode 100644 index 1580c78af..000000000 --- a/assets/js/39d73575.a5784d74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3136],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var s=2;s<a;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3218:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={},i="Alteration Methods",l={unversionedId:"development/alterations/methods",id:"development/alterations/methods",title:"Alteration Methods",description:"Coming soon.",source:"@site/docs/development/alterations/methods.md",sourceDirName:"development/alterations",slug:"/development/alterations/methods",permalink:"/docs/2.0.0/development/alterations/methods",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/methods.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"},next:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"}},c={},s=[],p={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"alteration-methods"},"Alteration Methods"),(0,o.kt)("p",null,"Coming soon."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a673d53.2766e28e.js b/assets/js/3a673d53.2766e28e.js new file mode 100644 index 000000000..5e9043434 --- /dev/null +++ b/assets/js/3a673d53.2766e28e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[831],{3202:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=o(4848),r=o(8453);const i={},a="Roadmap",s={id:"introduction/roadmap",title:"Roadmap",description:"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.",source:"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",sourceDirName:"introduction",slug:"/introduction/roadmap",permalink:"/docs/1.x.x/introduction/roadmap",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/roadmap.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/1.x.x/introduction/community"},next:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"}},c={},u=[{value:"Accounting, Authentication, and Authorization",id:"accounting-authentication-and-authorization",level:2},{value:"IM and Presence",id:"im-and-presence",level:2},{value:"Per-domain Certificate",id:"per-domain-certificate",level:2},{value:"Support the Ecosystem",id:"support-the-ecosystem",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"roadmap",children:"Roadmap"}),"\n",(0,n.jsxs)(t.p,{children:["The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr server"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"accounting-authentication-and-authorization",children:"Accounting, Authentication, and Authorization"}),"\n",(0,n.jsx)(t.p,{children:"Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events."}),"\n",(0,n.jsx)(t.h2,{id:"im-and-presence",children:"IM and Presence"}),"\n",(0,n.jsx)(t.p,{children:"We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr."}),"\n",(0,n.jsx)(t.h2,{id:"per-domain-certificate",children:"Per-domain Certificate"}),"\n",(0,n.jsx)(t.p,{children:"Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate."}),"\n",(0,n.jsx)(t.h2,{id:"support-the-ecosystem",children:"Support the Ecosystem"}),"\n",(0,n.jsxs)(t.p,{children:["We want to release a stable version of the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ui",children:"web UI"})," soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr."]})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>s});var n=o(6540);const r={},i=n.createContext(r);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a673d53.9e34c384.js b/assets/js/3a673d53.9e34c384.js deleted file mode 100644 index 53c4eba63..000000000 --- a/assets/js/3a673d53.9e34c384.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8854],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),m=o,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},9974:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={},a="Roadmap",c={unversionedId:"introduction/roadmap",id:"version-1.x.x/introduction/roadmap",title:"Roadmap",description:"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.",source:"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",sourceDirName:"introduction",slug:"/introduction/roadmap",permalink:"/docs/1.x.x/introduction/roadmap",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/roadmap.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/1.x.x/introduction/community"},next:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"}},s={},u=[{value:"Accounting, Authentication, and Authorization",id:"accounting-authentication-and-authorization",level:2},{value:"IM and Presence",id:"im-and-presence",level:2},{value:"Per-domain Certificate",id:"per-domain-certificate",level:2},{value:"Support the Ecosystem",id:"support-the-ecosystem",level:2}],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"roadmap"},"Roadmap"),(0,o.kt)("p",null,"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/issues"},"Routr server"),"."),(0,o.kt)("h2",{id:"accounting-authentication-and-authorization"},"Accounting, Authentication, and Authorization"),(0,o.kt)("p",null,"Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events."),(0,o.kt)("h2",{id:"im-and-presence"},"IM and Presence"),(0,o.kt)("p",null,"We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr."),(0,o.kt)("h2",{id:"per-domain-certificate"},"Per-domain Certificate"),(0,o.kt)("p",null,"Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate."),(0,o.kt)("h2",{id:"support-the-ecosystem"},"Support the Ecosystem"),(0,o.kt)("p",null,"We want to release a stable version of the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr-ui"},"web UI")," soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3c0cfdd0.004313f8.js b/assets/js/3c0cfdd0.004313f8.js deleted file mode 100644 index 8ed1ae173..000000000 --- a/assets/js/3c0cfdd0.004313f8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2634],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=r.createContext({}),l=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(i.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(n),d=o,b=p["".concat(i,".").concat(d)]||p[d]||m[d]||a;return n?r.createElement(b,s(s({ref:t},u),{},{components:n})):r.createElement(b,s({ref:t},u))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:o,s[1]=c;for(var l=2;l<a;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},2709:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={sidebar_position:2},s="Installing in Kubernetes",c={unversionedId:"connect/quick-start/kubernetes",id:"connect/quick-start/kubernetes",title:"Installing in Kubernetes",description:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.",source:"@site/docs/connect/quick-start/kubernetes.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/kubernetes.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"}},i={},l=[],u={toc:l},p="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"installing-in-kubernetes"},"Installing in Kubernetes"),(0,o.kt)("p",null,"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running. "),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"You can use Minikube or Docker Desktop to create a local Kubernetes cluster.")),(0,o.kt)("p",null,"First, add the Helm repository:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"helm repo add routr https://routr.io/charts\nhelm repo update\n")),(0,o.kt)("p",null,"Then, create a namespace for Routr:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl create namespace sipnet\n")),(0,o.kt)("p",null,"Next, install Routr with the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"helm install sipnet routr/routr-connect --namespace sipnet\n")),(0,o.kt)("p",null,"Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl get pods -n sipnet\n")),(0,o.kt)("p",null,"You should see a list of pods and their status. If the status is Running, then you are ready to go."),(0,o.kt)("p",null,"For more details, please refer to the chart's ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/ops/charts/connect/README.md"},"README"),"."),(0,o.kt)("p",null,"Please see the ",(0,o.kt)("a",{parentName:"p",href:"/docs/cli"},"Command-Line Tools")," section for detauls on how to interact with Routr Connect via the CLI."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3c0cfdd0.c1beae7e.js b/assets/js/3c0cfdd0.c1beae7e.js new file mode 100644 index 000000000..75b05f4e4 --- /dev/null +++ b/assets/js/3c0cfdd0.c1beae7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4480],{6456:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var s=t(4848),o=t(8453);const r={sidebar_position:2},c="Installing in Kubernetes",i={id:"connect/quick-start/kubernetes",title:"Installing in Kubernetes",description:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.",source:"@site/docs/connect/quick-start/kubernetes.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/kubernetes.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"}},a={},l=[];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"installing-in-kubernetes",children:"Installing in Kubernetes"}),"\n",(0,s.jsx)(n.p,{children:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can use Minikube or Docker Desktop to create a local Kubernetes cluster."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"First, add the Helm repository:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm repo add routr https://routr.io/charts\nhelm repo update\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then, create a namespace for Routr:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, install Routr with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm install sipnet routr/routr-connect --namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should see a list of pods and their status. If the status is Running, then you are ready to go."}),"\n",(0,s.jsxs)(n.p,{children:["For more details, please refer to the chart's ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/ops/charts/connect/README.md",children:"README"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"/docs/2.0.0/connect/command-line/overview",children:"Command-Line Tools"})," section for detauls on how to interact with Routr Connect via the CLI."]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.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(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e7ceef0.029f6e0f.js b/assets/js/3e7ceef0.029f6e0f.js deleted file mode 100644 index 649370007..000000000 --- a/assets/js/3e7ceef0.029f6e0f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9027],{3905:(t,e,a)=>{a.d(e,{Zo:()=>s,kt:()=>c});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},l=Object.keys(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),d=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=d(t.components);return n.createElement(p.Provider,{value:e},t.children)},u="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,s=o(t,["components","mdxType","originalType","parentName"]),u=d(a),k=r,c=u["".concat(p,".").concat(k)]||u[k]||m[k]||l;return a?n.createElement(c,i(i({ref:e},s),{},{components:a})):n.createElement(c,i({ref:e},s))}));function c(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=k;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[u]="string"==typeof t?t:r,i[1]=o;for(var d=2;d<l;d++)i[d]=a[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},1284:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var n=a(7462),r=(a(7294),a(3905));const l={},i="General",o={unversionedId:"configuration/general",id:"version-1.x.x/configuration/general",title:"General",description:"The general configuration affects your entire Routr instance. The general configuration",source:"@site/versioned_docs/version-1.x.x/configuration/general.md",sourceDirName:"configuration",slug:"/configuration/general",permalink:"/docs/1.x.x/configuration/general",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/general.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"},next:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"}},p={},d=[{value:"General Configuration Parameters",id:"general-configuration-parameters",level:2},{value:"Transport Configuration",id:"transport-configuration",level:2},{value:"Datasource Providers",id:"datasource-providers",level:2},{value:"Redis Data Provider",id:"redis-data-provider",level:3},{value:"Files Data Provider",id:"files-data-provider",level:3},{value:"Configuring the server behind a NAT",id:"configuring-the-server-behind-a-nat",level:2},{value:"Access Control List",id:"access-control-list",level:2},{value:"Basic Example",id:"basic-example",level:2}],s={toc:d},u="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(u,(0,n.Z)({},s,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"general"},"General"),(0,r.kt)("p",null,"The general configuration affects your entire Routr instance. The general configuration\ncan be provided using the file ",(0,r.kt)("inlineCode",{parentName:"p"},"config/config.yml")," located at the root of your Routr installation."),(0,r.kt)("h2",{id:"general-configuration-parameters"},"General Configuration Parameters"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,r.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"metadata.userAgent"),(0,r.kt)("td",{parentName:"tr",align:null},"Sets sip header ",(0,r.kt)("inlineCode",{parentName:"td"},"User-Agent")," to the desired value"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.dataSource.provider"),(0,r.kt)("td",{parentName:"tr",align:null},"Defines data provider. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"files_data_provider")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.dataSource.parameters"),(0,r.kt)("td",{parentName:"tr",align:null},"Data Source Parameters. Ex.: 'host=localhost,port=6379'"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.bindAddr"),(0,r.kt)("td",{parentName:"tr",align:null},"Default stack IP address"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.externAddr"),(0,r.kt)("td",{parentName:"tr",align:null},"IP address to advertise"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.localnets"),(0,r.kt)("td",{parentName:"tr",align:null},"Local networks. Use in combination with spec.externAddr"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.recordRoute"),(0,r.kt)("td",{parentName:"tr",align:null},"Stay within the signaling path"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.transport.","[*]",".bindAddr"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites ",(0,r.kt)("inlineCode",{parentName:"td"},"spec.bindAddr")," for transport entry"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.transport.","[*]",".port"),(0,r.kt)("td",{parentName:"tr",align:null},"Transport port"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.transport.","[*]",".protocol"),(0,r.kt)("td",{parentName:"tr",align:null},"Valid values are: ",(0,r.kt)("inlineCode",{parentName:"td"},"tcp"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"udp"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"tls"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"sctp"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"ws"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"wss")),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.registrarIntf"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Internal"),' causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ',(0,r.kt)("inlineCode",{parentName:"td"},"External")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.accessControlList.deny.","[*]"),(0,r.kt)("td",{parentName:"tr",align:null},"Deny incoming traffic from network list"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.accessControlList.allow.","[*]"),(0,r.kt)("td",{parentName:"tr",align:null},"Allow incoming traffic from network list"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.bindAddr"),(0,r.kt)("td",{parentName:"tr",align:null},"Restful service listening address"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.port"),(0,r.kt)("td",{parentName:"tr",align:null},"Restful service port. Defaults to 4567"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.minThreads"),(0,r.kt)("td",{parentName:"tr",align:null},"Minimum thread allocation. Defaults to 8"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.maxThreads"),(0,r.kt)("td",{parentName:"tr",align:null},"Maximum thread allocation. Defaults to 200"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.timeOutMillis"),(0,r.kt)("td",{parentName:"tr",align:null},"Will reject requests that last more than this value. Defaults to 5000(5 seconds)"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.unsecured"),(0,r.kt)("td",{parentName:"tr",align:null},"Disabled https for restful calls. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.keyStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Path to keyStore"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.trueStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Path to trueStore"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.keyStorePassword"),(0,r.kt)("td",{parentName:"tr",align:null},"Password for keyStore"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.restService.trueStorePassword"),(0,r.kt)("td",{parentName:"tr",align:null},"Password for trueStore"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.keyStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Path to keyStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.trustStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Path to trueStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.keyStorePassword"),(0,r.kt)("td",{parentName:"tr",align:null},"Password for keyStore"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.keyStoreType"),(0,r.kt)("td",{parentName:"tr",align:null},"KeyStore type"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.client.authType"),(0,r.kt)("td",{parentName:"tr",align:null},"Type of client authentication. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"DisabledAll"),". See ",(0,r.kt)("a",{parentName:"td",href:"https://goo.gl/1vKbXW"},"https://goo.gl/1vKbXW")," for more options"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.client.protocols.","[*]"),(0,r.kt)("td",{parentName:"tr",align:null},"Accepted TLS protocols. Defaults to ","[",(0,r.kt)("inlineCode",{parentName:"td"},"TLSv1.2"),"]"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.securityContext.debugging"),(0,r.kt)("td",{parentName:"tr",align:null},"Turns ON or OFF ssl debugging. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.ex_rtpEngine.enabled"),(0,r.kt)("td",{parentName:"tr",align:null},"If enabled, it will send all media thru the RTPEngine. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.ex_rtpEngine.proto"),(0,r.kt)("td",{parentName:"tr",align:null},"Reserved to allow for NG commands via ",(0,r.kt)("inlineCode",{parentName:"td"},"http"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"https"),", and ",(0,r.kt)("inlineCode",{parentName:"td"},"udp"),". Currently only ",(0,r.kt)("inlineCode",{parentName:"td"},"http")," is supported"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.ex_rtpEngine.host"),(0,r.kt)("td",{parentName:"tr",align:null},"Address for RTPEngine"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.ex_rtpEngine.port"),(0,r.kt)("td",{parentName:"tr",align:null},"Port for RTPEngine"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.ex_convertTelToE164"),(0,r.kt)("td",{parentName:"tr",align:null},"If enabled, it will convert the number on ingress calls to ",(0,r.kt)("inlineCode",{parentName:"td"},"E164")," format before routing the call. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.ex_uniqueGatewayPerHostPort"),(0,r.kt)("td",{parentName:"tr",align:null},"If enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Variables prefixed with ",(0,r.kt)("inlineCode",{parentName:"p"},"ex_")," are experimental features and may be removed or renamed in the future.")),(0,r.kt)("h2",{id:"transport-configuration"},"Transport Configuration"),(0,r.kt)("p",null,"Routr supports ",(0,r.kt)("inlineCode",{parentName:"p"},"tcp"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"udp"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"tls"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"sctp"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"ws"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"wss")," as transport protocols."),(0,r.kt)("p",null,"The server requires at least one transport protocol.\nTo bind a transport protocol to a specific IP address, you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.transport.bindAddr")," or more generally ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.bindAddr"),"."),(0,r.kt)("h2",{id:"datasource-providers"},"Datasource Providers"),(0,r.kt)("p",null,"Routr currently implements two data providers: ",(0,r.kt)("inlineCode",{parentName:"p"},"redis_data_provider")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"files_data_provider"),". The default data provider is the ",(0,r.kt)("inlineCode",{parentName:"p"},"files_data_provider"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"The docker distribution of the server uses ",(0,r.kt)("inlineCode",{parentName:"p"},"redis_data_provider")," by default")),(0,r.kt)("h3",{id:"redis-data-provider"},"Redis Data Provider"),(0,r.kt)("p",null,"The parameters for ",(0,r.kt)("inlineCode",{parentName:"p"},"redis_data_provider")," are:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Parameter"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"host"),(0,r.kt)("td",{parentName:"tr",align:null},"Redis host. Defaults to 'localhost'"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"port"),(0,r.kt)("td",{parentName:"tr",align:null},"Redis port. The default port is 6379"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"secret"),(0,r.kt)("td",{parentName:"tr",align:null},"Password to access database"),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("h3",{id:"files-data-provider"},"Files Data Provider"),(0,r.kt)("p",null,"The parameters for ",(0,r.kt)("inlineCode",{parentName:"p"},"files_data_provider")," are:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Parameter"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"path"),(0,r.kt)("td",{parentName:"tr",align:null},"Path to configuration files. Defaults to the ",(0,r.kt)("inlineCode",{parentName:"td"},"config")," folder"),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("p",null,"This implementation has the limitation that writes operations have to be performed manually on the files."),(0,r.kt)("h2",{id:"configuring-the-server-behind-a-nat"},"Configuring the server behind a NAT"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.externAddr")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.localnets")," parameters help Routr identify the\ncorrect path for any given traffic. The ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.externAddr")," is typically the Internet\nfacing IP address. The ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.localnets")," is an array with valid CIDR, IP/Mask, or single IP values.\nHere is quick example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"spec:\n externAddr: 172.220.231.23\n localnets: [172.17.0.2/16]\n")),(0,r.kt)("h2",{id:"access-control-list"},"Access Control List"),(0,r.kt)("p",null,"The Access Control List(ACL) provides with a security mechanism to disable network\naccess from unwanted sources. ACL rules exist at general or Domain level. Here is an example,\nblocking all traffic except from IP address ",(0,r.kt)("inlineCode",{parentName:"p"},"192.168.0.1"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"spec:\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n")),(0,r.kt)("h2",{id:"basic-example"},"Basic Example"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1beta1\nspec:\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3e7ceef0.c6e6babd.js b/assets/js/3e7ceef0.c6e6babd.js new file mode 100644 index 000000000..2f0611182 --- /dev/null +++ b/assets/js/3e7ceef0.c6e6babd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5613],{7156:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>c,toc:()=>o});var t=s(4848),d=s(8453);const n={},i="General",c={id:"configuration/general",title:"General",description:"The general configuration affects your entire Routr instance. The general configuration",source:"@site/versioned_docs/version-1.x.x/configuration/general.md",sourceDirName:"configuration",slug:"/configuration/general",permalink:"/docs/1.x.x/configuration/general",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/general.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"},next:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"}},l={},o=[{value:"General Configuration Parameters",id:"general-configuration-parameters",level:2},{value:"Transport Configuration",id:"transport-configuration",level:2},{value:"Datasource Providers",id:"datasource-providers",level:2},{value:"Redis Data Provider",id:"redis-data-provider",level:3},{value:"Files Data Provider",id:"files-data-provider",level:3},{value:"Configuring the server behind a NAT",id:"configuring-the-server-behind-a-nat",level:2},{value:"Access Control List",id:"access-control-list",level:2},{value:"Basic Example",id:"basic-example",level:2}];function a(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"general",children:"General"}),"\n",(0,t.jsxs)(r.p,{children:["The general configuration affects your entire Routr instance. The general configuration\ncan be provided using the file ",(0,t.jsx)(r.code,{children:"config/config.yml"})," located at the root of your Routr installation."]}),"\n",(0,t.jsx)(r.h2,{id:"general-configuration-parameters",children:"General Configuration Parameters"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"apiVersion"}),(0,t.jsx)(r.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"metadata.userAgent"}),(0,t.jsxs)(r.td,{children:["Sets sip header ",(0,t.jsx)(r.code,{children:"User-Agent"})," to the desired value"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.dataSource.provider"}),(0,t.jsxs)(r.td,{children:["Defines data provider. Defaults to ",(0,t.jsx)(r.code,{children:"files_data_provider"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.dataSource.parameters"}),(0,t.jsx)(r.td,{children:"Data Source Parameters. Ex.: 'host=localhost,port=6379'"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.bindAddr"}),(0,t.jsx)(r.td,{children:"Default stack IP address"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.externAddr"}),(0,t.jsx)(r.td,{children:"IP address to advertise"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.localnets"}),(0,t.jsx)(r.td,{children:"Local networks. Use in combination with spec.externAddr"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.recordRoute"}),(0,t.jsx)(r.td,{children:"Stay within the signaling path"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].bindAddr"}),(0,t.jsxs)(r.td,{children:["Overwrites ",(0,t.jsx)(r.code,{children:"spec.bindAddr"})," for transport entry"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].port"}),(0,t.jsx)(r.td,{children:"Transport port"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].protocol"}),(0,t.jsxs)(r.td,{children:["Valid values are: ",(0,t.jsx)(r.code,{children:"tcp"}),", ",(0,t.jsx)(r.code,{children:"udp"}),", ",(0,t.jsx)(r.code,{children:"tls"}),", ",(0,t.jsx)(r.code,{children:"sctp"}),", ",(0,t.jsx)(r.code,{children:"ws"}),", ",(0,t.jsx)(r.code,{children:"wss"})]}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.registrarIntf"}),(0,t.jsxs)(r.td,{children:[(0,t.jsx)(r.code,{children:"Internal"}),' causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ',(0,t.jsx)(r.code,{children:"External"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.accessControlList.deny.[*]"}),(0,t.jsx)(r.td,{children:"Deny incoming traffic from network list"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.accessControlList.allow.[*]"}),(0,t.jsx)(r.td,{children:"Allow incoming traffic from network list"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.bindAddr"}),(0,t.jsx)(r.td,{children:"Restful service listening address"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.port"}),(0,t.jsx)(r.td,{children:"Restful service port. Defaults to 4567"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.minThreads"}),(0,t.jsx)(r.td,{children:"Minimum thread allocation. Defaults to 8"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.maxThreads"}),(0,t.jsx)(r.td,{children:"Maximum thread allocation. Defaults to 200"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.timeOutMillis"}),(0,t.jsx)(r.td,{children:"Will reject requests that last more than this value. Defaults to 5000(5 seconds)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.unsecured"}),(0,t.jsxs)(r.td,{children:["Disabled https for restful calls. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.keyStore"}),(0,t.jsx)(r.td,{children:"Path to keyStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.trueStore"}),(0,t.jsx)(r.td,{children:"Path to trueStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.keyStorePassword"}),(0,t.jsx)(r.td,{children:"Password for keyStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.trueStorePassword"}),(0,t.jsx)(r.td,{children:"Password for trueStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStore"}),(0,t.jsx)(r.td,{children:"Path to keyStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.trustStore"}),(0,t.jsx)(r.td,{children:"Path to trueStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStorePassword"}),(0,t.jsx)(r.td,{children:"Password for keyStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStoreType"}),(0,t.jsx)(r.td,{children:"KeyStore type"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.client.authType"}),(0,t.jsxs)(r.td,{children:["Type of client authentication. Defaults to ",(0,t.jsx)(r.code,{children:"DisabledAll"}),". See ",(0,t.jsx)(r.a,{href:"https://goo.gl/1vKbXW",children:"https://goo.gl/1vKbXW"})," for more options"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.client.protocols.[*]"}),(0,t.jsxs)(r.td,{children:["Accepted TLS protocols. Defaults to [",(0,t.jsx)(r.code,{children:"TLSv1.2"}),"]"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.debugging"}),(0,t.jsxs)(r.td,{children:["Turns ON or OFF ssl debugging. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.enabled"}),(0,t.jsxs)(r.td,{children:["If enabled, it will send all media thru the RTPEngine. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.proto"}),(0,t.jsxs)(r.td,{children:["Reserved to allow for NG commands via ",(0,t.jsx)(r.code,{children:"http"}),", ",(0,t.jsx)(r.code,{children:"https"}),", and ",(0,t.jsx)(r.code,{children:"udp"}),". Currently only ",(0,t.jsx)(r.code,{children:"http"})," is supported"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.host"}),(0,t.jsx)(r.td,{children:"Address for RTPEngine"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.port"}),(0,t.jsx)(r.td,{children:"Port for RTPEngine"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_convertTelToE164"}),(0,t.jsxs)(r.td,{children:["If enabled, it will convert the number on ingress calls to ",(0,t.jsx)(r.code,{children:"E164"})," format before routing the call. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_uniqueGatewayPerHostPort"}),(0,t.jsxs)(r.td,{children:["If enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["Variables prefixed with ",(0,t.jsx)(r.code,{children:"ex_"})," are experimental features and may be removed or renamed in the future."]}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"transport-configuration",children:"Transport Configuration"}),"\n",(0,t.jsxs)(r.p,{children:["Routr supports ",(0,t.jsx)(r.code,{children:"tcp"}),", ",(0,t.jsx)(r.code,{children:"udp"}),", ",(0,t.jsx)(r.code,{children:"tls"}),", ",(0,t.jsx)(r.code,{children:"sctp"}),", ",(0,t.jsx)(r.code,{children:"ws"}),", and ",(0,t.jsx)(r.code,{children:"wss"})," as transport protocols."]}),"\n",(0,t.jsxs)(r.p,{children:["The server requires at least one transport protocol.\nTo bind a transport protocol to a specific IP address, you can use the ",(0,t.jsx)(r.code,{children:"spec.transport.bindAddr"})," or more generally ",(0,t.jsx)(r.code,{children:"spec.bindAddr"}),"."]}),"\n",(0,t.jsx)(r.h2,{id:"datasource-providers",children:"Datasource Providers"}),"\n",(0,t.jsxs)(r.p,{children:["Routr currently implements two data providers: ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," and ",(0,t.jsx)(r.code,{children:"files_data_provider"}),". The default data provider is the ",(0,t.jsx)(r.code,{children:"files_data_provider"}),"."]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["The docker distribution of the server uses ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," by default"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"redis-data-provider",children:"Redis Data Provider"}),"\n",(0,t.jsxs)(r.p,{children:["The parameters for ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," are:"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Parameter"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"host"}),(0,t.jsx)(r.td,{children:"Redis host. Defaults to 'localhost'"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"port"}),(0,t.jsx)(r.td,{children:"Redis port. The default port is 6379"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"secret"}),(0,t.jsx)(r.td,{children:"Password to access database"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.h3,{id:"files-data-provider",children:"Files Data Provider"}),"\n",(0,t.jsxs)(r.p,{children:["The parameters for ",(0,t.jsx)(r.code,{children:"files_data_provider"})," are:"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Parameter"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsx)(r.tbody,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"path"}),(0,t.jsxs)(r.td,{children:["Path to configuration files. Defaults to the ",(0,t.jsx)(r.code,{children:"config"})," folder"]}),(0,t.jsx)(r.td,{children:"No"})]})})]}),"\n",(0,t.jsx)(r.p,{children:"This implementation has the limitation that writes operations have to be performed manually on the files."}),"\n",(0,t.jsx)(r.h2,{id:"configuring-the-server-behind-a-nat",children:"Configuring the server behind a NAT"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"spec.externAddr"})," and ",(0,t.jsx)(r.code,{children:"spec.localnets"})," parameters help Routr identify the\ncorrect path for any given traffic. The ",(0,t.jsx)(r.code,{children:"spec.externAddr"})," is typically the Internet\nfacing IP address. The ",(0,t.jsx)(r.code,{children:"spec.localnets"})," is an array with valid CIDR, IP/Mask, or single IP values.\nHere is quick example:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"spec:\n externAddr: 172.220.231.23\n localnets: [172.17.0.2/16]\n"})}),"\n",(0,t.jsx)(r.h2,{id:"access-control-list",children:"Access Control List"}),"\n",(0,t.jsxs)(r.p,{children:["The Access Control List(ACL) provides with a security mechanism to disable network\naccess from unwanted sources. ACL rules exist at general or Domain level. Here is an example,\nblocking all traffic except from IP address ",(0,t.jsx)(r.code,{children:"192.168.0.1"}),"."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"spec:\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n"})}),"\n",(0,t.jsx)(r.h2,{id:"basic-example",children:"Basic Example"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"apiVersion: v1beta1\nspec:\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n"})})]})}function h(e={}){const{wrapper:r}={...(0,d.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>i,x:()=>c});var t=s(6540);const d={},n=t.createContext(d);function i(e){const r=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f9d54d1.c4d5fa12.js b/assets/js/3f9d54d1.c4d5fa12.js new file mode 100644 index 000000000..7a0287650 --- /dev/null +++ b/assets/js/3f9d54d1.c4d5fa12.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2333],{3451:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=o(4848),r=o(8453);const a={},s="Custom data with the APIServer",d={id:"development/custom-data-with-the-apiserver",title:"Custom data with the APIServer",description:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.",source:"@site/docs/development/custom-data-with-the-apiserver.md",sourceDirName:"development",slug:"/development/custom-data-with-the-apiserver",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/custom-data-with-the-apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"},next:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"}},i={},c=[{value:"When to store custom data",id:"when-to-store-custom-data",level:2},{value:"How to store custom data",id:"how-to-store-custom-data",level:2},{value:"How to retrieve custom data",id:"how-to-retrieve-custom-data",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"custom-data-with-the-apiserver",children:"Custom data with the APIServer"}),"\n",(0,n.jsx)(t.p,{children:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer."}),"\n",(0,n.jsxs)(t.p,{children:["The APIServer, typically used for Routr Connect, consists of objects with an ",(0,n.jsx)(t.code,{children:"extended"})," property to store custom data. This ",(0,n.jsx)(t.code,{children:"extended"})," property is a JSON object you can use to store any data you want."]}),"\n",(0,n.jsx)(t.h2,{id:"when-to-store-custom-data",children:"When to store custom data"}),"\n",(0,n.jsx)(t.p,{children:"Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system."}),"\n",(0,n.jsxs)(t.p,{children:["You might also need to store information a Processor requires, like the ",(0,n.jsx)(t.code,{children:"User-Agent"})," of a device an Agent uses, and use that information to adjust the signaling process."]}),"\n",(0,n.jsx)(t.h2,{id:"how-to-store-custom-data",children:"How to store custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To store custom data, add a property to the ",(0,n.jsx)(t.code,{children:"extended"})," object. For instance, to add the external identifier of an Agent in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'const request = {\n name: "John Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "externalId": "123456789"\n }\n};\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,n.jsxs)(t.p,{children:["For additional examples of how to store custom data, see the ",(0,n.jsx)(t.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"Node SDK"}),' and search for "extended."']}),"\n",(0,n.jsx)(t.h2,{id:"how-to-retrieve-custom-data",children:"How to retrieve custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To retrieve custom data, read the ",(0,n.jsx)(t.code,{children:"extended"})," property. For instance, to retrieve the external identifier of a user in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")\n .then(agent => {\n console.log(agent.extended.externalId);\n })\n .catch(console.error); // an error occurred\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.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:()=>s,x:()=>d});var n=o(6540);const r={},a=n.createContext(r);function s(e){const t=n.useContext(a);return n.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),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f9d54d1.e3677f00.js b/assets/js/3f9d54d1.e3677f00.js deleted file mode 100644 index bd3e29cd4..000000000 --- a/assets/js/3f9d54d1.e3677f00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8076],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),d=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=d(e.components);return n.createElement(c.Provider,{value:t},e.children)},l="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),l=d(r),m=o,h=l["".concat(c,".").concat(m)]||l[m]||p[m]||a;return r?n.createElement(h,i(i({ref:t},u),{},{components:r})):n.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[l]="string"==typeof e?e:o,i[1]=s;for(var d=2;d<a;d++)i[d]=r[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7882:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var n=r(7462),o=(r(7294),r(3905));const a={},i="Custom data with the APIServer",s={unversionedId:"development/custom-data-with-the-apiserver",id:"development/custom-data-with-the-apiserver",title:"Custom data with the APIServer",description:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.",source:"@site/docs/development/custom-data-with-the-apiserver.md",sourceDirName:"development",slug:"/development/custom-data-with-the-apiserver",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/custom-data-with-the-apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"},next:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"}},c={},d=[{value:"When to store custom data",id:"when-to-store-custom-data",level:2},{value:"How to store custom data",id:"how-to-store-custom-data",level:2},{value:"How to retrieve custom data",id:"how-to-retrieve-custom-data",level:2}],u={toc:d},l="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"custom-data-with-the-apiserver"},"Custom data with the APIServer"),(0,o.kt)("p",null,"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer."),(0,o.kt)("p",null,"The APIServer, typically used for Routr Connect, consists of objects with an ",(0,o.kt)("inlineCode",{parentName:"p"},"extended")," property to store custom data. This ",(0,o.kt)("inlineCode",{parentName:"p"},"extended")," property is a JSON object you can use to store any data you want."),(0,o.kt)("h2",{id:"when-to-store-custom-data"},"When to store custom data"),(0,o.kt)("p",null,"Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system."),(0,o.kt)("p",null,"You might also need to store information a Processor requires, like the ",(0,o.kt)("inlineCode",{parentName:"p"},"User-Agent")," of a device an Agent uses, and use that information to adjust the signaling process."),(0,o.kt)("h2",{id:"how-to-store-custom-data"},"How to store custom data"),(0,o.kt)("p",null,"To store custom data, add a property to the ",(0,o.kt)("inlineCode",{parentName:"p"},"extended")," object. For instance, to add the external identifier of an Agent in your external system, do the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-javascript"},'const request = {\n name: "John Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "externalId": "123456789"\n }\n};\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n')),(0,o.kt)("p",null,"For additional examples of how to store custom data, see the ",(0,o.kt)("a",{parentName:"p",href:"/docs/2.0.0/connect/nodesdk/sdk"},"Node SDK"),' and search for "extended."'),(0,o.kt)("h2",{id:"how-to-retrieve-custom-data"},"How to retrieve custom data"),(0,o.kt)("p",null,"To retrieve custom data, read the ",(0,o.kt)("inlineCode",{parentName:"p"},"extended")," property. For instance, to retrieve the external identifier of a user in your external system, do the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-javascript"},'agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")\n .then(agent => {\n console.log(agent.extended.externalId);\n })\n .catch(console.error); // an error occurred\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/40f2a0b4.583a660e.js b/assets/js/40f2a0b4.583a660e.js deleted file mode 100644 index 43d59fcb3..000000000 --- a/assets/js/40f2a0b4.583a660e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6581],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),i=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=i(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=i(r),d=n,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return r?a.createElement(f,l(l({ref:t},c),{},{components:r})):a.createElement(f,l({ref:t},c))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[u]="string"==typeof e?e:n,l[1]=p;for(var i=2;i<o;i++)l[i]=r[i];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},6849:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>i});var a=r(7462),n=(r(7294),r(3905));const o={},l="deleteGateway",p={unversionedId:"api/gateways/delete",id:"version-1.x.x/api/gateways/delete",title:"deleteGateway",description:"Removes a Gateway resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",sourceDirName:"api/gateways",slug:"/api/gateways/delete",permalink:"/docs/1.x.x/api/gateways/delete",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"},next:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"}},s={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"deletegateway"},"deleteGateway"),(0,n.kt)("p",null,"Removes a Gateway resource from a persistent database. Before removing\na Gateway, ensure you have remove all of it child Numbers. Otherwise,\nthis method returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"FOUND_DEPENDENT_OBJECTS_RESPONSE")),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"URL")),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"/gateways/{ref}")),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Method")),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"DELETE")),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Parameters")),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,n.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,n.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,n.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"ref"),(0,n.kt)("td",{parentName:"tr",align:"left"},"path"),(0,n.kt)("td",{parentName:"tr",align:"left"},"string"),(0,n.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Request body")),(0,n.kt)("p",null,"Do not supply a request body with this method."),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Response")),(0,n.kt)("p",null,"If successful this method removes a Gateway resource."),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Sample Call")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-json"},'DELETE /api/v1beta1/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/40f2a0b4.bcebf01b.js b/assets/js/40f2a0b4.bcebf01b.js new file mode 100644 index 000000000..0a7e7e6c0 --- /dev/null +++ b/assets/js/40f2a0b4.bcebf01b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6926],{125:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var n=s(4848),r=s(8453);const a={},i="deleteGateway",o={id:"api/gateways/delete",title:"deleteGateway",description:"Removes a Gateway resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",sourceDirName:"api/gateways",slug:"/api/gateways/delete",permalink:"/docs/1.x.x/api/gateways/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"},next:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"}},d={},l=[];function c(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"deletegateway",children:"deleteGateway"}),"\n",(0,n.jsxs)(t.p,{children:["Removes a Gateway resource from a persistent database. Before removing\na Gateway, ensure you have remove all of it child Numbers. Otherwise,\nthis method returns a ",(0,n.jsx)(t.code,{children:"FOUND_DEPENDENT_OBJECTS_RESPONSE"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"DELETE"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"ref"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method removes a Gateway resource."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>o});var n=s(6540);const r={},a=n.createContext(r);function i(e){const t=n.useContext(a);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(r):e.components||r:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/40f2f3c6.6108f911.js b/assets/js/40f2f3c6.6108f911.js new file mode 100644 index 000000000..463de0d22 --- /dev/null +++ b/assets/js/40f2f3c6.6108f911.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8353],{4765:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},o="deleteDomain",d={id:"api/domains/delete",title:"deleteDomain",description:"Removes a Domain resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/domains/delete.md",sourceDirName:"api/domains",slug:"/api/domains/delete",permalink:"/docs/1.x.x/api/domains/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"},next:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"}},l={},a=[];function c(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletedomain",children:"deleteDomain"}),"\n",(0,s.jsxs)(t.p,{children:["Removes a Domain resource from a persistent database. Before removing\na Domain, ensure you have remove all of it child Agents. Otherwise,\nthis method returns a ",(0,s.jsx)(t.code,{children:"FOUND_DEPENDENT_OBJECTS_RESPONSE"})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Domain resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.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:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/40f2f3c6.ea8a822e.js b/assets/js/40f2f3c6.ea8a822e.js deleted file mode 100644 index d006df4db..000000000 --- a/assets/js/40f2f3c6.ea8a822e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9748],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},m=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),c=s(n),d=a,f=c["".concat(p,".").concat(d)]||c[d]||u[d]||o;return n?r.createElement(f,i(i({ref:t},m),{},{components:n})):r.createElement(f,i({ref:t},m))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},1533:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},i="deleteDomain",l={unversionedId:"api/domains/delete",id:"version-1.x.x/api/domains/delete",title:"deleteDomain",description:"Removes a Domain resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/domains/delete.md",sourceDirName:"api/domains",slug:"/api/domains/delete",permalink:"/docs/1.x.x/api/domains/delete",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"},next:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"}},p={},s=[],m={toc:s},c="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deletedomain"},"deleteDomain"),(0,a.kt)("p",null,"Removes a Domain resource from a persistent database. Before removing\na Domain, ensure you have remove all of it child Agents. Otherwise,\nthis method returns a ",(0,a.kt)("inlineCode",{parentName:"p"},"FOUND_DEPENDENT_OBJECTS_RESPONSE")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/domains/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"DELETE")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method removes a Domain resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'DELETE /api/v1beta1/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/411db075.9b5d818d.js b/assets/js/411db075.9b5d818d.js new file mode 100644 index 000000000..52fe02550 --- /dev/null +++ b/assets/js/411db075.9b5d818d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8535],{7134:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>d});var t=r(4848),s=r(8453);const c={},o="createPeer",i={id:"api/peers/create",title:"createPeer",description:"Creates a new Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/create.md",sourceDirName:"api/peers",slug:"/api/peers/create",permalink:"/docs/1.x.x/api/peers/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"},next:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"createpeer",children:"createPeer"}),"\n",(0,t.jsx)(n.p,{children:"Creates a new Peer resource."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/peers"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"POST"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsxs)(n.p,{children:["A file containing a ",(0,t.jsx)(n.a,{href:"/docs/1.x.x/configuration/peers",children:"Peer"})," resource in ",(0,t.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful this method creates a Peer resource."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/peers\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Peer",\n\t"metadata": {\n\t\t"name": "Asterisk PBX"\n\t},\n\t"spec": {\n\t\t"credentials": {\n\t\t\t"username": "ast",\n\t\t\t"secret": "1234"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "pr2c77f4"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>i});var t=r(6540);const s={},c=t.createContext(s);function o(e){const n=t.useContext(c);return t.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(s):e.components||s:o(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/411db075.f8ce7c00.js b/assets/js/411db075.f8ce7c00.js deleted file mode 100644 index f74fc6260..000000000 --- a/assets/js/411db075.f8ce7c00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6074],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},l=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=c(r),d=a,f=u["".concat(i,".").concat(d)]||u[d]||m[d]||o;return r?n.createElement(f,p(p({ref:t},l),{},{components:r})):n.createElement(f,p({ref:t},l))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=d;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,p[1]=s;for(var c=2;c<o;c++)p[c]=r[c];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},7478:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={},p="createPeer",s={unversionedId:"api/peers/create",id:"version-1.x.x/api/peers/create",title:"createPeer",description:"Creates a new Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/create.md",sourceDirName:"api/peers",slug:"/api/peers/create",permalink:"/docs/1.x.x/api/peers/create",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"},next:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"}},i={},c=[],l={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"createpeer"},"createPeer"),(0,a.kt)("p",null,"Creates a new Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/peers")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/configuration/peers"},"Peer")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method creates a Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/peers\n{\n "apiVersion": "v1beta1",\n "kind": "Peer",\n "metadata": {\n "name": "Asterisk PBX"\n },\n "spec": {\n "credentials": {\n "username": "ast",\n "secret": "1234"\n }\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "pr2c77f4"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6945.2dea2b25.js b/assets/js/416.2c3d437b.js similarity index 55% rename from assets/js/6945.2dea2b25.js rename to assets/js/416.2c3d437b.js index 06e99b6a9..e0ff2666a 100644 --- a/assets/js/6945.2dea2b25.js +++ b/assets/js/416.2c3d437b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6945],{6945:(s,r,u)=>{u.r(r)}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[416],{416:(s,r,u)=>{u.r(r)}}]); \ No newline at end of file diff --git a/assets/js/43d3d555.c68cf535.js b/assets/js/43d3d555.c68cf535.js deleted file mode 100644 index cbe521756..000000000 --- a/assets/js/43d3d555.c68cf535.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6224],{3905:(e,t,n)=>{n.d(t,{Zo:()=>i,kt:()=>c});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},i=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),d=u(n),k=r,c=d["".concat(p,".").concat(k)]||d[k]||m[k]||l;return n?a.createElement(c,s(s({ref:t},i),{},{components:n})):a.createElement(c,s({ref:t},i))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,s=new Array(l);s[0]=k;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,s[1]=o;for(var u=2;u<l;u++)s[u]=n[u];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}k.displayName="MDXCreateElement"},4305:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const l={},s="SDK",o={unversionedId:"connect/nodesdk/sdk",id:"connect/nodesdk/sdk",title:"SDK",description:"* Installation",source:"@site/docs/connect/nodesdk/sdk.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/sdk",permalink:"/docs/2.0.0/connect/nodesdk/sdk",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/sdk.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"},next:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"}},p={},u=[{value:"ACL \u21d0 <code>APIClient</code>",id:"acl--apiclient",level:2},{value:"new ACL(options)",id:"new-acloptions",level:3},{value:"acL.createACL(request) \u21d2 <code>Promise.<CreateACLResponse></code>",id:"aclcreateaclrequest--promisecreateaclresponse",level:3},{value:"acL.updateACL(request) \u21d2 <code>Promise.<UpdateACLResponse></code>",id:"aclupdateaclrequest--promiseupdateaclresponse",level:3},{value:"acL.getACL(ref) \u21d2 <code>Promise.<GetACLResponse></code>",id:"aclgetaclref--promisegetaclresponse",level:3},{value:"acL.deleteACL(ref) \u21d2 <code>Promise.<void></code>",id:"acldeleteaclref--promisevoid",level:3},{value:"acL.listACLs(request) \u21d2 <code>Promise.<ListACLResponse></code>",id:"acllistaclsrequest--promiselistaclresponse",level:3},{value:"Agents \u21d0 <code>APIClient</code>",id:"agents--apiclient",level:2},{value:"new Agents(options)",id:"new-agentsoptions",level:3},{value:"agents.createAgent(request) \u21d2 <code>Promise.<CreateAgentResponse></code>",id:"agentscreateagentrequest--promisecreateagentresponse",level:3},{value:"agents.updateAgent(request) \u21d2 <code>Promise.<UpdateAgentResponse></code>",id:"agentsupdateagentrequest--promiseupdateagentresponse",level:3},{value:"agents.getAgent(ref) \u21d2 <code>Promise.<GetAgentResponse></code>",id:"agentsgetagentref--promisegetagentresponse",level:3},{value:"agents.deleteAgent(ref) \u21d2 <code>Promise.<void></code>",id:"agentsdeleteagentref--promisevoid",level:3},{value:"agents.listAgents(request) \u21d2 <code>Promise.<ListAgentResponse></code>",id:"agentslistagentsrequest--promiselistagentresponse",level:3},{value:"Credentials \u21d0 <code>APIClient</code>",id:"credentials--apiclient",level:2},{value:"new Credentials(options)",id:"new-credentialsoptions",level:3},{value:"credentials.createCredentials(request) \u21d2 <code>Promise.<CreateCredentialsResponse></code>",id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",level:3},{value:"credentials.updateCredentials(request) \u21d2 <code>Promise.<UpdateCredentialsResponse></code>",id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",level:3},{value:"credentials.getCredentials(ref) \u21d2 <code>Promise.<GetCredentialsResponse></code>",id:"credentialsgetcredentialsref--promisegetcredentialsresponse",level:3},{value:"credentials.deleteCredentials(ref) \u21d2 <code>Promise.<void></code>",id:"credentialsdeletecredentialsref--promisevoid",level:3},{value:"credentials.listCredentials(request) \u21d2 <code>Promise.<ListCredentialsResponse></code>",id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",level:3},{value:"Domains \u21d0 <code>APIClient</code>",id:"domains--apiclient",level:2},{value:"new Domains(options)",id:"new-domainsoptions",level:3},{value:"domains.createDomain(request) \u21d2 <code>Promise.<CreateDomainResponse></code>",id:"domainscreatedomainrequest--promisecreatedomainresponse",level:3},{value:"domains.updateDomain(request) \u21d2 <code>Promise.<UpdateDomainResponse></code>",id:"domainsupdatedomainrequest--promiseupdatedomainresponse",level:3},{value:"domains.getDomain(ref) \u21d2 <code>Promise.<GetDomainResponse></code>",id:"domainsgetdomainref--promisegetdomainresponse",level:3},{value:"domains.deleteDomain(ref) \u21d2 <code>Promise.<void></code>",id:"domainsdeletedomainref--promisevoid",level:3},{value:"domains.listDomains(request) \u21d2 <code>Promise.<ListDomainResponse></code>",id:"domainslistdomainsrequest--promiselistdomainresponse",level:3},{value:"Numbers \u21d0 <code>APIClient</code>",id:"numbers--apiclient",level:2},{value:"new Numbers(options)",id:"new-numbersoptions",level:3},{value:"numbers.createNumber(request) \u21d2 <code>Promise.<CreateNumberResponse></code>",id:"numberscreatenumberrequest--promisecreatenumberresponse",level:3},{value:"numbers.updateNumber(request) \u21d2 <code>Promise.<UpdateNumberResponse></code>",id:"numbersupdatenumberrequest--promiseupdatenumberresponse",level:3},{value:"numbers.getNumber(ref) \u21d2 <code>Promise.<GetNumberResponse></code>",id:"numbersgetnumberref--promisegetnumberresponse",level:3},{value:"numbers.deleteNumber(ref) \u21d2 <code>Promise.<void></code>",id:"numbersdeletenumberref--promisevoid",level:3},{value:"numbers.listNumbers(request) \u21d2 <code>Promise.<ListNumberResponse></code>",id:"numberslistnumbersrequest--promiselistnumberresponse",level:3},{value:"Peers \u21d0 <code>APIClient</code>",id:"peers--apiclient",level:2},{value:"new Peers(options)",id:"new-peersoptions",level:3},{value:"peers.createPeer(request) \u21d2 <code>Promise.<CreatePeerResponse></code>",id:"peerscreatepeerrequest--promisecreatepeerresponse",level:3},{value:"peers.updatePeer(request) \u21d2 <code>Promise.<UpdatePeerResponse></code>",id:"peersupdatepeerrequest--promiseupdatepeerresponse",level:3},{value:"peers.getPeer(ref) \u21d2 <code>Promise.<GetPeerResponse></code>",id:"peersgetpeerref--promisegetpeerresponse",level:3},{value:"peers.deletePeer(ref) \u21d2 <code>Promise.<void></code>",id:"peersdeletepeerref--promisevoid",level:3},{value:"peers.listPeers(request) \u21d2 <code>Promise.<ListPeerResponse></code>",id:"peerslistpeersrequest--promiselistpeerresponse",level:3},{value:"Trunks \u21d0 <code>APIClient</code>",id:"trunks--apiclient",level:2},{value:"new Trunks(options)",id:"new-trunksoptions",level:3},{value:"trunks.createTrunk(request) \u21d2 <code>Promise.<CreateTrunkResponse></code>",id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",level:3},{value:"trunks.updateTrunk(request) \u21d2 <code>Promise.<UpdateTrunkResponse></code>",id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",level:3},{value:"trunks.getTrunk(ref) \u21d2 <code>Promise.<GetTrunkResponse></code>",id:"trunksgettrunkref--promisegettrunkresponse",level:3},{value:"trunks.deleteTrunk(ref) \u21d2 <code>Promise.<void></code>",id:"trunksdeletetrunkref--promisevoid",level:3},{value:"trunks.listTrunks(request) \u21d2 <code>Promise.<ListTrunkResponse></code>",id:"trunkslisttrunksrequest--promiselisttrunkresponse",level:3}],i={toc:u},d="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"sdk"},"SDK"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#installation"},"Installation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#apis"},"APIs"))),(0,r.kt)("h1",{id:"installation"},"Installation"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh-session"},"$ npm install --save @routr/sdk\n")),(0,r.kt)("h1",{id:"apis"},"APIs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL"},(0,r.kt)("inlineCode",{parentName:"a"},"Access Control List"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents"},(0,r.kt)("inlineCode",{parentName:"a"},"Agents"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials"},(0,r.kt)("inlineCode",{parentName:"a"},"Credentials"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains"},(0,r.kt)("inlineCode",{parentName:"a"},"Domains"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers"},(0,r.kt)("inlineCode",{parentName:"a"},"Numbers"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers"},(0,r.kt)("inlineCode",{parentName:"a"},"Peers"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks"},(0,r.kt)("inlineCode",{parentName:"a"},"Trunks")))),(0,r.kt)("a",{name:"ACL"}),(0,r.kt)("h2",{id:"acl--apiclient"},"ACL \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get\nand delete Access Control Lists. The ACL API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL"},"ACL")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_ACL_new"},"new ACL(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL+createACL"},".createACL(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateACLResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL+updateACL"},".updateACL(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateACLResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL+getACL"},".getACL(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetACLResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL+deleteACL"},".deleteACL(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#ACL+listACLs"},".listACLs(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListACLResponse",">"))))),(0,r.kt)("a",{name:"new_ACL_new"}),(0,r.kt)("h3",{id:"new-acloptions"},"new ACL(options)"),(0,r.kt)("p",null,"Constructs a new ACL API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst acl = new SDK.ACL()\n\nconst request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"ACL+createACL"}),(0,r.kt)("h3",{id:"aclcreateaclrequest--promisecreateaclresponse"},"acL.createACL(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateACLResponse",">")),(0,r.kt)("p",null,"Creates a new AccessControlList on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#ACL"},(0,r.kt)("code",null,"ACL")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreateACLResponse",">")," - The newly created AccessControlList",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreateACLRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an ACL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the ACL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.allow"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","string",">")),(0,r.kt)("td",{parentName:"tr",align:null},"List of IP addresses or CIDR blocks to allow")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.deny"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","string",">")),(0,r.kt)("td",{parentName:"tr",align:null},"List of IP addresses or CIDR blocks to deny")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"ACL+updateACL"}),(0,r.kt)("h3",{id:"aclupdateaclrequest--promiseupdateaclresponse"},"acL.updateACL(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateACLResponse",">")),(0,r.kt)("p",null,"Updates an already existing AccessControlList on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#ACL"},(0,r.kt)("code",null,"ACL")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdateACLResponse",">")," - The AccessControlList "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdateACLRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the ACL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.allow"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","string",">")),(0,r.kt)("td",{parentName:"tr",align:null},"List of IP addresses or CIDR blocks to allow")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.deny"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","string",">")),(0,r.kt)("td",{parentName:"tr",align:null},"List of IP addresses or CIDR blocks to deny")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Peer network updated",\n}\n\nacl.updateACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"ACL+getACL"}),(0,r.kt)("h3",{id:"aclgetaclref--promisegetaclresponse"},"acL.getACL(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetACLResponse",">")),(0,r.kt)("p",null,"Gets an AccessControlList from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#ACL"},(0,r.kt)("code",null,"ACL")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetACLResponse",">")," - The AccessControlList "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The ACL reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.getACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"ACL+deleteACL"}),(0,r.kt)("h3",{id:"acldeleteaclref--promisevoid"},"acL.deleteACL(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes an AccessControlList from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#ACL"},(0,r.kt)("code",null,"ACL"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The ACL reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.deleteACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"ACL+listACLs"}),(0,r.kt)("h3",{id:"acllistaclsrequest--promiselistaclresponse"},"acL.listACLs(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListACLResponse",">")),(0,r.kt)("p",null,"Lists all AccessControlLists from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#ACL"},(0,r.kt)("code",null,"ACL")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListACLResponse",">")," - The list of AccessControlLists "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListACLRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list ACLs")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of ACLs to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\nacl.listACLs(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")),(0,r.kt)("a",{name:"Agents"}),(0,r.kt)("h2",{id:"agents--apiclient"},"Agents \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get\nand delete Agents. The Agents API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents"},"Agents")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_Agents_new"},"new Agents(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents+createAgent"},".createAgent(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateAgentResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents+updateAgent"},".updateAgent(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateAgentResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents+getAgent"},".getAgent(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetAgentResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents+deleteAgent"},".deleteAgent(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Agents+listAgents"},".listAgents(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListAgentResponse",">"))))),(0,r.kt)("a",{name:"new_Agents_new"}),(0,r.kt)("h3",{id:"new-agentsoptions"},"new Agents(options)"),(0,r.kt)("p",null,"Constructs a new Agent API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst agents = new SDK.Agents()\n\nconst request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Agents+createAgent"}),(0,r.kt)("h3",{id:"agentscreateagentrequest--promisecreateagentresponse"},"agents.createAgent(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateAgentResponse",">")),(0,r.kt)("p",null,"Creates a new Agent on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Agents"},(0,r.kt)("code",null,"Agents")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreateAgentResponse",">")," - The newly created Agent",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreateAgentRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an Agent")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Agent")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.username"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Username of the Agent")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.privacy"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Privacy")),(0,r.kt)("td",{parentName:"tr",align:null},"Privacy of the Agent (e.g., Privacy.PRIVATE)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.domainRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Domain reference of the Domain the Agent belongs to")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.credentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Credentials reference of the Credentials for the Agent")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.enabled"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"boolean")),(0,r.kt)("td",{parentName:"tr",align:null},"Whether the Agent is enabled or not (for future use)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Agents+updateAgent"}),(0,r.kt)("h3",{id:"agentsupdateagentrequest--promiseupdateagentresponse"},"agents.updateAgent(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateAgentResponse",">")),(0,r.kt)("p",null,"Updates an already existing Agent on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Agents"},(0,r.kt)("code",null,"Agents")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdateAgentResponse",">")," - The updated Agent "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdateAgentRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Agent")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.privacy"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Privacy")),(0,r.kt)("td",{parentName:"tr",align:null},"Privacy of the Agent (e.g., Privacy.PRIVATE)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.domainRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Domain reference of the Domain the Agent belongs to")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.credentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Credentials reference of the Credentials for the Agent")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.enabled"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"boolean")),(0,r.kt)("td",{parentName:"tr",align:null},"Whether the Agent is enabled or not (for future use)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John D Doe",\n enabled: false\n}\n\nagents.updateAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Agents+getAgent"}),(0,r.kt)("h3",{id:"agentsgetagentref--promisegetagentresponse"},"agents.getAgent(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetAgentResponse",">")),(0,r.kt)("p",null,"Gets an Agent from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Agents"},(0,r.kt)("code",null,"Agents")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetAgentResponse",">")," - The Agent "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Agent's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.getAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Agents+deleteAgent"}),(0,r.kt)("h3",{id:"agentsdeleteagentref--promisevoid"},"agents.deleteAgent(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes an Agent from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Agents"},(0,r.kt)("code",null,"Agents"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Agent's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.deleteAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Agents+listAgents"}),(0,r.kt)("h3",{id:"agentslistagentsrequest--promiselistagentresponse"},"agents.listAgents(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListAgentResponse",">")),(0,r.kt)("p",null,"Lists all Agents from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Agents"},(0,r.kt)("code",null,"Agents")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListAgentResponse",">")," - The list of Agents in the current page "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListAgentRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list Agents")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of Agents to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\nagents.listAgents(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")),(0,r.kt)("a",{name:"Credentials"}),(0,r.kt)("h2",{id:"credentials--apiclient"},"Credentials \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get\nand delete Credentials. The Credentials API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials"},"Credentials")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_Credentials_new"},"new Credentials(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials+createCredentials"},".createCredentials(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateCredentialsResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials+updateCredentials"},".updateCredentials(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateCredentialsResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials+getCredentials"},".getCredentials(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetCredentialsResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials+deleteCredentials"},".deleteCredentials(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Credentials+listCredentials"},".listCredentials(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListCredentialsResponse",">"))))),(0,r.kt)("a",{name:"new_Credentials_new"}),(0,r.kt)("h3",{id:"new-credentialsoptions"},"new Credentials(options)"),(0,r.kt)("p",null,"Constructs a new Credentials API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst credentials = new SDK.Credentials()\n\nconst request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Credentials+createCredentials"}),(0,r.kt)("h3",{id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse"},"credentials.createCredentials(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateCredentialsResponse",">")),(0,r.kt)("p",null,"Creates a new Credentials on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Credentials"},(0,r.kt)("code",null,"Credentials")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreateCredentialsResponse",">")," - The newly created Credentials",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreateCredentialsRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The friendly name of the Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.username"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Username of the Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.password"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Password of the Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Credentials+updateCredentials"}),(0,r.kt)("h3",{id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse"},"credentials.updateCredentials(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateCredentialsResponse",">")),(0,r.kt)("p",null,"Updates an already existing Credentials on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Credentials"},(0,r.kt)("code",null,"Credentials")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdateCredentialsResponse",">")," - The updated Credentials "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdateCredentialsRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The friendly name of the Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.username"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Username of the Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.password"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Password of the Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John Doe\'s Credentials"\n}\n\ncredentials.updateCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Credentials+getCredentials"}),(0,r.kt)("h3",{id:"credentialsgetcredentialsref--promisegetcredentialsresponse"},"credentials.getCredentials(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetCredentialsResponse",">")),(0,r.kt)("p",null,"Gets an Credentials from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Credentials"},(0,r.kt)("code",null,"Credentials")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetCredentialsResponse",">")," - The Credentials "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Credentials's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.getCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Credentials+deleteCredentials"}),(0,r.kt)("h3",{id:"credentialsdeletecredentialsref--promisevoid"},"credentials.deleteCredentials(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes an Credentials from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Credentials"},(0,r.kt)("code",null,"Credentials"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Credentials's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.deleteCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Credentials+listCredentials"}),(0,r.kt)("h3",{id:"credentialslistcredentialsrequest--promiselistcredentialsresponse"},"credentials.listCredentials(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListCredentialsResponse",">")),(0,r.kt)("p",null,"Lists all Credentials from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Credentials"},(0,r.kt)("code",null,"Credentials")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListCredentialsResponse",">")," - The list of Credentials in the current page "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListCredentialsRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list Credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of Credentials to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\ncredentials.listCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")),(0,r.kt)("a",{name:"Domains"}),(0,r.kt)("h2",{id:"domains--apiclient"},"Domains \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get\nand delete Domains. The Domains API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains"},"Domains")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_Domains_new"},"new Domains(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains+createDomain"},".createDomain(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateDomainResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains+updateDomain"},".updateDomain(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateDomainResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains+getDomain"},".getDomain(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetDomainResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains+deleteDomain"},".deleteDomain(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Domains+listDomains"},".listDomains(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListDomainResponse",">"))))),(0,r.kt)("a",{name:"new_Domains_new"}),(0,r.kt)("h3",{id:"new-domainsoptions"},"new Domains(options)"),(0,r.kt)("p",null,"Constructs a new Domain API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst domains = new SDK.Domains()\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Domains+createDomain"}),(0,r.kt)("h3",{id:"domainscreatedomainrequest--promisecreatedomainresponse"},"domains.createDomain(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateDomainResponse",">")),(0,r.kt)("p",null,"Creates a new Domain on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Domains"},(0,r.kt)("code",null,"Domains")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreateDomainResponse",">")," - The newly created Domain",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreateDomainRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.domainUri"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The FQDN of the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.accessControlListRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The reference to the AccessControlList for the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.egressPolicies"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","CC.EgressPolicy",">")),(0,r.kt)("td",{parentName:"tr",align:null},"The list of EgressPolicies for the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Domains+updateDomain"}),(0,r.kt)("h3",{id:"domainsupdatedomainrequest--promiseupdatedomainresponse"},"domains.updateDomain(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateDomainResponse",">")),(0,r.kt)("p",null,"Updates an already existing Domain on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Domains"},(0,r.kt)("code",null,"Domains")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdateDomainResponse",">")," - The updated Domain "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdateDomainRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.accessControlListRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The reference to the AccessControlList for the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.egressPolicies"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","CC.EgressPolicy",">")),(0,r.kt)("td",{parentName:"tr",align:null},"The list of EgressPolicies for the Domain")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Local domain updated",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n}\n\ndomains.updateDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Domains+getDomain"}),(0,r.kt)("h3",{id:"domainsgetdomainref--promisegetdomainresponse"},"domains.getDomain(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetDomainResponse",">")),(0,r.kt)("p",null,"Gets a Domain from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Domains"},(0,r.kt)("code",null,"Domains")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetDomainResponse",">")," - The Domain "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Domain's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.getDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Domains+deleteDomain"}),(0,r.kt)("h3",{id:"domainsdeletedomainref--promisevoid"},"domains.deleteDomain(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes a Domain from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Domains"},(0,r.kt)("code",null,"Domains"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Domain's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.deleteDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Domains+listDomains"}),(0,r.kt)("h3",{id:"domainslistdomainsrequest--promiselistdomainresponse"},"domains.listDomains(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListDomainResponse",">")),(0,r.kt)("p",null,"Lists all Domains from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Domains"},(0,r.kt)("code",null,"Domains")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListDomainResponse",">")," - The list of Domains "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListDomainRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list Domains")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of Domains to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\ndomains.listDomains(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")),(0,r.kt)("a",{name:"Numbers"}),(0,r.kt)("h2",{id:"numbers--apiclient"},"Numbers \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get\nand delete Numbers. The Number API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers"},"Numbers")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_Numbers_new"},"new Numbers(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers+createNumber"},".createNumber(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateNumberResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers+updateNumber"},".updateNumber(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateNumberResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers+getNumber"},".getNumber(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetNumberResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers+deleteNumber"},".deleteNumber(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Numbers+listNumbers"},".listNumbers(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListNumberResponse",">"))))),(0,r.kt)("a",{name:"new_Numbers_new"}),(0,r.kt)("h3",{id:"new-numbersoptions"},"new Numbers(options)"),(0,r.kt)("p",null,"Constructs a new Number API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst numbers = new SDK.Numbers()\n\nconst request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Numbers+createNumber"}),(0,r.kt)("h3",{id:"numberscreatenumberrequest--promisecreatenumberresponse"},"numbers.createNumber(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateNumberResponse",">")),(0,r.kt)("p",null,"Creates a new Number on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Numbers"},(0,r.kt)("code",null,"Numbers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreateNumberResponse",">")," - The newly created Number",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreateNumberRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an Number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.telUrl"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The number URI to be used (e.g., te:+1234567890)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.aorLink"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The AOR link to be used (e.g., sip:",(0,r.kt)("a",{parentName:"td",href:"mailto:1001@sip.local"},"1001@sip.local"),")")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.city"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The city where the number is located")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.country"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The country where the number is located")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.countryISOCode"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The country ISO code where the number is located")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extraHeaders"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","Object",">")),(0,r.kt)("td",{parentName:"tr",align:null},"Extra headers to be used (e.g., ",'[{name: "X-Room-Id", value: "abc-us-123"}]',")")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.trunkRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Trunk reference to be used")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.sessionAffinityHeader"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional session affinity header")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Numbers+updateNumber"}),(0,r.kt)("h3",{id:"numbersupdatenumberrequest--promiseupdatenumberresponse"},"numbers.updateNumber(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateNumberResponse",">")),(0,r.kt)("p",null,"Updates an already existing Number on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Numbers"},(0,r.kt)("code",null,"Numbers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdateNumberResponse",">")," - The updated Number "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdateNumberRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.aorLink"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The AOR link to be used (e.g., sip:",(0,r.kt)("a",{parentName:"td",href:"mailto:1001@sip.local"},"1001@sip.local"),")")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extraHeaders"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","Object",">")),(0,r.kt)("td",{parentName:"tr",align:null},"Extra headers to be used (e.g., ",'[{name: "X-Room-Id", value: "abc-us-123"}]',")")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.trunkRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Trunk reference to be used")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.sessionAffinityHeader"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional session affinity header")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "(415) 555-1212 (friendly name)",\n aorLink: "sip:2001@sip.local"\n}\n\nnumbers.updateNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Numbers+getNumber"}),(0,r.kt)("h3",{id:"numbersgetnumberref--promisegetnumberresponse"},"numbers.getNumber(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetNumberResponse",">")),(0,r.kt)("p",null,"Gets a Number from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Numbers"},(0,r.kt)("code",null,"Numbers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetNumberResponse",">")," - The Number "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Number's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.getNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Numbers+deleteNumber"}),(0,r.kt)("h3",{id:"numbersdeletenumberref--promisevoid"},"numbers.deleteNumber(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes a Number from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Numbers"},(0,r.kt)("code",null,"Numbers"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Number's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.deleteNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Numbers+listNumbers"}),(0,r.kt)("h3",{id:"numberslistnumbersrequest--promiselistnumberresponse"},"numbers.listNumbers(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListNumberResponse",">")),(0,r.kt)("p",null,"Lists all Numbers from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Numbers"},(0,r.kt)("code",null,"Numbers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListNumberResponse",">")," - The list of Numbers "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListNumberRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list Numbers")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of Numbers to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\nnumbers.listNumbers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")),(0,r.kt)("a",{name:"Peers"}),(0,r.kt)("h2",{id:"peers--apiclient"},"Peers \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get\nand delete Peers. The Peers API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers"},"Peers")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_Peers_new"},"new Peers(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers+createPeer"},".createPeer(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreatePeerResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers+updatePeer"},".updatePeer(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdatePeerResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers+getPeer"},".getPeer(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetPeerResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers+deletePeer"},".deletePeer(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Peers+listPeers"},".listPeers(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListPeerResponse",">"))))),(0,r.kt)("a",{name:"new_Peers_new"}),(0,r.kt)("h3",{id:"new-peersoptions"},"new Peers(options)"),(0,r.kt)("p",null,"Constructs a new Peer API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst peers = new SDK.Peers()\n\nconst request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Peers+createPeer"}),(0,r.kt)("h3",{id:"peerscreatepeerrequest--promisecreatepeerresponse"},"peers.createPeer(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreatePeerResponse",">")),(0,r.kt)("p",null,"Creates a new Peer on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Peers"},(0,r.kt)("code",null,"Peers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreatePeerResponse",">")," - The newly created Peer",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreatePeerRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.aor"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Address of Record of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.contactAddr"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional contact address of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.accessControlListRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Access Control List reference of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.credentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Credentials reference of the Credentials for the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.balancingAlgorithm"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"LoadBalancingAlgorithm")),(0,r.kt)("td",{parentName:"tr",align:null},'Optional balancing algorithm for the Peer (defaults to "round-robin")')),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.withSessionAffinity"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"boolean")),(0,r.kt)("td",{parentName:"tr",align:null},"Whether the Peer has session affinity or not (defaults to false)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.enabled"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"boolean")),(0,r.kt)("td",{parentName:"tr",align:null},"Whether the Peer is enabled or not (for future use)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Peers+updatePeer"}),(0,r.kt)("h3",{id:"peersupdatepeerrequest--promiseupdatepeerresponse"},"peers.updatePeer(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdatePeerResponse",">")),(0,r.kt)("p",null,"Updates an already existing Peer on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Peers"},(0,r.kt)("code",null,"Peers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdatePeerResponse",">")," - The updated Peer "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdatePeerRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.aor"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Address of Record of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.contactAddr"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional contact address of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.accessControlListRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Access Control List reference of the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.credentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Credentials reference of the Credentials for the Peer")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.balancingAlgorithm"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"LoadBalancingAlgorithm")),(0,r.kt)("td",{parentName:"tr",align:null},'Optional balancing algorithm for the Peer (defaults to "round-robin")')),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.withSessionAffinity"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"boolean")),(0,r.kt)("td",{parentName:"tr",align:null},"Whether the Peer has session affinity or not (defaults to false)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.enabled"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"boolean")),(0,r.kt)("td",{parentName:"tr",align:null},"Whether the Peer is enabled or not (for future use)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Feature Server"\n}\n\npeers.updatePeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Peers+getPeer"}),(0,r.kt)("h3",{id:"peersgetpeerref--promisegetpeerresponse"},"peers.getPeer(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetPeerResponse",">")),(0,r.kt)("p",null,"Gets an Peer from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Peers"},(0,r.kt)("code",null,"Peers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetPeerResponse",">")," - The Peer "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Peer's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.getPeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Peers+deletePeer"}),(0,r.kt)("h3",{id:"peersdeletepeerref--promisevoid"},"peers.deletePeer(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes an Peer from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Peers"},(0,r.kt)("code",null,"Peers"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Peer's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.deletePeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Peers+listPeers"}),(0,r.kt)("h3",{id:"peerslistpeersrequest--promiselistpeerresponse"},"peers.listPeers(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListPeerResponse",">")),(0,r.kt)("p",null,"Lists all Peers from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Peers"},(0,r.kt)("code",null,"Peers")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListPeerResponse",">")," - The list of Peers in the current page "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListPeerRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list Peers")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of Peers to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\npeers.listPeers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")),(0,r.kt)("a",{name:"Trunks"}),(0,r.kt)("h2",{id:"trunks--apiclient"},"Trunks \u21d0 ",(0,r.kt)("code",null,"APIClient")),(0,r.kt)("p",null,"Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get\nand delete Trunks. The Trunks API requires of a running Routr deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": global class",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Extends"),": ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"See"),": module:core:APIClient "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks"},"Trunks")," \u21d0 ",(0,r.kt)("code",null,"APIClient"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#new_Trunks_new"},"new Trunks(options)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks+createTrunk"},".createTrunk(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateTrunkResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks+updateTrunk"},".updateTrunk(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateTrunkResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks+getTrunk"},".getTrunk(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetTrunkResponse",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks+deleteTrunk"},".deleteTrunk(ref)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#Trunks+listTrunks"},".listTrunks(request)")," \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListTrunkResponse",">"))))),(0,r.kt)("a",{name:"new_Trunks_new"}),(0,r.kt)("h3",{id:"new-trunksoptions"},"new Trunks(options)"),(0,r.kt)("p",null,"Constructs a new Trunk API object."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"options"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ClientOptions")),(0,r.kt)("td",{parentName:"tr",align:null},"Options to indicate the objects endpoint")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const SDK = require("@routr/sdk")\nconst trunks = new SDK.Trunks()\n\nconst request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Trunks+createTrunk"}),(0,r.kt)("h3",{id:"trunkscreatetrunkrequest--promisecreatetrunkresponse"},"trunks.createTrunk(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","CreateTrunkResponse",">")),(0,r.kt)("p",null,"Creates a new Trunk on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Trunks"},(0,r.kt)("code",null,"Trunks")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","CreateTrunkResponse",">")," - The newly created Trunk",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Throws"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"if request is null")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"CreateTrunkRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to create an Trunk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Trunk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.inboundUri"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Inbound URI of the Trunk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.accessControlListRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Access Control List reference")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.inboundCredentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The reference of the inbound credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.outboundCredentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The reference of the outbound credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.uris"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","TrunkURI",">")),(0,r.kt)("td",{parentName:"tr",align:null},"The outbound URIs of the Trunk")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Trunks+updateTrunk"}),(0,r.kt)("h3",{id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse"},"trunks.updateTrunk(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","UpdateTrunkResponse",">")),(0,r.kt)("p",null,"Updates an already existing Trunk on Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Trunks"},(0,r.kt)("code",null,"Trunks")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","UpdateTrunkResponse",">")," - The updated Trunk "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"UpdateTrunkRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"Partial with the fields to update")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the Trunk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.inboundUri"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Inbound URI of the Trunk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.accessControlListRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"Access Control List reference")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.inboundCredentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The reference of the inbound credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.outboundCredentialsRef"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The reference of the outbound credentials")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.uris"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Array.","<","TrunkURI",">")),(0,r.kt)("td",{parentName:"tr",align:null},"The outbound URIs of the Trunk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.extended"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"Object")),(0,r.kt)("td",{parentName:"tr",align:null},"Optional extended attributes")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Trunk from Twilio (US-East)",\n}\n\ntrunks.updateTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Trunks+getTrunk"}),(0,r.kt)("h3",{id:"trunksgettrunkref--promisegettrunkresponse"},"trunks.getTrunk(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","GetTrunkResponse",">")),(0,r.kt)("p",null,"Gets an Trunk from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Trunks"},(0,r.kt)("code",null,"Trunks")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","GetTrunkResponse",">")," - The Trunk "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Trunk's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.getTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Trunks+deleteTrunk"}),(0,r.kt)("h3",{id:"trunksdeletetrunkref--promisevoid"},"trunks.deleteTrunk(ref) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","void",">")),(0,r.kt)("p",null,"Deletes an Trunk from Routr."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Trunks"},(0,r.kt)("code",null,"Trunks"))," "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ref"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The Trunk's reference")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.deleteTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n')),(0,r.kt)("a",{name:"Trunks+listTrunks"}),(0,r.kt)("h3",{id:"trunkslisttrunksrequest--promiselisttrunkresponse"},"trunks.listTrunks(request) \u21d2 ",(0,r.kt)("code",null,"Promise.","<","ListTrunkResponse",">")),(0,r.kt)("p",null,"Lists all Trunks from Routr with pagination."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kind"),": instance method of ",(0,r.kt)("a",{parentName:"p",href:"#Trunks"},(0,r.kt)("code",null,"Trunks")),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Returns"),": ",(0,r.kt)("code",null,"Promise.","<","ListTrunkResponse",">")," - The list of Trunks in the current page "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Param"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"ListTrunkRequest")),(0,r.kt)("td",{parentName:"tr",align:null},"The request to list Trunks")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageSize"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"number")),(0,r.kt)("td",{parentName:"tr",align:null},"The number of Trunks to return")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"request.pageToken"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("code",null,"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The page token to use for pagination")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Example")," "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},"const request = {\n pageSize: 10\n}\n\ntrunks.listTrunks(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43d3d555.fc23fdad.js b/assets/js/43d3d555.fc23fdad.js new file mode 100644 index 000000000..b76d36b56 --- /dev/null +++ b/assets/js/43d3d555.fc23fdad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3624],{4236:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>a,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var r=s(4848),d=s(8453);const t={},i="SDK",c={id:"connect/nodesdk/sdk",title:"SDK",description:"* Installation",source:"@site/docs/connect/nodesdk/sdk.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/sdk",permalink:"/docs/2.0.0/connect/nodesdk/sdk",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/sdk.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"},next:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"}},l={},o=[{value:"ACL \u21d0 <code>APIClient</code>",id:"acl--apiclient",level:2},{value:"new ACL(options)",id:"new-acloptions",level:3},{value:"acL.createACL(request) \u21d2 <code>Promise.<CreateACLResponse></code>",id:"aclcreateaclrequest--promisecreateaclresponse",level:3},{value:"acL.updateACL(request) \u21d2 <code>Promise.<UpdateACLResponse></code>",id:"aclupdateaclrequest--promiseupdateaclresponse",level:3},{value:"acL.getACL(ref) \u21d2 <code>Promise.<GetACLResponse></code>",id:"aclgetaclref--promisegetaclresponse",level:3},{value:"acL.deleteACL(ref) \u21d2 <code>Promise.<void></code>",id:"acldeleteaclref--promisevoid",level:3},{value:"acL.listACLs(request) \u21d2 <code>Promise.<ListACLResponse></code>",id:"acllistaclsrequest--promiselistaclresponse",level:3},{value:"Agents \u21d0 <code>APIClient</code>",id:"agents--apiclient",level:2},{value:"new Agents(options)",id:"new-agentsoptions",level:3},{value:"agents.createAgent(request) \u21d2 <code>Promise.<CreateAgentResponse></code>",id:"agentscreateagentrequest--promisecreateagentresponse",level:3},{value:"agents.updateAgent(request) \u21d2 <code>Promise.<UpdateAgentResponse></code>",id:"agentsupdateagentrequest--promiseupdateagentresponse",level:3},{value:"agents.getAgent(ref) \u21d2 <code>Promise.<GetAgentResponse></code>",id:"agentsgetagentref--promisegetagentresponse",level:3},{value:"agents.deleteAgent(ref) \u21d2 <code>Promise.<void></code>",id:"agentsdeleteagentref--promisevoid",level:3},{value:"agents.listAgents(request) \u21d2 <code>Promise.<ListAgentResponse></code>",id:"agentslistagentsrequest--promiselistagentresponse",level:3},{value:"Credentials \u21d0 <code>APIClient</code>",id:"credentials--apiclient",level:2},{value:"new Credentials(options)",id:"new-credentialsoptions",level:3},{value:"credentials.createCredentials(request) \u21d2 <code>Promise.<CreateCredentialsResponse></code>",id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",level:3},{value:"credentials.updateCredentials(request) \u21d2 <code>Promise.<UpdateCredentialsResponse></code>",id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",level:3},{value:"credentials.getCredentials(ref) \u21d2 <code>Promise.<GetCredentialsResponse></code>",id:"credentialsgetcredentialsref--promisegetcredentialsresponse",level:3},{value:"credentials.deleteCredentials(ref) \u21d2 <code>Promise.<void></code>",id:"credentialsdeletecredentialsref--promisevoid",level:3},{value:"credentials.listCredentials(request) \u21d2 <code>Promise.<ListCredentialsResponse></code>",id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",level:3},{value:"Domains \u21d0 <code>APIClient</code>",id:"domains--apiclient",level:2},{value:"new Domains(options)",id:"new-domainsoptions",level:3},{value:"domains.createDomain(request) \u21d2 <code>Promise.<CreateDomainResponse></code>",id:"domainscreatedomainrequest--promisecreatedomainresponse",level:3},{value:"domains.updateDomain(request) \u21d2 <code>Promise.<UpdateDomainResponse></code>",id:"domainsupdatedomainrequest--promiseupdatedomainresponse",level:3},{value:"domains.getDomain(ref) \u21d2 <code>Promise.<GetDomainResponse></code>",id:"domainsgetdomainref--promisegetdomainresponse",level:3},{value:"domains.deleteDomain(ref) \u21d2 <code>Promise.<void></code>",id:"domainsdeletedomainref--promisevoid",level:3},{value:"domains.listDomains(request) \u21d2 <code>Promise.<ListDomainResponse></code>",id:"domainslistdomainsrequest--promiselistdomainresponse",level:3},{value:"Numbers \u21d0 <code>APIClient</code>",id:"numbers--apiclient",level:2},{value:"new Numbers(options)",id:"new-numbersoptions",level:3},{value:"numbers.createNumber(request) \u21d2 <code>Promise.<CreateNumberResponse></code>",id:"numberscreatenumberrequest--promisecreatenumberresponse",level:3},{value:"numbers.updateNumber(request) \u21d2 <code>Promise.<UpdateNumberResponse></code>",id:"numbersupdatenumberrequest--promiseupdatenumberresponse",level:3},{value:"numbers.getNumber(ref) \u21d2 <code>Promise.<GetNumberResponse></code>",id:"numbersgetnumberref--promisegetnumberresponse",level:3},{value:"numbers.deleteNumber(ref) \u21d2 <code>Promise.<void></code>",id:"numbersdeletenumberref--promisevoid",level:3},{value:"numbers.listNumbers(request) \u21d2 <code>Promise.<ListNumberResponse></code>",id:"numberslistnumbersrequest--promiselistnumberresponse",level:3},{value:"Peers \u21d0 <code>APIClient</code>",id:"peers--apiclient",level:2},{value:"new Peers(options)",id:"new-peersoptions",level:3},{value:"peers.createPeer(request) \u21d2 <code>Promise.<CreatePeerResponse></code>",id:"peerscreatepeerrequest--promisecreatepeerresponse",level:3},{value:"peers.updatePeer(request) \u21d2 <code>Promise.<UpdatePeerResponse></code>",id:"peersupdatepeerrequest--promiseupdatepeerresponse",level:3},{value:"peers.getPeer(ref) \u21d2 <code>Promise.<GetPeerResponse></code>",id:"peersgetpeerref--promisegetpeerresponse",level:3},{value:"peers.deletePeer(ref) \u21d2 <code>Promise.<void></code>",id:"peersdeletepeerref--promisevoid",level:3},{value:"peers.listPeers(request) \u21d2 <code>Promise.<ListPeerResponse></code>",id:"peerslistpeersrequest--promiselistpeerresponse",level:3},{value:"Trunks \u21d0 <code>APIClient</code>",id:"trunks--apiclient",level:2},{value:"new Trunks(options)",id:"new-trunksoptions",level:3},{value:"trunks.createTrunk(request) \u21d2 <code>Promise.<CreateTrunkResponse></code>",id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",level:3},{value:"trunks.updateTrunk(request) \u21d2 <code>Promise.<UpdateTrunkResponse></code>",id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",level:3},{value:"trunks.getTrunk(ref) \u21d2 <code>Promise.<GetTrunkResponse></code>",id:"trunksgettrunkref--promisegettrunkresponse",level:3},{value:"trunks.deleteTrunk(ref) \u21d2 <code>Promise.<void></code>",id:"trunksdeletetrunkref--promisevoid",level:3},{value:"trunks.listTrunks(request) \u21d2 <code>Promise.<ListTrunkResponse></code>",id:"trunkslisttrunksrequest--promiselisttrunkresponse",level:3}];function h(e){const n={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"sdk",children:"SDK"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/sdk#installation",children:"Installation"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#apis",children:"APIs"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install --save @routr/sdk\n"})}),"\n",(0,r.jsx)(n.h1,{id:"apis",children:"APIs"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)(n.code,{children:"Access Control List"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)(n.code,{children:"Agents"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)(n.code,{children:"Credentials"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)(n.code,{children:"Domains"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)(n.code,{children:"Numbers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)(n.code,{children:"Peers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)(n.code,{children:"Trunks"})})}),"\n"]}),"\n",(0,r.jsx)("a",{name:"ACL"}),"\n",(0,r.jsxs)(n.h2,{id:"acl--apiclient",children:["ACL \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get\nand delete Access Control Lists. The ACL API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL",children:"ACL"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_ACL_new",children:"new ACL(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+createACL",children:".createACL(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+updateACL",children:".updateACL(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+getACL",children:".getACL(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+deleteACL",children:".deleteACL(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+listACLs",children:".listACLs(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_ACL_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-acloptions",children:"new ACL(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new ACL API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst acl = new SDK.ACL()\n\nconst request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+createACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclcreateaclrequest--promisecreateaclresponse",children:["acL.createACL(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})," - The newly created AccessControlList",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateACLRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+updateACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclupdateaclrequest--promiseupdateaclresponse",children:["acL.updateACL(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})," - The AccessControlList"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateACLRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Peer network updated",\n}\n\nacl.updateACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+getACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclgetaclref--promisegetaclresponse",children:["acL.getACL(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})," - The AccessControlList"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.getACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+deleteACL"}),"\n",(0,r.jsxs)(n.h3,{id:"acldeleteaclref--promisevoid",children:["acL.deleteACL(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.deleteACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+listACLs"}),"\n",(0,r.jsxs)(n.h3,{id:"acllistaclsrequest--promiselistaclresponse",children:["acL.listACLs(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all AccessControlLists from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})," - The list of AccessControlLists"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListACLRequest"})}),(0,r.jsx)(n.td,{children:"The request to list ACLs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of ACLs to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nacl.listACLs(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Agents"}),"\n",(0,r.jsxs)(n.h2,{id:"agents--apiclient",children:["Agents \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get\nand delete Agents. The Agents API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents",children:"Agents"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Agents_new",children:"new Agents(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+createAgent",children:".createAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+updateAgent",children:".updateAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+getAgent",children:".getAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+deleteAgent",children:".deleteAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+listAgents",children:".listAgents(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Agents_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-agentsoptions",children:"new Agents(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Agent API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst agents = new SDK.Agents()\n\nconst request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+createAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentscreateagentrequest--promisecreateagentresponse",children:["agents.createAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})," - The newly created Agent",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+updateAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsupdateagentrequest--promiseupdateagentresponse",children:["agents.updateAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})," - The updated Agent"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateAgentRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John D Doe",\n enabled: false\n}\n\nagents.updateAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+getAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsgetagentref--promisegetagentresponse",children:["agents.getAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})," - The Agent"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.getAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+deleteAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsdeleteagentref--promisevoid",children:["agents.deleteAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.deleteAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+listAgents"}),"\n",(0,r.jsxs)(n.h3,{id:"agentslistagentsrequest--promiselistagentresponse",children:["agents.listAgents(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Agents from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})," - The list of Agents in the current page"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Agents"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Agents to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nagents.listAgents(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Credentials"}),"\n",(0,r.jsxs)(n.h2,{id:"credentials--apiclient",children:["Credentials \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get\nand delete Credentials. The Credentials API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials",children:"Credentials"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Credentials_new",children:"new Credentials(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+createCredentials",children:".createCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+updateCredentials",children:".updateCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+getCredentials",children:".getCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+deleteCredentials",children:".deleteCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+listCredentials",children:".listCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Credentials_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-credentialsoptions",children:"new Credentials(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Credentials API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst credentials = new SDK.Credentials()\n\nconst request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+createCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",children:["credentials.createCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})," - The newly created Credentials",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+updateCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",children:["credentials.updateCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})," - The updated Credentials"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John Doe\'s Credentials"\n}\n\ncredentials.updateCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+getCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsgetcredentialsref--promisegetcredentialsresponse",children:["credentials.getCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})," - The Credentials"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.getCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+deleteCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsdeletecredentialsref--promisevoid",children:["credentials.deleteCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.deleteCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+listCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",children:["credentials.listCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Credentials from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})," - The list of Credentials in the current page"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Credentials to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ncredentials.listCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Domains"}),"\n",(0,r.jsxs)(n.h2,{id:"domains--apiclient",children:["Domains \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get\nand delete Domains. The Domains API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains",children:"Domains"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Domains_new",children:"new Domains(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+createDomain",children:".createDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+updateDomain",children:".updateDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+getDomain",children:".getDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+deleteDomain",children:".deleteDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+listDomains",children:".listDomains(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Domains_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-domainsoptions",children:"new Domains(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Domain API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst domains = new SDK.Domains()\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+createDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainscreatedomainrequest--promisecreatedomainresponse",children:["domains.createDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})," - The newly created Domain",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The FQDN of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<CC.EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+updateDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsupdatedomainrequest--promiseupdatedomainresponse",children:["domains.updateDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})," - The updated Domain"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateDomainRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<CC.EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain updated",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n}\n\ndomains.updateDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+getDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsgetdomainref--promisegetdomainresponse",children:["domains.getDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})," - The Domain"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.getDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+deleteDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsdeletedomainref--promisevoid",children:["domains.deleteDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.deleteDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+listDomains"}),"\n",(0,r.jsxs)(n.h3,{id:"domainslistdomainsrequest--promiselistdomainresponse",children:["domains.listDomains(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Domains from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})," - The list of Domains"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Domains"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Domains to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ndomains.listDomains(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Numbers"}),"\n",(0,r.jsxs)(n.h2,{id:"numbers--apiclient",children:["Numbers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get\nand delete Numbers. The Number API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers",children:"Numbers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Numbers_new",children:"new Numbers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+createNumber",children:".createNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+updateNumber",children:".updateNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+getNumber",children:".getNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+deleteNumber",children:".deleteNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+listNumbers",children:".listNumbers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Numbers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-numbersoptions",children:"new Numbers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Number API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst numbers = new SDK.Numbers()\n\nconst request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+createNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numberscreatenumberrequest--promisecreatenumberresponse",children:["numbers.createNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})," - The newly created Number",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.telUrl"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The number URI to be used (e.g., te:+1234567890)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.city"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The city where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.country"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.countryISOCode"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country ISO code where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<Object>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+updateNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersupdatenumberrequest--promiseupdatenumberresponse",children:["numbers.updateNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})," - The updated Number"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateNumberRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<Object>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212 (friendly name)",\n aorLink: "sip:2001@sip.local"\n}\n\nnumbers.updateNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+getNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersgetnumberref--promisegetnumberresponse",children:["numbers.getNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})," - The Number"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.getNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+deleteNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersdeletenumberref--promisevoid",children:["numbers.deleteNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.deleteNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+listNumbers"}),"\n",(0,r.jsxs)(n.h3,{id:"numberslistnumbersrequest--promiselistnumberresponse",children:["numbers.listNumbers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Numbers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})," - The list of Numbers"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Numbers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Numbers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nnumbers.listNumbers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Peers"}),"\n",(0,r.jsxs)(n.h2,{id:"peers--apiclient",children:["Peers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get\nand delete Peers. The Peers API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers",children:"Peers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Peers_new",children:"new Peers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+createPeer",children:".createPeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+updatePeer",children:".updatePeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+getPeer",children:".getPeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+deletePeer",children:".deletePeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+listPeers",children:".listPeers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Peers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-peersoptions",children:"new Peers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Peer API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst peers = new SDK.Peers()\n\nconst request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+createPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peerscreatepeerrequest--promisecreatepeerresponse",children:["peers.createPeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})," - The newly created Peer",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreatePeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+updatePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersupdatepeerrequest--promiseupdatepeerresponse",children:["peers.updatePeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})," - The updated Peer"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdatePeerRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Feature Server"\n}\n\npeers.updatePeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+getPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersgetpeerref--promisegetpeerresponse",children:["peers.getPeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})," - The Peer"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.getPeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+deletePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersdeletepeerref--promisevoid",children:["peers.deletePeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.deletePeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+listPeers"}),"\n",(0,r.jsxs)(n.h3,{id:"peerslistpeersrequest--promiselistpeerresponse",children:["peers.listPeers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Peers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})," - The list of Peers in the current page"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListPeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Peers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Peers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\npeers.listPeers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Trunks"}),"\n",(0,r.jsxs)(n.h2,{id:"trunks--apiclient",children:["Trunks \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get\nand delete Trunks. The Trunks API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks",children:"Trunks"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Trunks_new",children:"new Trunks(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+createTrunk",children:".createTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+updateTrunk",children:".updateTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+getTrunk",children:".getTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+deleteTrunk",children:".deleteTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+listTrunks",children:".listTrunks(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Trunks_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-trunksoptions",children:"new Trunks(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Trunk API object."}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst trunks = new SDK.Trunks()\n\nconst request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+createTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",children:["trunks.createTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})," - The newly created Trunk",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+updateTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",children:["trunks.updateTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})," - The updated Trunk"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Trunk from Twilio (US-East)",\n}\n\ntrunks.updateTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+getTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksgettrunkref--promisegettrunkresponse",children:["trunks.getTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})," - The Trunk"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.getTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+deleteTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksdeletetrunkref--promisevoid",children:["trunks.deleteTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})})]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.deleteTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+listTrunks"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkslisttrunksrequest--promiselisttrunkresponse",children:["trunks.listTrunks(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Trunks from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})," - The list of Trunks in the current page"]}),"\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:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(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:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Trunks"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Trunks to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ntrunks.listTrunks(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var r=s(6540);const d={},t=r.createContext(d);function i(e){const n=r.useContext(t);return r.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(d):e.components||d:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4972.cda16f58.js b/assets/js/4972.cda16f58.js deleted file mode 100644 index 055ba22d0..000000000 --- a/assets/js/4972.cda16f58.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(7294),o=n(5999),l=n(833),r=n(7452);function c(){return a.createElement(a.Fragment,null,a.createElement(l.d,{title:(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/4d0c799d.24d91ca6.js b/assets/js/4d0c799d.24d91ca6.js deleted file mode 100644 index f382c40bd..000000000 --- a/assets/js/4d0c799d.24d91ca6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7011],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),i=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=i(r),d=a,b=m["".concat(s,".").concat(d)]||m[d]||c[d]||o;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[m]="string"==typeof e?e:a,l[1]=p;for(var i=2;i<o;i++)l[i]=r[i];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},217:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const o={},l="deleteNumber",p={unversionedId:"api/numbers/delete",id:"version-1.x.x/api/numbers/delete",title:"deleteNumber",description:"Removes a Number from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",sourceDirName:"api/numbers",slug:"/api/numbers/delete",permalink:"/docs/1.x.x/api/numbers/delete",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"},next:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"}},s={},i=[],u={toc:i},m="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deletenumber"},"deleteNumber"),(0,a.kt)("p",null,"Removes a Number from a persistent database."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/numbers/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"DELETE")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method removes a Number."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'DELETE /api/v1beta1/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200", \n "message": "Successful request"\n}\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4d0c799d.82777be3.js b/assets/js/4d0c799d.82777be3.js new file mode 100644 index 000000000..c4654ea07 --- /dev/null +++ b/assets/js/4d0c799d.82777be3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[823],{2260:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>d,metadata:()=>l,toc:()=>c});var s=n(4848),r=n(8453);const d={},i="deleteNumber",l={id:"api/numbers/delete",title:"deleteNumber",description:"Removes a Number from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",sourceDirName:"api/numbers",slug:"/api/numbers/delete",permalink:"/docs/1.x.x/api/numbers/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"},next:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"}},o={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletenumber",children:"deleteNumber"}),"\n",(0,s.jsx)(t.p,{children:"Removes a Number from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/numbers/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Number."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200", \n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var s=n(6540);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d54d076.1e8f115b.js b/assets/js/4d54d076.1e8f115b.js new file mode 100644 index 000000000..b4aae890a --- /dev/null +++ b/assets/js/4d54d076.1e8f115b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1459],{6564:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var i=t(4848),s=t(8453);const o={},r="Contributing Guide",l={id:"contributing",title:"Contributing Guide",description:"* New Contributor Guide",source:"@site/docs/contributing.md",sourceDirName:".",slug:"/contributing",permalink:"/docs/2.0.0/contributing",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/contributing.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/2.0.0/community"},next:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},u={},c=[{value:"Ways to Contribute",id:"ways-to-contribute",level:2},{value:"Come to Meetings",id:"come-to-meetings",level:3},{value:"Find an Issue",id:"find-an-issue",level:2},{value:"Ask for Help",id:"ask-for-help",level:2},{value:"Pull Request Lifecycle",id:"pull-request-lifecycle",level:2},{value:"Development Environment Setup",id:"development-environment-setup",level:2},{value:"Sign your Commits",id:"sign-your-commits",level:2},{value:"DCO",id:"dco",level:3},{value:"Pull Request Checklist",id:"pull-request-checklist",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#contributing-guide",children:"New Contributor Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ways-to-contribute",children:"Ways to Contribute"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#find-an-issue",children:"Find an Issue"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ask-for-help",children:"Ask for Help"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#pull-request-lifecycle",children:"Pull Request Lifecycle"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#development-environment-setup",children:"Development Environment Setup"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#sign-your-commits",children:"Sign your Commits"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#pull-request-checklist",children:"Pull Request Checklist"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Welcome! We are glad that you want to contribute to our project! \ud83d\udc96"}),"\n",(0,i.jsx)(n.p,{children:"As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Problems found during setting up a new developer environment"}),"\n",(0,i.jsx)(n.li,{children:"Gaps in our Quickstart Guide or documentation"}),"\n",(0,i.jsx)(n.li,{children:"Bugs in our automation scripts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!"}),"\n",(0,i.jsx)(n.h2,{id:"ways-to-contribute",children:"Ways to Contribute"}),"\n",(0,i.jsx)(n.p,{children:"We welcome many different types of contributions including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"New features"}),"\n",(0,i.jsx)(n.li,{children:"Builds, CI/CD"}),"\n",(0,i.jsx)(n.li,{children:"Bug fixes"}),"\n",(0,i.jsx)(n.li,{children:"Documentation"}),"\n",(0,i.jsx)(n.li,{children:"Issue Triage"}),"\n",(0,i.jsx)(n.li,{children:"Answering questions on Discord/GitHub Discussions"}),"\n",(0,i.jsx)(n.li,{children:"Web design"}),"\n",(0,i.jsx)(n.li,{children:"UI/UX"}),"\n",(0,i.jsx)(n.li,{children:"Communications / Social Media / Blog Posts"}),"\n",(0,i.jsx)(n.li,{children:"Release management"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Not everything happens through a GitHub pull request. Please come to our ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"meetings"})," or ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"contact us"})," and let's discuss how we can work\ntogether."]}),"\n",(0,i.jsx)(n.h3,{id:"come-to-meetings",children:"Come to Meetings"}),"\n",(0,i.jsx)(n.p,{children:"Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don\u2019t have anything you feel like you want to contribute. Just being there is enough!"}),"\n",(0,i.jsxs)(n.p,{children:["You can find out more about our meetings ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"here"}),". You don\u2019t have to turn on your video. The first time you come, introducing yourself is more than enough."]}),"\n",(0,i.jsx)(n.p,{children:"Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences."}),"\n",(0,i.jsx)(n.h2,{id:"find-an-issue",children:"Find an Issue"}),"\n",(0,i.jsxs)(n.p,{children:["We have good first issues for new contributors and help wanted issues suitable for any contributor. ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22",children:"good first issue"})," has extra information to help you make your first contribution. ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22",children:"help wanted"})," are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request."]}),"\n",(0,i.jsxs)(n.p,{children:["Sometimes there won\u2019t be any issues with these labels. That\u2019s ok! There is likely still something for you to work on. If you want to contribute but you don\u2019t know where to start or can't find a suitable issue, you can reach out to us via ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," or ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," and we will help you find something."]}),"\n",(0,i.jsx)(n.p,{children:'Once you see an issue that you\'d like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.'}),"\n",(0,i.jsx)(n.h2,{id:"ask-for-help",children:"Ask for Help"}),"\n",(0,i.jsx)(n.p,{children:"The best way to reach us with a question when contributing is to ask on:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The original github issue"}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," community"]}),"\n",(0,i.jsxs)(n.li,{children:["Our ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"pull-request-lifecycle",children:"Pull Request Lifecycle"}),"\n",(0,i.jsx)(n.p,{children:"Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request."}),"\n",(0,i.jsx)(n.p,{children:"After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Enhancements in your code"}),"\n",(0,i.jsx)(n.li,{children:"Additional tests or updates to the documentation"}),"\n",(0,i.jsx)(n.li,{children:"Changes in your implementation approach"}),"\n",(0,i.jsx)(n.li,{children:"Dividing your pull request into smaller, more manageable parts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Depending on the project\u2019s roadmap and priorities, you might also be asked to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Delay the integration of your pull request to align with future releases"}),"\n",(0,i.jsx)(n.li,{children:"Close your current pull request and, if needed, open a new one with revised changes"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"development-environment-setup",children:"Development Environment Setup"}),"\n",(0,i.jsxs)(n.p,{children:["See our ",(0,i.jsx)(n.a,{href:"https://routr.io/docs/2.0.0/development/introduction",children:"Development environment setup"})," guide to get started locally or using Gitpod."]}),"\n",(0,i.jsx)(n.h2,{id:"sign-your-commits",children:"Sign your Commits"}),"\n",(0,i.jsx)(n.h3,{id:"dco",children:"DCO"}),"\n",(0,i.jsxs)(n.p,{children:["Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The ",(0,i.jsx)(n.a,{href:"https://probot.github.io/apps/dco/",children:"Developer Certificate of Origin (DCO)"})," is a way to certify that you wrote and have the right to contribute the code you are submitting to the project."]}),"\n",(0,i.jsx)(n.p,{children:"You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"This is my commit message\n\nSigned-off-by: Your Name <your.name@example.com>\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Git has a ",(0,i.jsx)(n.code,{children:"-s"})," command line option to do this automatically:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"git commit -s -m 'This is my commit message'\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"git commit --amend -s\n"})}),"\n",(0,i.jsx)(n.h2,{id:"pull-request-checklist",children:"Pull Request Checklist"}),"\n",(0,i.jsx)(n.p,{children:"When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:"}),"\n",(0,i.jsxs)(n.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code builds and passes tests locally"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code passes our automated checks"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have signed your commits"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have added tests for your code (if applicable)"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have updated the documentation (if applicable)"]}),"\n"]})]})}function d(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,t)=>{t.d(n,{R:()=>r,x:()=>l});var i=t(6540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.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:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d54d076.67aee960.js b/assets/js/4d54d076.67aee960.js deleted file mode 100644 index 8a7dd862c..000000000 --- a/assets/js/4d54d076.67aee960.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7080],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var o=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,i=function(e,t){if(null==e)return{};var n,o,i={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=o.createContext({}),l=function(e){var t=o.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=l(e.components);return o.createElement(u.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,u=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=l(n),d=i,h=p["".concat(u,".").concat(d)]||p[d]||m[d]||r;return n?o.createElement(h,a(a({ref:t},c),{},{components:n})):o.createElement(h,a({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,a=new Array(r);a[0]=d;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:i,a[1]=s;for(var l=2;l<r;l++)a[l]=n[l];return o.createElement.apply(null,a)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},1933:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var o=n(7462),i=(n(7294),n(3905));const r={},a="Contributing Guide",s={unversionedId:"contributing",id:"contributing",title:"Contributing Guide",description:"* New Contributor Guide",source:"@site/docs/contributing.md",sourceDirName:".",slug:"/contributing",permalink:"/docs/2.0.0/contributing",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/contributing.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/2.0.0/community"},next:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},u={},l=[{value:"Ways to Contribute",id:"ways-to-contribute",level:2},{value:"Come to Meetings",id:"come-to-meetings",level:3},{value:"Find an Issue",id:"find-an-issue",level:2},{value:"Ask for Help",id:"ask-for-help",level:2},{value:"Pull Request Lifecycle",id:"pull-request-lifecycle",level:2},{value:"Development Environment Setup",id:"development-environment-setup",level:2},{value:"Sign your Commits",id:"sign-your-commits",level:2},{value:"DCO",id:"dco",level:3},{value:"Pull Request Checklist",id:"pull-request-checklist",level:2}],c={toc:l},p="wrapper";function m(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"contributing-guide"},"Contributing Guide"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#contributing-guide"},"New Contributor Guide"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#ways-to-contribute"},"Ways to Contribute")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#find-an-issue"},"Find an Issue")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#ask-for-help"},"Ask for Help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#pull-request-lifecycle"},"Pull Request Lifecycle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#development-environment-setup"},"Development Environment Setup")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#sign-your-commits"},"Sign your Commits")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#pull-request-checklist"},"Pull Request Checklist"))))),(0,i.kt)("p",null,"Welcome! We are glad that you want to contribute to our project! \ud83d\udc96"),(0,i.kt)("p",null,"As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Problems found during setting up a new developer environment"),(0,i.kt)("li",{parentName:"ul"},"Gaps in our Quickstart Guide or documentation"),(0,i.kt)("li",{parentName:"ul"},"Bugs in our automation scripts")),(0,i.kt)("p",null,"If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!"),(0,i.kt)("h2",{id:"ways-to-contribute"},"Ways to Contribute"),(0,i.kt)("p",null,"We welcome many different types of contributions including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"New features"),(0,i.kt)("li",{parentName:"ul"},"Builds, CI/CD"),(0,i.kt)("li",{parentName:"ul"},"Bug fixes"),(0,i.kt)("li",{parentName:"ul"},"Documentation"),(0,i.kt)("li",{parentName:"ul"},"Issue Triage"),(0,i.kt)("li",{parentName:"ul"},"Answering questions on Discord/GitHub Discussions"),(0,i.kt)("li",{parentName:"ul"},"Web design"),(0,i.kt)("li",{parentName:"ul"},"UI/UX"),(0,i.kt)("li",{parentName:"ul"},"Communications / Social Media / Blog Posts"),(0,i.kt)("li",{parentName:"ul"},"Release management")),(0,i.kt)("p",null,"Not everything happens through a GitHub pull request. Please come to our ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/4QWgSz4hTC"},"meetings")," or ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/4QWgSz4hTC"},"contact us")," and let's discuss how we can work\ntogether. "),(0,i.kt)("h3",{id:"come-to-meetings"},"Come to Meetings"),(0,i.kt)("p",null,"Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don\u2019t have anything you feel like you want to contribute. Just being there is enough!"),(0,i.kt)("p",null,"You can find out more about our meetings ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/4QWgSz4hTC"},"here"),". You don\u2019t have to turn on your video. The first time you come, introducing yourself is more than enough."),(0,i.kt)("p",null,"Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences."),(0,i.kt)("h2",{id:"find-an-issue"},"Find an Issue"),(0,i.kt)("p",null,"We have good first issues for new contributors and help wanted issues suitable for any contributor. ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22"},"good first issue")," has extra information to help you make your first contribution. ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22"},"help wanted")," are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request."),(0,i.kt)("p",null,"Sometimes there won\u2019t be any issues with these labels. That\u2019s ok! There is likely still something for you to work on. If you want to contribute but you don\u2019t know where to start or can't find a suitable issue, you can reach out to us via ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/4QWgSz4hTC"},"Discord")," or ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/discussions"},"GitHub Discussions")," and we will help you find something."),(0,i.kt)("p",null,'Once you see an issue that you\'d like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.'),(0,i.kt)("h2",{id:"ask-for-help"},"Ask for Help"),(0,i.kt)("p",null,"The best way to reach us with a question when contributing is to ask on:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The original github issue"),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"https://discord.gg/4QWgSz4hTC"},"Discord")," community"),(0,i.kt)("li",{parentName:"ul"},"Our ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr/discussions"},"GitHub Discussions"))),(0,i.kt)("h2",{id:"pull-request-lifecycle"},"Pull Request Lifecycle"),(0,i.kt)("p",null,"Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request."),(0,i.kt)("p",null,"After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Enhancements in your code"),(0,i.kt)("li",{parentName:"ul"},"Additional tests or updates to the documentation"),(0,i.kt)("li",{parentName:"ul"},"Changes in your implementation approach"),(0,i.kt)("li",{parentName:"ul"},"Dividing your pull request into smaller, more manageable parts")),(0,i.kt)("p",null,"Depending on the project\u2019s roadmap and priorities, you might also be asked to:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Delay the integration of your pull request to align with future releases"),(0,i.kt)("li",{parentName:"ul"},"Close your current pull request and, if needed, open a new one with revised changes")),(0,i.kt)("h2",{id:"development-environment-setup"},"Development Environment Setup"),(0,i.kt)("p",null,"See our ",(0,i.kt)("a",{parentName:"p",href:"https://routr.io/docs/2.0.0/development/introduction"},"Development environment setup")," guide to get started locally or using Gitpod."),(0,i.kt)("h2",{id:"sign-your-commits"},"Sign your Commits"),(0,i.kt)("h3",{id:"dco"},"DCO"),(0,i.kt)("p",null,"Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The ",(0,i.kt)("a",{parentName:"p",href:"https://probot.github.io/apps/dco/"},"Developer Certificate of Origin (DCO)")," is a way to certify that you wrote and have the right to contribute the code you are submitting to the project."),(0,i.kt)("p",null,"You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-text"},"This is my commit message\n\nSigned-off-by: Your Name <your.name@example.com>\n")),(0,i.kt)("p",null,"Git has a ",(0,i.kt)("inlineCode",{parentName:"p"},"-s")," command line option to do this automatically:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-text"},"git commit -s -m 'This is my commit message'\n")),(0,i.kt)("p",null,"If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-text"},"git commit --amend -s\n")),(0,i.kt)("h2",{id:"pull-request-checklist"},"Pull Request Checklist"),(0,i.kt)("p",null,"When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:"),(0,i.kt)("ul",{className:"contains-task-list"},(0,i.kt)("li",{parentName:"ul",className:"task-list-item"},(0,i.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Your code builds and passes tests locally"),(0,i.kt)("li",{parentName:"ul",className:"task-list-item"},(0,i.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Your code passes our automated checks"),(0,i.kt)("li",{parentName:"ul",className:"task-list-item"},(0,i.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","You have signed your commits"),(0,i.kt)("li",{parentName:"ul",className:"task-list-item"},(0,i.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","You have added tests for your code (if applicable)"),(0,i.kt)("li",{parentName:"ul",className:"task-list-item"},(0,i.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","You have updated the documentation (if applicable)")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4dcd5895.b14ce444.js b/assets/js/4dcd5895.b14ce444.js deleted file mode 100644 index f71e4d2d5..000000000 --- a/assets/js/4dcd5895.b14ce444.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9587],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),s=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},l=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),c=s(n),d=a,f=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return n?r.createElement(f,p(p({ref:t},l),{},{components:n})):r.createElement(f,p({ref:t},l))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,p[1]=i;for(var s=2;s<o;s++)p[s]=n[s];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},4386:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},p="updateNumber",i={unversionedId:"api/numbers/update",id:"version-1.x.x/api/numbers/update",title:"updateNumber",description:"Updates an existing Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/update.md",sourceDirName:"api/numbers",slug:"/api/numbers/update",permalink:"/docs/1.x.x/api/numbers/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"},next:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"}},u={},s=[],l={toc:s},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"updatenumber"},"updateNumber"),(0,a.kt)("p",null,"Updates an existing Number."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/numbers/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"PUT")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/configuration/numbers"},"Number")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method updates a Number."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'PUT /api/v1beta1/numbers/dd50baa4\n{\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "ref": "dd50baa4",\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4dcd5895.fb90af12.js b/assets/js/4dcd5895.fb90af12.js new file mode 100644 index 000000000..aea55adfb --- /dev/null +++ b/assets/js/4dcd5895.fb90af12.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6615],{3022:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=r(4848),t=r(8453);const i={},o="updateNumber",a={id:"api/numbers/update",title:"updateNumber",description:"Updates an existing Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/update.md",sourceDirName:"api/numbers",slug:"/api/numbers/update",permalink:"/docs/1.x.x/api/numbers/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"},next:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"}},c={},d=[];function u(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updatenumber",children:"updateNumber"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Number."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/numbers/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing a ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/numbers",children:"Number"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates a Number."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/numbers/dd50baa4\n{\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "ref": "dd50baa4",\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>a});var s=r(6540);const t={},i=s.createContext(t);function o(e){const n=s.useContext(i);return s.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:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e27cd47.23397cb1.js b/assets/js/4e27cd47.23397cb1.js deleted file mode 100644 index 94b5ee3c0..000000000 --- a/assets/js/4e27cd47.23397cb1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1697],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(p,".").concat(m)]||d[m]||u[m]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},9091:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},l="addEndpoint",i={unversionedId:"api/location/create",id:"version-1.x.x/api/location/create",title:"addEndpoint",description:"Adds an entry into the location table",source:"@site/versioned_docs/version-1.x.x/api/location/create.md",sourceDirName:"api/location",slug:"/api/location/create",permalink:"/docs/1.x.x/api/location/create",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"},next:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"}},p={},s=[],c={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"addendpoint"},"addEndpoint"),(0,a.kt)("p",null,"Adds an entry into the location table"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/location/{addressOfRecord}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"addressOfRecord"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Address of record for the new entry")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Supply a json containing an address, port, expires, user values."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"This method adds an entry to the location table. Useful for end-to-end testing."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/location/sip:guest@guest\n{\n "user": "guest",\n "address": "192.168.1.149",\n "port": 5080,\n "expires": 600\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Added location entry"\n}\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e27cd47.40cb91a8.js b/assets/js/4e27cd47.40cb91a8.js new file mode 100644 index 000000000..5ff8062fd --- /dev/null +++ b/assets/js/4e27cd47.40cb91a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8253],{5846:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var s=n(4848),r=n(8453);const o={},d="addEndpoint",i={id:"api/location/create",title:"addEndpoint",description:"Adds an entry into the location table",source:"@site/versioned_docs/version-1.x.x/api/location/create.md",sourceDirName:"api/location",slug:"/api/location/create",permalink:"/docs/1.x.x/api/location/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"},next:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"addendpoint",children:"addEndpoint"}),"\n",(0,s.jsx)(t.p,{children:"Adds an entry into the location table"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location/{addressOfRecord}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"POST"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"addressOfRecord"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Address of record for the new entry"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Supply a json containing an address, port, expires, user values."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method adds an entry to the location table. Useful for end-to-end testing."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/location/sip:guest@guest\n{\n "user": "guest",\n "address": "192.168.1.149",\n "port": 5080,\n "expires": 600\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Added location entry"\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>i});var s=n(6540);const r={},o=s.createContext(r);function d(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(r):e.components||r:d(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e3cbe94.0efb67be.js b/assets/js/4e3cbe94.0efb67be.js new file mode 100644 index 000000000..6f06bca17 --- /dev/null +++ b/assets/js/4e3cbe94.0efb67be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6692],{7403:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(4848),s=n(8453);const i={},r="Testing with SEET",c={id:"development/testing-with-seet",title:"Testing with SEET",description:"Coming soon.",source:"@site/docs/development/testing-with-seet.md",sourceDirName:"development",slug:"/development/testing-with-seet",permalink:"/docs/2.0.0/development/testing-with-seet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/testing-with-seet.md",tags:[],version:"current",frontMatter:{}},d={},u=[];function p(t){const e={h1:"h1",p:"p",...(0,s.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.h1,{id:"testing-with-seet",children:"Testing with SEET"}),"\n",(0,o.jsx)(e.p,{children:"Coming soon."})]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(p,{...t})}):p(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>r,x:()=>c});var o=n(6540);const s={},i=o.createContext(s);function r(t){const e=o.useContext(i);return o.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(s):t.components||s:r(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e3cbe94.f25ac18d.js b/assets/js/4e3cbe94.f25ac18d.js deleted file mode 100644 index f7bb4ff73..000000000 --- a/assets/js/4e3cbe94.f25ac18d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6292],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),u=p(r),m=o,d=u["".concat(s,".").concat(m)]||u[m]||f[m]||i;return r?n.createElement(d,c(c({ref:t},l),{},{components:r})):n.createElement(d,c({ref:t},l))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=m;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[u]="string"==typeof e?e:o,c[1]=a;for(var p=2;p<i;p++)c[p]=r[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7402:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>f,frontMatter:()=>i,metadata:()=>a,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={},c="Testing with SEET",a={unversionedId:"development/testing-with-seet",id:"development/testing-with-seet",title:"Testing with SEET",description:"Coming soon.",source:"@site/docs/development/testing-with-seet.md",sourceDirName:"development",slug:"/development/testing-with-seet",permalink:"/docs/2.0.0/development/testing-with-seet",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/testing-with-seet.md",tags:[],version:"current",frontMatter:{}},s={},p=[],l={toc:p},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"testing-with-seet"},"Testing with SEET"),(0,o.kt)("p",null,"Coming soon."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/54969ead.01cf159a.js b/assets/js/54969ead.01cf159a.js new file mode 100644 index 000000000..58b28431c --- /dev/null +++ b/assets/js/54969ead.01cf159a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[364],{2994:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var o=n(4848),s=n(8453);const r={},c="Everything about MELT",i={id:"development/metrics-events-logs-and-traces",title:"Everything about MELT",description:"Comin soon.",source:"@site/docs/development/metrics-events-logs-and-traces.md",sourceDirName:"development",slug:"/development/metrics-events-logs-and-traces",permalink:"/docs/2.0.0/development/metrics-events-logs-and-traces",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/metrics-events-logs-and-traces.md",tags:[],version:"current",frontMatter:{}},a={},d=[];function u(e){const t={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"everything-about-melt",children:"Everything about MELT"}),"\n",(0,o.jsx)(t.p,{children:"Comin soon."})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var o=n(6540);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.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:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54969ead.ebbccc5b.js b/assets/js/54969ead.ebbccc5b.js deleted file mode 100644 index 885b84292..000000000 --- a/assets/js/54969ead.ebbccc5b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[119],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(r),d=o,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return r?n.createElement(f,c(c({ref:t},p),{},{components:r})):n.createElement(f,c({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,c[1]=i;for(var l=2;l<a;l++)c[l]=r[l];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},9275:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={},c="Everything about MELT",i={unversionedId:"development/metrics-events-logs-and-traces",id:"development/metrics-events-logs-and-traces",title:"Everything about MELT",description:"Comin soon.",source:"@site/docs/development/metrics-events-logs-and-traces.md",sourceDirName:"development",slug:"/development/metrics-events-logs-and-traces",permalink:"/docs/2.0.0/development/metrics-events-logs-and-traces",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/metrics-events-logs-and-traces.md",tags:[],version:"current",frontMatter:{}},s={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"everything-about-melt"},"Everything about MELT"),(0,o.kt)("p",null,"Comin soon."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5514a4b8.07e210c6.js b/assets/js/5514a4b8.07e210c6.js deleted file mode 100644 index 3b5c96686..000000000 --- a/assets/js/5514a4b8.07e210c6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6547],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=o,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||a;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:o,i[1]=l;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},755:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={title:"Installation"},i=void 0,l={unversionedId:"administration/cli/installation",id:"version-1.x.x/administration/cli/installation",title:"Installation",description:"To get the Routr Command-Line Tool run the following command:",source:"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",sourceDirName:"administration/cli",slug:"/administration/cli/installation",permalink:"/docs/1.x.x/administration/cli/installation",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/installation.md",tags:[],version:"1.x.x",frontMatter:{title:"Installation"},sidebar:"tutorialSidebar",previous:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"},next:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"}},s={},c=[{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"To get the Routr Command-Line Tool run the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm install -g routr-ctl\n")),(0,o.kt)("p",null,"The command-line tool is now globally accessible."),(0,o.kt)("p",null,"Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo snap install rctl\n")),(0,o.kt)("h2",{id:"login-to-a-routr-server"},"Login to a Routr server"),(0,o.kt)("p",null,"To log in to a Routr server and being issuing commands run the following commands."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"The current API version is v1beta1")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5514a4b8.b85640cf.js b/assets/js/5514a4b8.b85640cf.js new file mode 100644 index 000000000..62bdfb780 --- /dev/null +++ b/assets/js/5514a4b8.b85640cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[583],{405:(n,t,e)=>{e.r(t),e.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=e(4848),i=e(8453);const s={title:"Installation"},r=void 0,a={id:"administration/cli/installation",title:"Installation",description:"To get the Routr Command-Line Tool run the following command:",source:"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",sourceDirName:"administration/cli",slug:"/administration/cli/installation",permalink:"/docs/1.x.x/administration/cli/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/installation.md",tags:[],version:"1.x.x",frontMatter:{title:"Installation"},sidebar:"tutorialSidebar",previous:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"},next:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"}},l={},c=[{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2}];function d(n){const t={blockquote:"blockquote",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"To get the Routr Command-Line Tool run the following command:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"npm install -g routr-ctl\n"})}),"\n",(0,o.jsx)(t.p,{children:"The command-line tool is now globally accessible."}),"\n",(0,o.jsx)(t.p,{children:"Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo snap install rctl\n"})}),"\n",(0,o.jsx)(t.h2,{id:"login-to-a-routr-server",children:"Login to a Routr server"}),"\n",(0,o.jsx)(t.p,{children:"To log in to a Routr server and being issuing commands run the following commands."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"The current API version is v1beta1"}),"\n"]})]})}function u(n={}){const{wrapper:t}={...(0,i.R)(),...n.components};return t?(0,o.jsx)(t,{...n,children:(0,o.jsx)(d,{...n})}):d(n)}},8453:(n,t,e)=>{e.d(t,{R:()=>r,x:()=>a});var o=e(6540);const i={},s=o.createContext(i);function r(n){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function a(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:r(n.components),o.createElement(s.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a1924d4.161693fb.js b/assets/js/5a1924d4.161693fb.js new file mode 100644 index 000000000..7c3c9a5e0 --- /dev/null +++ b/assets/js/5a1924d4.161693fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2433],{4670:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const i={},s="Concepts",a={id:"connect/concepts",title:"Concepts",description:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.",source:"@site/docs/connect/concepts.md",sourceDirName:"connect",slug:"/connect/concepts",permalink:"/docs/2.0.0/connect/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"},next:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"}},c={},l=[{value:"Agent-to-Agent",id:"agent-to-agent",level:2},{value:"Agent-to-PSTN",id:"agent-to-pstn",level:2},{value:"From-PSTN",id:"from-pstn",level:2},{value:"Peer-to-PSTN",id:"peer-to-pstn",level:2},{value:"Agent-to-Peer",id:"agent-to-peer",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,o.jsx)(n.p,{children:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation."}),"\n",(0,o.jsx)(n.p,{children:'The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.'}),"\n",(0,o.jsx)(n.p,{children:"The following routing types are supported:"}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-agent",children:"Agent-to-Agent"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"agent-to-agent"})," routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n\n- apiVersion: v2beta1\n kind: Agent\n ref: agent-02\n metadata:\n name: Jane Doe\n spec:\n username: "1002"\n domainRef: domain-01\n credentialsRef: credentials-02\n'})}),"\n",(0,o.jsx)(n.p,{children:"With the configuration above, John and Jane can call each other using their usernames."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-pstn",children:"Agent-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["In the Connect Mode, the ",(0,o.jsx)(n.code,{children:"agent-to-pstn"})," routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"egressPolicies"})," section of the Domain resource handles the routing. The examples below show how these resources relate to each other."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n accessControlListRef: acl-01\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Number configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n'})}),"\n",(0,o.jsxs)(n.p,{children:["With the previous configuration, any Agent in the Domain can call the PSTN using the Number ",(0,o.jsx)(n.code,{children:"(910)343-4434"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"from-pstn",children:"From-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"from-pstn"})," routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The ",(0,o.jsx)(n.code,{children:"location"})," section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n aorLink: sip:john@sip.local\n'})}),"\n",(0,o.jsx)(n.p,{children:"You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr."}),"\n",(0,o.jsx)(n.h2,{id:"peer-to-pstn",children:"Peer-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"peer-to-pstn"})," routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike ",(0,o.jsx)(n.code,{children:"agent-to-pstn"}),", this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the ",(0,o.jsx)(n.code,{children:"Trunking"})," resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table."]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-peer",children:"Agent-to-Peer"}),"\n",(0,o.jsxs)(n.p,{children:['This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain\'s boundaries, the Agent must have a valid JWT token in the ',(0,o.jsx)(n.code,{children:"X-Connect-Token"})," header. Incidentally, required claims in the JWT token include fields similar to the ",(0,o.jsx)(n.code,{children:"Agent"})," resource. Here is an example of the payload of a JWT token:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "ref": "agent-01",\n "domainRef": "domain-01",\n "aor": "sip:1001@sip.local",\n "aorLink": "sip:asterisk@default",\n "domain": "sip.local",\n "privacy": "NONE",\n "allowedMethods": ["INVITE", "REGISTER"]\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(6540);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);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:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a1924d4.a8c201b1.js b/assets/js/5a1924d4.a8c201b1.js deleted file mode 100644 index 0ab53b140..000000000 --- a/assets/js/5a1924d4.a8c201b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[995],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var o=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,o,r=function(e,n){if(null==e)return{};var t,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)t=a[o],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=o.createContext({}),s=function(e){var n=o.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return o.createElement(c.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},d=o.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(t),d=r,g=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return t?o.createElement(g,i(i({ref:n},p),{},{components:t})):o.createElement(g,i({ref:n},p))}));function g(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,i=new Array(a);i[0]=d;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var s=2;s<a;s++)i[s]=t[s];return o.createElement.apply(null,i)}return o.createElement.apply(null,t)}d.displayName="MDXCreateElement"},6957:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var o=t(7462),r=(t(7294),t(3905));const a={},i="Concepts",l={unversionedId:"connect/concepts",id:"connect/concepts",title:"Concepts",description:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.",source:"@site/docs/connect/concepts.md",sourceDirName:"connect",slug:"/connect/concepts",permalink:"/docs/2.0.0/connect/concepts",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"},next:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"}},c={},s=[{value:"Agent-to-Agent",id:"agent-to-agent",level:2},{value:"Agent-to-PSTN",id:"agent-to-pstn",level:2},{value:"From-PSTN",id:"from-pstn",level:2},{value:"Peer-to-PSTN",id:"peer-to-pstn",level:2},{value:"Agent-to-Peer",id:"agent-to-peer",level:2}],p={toc:s},u="wrapper";function m(e){let{components:n,...t}=e;return(0,r.kt)(u,(0,o.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"concepts"},"Concepts"),(0,r.kt)("p",null,"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation."),(0,r.kt)("p",null,'The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.'),(0,r.kt)("p",null,"The following routing types are supported:"),(0,r.kt)("h2",{id:"agent-to-agent"},"Agent-to-Agent"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"agent-to-agent")," routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Domain configuration")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Agents configuration")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n\n- apiVersion: v2beta1\n kind: Agent\n ref: agent-02\n metadata:\n name: Jane Doe\n spec:\n username: "1002"\n domainRef: domain-01\n credentialsRef: credentials-02\n')),(0,r.kt)("p",null,"With the configuration above, John and Jane can call each other using their usernames."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources.")),(0,r.kt)("h2",{id:"agent-to-pstn"},"Agent-to-PSTN"),(0,r.kt)("p",null,"In the Connect Mode, the ",(0,r.kt)("inlineCode",{parentName:"p"},"agent-to-pstn")," routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"egressPolicies")," section of the Domain resource handles the routing. The examples below show how these resources relate to each other."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Domain configuration")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n accessControlListRef: acl-01\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Number configuration")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n')),(0,r.kt)("p",null,"With the previous configuration, any Agent in the Domain can call the PSTN using the Number ",(0,r.kt)("inlineCode",{parentName:"p"},"(910)343-4434"),"."),(0,r.kt)("h2",{id:"from-pstn"},"From-PSTN"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"from-pstn")," routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The ",(0,r.kt)("inlineCode",{parentName:"p"},"location")," section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n aorLink: sip:john@sip.local\n')),(0,r.kt)("p",null,"You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr."),(0,r.kt)("h2",{id:"peer-to-pstn"},"Peer-to-PSTN"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"peer-to-pstn")," routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike ",(0,r.kt)("inlineCode",{parentName:"p"},"agent-to-pstn"),", this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the ",(0,r.kt)("inlineCode",{parentName:"p"},"Trunking")," resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table."),(0,r.kt)("h2",{id:"agent-to-peer"},"Agent-to-Peer"),(0,r.kt)("p",null,'This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain\'s boundaries, the Agent must have a valid JWT token in the ',(0,r.kt)("inlineCode",{parentName:"p"},"X-Connect-Token")," header. Incidentally, required claims in the JWT token include fields similar to the ",(0,r.kt)("inlineCode",{parentName:"p"},"Agent")," resource. Here is an example of the payload of a JWT token:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "ref": "agent-01",\n "domainRef": "domain-01",\n "aor": "sip:1001@sip.local",\n "aorLink": "asterisk@default",\n "domain": "sip.local",\n "privacy": "NONE",\n "allowedMethods": ["INVITE", "REGISTER"]\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5a510007.05a6af86.js b/assets/js/5a510007.05a6af86.js deleted file mode 100644 index f593281c8..000000000 --- a/assets/js/5a510007.05a6af86.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1948],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var a=n.createContext({}),p=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(a.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=p(r),f=o,y=s["".concat(a,".").concat(f)]||s[f]||m[f]||i;return r?n.createElement(y,l(l({ref:t},u),{},{components:r})):n.createElement(y,l({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,l=new Array(i);l[0]=f;var c={};for(var a in t)hasOwnProperty.call(t,a)&&(c[a]=t[a]);c.originalType=e,c[s]="string"==typeof e?e:o,l[1]=c;for(var p=2;p<i;p++)l[p]=r[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},838:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={},l="Deploying to Civo with Helm",c={unversionedId:"tutorials/deploying-to-civo-with-helm",id:"tutorials/deploying-to-civo-with-helm",title:"Deploying to Civo with Helm",description:"Coming soon.",source:"@site/docs/tutorials/deploying-to-civo-with-helm.md",sourceDirName:"tutorials",slug:"/tutorials/deploying-to-civo-with-helm",permalink:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/deploying-to-civo-with-helm.md",tags:[],version:"current",frontMatter:{}},a={},p=[],u={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"deploying-to-civo-with-helm"},"Deploying to Civo with Helm"),(0,o.kt)("p",null,"Coming soon."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5a510007.f35cb9c6.js b/assets/js/5a510007.f35cb9c6.js new file mode 100644 index 000000000..3eb882fe2 --- /dev/null +++ b/assets/js/5a510007.f35cb9c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9012],{8671:(t,o,e)=>{e.r(o),e.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>u});var n=e(4848),i=e(8453);const r={},s="Deploying to Civo with Helm",c={id:"tutorials/deploying-to-civo-with-helm",title:"Deploying to Civo with Helm",description:"Coming soon.",source:"@site/docs/tutorials/deploying-to-civo-with-helm.md",sourceDirName:"tutorials",slug:"/tutorials/deploying-to-civo-with-helm",permalink:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/deploying-to-civo-with-helm.md",tags:[],version:"current",frontMatter:{}},l={},u=[];function d(t){const o={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"deploying-to-civo-with-helm",children:"Deploying to Civo with Helm"}),"\n",(0,n.jsx)(o.p,{children:"Coming soon."})]})}function a(t={}){const{wrapper:o}={...(0,i.R)(),...t.components};return o?(0,n.jsx)(o,{...t,children:(0,n.jsx)(d,{...t})}):d(t)}},8453:(t,o,e)=>{e.d(o,{R:()=>s,x:()=>c});var n=e(6540);const i={},r=n.createContext(i);function s(t){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(o):{...o,...t}}),[o,t])}function c(t){let o;return o=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:s(t.components),n.createElement(r.Provider,{value:o},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e82a060.c1d9a442.js b/assets/js/5e82a060.c1d9a442.js new file mode 100644 index 000000000..f80db2f1a --- /dev/null +++ b/assets/js/5e82a060.c1d9a442.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6038],{6118:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>o});var n=s(4848),r=s(8453);const i={},l="listGateways",a={id:"api/gateways/list",title:"listGateways",description:"This method returns a list of Gateways resources.",source:"@site/versioned_docs/version-1.x.x/api/gateways/list.md",sourceDirName:"api/gateways",slug:"/api/gateways/list",permalink:"/docs/1.x.x/api/gateways/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"},next:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"}},d={},o=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"listgateways",children:"listGateways"}),"\n",(0,n.jsx)(t.p,{children:"This method returns a list of Gateways resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/gateways"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"filter"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"page"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"itemsPerPage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,n.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method returns a list of Gateways resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/gateways\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Gateway",\n \t"metadata": {\n \t\t"name": "Provider Inc.",\n "ref": "gw5c77t2"\n \t},\n \t"spec": {\n \t\t"host": "sip.provider.net",\n \t\t"credentials": {\n \t\t\t"username": "youruser",\n \t\t\t"secret": "yoursecret"\n \t\t},\n \t\t"transport": "udp"\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>a});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e82a060.d76f4323.js b/assets/js/5e82a060.d76f4323.js deleted file mode 100644 index f95850de3..000000000 --- a/assets/js/5e82a060.d76f4323.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8464],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,f=c["".concat(i,".").concat(d)]||c[d]||m[d]||l;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=d;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var p=2;p<l;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},6626:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const l={},o="listGateways",s={unversionedId:"api/gateways/list",id:"version-1.x.x/api/gateways/list",title:"listGateways",description:"This method returns a list of Gateways resources.",source:"@site/versioned_docs/version-1.x.x/api/gateways/list.md",sourceDirName:"api/gateways",slug:"/api/gateways/list",permalink:"/docs/1.x.x/api/gateways/list",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"},next:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"}},i={},p=[],u={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"listgateways"},"listGateways"),(0,a.kt)("p",null,"This method returns a list of Gateways resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/gateways")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"filter"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Use filter to narrow the elements shown")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,"Note: The filter parameter uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/json-path/JsonPath"},"JsonPath")," format"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a list of Gateways resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/gateways\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n "apiVersion": "v1beta1",\n "kind": "Gateway",\n "metadata": {\n "name": "Provider Inc.",\n "ref": "gw5c77t2"\n },\n "spec": {\n "host": "sip.provider.net",\n "credentials": {\n "username": "youruser",\n "secret": "yoursecret"\n },\n "transport": "udp"\n }\n }]\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.0fe135c9.js b/assets/js/5e95c892.0fe135c9.js new file mode 100644 index 000000000..ab97e8cf5 --- /dev/null +++ b/assets/js/5e95c892.0fe135c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9647],{7121:(e,r,s)=>{s.r(r),s.d(r,{default:()=>n});s(6540);var u=s(8215),c=s(9024),t=s(7559),a=s(2831),o=s(9201),d=s(4848);function n(e){return(0,d.jsx)(c.e3,{className:(0,u.A)(t.G.wrapper.docsPages),children:(0,d.jsx)(o.A,{children:(0,a.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.72a3fe22.js b/assets/js/5ef0e9d6.72a3fe22.js new file mode 100644 index 000000000..cb73cee8d --- /dev/null +++ b/assets/js/5ef0e9d6.72a3fe22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[911],{8999:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=o(4848),s=o(8453);const i={},r="Community",c={id:"community",title:"Community",description:"We are developing Routr in the open. These are the channels we use for communication and contribution:",source:"@site/docs/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/2.0.0/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/community.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"},next:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"}},u={},d=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(n.p,{children:"We are developing Routr in the open. These are the channels we use for communication and contribution:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://discord.com/invite/4QWgSz4hTC",children:"Discord community"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub discussions"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Twitter:"})," ",(0,t.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr repository"})," to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsxs)(n.p,{children:["We welcome community contributions! Please see the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING.md"})," file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request."]}),"\n",(0,t.jsxs)(n.p,{children:["Development: ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(n.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(n.p,{children:"We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting."}),"\n",(0,t.jsx)(n.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(n.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(n.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (creator and maintainer)"]}),"\n",(0,t.jsx)(n.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(n.p,{children:["Routr was developed initially by ",(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(n.a,{href:"https://fonoster.com",children:"Fonoster"})," and ",(0,t.jsx)(n.a,{href:"https://camanio.com",children:"Camanio AB"})," sponsored the majority of its development."]})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.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(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.fe4d5bb3.js b/assets/js/5ef0e9d6.fe4d5bb3.js deleted file mode 100644 index 2440e962c..000000000 --- a/assets/js/5ef0e9d6.fe4d5bb3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9880],{3905:(e,t,o)=>{o.d(t,{Zo:()=>l,kt:()=>f});var n=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function a(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?i(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):i(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function s(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)o=i[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)o=i[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var u=n.createContext({}),c=function(e){var t=n.useContext(u),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},l=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(o),d=r,f=p["".concat(u,".").concat(d)]||p[d]||m[d]||i;return o?n.createElement(f,a(a({ref:t},l),{},{components:o})):n.createElement(f,a({ref:t},l))}));function f(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=o.length,a=new Array(i);a[0]=d;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:r,a[1]=s;for(var c=2;c<i;c++)a[c]=o[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,o)}d.displayName="MDXCreateElement"},5330:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=o(7462),r=(o(7294),o(3905));const i={},a="Community",s={unversionedId:"community",id:"community",title:"Community",description:"We are developing Routr in the open. These are the channels we use for communication and contribution:",source:"@site/docs/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/2.0.0/community",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/community.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"},next:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"}},u={},c=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}],l={toc:c},p="wrapper";function m(e){let{components:t,...o}=e;return(0,r.kt)(p,(0,n.Z)({},l,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"community"},"Community"),(0,r.kt)("p",null,"We are developing Routr in the open. These are the channels we use for communication and contribution:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://discord.com/invite/4QWgSz4hTC"},"Discord community")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr/discussions"},"GitHub discussions"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Twitter:")," ",(0,r.kt)("a",{parentName:"p",href:"https://twitter.com/fonoster"},"@Fonoster")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Issue tracker:")," Use the GitHub issue tracker for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/issues"},"Routr repository")," to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required.")),(0,r.kt)("h2",{id:"contributing"},"Contributing"),(0,r.kt)("p",null,"We welcome community contributions! Please see the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/CONTRIBUTING.md"},"CONTRIBUTING.md")," file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request."),(0,r.kt)("p",null,"Development: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/discussions"},"GitHub Discussions")," \u2013 for discussions around Routr development"),(0,r.kt)("h2",{id:"developer-summits"},"Developer Summits"),(0,r.kt)("p",null,"We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting."),(0,r.kt)("h2",{id:"code-of-conduct"},"Code of Conduct"),(0,r.kt)("p",null,"To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md"},"Contributor Covenant Code of Conduct"),"."),(0,r.kt)("h2",{id:"commercial-support"},"Commercial Support"),(0,r.kt)("p",null,"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/psanders"},"Pedro Sanders")," (creator and maintainer)"),(0,r.kt)("h2",{id:"acknowledgments"},"Acknowledgments"),(0,r.kt)("p",null,"Routr was developed initially by ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/psanders"},"Pedro Sanders"),". ",(0,r.kt)("a",{parentName:"p",href:"https://fonoster.com"},"Fonoster")," and ",(0,r.kt)("a",{parentName:"p",href:"https://camanio.com"},"Camanio AB")," sponsored the majority of its development."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/64332b0f.849013cf.js b/assets/js/64332b0f.849013cf.js new file mode 100644 index 000000000..f96e5f2b8 --- /dev/null +++ b/assets/js/64332b0f.849013cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8329],{4801:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var n=o(4848),r=o(8453);const s={sidebar_position:1},i="Welcome",c={id:"welcome",title:"Welcome",description:"Use the left-hand to navigate to find topics of interest.",source:"@site/versioned_docs/version-1.x.x/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/docs/1.x.x/welcome",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/welcome.md",tags:[],version:"1.x.x",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"}},d={},a=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"welcome",children:"Welcome"}),"\n",(0,n.jsx)(t.p,{children:"Use the left-hand to navigate to find topics of interest."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>c});var n=o(6540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/64332b0f.9b376f8b.js b/assets/js/64332b0f.9b376f8b.js deleted file mode 100644 index 47715717e..000000000 --- a/assets/js/64332b0f.9b376f8b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7655],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),u=s(r),d=o,m=u["".concat(l,".").concat(d)]||u[d]||f[d]||i;return r?n.createElement(m,c(c({ref:t},p),{},{components:r})):n.createElement(m,c({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=d;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[u]="string"==typeof e?e:o,c[1]=a;for(var s=2;s<i;s++)c[s]=r[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},2590:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>i,metadata:()=>a,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={sidebar_position:1},c="Welcome",a={unversionedId:"welcome",id:"version-1.x.x/welcome",title:"Welcome",description:"Use the left-hand to navigate to find topics of interest.",source:"@site/versioned_docs/version-1.x.x/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/docs/1.x.x/welcome",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/welcome.md",tags:[],version:"1.x.x",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"}},l={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"welcome"},"Welcome"),(0,o.kt)("p",null,"Use the left-hand to navigate to find topics of interest."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/646468fb.28bd5243.js b/assets/js/646468fb.28bd5243.js new file mode 100644 index 000000000..a1a19bd3d --- /dev/null +++ b/assets/js/646468fb.28bd5243.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[821],{2013:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="evictEndpoint",d={id:"api/location/delete",title:"evictEndpoint",description:"Evicts an entry from the location table",source:"@site/versioned_docs/version-1.x.x/api/location/delete.md",sourceDirName:"api/location",slug:"/api/location/delete",permalink:"/docs/1.x.x/api/location/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"},next:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"evictendpoint",children:"evictEndpoint"}),"\n",(0,s.jsx)(t.p,{children:"Evicts an entry from the location table"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location/{addressOfRecord}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"addressOfRecord"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Address of record for the entry"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method removes and entry for the give address of record"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/{apiversion}/location/sip:guest@guest\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Location entry evicted"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.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:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/646468fb.cd9b8a3f.js b/assets/js/646468fb.cd9b8a3f.js deleted file mode 100644 index 205018086..000000000 --- a/assets/js/646468fb.cd9b8a3f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8275],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),c=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,f=d["".concat(p,".").concat(m)]||d[m]||u[m]||o;return n?r.createElement(f,i(i({ref:t},s),{},{components:n})):r.createElement(f,i({ref:t},s))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6350:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={},i="evictEndpoint",l={unversionedId:"api/location/delete",id:"version-1.x.x/api/location/delete",title:"evictEndpoint",description:"Evicts an entry from the location table",source:"@site/versioned_docs/version-1.x.x/api/location/delete.md",sourceDirName:"api/location",slug:"/api/location/delete",permalink:"/docs/1.x.x/api/location/delete",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"},next:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"}},p={},c=[],s={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"evictendpoint"},"evictEndpoint"),(0,a.kt)("p",null,"Evicts an entry from the location table"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/location/{addressOfRecord}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"DELETE")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"addressOfRecord"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Address of record for the entry")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"This method removes and entry for the give address of record"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'DELETE /api/{apiversion}/location/sip:guest@guest\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Location entry evicted"\n}\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/656951a7.507c6aff.js b/assets/js/656951a7.507c6aff.js deleted file mode 100644 index debad8e1e..000000000 --- a/assets/js/656951a7.507c6aff.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3804],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),l=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=o,f=c["".concat(p,".").concat(d)]||c[d]||m[d]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<a;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},6127:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={},s=void 0,i={unversionedId:"api/token",id:"version-1.x.x/api/token",title:"token",description:"This method gets a token for subsequent API calls.",source:"@site/versioned_docs/version-1.x.x/api/token.md",sourceDirName:"api",slug:"/api/token",permalink:"/docs/1.x.x/api/token",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/token.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},p={},l=[],u={toc:l},c="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"This method gets a token for subsequent API calls."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"URL")),(0,o.kt)("p",null," ",(0,o.kt)("inlineCode",{parentName:"p"},"/token")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Method")),(0,o.kt)("p",null," ",(0,o.kt)("inlineCode",{parentName:"p"},"GET")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Parameters")),(0,o.kt)("p",null," This method does not receive any parameters."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Request body")),(0,o.kt)("p",null," Do not supply a request body with this method."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Response")),(0,o.kt)("p",null," If successful, this method returns a string with a token."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Sample Call")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/token\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n')),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Notes")),(0,o.kt)("p",null,"You must send a basic authentication header with this request."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/656951a7.c9f52622.js b/assets/js/656951a7.c9f52622.js new file mode 100644 index 000000000..f3389f2b9 --- /dev/null +++ b/assets/js/656951a7.c9f52622.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5009],{5523:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>a});var t=s(4848),r=s(8453);const o={},i=void 0,c={id:"api/token",title:"token",description:"This method gets a token for subsequent API calls.",source:"@site/versioned_docs/version-1.x.x/api/token.md",sourceDirName:"api",slug:"/api/token",permalink:"/docs/1.x.x/api/token",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/token.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},d={},a=[];function l(e){const n={code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This method gets a token for subsequent API calls."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/token"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"GET"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsx)(n.p,{children:"Do not supply a request body with this method."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful, this method returns a string with a token."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'GET /api/{apiversion}/token\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Notes"})}),"\n",(0,t.jsx)(n.p,{children:"You must send a basic authentication header with this request."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var t=s(6540);const r={},o=t.createContext(r);function i(e){const n=t.useContext(o);return t.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:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6a8a88b7.1c818d41.js b/assets/js/6a8a88b7.1c818d41.js deleted file mode 100644 index 7df91c064..000000000 --- a/assets/js/6a8a88b7.1c818d41.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6083],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>h});var r=o(7294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function a(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?i(Object(o),!0).forEach((function(t){n(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):i(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function l(e,t){if(null==e)return{};var o,r,n=function(e,t){if(null==e)return{};var o,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)o=i[r],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)o=i[r],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var s=r.createContext({}),c=function(e){var t=r.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),m=n,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||i;return o?r.createElement(h,a(a({ref:t},u),{},{components:o})):r.createElement(h,a({ref:t},u))}));function h(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,a[1]=l;for(var c=2;c<i;c++)a[c]=o[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,o)}m.displayName="MDXCreateElement"},7753:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=o(7462),n=(o(7294),o(3905));const i={},a="Introduction",l={unversionedId:"development/introduction",id:"development/introduction",title:"Introduction",description:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.",source:"@site/docs/development/introduction.md",sourceDirName:"development",slug:"/development/introduction",permalink:"/docs/2.0.0/development/introduction",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"},next:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"}},s={},c=[{value:"How to read this section",id:"how-to-read-this-section",level:2},{value:"Tooling and dependencies",id:"tooling-and-dependencies",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,n.kt)(p,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"introduction"},"Introduction"),(0,n.kt)("p",null,"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware."),(0,n.kt)("p",null,"Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool."),(0,n.kt)("h2",{id:"how-to-read-this-section"},"How to read this section"),(0,n.kt)("p",null,"The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most."),(0,n.kt)("h2",{id:"tooling-and-dependencies"},"Tooling and dependencies"),(0,n.kt)("p",null,"The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.docker.com/"},"Docker"),": We use Docker to build and run individual components"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/"},"Docker Compose"),": We use Docker Compose to orchestrate the components"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://helm.sh/"},"Helm"),": Helm helps us to deploy Routr in Kubernetes"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://kubernetes.io/"},"Kubernetes"),": Kubernetes is the platform where we deploy Routr for large scale deployments"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/"},"Kubectl"),": Kubectl is the command-line tool for Kubernetes"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"link"},"sngrep"),": A tool for monitoring SIP traffic (You could use Wireshark as well)"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"link"},"grpcurl"),": A command-line tool for interacting with gRPC servers")),(0,n.kt)("p",null,"If you don't have a Kubernetes cluster, you can use ",(0,n.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/tools/install-minikube/"},"Minikube")," or Docker Desktop with Kubernetes enabled."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6a8a88b7.4d11689b.js b/assets/js/6a8a88b7.4d11689b.js new file mode 100644 index 000000000..7332d90cd --- /dev/null +++ b/assets/js/6a8a88b7.4d11689b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3244],{4846:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=t(4848),r=t(8453);const s={},i="Introduction",c={id:"development/introduction",title:"Introduction",description:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.",source:"@site/docs/development/introduction.md",sourceDirName:"development",slug:"/development/introduction",permalink:"/docs/2.0.0/development/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"},next:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"}},l={},d=[{value:"How to read this section",id:"how-to-read-this-section",level:2},{value:"Tooling and dependencies",id:"tooling-and-dependencies",level:2}];function a(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(o.p,{children:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware."}),"\n",(0,n.jsx)(o.p,{children:"Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool."}),"\n",(0,n.jsx)(o.h2,{id:"how-to-read-this-section",children:"How to read this section"}),"\n",(0,n.jsx)(o.p,{children:"The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most."}),"\n",(0,n.jsx)(o.h2,{id:"tooling-and-dependencies",children:"Tooling and dependencies"}),"\n",(0,n.jsx)(o.p,{children:"The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://www.docker.com/",children:"Docker"}),": We use Docker to build and run individual components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://docs.docker.com/compose/",children:"Docker Compose"}),": We use Docker Compose to orchestrate the components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://helm.sh/",children:"Helm"}),": Helm helps us to deploy Routr in Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),": Kubernetes is the platform where we deploy Routr for large scale deployments"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",children:"Kubectl"}),": Kubectl is the command-line tool for Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/irontec/sngrep",children:"sngrep"}),": A tool for monitoring SIP traffic (You could use Wireshark as well)"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/fullstorydev/grpcurl",children:"grpcurl"}),": A command-line tool for interacting with gRPC servers"]}),"\n"]}),"\n",(0,n.jsxs)(o.p,{children:["If you don't have a Kubernetes cluster, you can use ",(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-minikube/",children:"Minikube"})," or Docker Desktop with Kubernetes enabled."]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>c});var n=t(6540);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c14cd7d.905756f6.js b/assets/js/6c14cd7d.905756f6.js deleted file mode 100644 index c5fde1030..000000000 --- a/assets/js/6c14cd7d.905756f6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2593],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,f=m["".concat(s,".").concat(d)]||m[d]||c[d]||l;return n?r.createElement(f,o(o({ref:t},u),{},{components:n})):r.createElement(f,o({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:a,o[1]=i;for(var p=2;p<l;p++)o[p]=n[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},8232:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const l={},o="listNumbers",i={unversionedId:"api/numbers/list",id:"version-1.x.x/api/numbers/list",title:"listNumbers",description:"This method returns a list of Numbers.",source:"@site/versioned_docs/version-1.x.x/api/numbers/list.md",sourceDirName:"api/numbers",slug:"/api/numbers/list",permalink:"/docs/1.x.x/api/numbers/list",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"},next:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"}},s={},p=[],u={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"listnumbers"},"listNumbers"),(0,a.kt)("p",null,"This method returns a list of Numbers."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/numbers")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"filter"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Use filter to narrow the elements shown")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,"Note: The filter parameter uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/json-path/JsonPath"},"JsonPath")," format"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a list of Numbers."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/numbers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "ref": "dd50baa4",\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n }]\n}\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6c14cd7d.f1e17186.js b/assets/js/6c14cd7d.f1e17186.js new file mode 100644 index 000000000..34d2f9194 --- /dev/null +++ b/assets/js/6c14cd7d.f1e17186.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6341],{5655:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var s=n(4848),r=n(8453);const i={},l="listNumbers",d={id:"api/numbers/list",title:"listNumbers",description:"This method returns a list of Numbers.",source:"@site/versioned_docs/version-1.x.x/api/numbers/list.md",sourceDirName:"api/numbers",slug:"/api/numbers/list",permalink:"/docs/1.x.x/api/numbers/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"},next:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"}},o={},c=[];function a(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listnumbers",children:"listNumbers"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Numbers."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/numbers"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Numbers."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/numbers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Number",\n \t"metadata": {\n "ref": "dd50baa4",\n \t\t"gwRef": "gweef506",\n \t\t"geoInfo": {\n \t\t\t"city": "City, State",\n \t\t\t"country": "Country",\n \t\t\t"countryISOCode": "US"\n \t\t}\n \t},\n \t"spec": {\n \t\t"location": {\n \t\t\t"telUrl": "tel:0000000000",\n \t\t\t"aorLink": "sip:1001@sip.local"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.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:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c35bbce.00ee5040.js b/assets/js/6c35bbce.00ee5040.js new file mode 100644 index 000000000..25a2ba246 --- /dev/null +++ b/assets/js/6c35bbce.00ee5040.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4862],{3653:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},l="listAgents",d={id:"api/agents/list",title:"listAgents",description:"This method returns a list of Agent resources.",source:"@site/versioned_docs/version-1.x.x/api/agents/list.md",sourceDirName:"api/agents",slug:"/api/agents/list",permalink:"/docs/1.x.x/api/agents/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"},next:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"}},o={},a=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listagents",children:"listAgents"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Agent resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Agent resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/agents\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.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:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c35bbce.4b8cb27d.js b/assets/js/6c35bbce.4b8cb27d.js deleted file mode 100644 index 5bb1db506..000000000 --- a/assets/js/6c35bbce.4b8cb27d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7258],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=p(n),g=a,d=m["".concat(i,".").concat(g)]||m[g]||c[g]||l;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[m]="string"==typeof e?e:a,o[1]=s;for(var p=2;p<l;p++)o[p]=n[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},4568:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const l={},o="listAgents",s={unversionedId:"api/agents/list",id:"version-1.x.x/api/agents/list",title:"listAgents",description:"This method returns a list of Agent resources.",source:"@site/versioned_docs/version-1.x.x/api/agents/list.md",sourceDirName:"api/agents",slug:"/api/agents/list",permalink:"/docs/1.x.x/api/agents/list",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"},next:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"}},i={},p=[],u={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"listagents"},"listAgents"),(0,a.kt)("p",null,"This method returns a list of Agent resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/agents")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"filter"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Use filter to narrow the elements shown")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,"Note: The filter parameter uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/json-path/JsonPath"},"JsonPath")," format"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a list of Agent resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/agents\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n "credentials": {\n "username": "1001",\n "secret": "1234"\n },\n "domains": [\n "sip.local"\n ]\n }\n }]\n}\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e2907e5.766a8f96.js b/assets/js/6e2907e5.766a8f96.js new file mode 100644 index 000000000..f74065485 --- /dev/null +++ b/assets/js/6e2907e5.766a8f96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4366],{8213:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(4848),t=n(8453);const o={},i="getServerLogs",c={id:"api/sys/logs",title:"getServerLogs",description:"This method returns logs from the server",source:"@site/versioned_docs/version-1.x.x/api/sys/logs.md",sourceDirName:"api/sys",slug:"/api/sys/logs",permalink:"/docs/1.x.x/api/sys/logs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/logs.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"},next:{title:"token",permalink:"/docs/1.x.x/api/token"}},d={},l=[];function a(e){const s={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"getserverlogs",children:"getServerLogs"}),"\n",(0,r.jsx)(s.p,{children:"This method returns logs from the server"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"URL"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"/system/logs"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Method"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"GET"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(s.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Request body"})}),"\n",(0,r.jsx)(s.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Response"})}),"\n",(0,r.jsx)(s.p,{children:"If successful this method returns logging information from the server."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'GET /api/{apiversion}/system/logs\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":"[DEBUG] 2020-04-13 12:29:49.785..."\n}\n'})})]})}function p(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>c});var r=n(6540);const t={},o=r.createContext(t);function i(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e2907e5.c187fd92.js b/assets/js/6e2907e5.c187fd92.js deleted file mode 100644 index 9f81a3142..000000000 --- a/assets/js/6e2907e5.c187fd92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3320],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),i=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=i(r),f=o,d=u["".concat(p,".").concat(f)]||u[f]||m[f]||s;return r?n.createElement(d,a(a({ref:t},c),{},{components:r})):n.createElement(d,a({ref:t},c))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,a=new Array(s);a[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:o,a[1]=l;for(var i=2;i<s;i++)a[i]=r[i];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},5412:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>i});var n=r(7462),o=(r(7294),r(3905));const s={},a="getServerLogs",l={unversionedId:"api/sys/logs",id:"version-1.x.x/api/sys/logs",title:"getServerLogs",description:"This method returns logs from the server",source:"@site/versioned_docs/version-1.x.x/api/sys/logs.md",sourceDirName:"api/sys",slug:"/api/sys/logs",permalink:"/docs/1.x.x/api/sys/logs",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/logs.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"},next:{title:"token",permalink:"/docs/1.x.x/api/token"}},p={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"getserverlogs"},"getServerLogs"),(0,o.kt)("p",null,"This method returns logs from the server"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"URL")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"/system/logs")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Method")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"GET")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Parameters")),(0,o.kt)("p",null,"This method does not receive any parameters."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Request body")),(0,o.kt)("p",null,"Do not supply a request body with this method."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Response")),(0,o.kt)("p",null,"If successful this method returns logging information from the server."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Sample Call")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/system/logs\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":"[DEBUG] 2020-04-13 12:29:49.785..."\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/71153375.1ac7f02d.js b/assets/js/71153375.1ac7f02d.js new file mode 100644 index 000000000..cf0873fcd --- /dev/null +++ b/assets/js/71153375.1ac7f02d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8911],{3017:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="getConfiguration",c={id:"api/config/get",title:"getConfiguration",description:"This method returns the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/get.md",sourceDirName:"api/config",slug:"/api/config/get",permalink:"/docs/1.x.x/api/config/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"},next:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"}},d={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getconfiguration",children:"getConfiguration"}),"\n",(0,s.jsx)(t.p,{children:"This method returns the servers' configuration."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/system/config"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"full"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"boolean"}),(0,s.jsxs)(t.td,{style:{textAlign:"left"},children:["If set to ",(0,s.jsx)(t.code,{children:"true"})," it will return a merged configuration between defaults and user defined values"]})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns the current configuration from the server."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/system/config\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": {\n ...\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/71153375.408119ca.js b/assets/js/71153375.408119ca.js deleted file mode 100644 index fb18f4ebd..000000000 --- a/assets/js/71153375.408119ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8989],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(n),m=a,d=c["".concat(p,".").concat(m)]||c[m]||f[m]||o;return n?r.createElement(d,i(i({ref:t},u),{},{components:n})):r.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},697:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>f,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},i="getConfiguration",l={unversionedId:"api/config/get",id:"version-1.x.x/api/config/get",title:"getConfiguration",description:"This method returns the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/get.md",sourceDirName:"api/config",slug:"/api/config/get",permalink:"/docs/1.x.x/api/config/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"},next:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"}},p={},s=[],u={toc:s},c="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getconfiguration"},"getConfiguration"),(0,a.kt)("p",null,"This method returns the servers' configuration."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/system/config")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"full"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"boolean"),(0,a.kt)("td",{parentName:"tr",align:"left"},"If set to ",(0,a.kt)("inlineCode",{parentName:"td"},"true")," it will return a merged configuration between defaults and user defined values")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns the current configuration from the server."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/system/config\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": {\n ...\n }\n}\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/72607e62.8c39e033.js b/assets/js/72607e62.8c39e033.js new file mode 100644 index 000000000..73b8b7f90 --- /dev/null +++ b/assets/js/72607e62.8c39e033.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9042],{5831:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},l=void 0,d={id:"api/registry",title:"registry",description:"This method gets a list of available(online) gateways.",source:"@site/versioned_docs/version-1.x.x/api/registry.md",sourceDirName:"api",slug:"/api/registry",permalink:"/docs/1.x.x/api/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/registry.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"},next:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"}},o={},a=[];function c(e){const t={code:"code",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This method gets a list of available(online) gateways."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/registry"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list with registered devices."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/registry\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [\n {\n "username": "215706",\n "host": "atlanta2.voip.ms",\n "ip":"209.217.224.50",\n "expires": 600,\n "registeredOn": 1588525156280,\n "gwRef": "gw50a1a4ca",\n "gwURI": "sip:215706@atlanta2.voip.ms:5060",\n "regOnFormatted": "a few seconds ago"\n }\n ]\n}\n'})})]})}function x(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.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:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72607e62.e25fef97.js b/assets/js/72607e62.e25fef97.js deleted file mode 100644 index ddc9717d7..000000000 --- a/assets/js/72607e62.e25fef97.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9494],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(r),d=a,g=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(g,i(i({ref:t},u),{},{components:r})):n.createElement(g,i({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},1843:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const o={},i=void 0,l={unversionedId:"api/registry",id:"version-1.x.x/api/registry",title:"registry",description:"This method gets a list of available(online) gateways.",source:"@site/versioned_docs/version-1.x.x/api/registry.md",sourceDirName:"api",slug:"/api/registry",permalink:"/docs/1.x.x/api/registry",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/registry.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"},next:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"}},p={},s=[],u={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"This method gets a list of available(online) gateways."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/registry")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"This method returns a list with registered devices."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/registry\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [\n {\n "username": "215706",\n "host": "atlanta2.voip.ms",\n "ip":"209.217.224.50",\n "expires": 600,\n "registeredOn": 1588525156280,\n "gwRef": "gw50a1a4ca",\n "gwURI": "sip:215706@atlanta2.voip.ms:5060",\n "regOnFormatted": "a few seconds ago"\n }\n ]\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/759bfbe1.035fb5f8.js b/assets/js/759bfbe1.035fb5f8.js new file mode 100644 index 000000000..44658c906 --- /dev/null +++ b/assets/js/759bfbe1.035fb5f8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1080],{1538:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>o,frontMatter:()=>l,metadata:()=>d,toc:()=>x});var n=s(4848),i=s(8453);const l={},r="Test Plan",d={id:"introduction/test-plan",title:"Test Plan",description:"DUT and Endpoints Configuration",source:"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",sourceDirName:"introduction",slug:"/introduction/test-plan",permalink:"/docs/1.x.x/introduction/test-plan",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/test-plan.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"},next:{title:"Concepts",permalink:"/docs/1.x.x/concepts"}},c={},x=[{value:"DUT and Endpoints Configuration",id:"dut-and-endpoints-configuration",level:2},{value:"Test Case Summary",id:"test-case-summary",level:2},{value:"Test Cases",id:"test-cases",level:2},{value:"Test Case 1.1.1: Registration Setup",id:"test-case-111-registration-setup",level:3}];function h(t){const e={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"test-plan",children:"Test Plan"}),"\n",(0,n.jsx)(e.h2,{id:"dut-and-endpoints-configuration",children:"DUT and Endpoints Configuration"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:"Routr has a Gateway resource configured to use TCP transport."}),"\n",(0,n.jsx)(e.li,{children:"The Gateway resource is configured with a range of E.164 numbers."}),"\n",(0,n.jsx)(e.li,{children:"Routr is configured to support Registration mode."}),"\n",(0,n.jsxs)(e.li,{children:["A Domain named ",(0,n.jsx)(e.code,{children:"sip.local"})," exist with Agents ",(0,n.jsx)(e.code,{children:"1001@sip.local"})," and ",(0,n.jsx)(e.code,{children:"1002@sip.local"})]}),"\n",(0,n.jsx)(e.li,{children:"The Gateway is capable of handling RFC6140 registrations"}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"test-case-summary",children:"Test Case Summary"}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{children:"Test Case ID"}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Title"}),(0,n.jsx)(e.th,{style:{textAlign:"right"},children:"Required"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registration Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registration Failure"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Maintaining Registration"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Authentication"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.5"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Server Mode"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"DNS Lookup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Static Mode Failure Detection"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Authentication"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Certificate Validation"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.6.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Peer-Egress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]})]})]}),"\n",(0,n.jsx)(e.h2,{id:"test-cases",children:"Test Cases"}),"\n",(0,n.jsx)(e.h3,{id:"test-case-111-registration-setup",children:"Test Case 1.1.1: Registration Setup"}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Objective"}),": This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Procedure"}),":"]}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Description"}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Expected Result"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Restart Routr to send a REGISTER message to the Gateway"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Routr restarts"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Wait for the server to restart"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"UAS receives correct registration sequence"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Clear the registration table"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registry table is empty"})]})]})]})]})}function o(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},8453:(t,e,s)=>{s.d(e,{R:()=>r,x:()=>d});var n=s(6540);const i={},l=n.createContext(i);function r(t){const e=n.useContext(l);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function d(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:r(t.components),n.createElement(l.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/759bfbe1.ff627b45.js b/assets/js/759bfbe1.ff627b45.js deleted file mode 100644 index 0405657d7..000000000 --- a/assets/js/759bfbe1.ff627b45.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1189],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>k});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),s=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=s(t.components);return n.createElement(p.Provider,{value:e},t.children)},m="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},g=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,d=o(t,["components","mdxType","originalType","parentName"]),m=s(a),g=r,k=m["".concat(p,".").concat(g)]||m[g]||u[g]||i;return a?n.createElement(k,l(l({ref:e},d),{},{components:a})):n.createElement(k,l({ref:e},d))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=g;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[m]="string"==typeof t?t:r,l[1]=o;for(var s=2;s<i;s++)l[s]=a[s];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}g.displayName="MDXCreateElement"},5973:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const i={},l="Test Plan",o={unversionedId:"introduction/test-plan",id:"version-1.x.x/introduction/test-plan",title:"Test Plan",description:"DUT and Endpoints Configuration",source:"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",sourceDirName:"introduction",slug:"/introduction/test-plan",permalink:"/docs/1.x.x/introduction/test-plan",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/test-plan.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"},next:{title:"Concepts",permalink:"/docs/1.x.x/concepts"}},p={},s=[{value:"DUT and Endpoints Configuration",id:"dut-and-endpoints-configuration",level:2},{value:"Test Case Summary",id:"test-case-summary",level:2},{value:"Test Cases",id:"test-cases",level:2},{value:"Test Case 1.1.1: Registration Setup",id:"test-case-111-registration-setup",level:3}],d={toc:s},m="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"test-plan"},"Test Plan"),(0,r.kt)("h2",{id:"dut-and-endpoints-configuration"},"DUT and Endpoints Configuration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Routr has a Gateway resource configured to use TCP transport."),(0,r.kt)("li",{parentName:"ul"},"The Gateway resource is configured with a range of E.164 numbers."),(0,r.kt)("li",{parentName:"ul"},"Routr is configured to support Registration mode."),(0,r.kt)("li",{parentName:"ul"},"A Domain named ",(0,r.kt)("inlineCode",{parentName:"li"},"sip.local")," exist with Agents ",(0,r.kt)("inlineCode",{parentName:"li"},"1001@sip.local")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"1002@sip.local")),(0,r.kt)("li",{parentName:"ul"},"The Gateway is capable of handling RFC6140 registrations")),(0,r.kt)("h2",{id:"test-case-summary"},"Test Case Summary"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Test Case ID"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Title"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.1.1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Registration Setup"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.1.2"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Registration Failure"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.1.3"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Maintaining Registration"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.1.4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Authentication"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.1.5"),(0,r.kt)("td",{parentName:"tr",align:"left"},"TLS Server Mode"),(0,r.kt)("td",{parentName:"tr",align:"right"},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.2.1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"DNS Lookup"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.2.2"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Static Mode Failure Detection"),(0,r.kt)("td",{parentName:"tr",align:"right"},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.2.3"),(0,r.kt)("td",{parentName:"tr",align:"left"},"TLS Authentication"),(0,r.kt)("td",{parentName:"tr",align:"right"},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.2.4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"TLS Certificate Validation"),(0,r.kt)("td",{parentName:"tr",align:"right"},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.3.1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Intra-Domain Routing / Successful Invite Setup"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.3.2"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Intra-Domain Routing / Invite Rejected by Callee"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.3.3"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Intra-Domain Routing / Invite Cancelled by Caller"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.3.4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Intra-Domain Routing / Invite Cancelled by Callee"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.4.1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Ingress Routing / Successful Invite Setup"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.4.2"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Ingress Routing / Invite Rejected by Callee"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.4.3"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Ingress Routing / Invite Cancelled by Caller"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.4.4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Ingress Routing / Invite Cancelled by Callee"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.5.1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Egress Routing / Successful Invite Setup"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.5.2"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Egress Routing / Invite Rejected by Callee"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.5.3"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Egress Routing / Invite Cancelled by Caller"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.5.4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Domain-Egress Routing / Invite Cancelled by Callee"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1.6.1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Peer-Egress Routing / Successful Invite Setup"),(0,r.kt)("td",{parentName:"tr",align:"right"},"Yes")))),(0,r.kt)("h2",{id:"test-cases"},"Test Cases"),(0,r.kt)("h3",{id:"test-case-111-registration-setup"},"Test Case 1.1.1: Registration Setup"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Objective"),": This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped."),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Procedure"),":"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:"left"},"Description"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Expected Result"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Step 1"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Restart Routr to send a REGISTER message to the Gateway"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Routr restarts")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Step 2"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Wait for the server to restart"),(0,r.kt)("td",{parentName:"tr",align:"left"},"UAS receives correct registration sequence")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Step 3"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Clear the registration table"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Registry table is empty")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/76273f75.49123404.js b/assets/js/76273f75.49123404.js deleted file mode 100644 index 5775462a4..000000000 --- a/assets/js/76273f75.49123404.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7325],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||i;return n?o.createElement(f,a(a({ref:t},s),{},{components:n})):o.createElement(f,a({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[u]="string"==typeof e?e:r,a[1]=c;for(var l=2;l<i;l++)a[l]=n[l];return o.createElement.apply(null,a)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},6642:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var o=n(7462),r=(n(7294),n(3905));const i={},a="Overview",c={unversionedId:"development/components/overview",id:"development/components/overview",title:"Overview",description:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.",source:"@site/docs/development/components/overview.md",sourceDirName:"development/components",slug:"/development/components/overview",permalink:"/docs/2.0.0/development/components/overview",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"},next:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"}},p={},l=[],s={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,o.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"overview"},"Overview"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502EdgePort 001\u2502\u2502EdgePort 002\u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Message Dispatcher \u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502IM Processor \u2502\u2502Connect Processor \u2502\u2502Twilio Processor\u2502\n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Data APIs & External Services\u2502 \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n")),(0,r.kt)("p",null,"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it."),(0,r.kt)("p",null,"Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/76273f75.60924f2a.js b/assets/js/76273f75.60924f2a.js new file mode 100644 index 000000000..72c775064 --- /dev/null +++ b/assets/js/76273f75.60924f2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3578],{9346:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>p});var n=o(4848),i=o(8453);const r={},s="Overview",c={id:"development/components/overview",title:"Overview",description:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.",source:"@site/docs/development/components/overview.md",sourceDirName:"development/components",slug:"/development/components/overview",permalink:"/docs/2.0.0/development/components/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"},next:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"}},a={},p=[];function d(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502EdgePort 001\u2502\u2502EdgePort 002\u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Message Dispatcher \u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502IM Processor \u2502\u2502Connect Processor \u2502\u2502Twilio Processor\u2502\n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Data APIs & External Services\u2502 \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n"})}),"\n",(0,n.jsx)(t.p,{children:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it."}),"\n",(0,n.jsx)(t.p,{children:"Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>c});var n=o(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c32d245.0a3ded36.js b/assets/js/7c32d245.0a3ded36.js deleted file mode 100644 index 51da64abe..000000000 --- a/assets/js/7c32d245.0a3ded36.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7287],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(r),d=a,k=c["".concat(s,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(k,l(l({ref:t},p),{},{components:r})):n.createElement(k,l({ref:t},p))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var u=2;u<o;u++)l[u]=r[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},1255:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const o={},l="Routr 1.0RC3 - User Location Lookup Performance Tests",i={unversionedId:"introduction/performance-tests/user-location",id:"version-1.x.x/introduction/performance-tests/user-location",title:"Routr 1.0RC3 - User Location Lookup Performance Tests",description:"Author:",source:"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",sourceDirName:"introduction/performance-tests",slug:"/introduction/performance-tests/user-location",permalink:"/docs/1.x.x/introduction/performance-tests/user-location",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Media",permalink:"/docs/1.x.x/introduction/media"},next:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"}},s={},u=[{value:"Overview",id:"overview",level:2},{value:"Scope",id:"scope",level:3},{value:"Software",id:"software",level:3},{value:"Platform",id:"platform",level:3},{value:"Performance Tests",id:"performance-tests",level:2}],p={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"routr-10rc3---user-location-lookup-performance-tests"},"Routr 1.0RC3 - User Location Lookup Performance Tests"),(0,a.kt)("p",null,"Author:\nPedro Sanders"),(0,a.kt)("ol",{type:"1"},(0,a.kt)("li",null,"Overview"),(0,a.kt)("li",null,"User Location Performance Tests"),(0,a.kt)("ol",{type:"1"},(0,a.kt)("li",null,"New registrations"),(0,a.kt)("li",null,"Update registrations"),(0,a.kt)("li",null,"User location lookup")),(0,a.kt)("li",null,"Conclusions"),(0,a.kt)("li",null,"Notes"),(0,a.kt)("li",null,"References")),(0,a.kt)("h2",{id:"overview"},"Overview"),(0,a.kt)("h3",{id:"scope"},"Scope"),(0,a.kt)("p",null,"These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3.\nThese can be useful to help you better dimension your Routr installation. For these test the login module\nwas deactivated. The network configuration used during the test is depicted in the following image:"),(0,a.kt)("h3",{id:"software"},"Software"),(0,a.kt)("p",null,"As load generator (UAC side) it was used ",(0,a.kt)("a",{parentName:"p",href:"URL"},"SIPp docker")," image."),(0,a.kt)("p",null,"All used SIP-related software was configured to use TCP as the transport protocol for SIP."),(0,a.kt)("h3",{id:"platform"},"Platform"),(0,a.kt)("p",null,"Description of the elements used:"),(0,a.kt)("p",null,"Equipment #1 - ","[Processor]",", ","[Memory]"," with ","[Operating system]"," testing.\nEquipment #2 - ","[Processor]",", ","[Memory]"," with ","[Operating system]"," testing.\nEquipment #x - ","[Processor]",", ","[Memory]"," with ","[Operating system]"," testing."),(0,a.kt)("h2",{id:"performance-tests"},"Performance Tests"),(0,a.kt)("p",null,"Routr running without any special"),(0,a.kt)("p",null,"SIPp was used to generate ","[# of interaction]"," MESSAGE requests via Routr.\nThe results reflect the capacity ","[General or sub topic]"," and speed (average response time)."),(0,a.kt)("p",null,"Flow\nSIP entities definition:"),(0,a.kt)("p",null,"UAC - ","[UAC]",":5070\nUAS - ","[UAS]",":5070\nProxy - ","[PROXY_IP]",":5060"),(0,a.kt)("p",null,"SIP messages flow for one complete transaction:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"UAC ---\x3e MESSAGE ---\x3e Routr ---\x3e MESSAGE ---\x3e UAS\nUAC <--- 200 OK <--- Routr <--- 200 OK <--- UAS\n")),(0,a.kt)("p",null,"Configuration\nSIPP command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"[Used SIPp command config ]\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Results")),(0,a.kt)("p",null,"Results reported by SIPp on the UAC servers:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Factor"),(0,a.kt)("th",{parentName:"tr",align:null},"Value"),(0,a.kt)("th",{parentName:"tr",align:null},"Note"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Iterations"),(0,a.kt)("td",{parentName:"tr",align:null},"200000"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Max concurrent requests"),(0,a.kt)("td",{parentName:"tr",align:null},"70"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Max allowed Rate"),(0,a.kt)("td",{parentName:"tr",align:null},"10000"),(0,a.kt)("td",{parentName:"tr",align:null},"requests per second")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Average Request Rate"),(0,a.kt)("td",{parentName:"tr",align:null},"8047.966"),(0,a.kt)("td",{parentName:"tr",align:null},"requests per second")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Failures"),(0,a.kt)("td",{parentName:"tr",align:null},"0"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Retransmissions"),(0,a.kt)("td",{parentName:"tr",align:null},"0"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Timeout"),(0,a.kt)("td",{parentName:"tr",align:null},"0"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Elapsed Time"),(0,a.kt)("td",{parentName:"tr",align:null},"00:00:24:851"),(0,a.kt)("td",{parentName:"tr",align:null},"00:00:24:851")))),(0,a.kt)("br",null),(0,a.kt)("img",{src:"/docs/assets/images/[DUT Performance Summary]"}),(0,a.kt)("br",null),(0,a.kt)("br",null),(0,a.kt)("p",null,"Routr config file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"[Whatever config applies]\n")),(0,a.kt)("p",null,"[Graphical results]"),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"Conclusions"),(0,a.kt)("li",{parentName:"ol"},"Notes"),(0,a.kt)("li",{parentName:"ol"},"References")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7c32d245.80c5bf10.js b/assets/js/7c32d245.80c5bf10.js new file mode 100644 index 000000000..f540cd3aa --- /dev/null +++ b/assets/js/7c32d245.80c5bf10.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[529],{8786:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(4848),r=n(8453);const o={},i="Routr 1.0RC3 - User Location Lookup Performance Tests",c={id:"introduction/performance-tests/user-location",title:"Routr 1.0RC3 - User Location Lookup Performance Tests",description:"Author:",source:"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",sourceDirName:"introduction/performance-tests",slug:"/introduction/performance-tests/user-location",permalink:"/docs/1.x.x/introduction/performance-tests/user-location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Media",permalink:"/docs/1.x.x/introduction/media"},next:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Scope",id:"scope",level:3},{value:"Software",id:"software",level:3},{value:"Platform",id:"platform",level:3},{value:"Performance Tests",id:"performance-tests",level:2}];function a(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"routr-10rc3---user-location-lookup-performance-tests",children:"Routr 1.0RC3 - User Location Lookup Performance Tests"}),"\n",(0,s.jsx)(t.p,{children:"Author:\nPedro Sanders"}),"\n",(0,s.jsxs)("ol",{type:"1",children:[(0,s.jsx)("li",{children:"Overview"}),(0,s.jsx)("li",{children:"User Location Performance Tests"}),(0,s.jsxs)("ol",{type:"1",children:[(0,s.jsx)("li",{children:"New registrations"}),(0,s.jsx)("li",{children:"Update registrations"}),(0,s.jsx)("li",{children:"User location lookup"})]}),(0,s.jsx)("li",{children:"Conclusions"}),(0,s.jsx)("li",{children:"Notes"}),(0,s.jsx)("li",{children:"References"})]}),"\n",(0,s.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(t.h3,{id:"scope",children:"Scope"}),"\n",(0,s.jsx)(t.p,{children:"These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3.\nThese can be useful to help you better dimension your Routr installation. For these test the login module\nwas deactivated. The network configuration used during the test is depicted in the following image:"}),"\n",(0,s.jsx)(t.h3,{id:"software",children:"Software"}),"\n",(0,s.jsx)(t.p,{children:"As load generator (UAC side) it was used SIPp."}),"\n",(0,s.jsx)(t.p,{children:"All used SIP-related software was configured to use TCP as the transport protocol for SIP."}),"\n",(0,s.jsx)(t.h3,{id:"platform",children:"Platform"}),"\n",(0,s.jsx)(t.p,{children:"Description of the elements used:"}),"\n",(0,s.jsx)(t.p,{children:"Equipment #1 - [Processor], [Memory] with [Operating system] testing.\nEquipment #2 - [Processor], [Memory] with [Operating system] testing.\nEquipment #x - [Processor], [Memory] with [Operating system] testing."}),"\n",(0,s.jsx)(t.h2,{id:"performance-tests",children:"Performance Tests"}),"\n",(0,s.jsx)(t.p,{children:"Routr running without any special"}),"\n",(0,s.jsx)(t.p,{children:"SIPp was used to generate [# of interaction] MESSAGE requests via Routr.\nThe results reflect the capacity [General or sub topic] and speed (average response time)."}),"\n",(0,s.jsx)(t.p,{children:"Flow\nSIP entities definition:"}),"\n",(0,s.jsx)(t.p,{children:"UAC - [UAC]:5070\nUAS - [UAS]:5070\nProxy - [PROXY_IP]:5060"}),"\n",(0,s.jsx)(t.p,{children:"SIP messages flow for one complete transaction:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"UAC ---\x3e MESSAGE ---\x3e Routr ---\x3e MESSAGE ---\x3e UAS\nUAC <--- 200 OK <--- Routr <--- 200 OK <--- UAS\n"})}),"\n",(0,s.jsx)(t.p,{children:"Configuration\nSIPP command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"[Used SIPp command config ]\n"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Results"})}),"\n",(0,s.jsx)(t.p,{children:"Results reported by SIPp on the UAC servers:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Factor"}),(0,s.jsx)(t.th,{children:"Value"}),(0,s.jsx)(t.th,{children:"Note"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Iterations"}),(0,s.jsx)(t.td,{children:"200000"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Max concurrent requests"}),(0,s.jsx)(t.td,{children:"70"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Max allowed Rate"}),(0,s.jsx)(t.td,{children:"10000"}),(0,s.jsx)(t.td,{children:"requests per second"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Average Request Rate"}),(0,s.jsx)(t.td,{children:"8047.966"}),(0,s.jsx)(t.td,{children:"requests per second"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Failures"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Retransmissions"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Timeout"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Elapsed Time"}),(0,s.jsx)(t.td,{children:"00:00:24:851"}),(0,s.jsx)(t.td,{children:"00:00:24:851"})]})]})]}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("img",{src:"/docs/assets/images/[DUT Performance Summary]"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)(t.p,{children:"Routr config file:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"[Whatever config applies]\n"})}),"\n",(0,s.jsx)(t.p,{children:"[Graphical results]"}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"Conclusions"}),"\n",(0,s.jsx)(t.li,{children:"Notes"}),"\n",(0,s.jsx)(t.li,{children:"References"}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(6540);const r={},o=s.createContext(r);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7cf72cd4.590cd8be.js b/assets/js/7cf72cd4.590cd8be.js deleted file mode 100644 index 00b3e5a03..000000000 --- a/assets/js/7cf72cd4.590cd8be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3173],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>N});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=s(n),k=r,N=m["".concat(p,".").concat(k)]||m[k]||u[k]||l;return n?a.createElement(N,i(i({ref:t},d),{},{components:n})):a.createElement(N,i({ref:t},d))}));function N(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=k;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var s=2;s<l;s++)i[s]=n[s];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}k.displayName="MDXCreateElement"},6702:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const l={},i="APIServer",o={unversionedId:"development/components/apiserver",id:"development/components/apiserver",title:"APIServer",description:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.",source:"@site/docs/development/components/apiserver.md",sourceDirName:"development/components",slug:"/development/components/apiserver",permalink:"/docs/2.0.0/development/components/apiserver",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"},next:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"}},p={},s=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the APIServer",id:"launching-the-apiserver",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}],d={toc:s},m="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"apiserver"},"APIServer"),(0,r.kt)("p",null,"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC."),(0,r.kt)("p",null,"The APIServer has two implementations: the ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," for persistent data storage in a PostgreSQL database and the ",(0,r.kt)("inlineCode",{parentName:"p"},"simpledata")," for storing data in files. The ",(0,r.kt)("inlineCode",{parentName:"p"},"simpledata")," implementation is intended for testing and small deployments."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," has several advantages over the ",(0,r.kt)("inlineCode",{parentName:"p"},"simpledata")," implementation. The first advantage is that the ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the ",(0,r.kt)("inlineCode",{parentName:"p"},"extended")," attribute, enabling you to store additional data in the database in JSON format\u2014more on this in later sections."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Data Migration")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," implementation uses ",(0,r.kt)("a",{parentName:"p",href:"https://www.prisma.io/"},"Prisma")," to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily."),(0,r.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"pgdata")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," has the following environment variables available for configuration:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"DATABASE_URL")," - The URL of the PostgreSQL database. Example: ",(0,r.kt)("inlineCode",{parentName:"li"},"postgresql://postgres:postgres@localhost:5432/routr")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"BIND_ADDR")," - The address where the APIServer will listen for gRPC requests. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"0.0.0.0:51907")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"EXTERNAL_SERVER_BIND_ADDR")," - The address where the APIServer will listen for HTTP requests. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"0.0.0.0:51908")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"TLS_ON")," - Enables TLS for the gRPC server. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"false")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"VERIFY_CLIENT_CERT")," - Enables client certificate verification. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"false")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"CACERT")," - The path to the CA certificate. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"/etc/routr/certs/ca.crt")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_CERT")," - The path to the server certificate. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"/etc/routr/certs/server.crt")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ENFORCE_E164")," - Enables E164 validation for Numbers. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"false")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ENFORCE_E164_WITH_MOBILE_PREFIX")," - Enables E164 validation for Numbers with mobile prefixes. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"false"))),(0,r.kt)("p",null,"For details about connecting to the ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," to manage the data, see the ",(0,r.kt)("a",{parentName:"p",href:"../ctl/README.md"},"CTL")," and ",(0,r.kt)("a",{parentName:"p",href:"../sdk/README.md"},"SDK")," documentation."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"simpledata")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"simpledata")," has the following environment variables available for configuration:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PATH_TO_RESOURCES")," - The path to the directory where the data will be stored. Example: ",(0,r.kt)("inlineCode",{parentName:"li"},"/etc/routr/resources")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"BIND_ADDR")," - The address where the APIServer will listen for gRPC requests. Default to ",(0,r.kt)("inlineCode",{parentName:"li"},"0.0.0.0:51907"))),(0,r.kt)("p",null,"Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components. "),(0,r.kt)("p",null,"In your resources directory, you will find the following files:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"agents.yaml")," - A list of Agents"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"domains.yaml")," - A list of Domains to which Agents belong"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"trunks.yaml")," - Represents the list of Trunks"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"numbers.yaml")," - A list of Numbers to which Trunks belong"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"peers.yaml")," - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"credentials.yaml")," - A list of Credentials for Peers and Agents"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"acl.yaml")," - The list of ACLs")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"You may also provide a ",(0,r.kt)("inlineCode",{parentName:"p"},".json")," file instead of a ",(0,r.kt)("inlineCode",{parentName:"p"},".yaml")," file.")),(0,r.kt)("p",null,"The Agents configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the Agent"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Agent"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the Agent"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.username")),(0,r.kt)("td",{parentName:"tr",align:null},"The username of the Agent"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.domainRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Domain of the Agent"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.credentialsRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Credentials of the Agent"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.privacy")),(0,r.kt)("td",{parentName:"tr",align:null},"The privacy settings of the Agent (",(0,r.kt)("inlineCode",{parentName:"td"},"Private")," or ",(0,r.kt)("inlineCode",{parentName:"td"},"None"),")"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.enabled")),(0,r.kt)("td",{parentName:"tr",align:null},"The enabled status of the Agent (reserved for future use)"),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("p",null,"An example of an Agents configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"agents.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n privacy: Private\n')),(0,r.kt)("p",null,"In the example above, the Agent ",(0,r.kt)("inlineCode",{parentName:"p"},"agent-01")," has the username ",(0,r.kt)("inlineCode",{parentName:"p"},"1001"),", belongs to the Domain ",(0,r.kt)("inlineCode",{parentName:"p"},"domain-01"),", and uses the Credentials ",(0,r.kt)("inlineCode",{parentName:"p"},"credentials-01"),". Both the Domain and the Credentials are required for the Agent to work."),(0,r.kt)("p",null,"The Domains configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the Domain"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Domain"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the Domain"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.context.domainUri")),(0,r.kt)("td",{parentName:"tr",align:null},"The domain URI"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.context.egressPolicies")),(0,r.kt)("td",{parentName:"tr",align:null},"The list of egress policies"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.context.egressPolicies[*].rule")),(0,r.kt)("td",{parentName:"tr",align:null},"The regular expression to match the number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.context.egressPolicies[*].numberRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,r.kt)("p",null,"An example of a Domains configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"domains.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n')),(0,r.kt)("p",null,"In the example above, the Domain ",(0,r.kt)("inlineCode",{parentName:"p"},"domain-01")," has the Domain URI ",(0,r.kt)("inlineCode",{parentName:"p"},"sip.local")," and the egress policy ",(0,r.kt)("inlineCode",{parentName:"p"},".*")," that matches all numbers. The egress policy is associated with the Number ",(0,r.kt)("inlineCode",{parentName:"p"},"number-01"),". The Number ",(0,r.kt)("inlineCode",{parentName:"p"},"number-01")," is required for the Domain to work."),(0,r.kt)("p",null,"Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.geoInfo.city")),(0,r.kt)("td",{parentName:"tr",align:null},"The city where the Number is located"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.geoInfo.country")),(0,r.kt)("td",{parentName:"tr",align:null},"The country where the Number is located"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.geoInfo.countryISOCode")),(0,r.kt)("td",{parentName:"tr",align:null},"The ISO code of the country"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.trunkRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.location.telUrl")),(0,r.kt)("td",{parentName:"tr",align:null},"The tel URL of the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.location.aorLink")),(0,r.kt)("td",{parentName:"tr",align:null},"The Address of Record (AOR) of the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.location.sessionAffinityHeader")),(0,r.kt)("td",{parentName:"tr",align:null},"The session affinity header of the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.location.extraHeaders")),(0,r.kt)("td",{parentName:"tr",align:null},"The extra headers of the Number"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.location.extraHeaders[*].name")),(0,r.kt)("td",{parentName:"tr",align:null},"The name of the extra header"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,r.kt)("p",null,"Tthe ' tel: ' scheme is required when setting the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.location.telUrl")," property. For example, ",(0,r.kt)("inlineCode",{parentName:"p"},"tel:+17066041487"),". Here, ",(0,r.kt)("inlineCode",{parentName:"p"},"tel:")," indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider."),(0,r.kt)("p",null,"Another important property is the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.location.aorLink"),". The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.location.sessionAffinityHeader"),' tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the ',(0,r.kt)("inlineCode",{parentName:"p"},"X-Room-Id")," header to identify the session. The Location Service will use the header's value to identify the session."),(0,r.kt)("p",null,"An example of a Numbers configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"numbers.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(706)604-1487"\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+17066041487\n aorLink: sip:conference@sip.local\n sessionAffinityHeader: X-Room-Id\n extraHeaders:\n - name: X-Room-Id\n value: jsa-shqm-iyo\n')),(0,r.kt)("p",null,"Numbers must be associated with a Trunk to work. "),(0,r.kt)("p",null,"The Trunks configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.region")),(0,r.kt)("td",{parentName:"tr",align:null},"Reserved for future use"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.inbound.uri")),(0,r.kt)("td",{parentName:"tr",align:null},"The inbound URI of the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.inbound.accessControlListRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the ACL of the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.sendRegister")),(0,r.kt)("td",{parentName:"tr",align:null},"Enables outbound registration"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.credentialsRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Credentials of the Trunk"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris")),(0,r.kt)("td",{parentName:"tr",align:null},"The list of outbound URIs"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].uri")),(0,r.kt)("td",{parentName:"tr",align:null},"The outbound URI"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].priority")),(0,r.kt)("td",{parentName:"tr",align:null},"Reserved for future use"),(0,r.kt)("td",{parentName:"tr",align:null},"NA")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].weight")),(0,r.kt)("td",{parentName:"tr",align:null},"Reserved for future use"),(0,r.kt)("td",{parentName:"tr",align:null},"NA")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].enabled")),(0,r.kt)("td",{parentName:"tr",align:null},"Reserved for future use"),(0,r.kt)("td",{parentName:"tr",align:null},"NA")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].transport")),(0,r.kt)("td",{parentName:"tr",align:null},"The transport of the outbound URI"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].user")),(0,r.kt)("td",{parentName:"tr",align:null},"The user of the outbound URI"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].host")),(0,r.kt)("td",{parentName:"tr",align:null},"The host of the outbound URI"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.outbound.uris[*].port")),(0,r.kt)("td",{parentName:"tr",align:null},"The port of the outbound URI"),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("p",null,"An example of a Trunks configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"trunks.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v2beta1\n kind: Trunk\n ref: trunk-01\n metadata:\n name: Test Trunk\n region: us-east1\n spec:\n inbound:\n uri: trunk01.acme.com\n accessControlListRef: acl-01\n outbound:\n sendRegister: true\n credentialsRef: credentials-04\n uris:\n - uri:\n user: pbx-1\n host: sip.provider.net\n port: 7060\n transport: udp\n enabled: true\n")),(0,r.kt)("p",null,"In the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.inbound")," section, the ",(0,r.kt)("inlineCode",{parentName:"p"},"uri")," property helps Routr to identify the Trunk. Calls from the PSTN using the ",(0,r.kt)("inlineCode",{parentName:"p"},"uri")," will be routed to the Trunk. The ",(0,r.kt)("inlineCode",{parentName:"p"},"accessControlListRef")," property restricts the access to the Trunk. The ",(0,r.kt)("inlineCode",{parentName:"p"},"accessControlListRef")," is optional."),(0,r.kt)("p",null,"In the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.outbound")," section, the ",(0,r.kt)("inlineCode",{parentName:"p"},"sendRegister")," property enables registration outbound registrations while the ",(0,r.kt)("inlineCode",{parentName:"p"},"credentialsRef")," property for authentication with your trunk provider."),(0,r.kt)("p",null,"In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the Peer"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Peer"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the Peer"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.aor")),(0,r.kt)("td",{parentName:"tr",align:null},"The Address of Record (AOR) of the Peer"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.username")),(0,r.kt)("td",{parentName:"tr",align:null},"The username of the Peer"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.credentialsRef")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Credentials of the Peer"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.loadBalancing.withSessionAffinity")),(0,r.kt)("td",{parentName:"tr",align:null},"Enables session affinity"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.loadBalancing.algorithm")),(0,r.kt)("td",{parentName:"tr",align:null},"The load balancing algorithm"),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.loadBalancing.withSessionAffinity")," property enables session affinity, and the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.loadBalancing.algorithm")," property sets the load-balancing algorithm. The available algorithms are ",(0,r.kt)("inlineCode",{parentName:"p"},"least-sessions")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"round-robin"),"."),(0,r.kt)("p",null,"Remember that for the ",(0,r.kt)("inlineCode",{parentName:"p"},"least-sessions")," algorithm to work, your SIP backend includes the special header ",(0,r.kt)("inlineCode",{parentName:"p"},"X-Session-Count")," with the number of active sessions as part of the registration request."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date.")),(0,r.kt)("p",null,"An example of a Peers configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"peers.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v2beta1\n kind: Peer\n ref: peer-01\n metadata:\n name: Asterisk (Media Server)\n spec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-03\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n")),(0,r.kt)("p",null,"Credentials in Routr help Agents and Peers authenticate with Routr."),(0,r.kt)("p",null,"The Credentials configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the Credentials"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the Credentials"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the Credentials"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.credentials.username")),(0,r.kt)("td",{parentName:"tr",align:null},"The username of the Credentials"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.credentials.password")),(0,r.kt)("td",{parentName:"tr",align:null},"The password of the Credentials"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,r.kt)("p",null,"An example of a Credentials configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"credentials.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- apiVersion: v2beta1\n kind: Credentials\n ref: credentials-01\n metadata:\n name: Agent Credentials\n spec:\n credentials:\n username: "1001"\n password: "1234"\n')),(0,r.kt)("p",null,"Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains. "),(0,r.kt)("p",null,"The ACLs configuration file has the following structure:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apiVersion")),(0,r.kt)("td",{parentName:"tr",align:null},"The API version of the ACL"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind")),(0,r.kt)("td",{parentName:"tr",align:null},"The kind of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ref")),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to the ACL"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"metadata.name")),(0,r.kt)("td",{parentName:"tr",align:null},"A friendly name for the ACL"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.accessControlList.deny")),(0,r.kt)("td",{parentName:"tr",align:null},"The list of deny rules"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.accessControlList.deny[*]")),(0,r.kt)("td",{parentName:"tr",align:null},"The deny rule"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.accessControlList.allow")),(0,r.kt)("td",{parentName:"tr",align:null},"The list of allow rules"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"spec.accessControlList.allow[*]")),(0,r.kt)("td",{parentName:"tr",align:null},"The allow rule"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,r.kt)("p",null,"An example of an ACLs configuration file:"),(0,r.kt)("p",null,"Filename: ",(0,r.kt)("inlineCode",{parentName:"p"},"acl.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v2beta1\n kind: AccessControlList\n ref: acl-01\n metadata:\n name: Europe ACL\n spec:\n accessControlList:\n deny:\n - 0.0.0.0/1\n allow:\n - 192.168.1.3/31\n - 127.0.0.1/8\n - 10.111.221.22/31\n")),(0,r.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,r.kt)("p",null,"Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc."),(0,r.kt)("p",null,"The following protobuf defines the Agent service interface:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.connect.agents.v2beta1;\n\n// The Agents service definition\nservice Agents {\n // Creates a new Agent\n rpc Create (CreateAgentRequest) returns (Agent) {}\n // Updates an existing Agent\n rpc Update (UpdateAgentRequest) returns (Agent) {}\n // Gets an existing Agent\n rpc Get (GetAgentRequest) returns (Agent) {}\n // Deletes an existing Agent\n rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}\n // Lists all Agents\n rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}\n // Find Agents by field name and value\n rpc FindBy (FindByRequest) returns (FindByResponse) {}\n}\n\nenum Privacy {\n PRIVATE = 0;\n NONE = 1;\n}\n\n// The message for the Agent resource\nmessage Agent {\n // The API version of the Agent\n string api_version = 1;\n // The unique identifier of the Agent\n string ref = 2;\n // The name of the Agent\n string name = 3;\n // The username of the Agent\n string username = 4;\n // The password of the Agent\n Privacy privacy = 5;\n // The enabled status of the Agent\n bool enabled = 6;\n // The created_at timestamp of the Agent\n int32 created_at = 7;\n // The updated_at timestamp of the Agent\n int32 updated_at = 8;\n // The domain of the Agent\n fonoster.routr.connect.domains.v2beta1.Domain domain = 9;\n // The credentials of the Agent\n fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 11; \n}\n\n// The request message for the Agents.Create method\nmessage CreateAgentRequest {\n // The name of the Agent\n string name = 1;\n // The username of the Agent\n string username = 2;\n // The password of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7; \n}\n\n// The request message for the Agents.Update method\nmessage UpdateAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n // The name of the Agent\n string name = 2;\n // The privacy settings of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7;\n}\n\n// The request message for the Agents.Get method\nmessage GetAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.Delete method\nmessage DeleteAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.FindBy method\nmessage FindByRequest {\n // The field name to search\n string field_name = 1;\n // The value to search\n string field_value = 2;\n}\n\n// The response message for the Agents.FindBy method\nmessage FindByResponse {\n // The list of Agents\n repeated Agent items = 1;\n} \n\n// The request message for the Agents.List method\nmessage ListAgentsRequest {\n // The maximum number of items in the list\n int32 page_size = 1;\n\n // The next_page_token value returned from the previous request, if any\n string page_token = 2;\n}\n\n// The response message for the Agents.List method\nmessage ListAgentsResponse {\n // List of Agents\n repeated Agent items = 1;\n\n // Token to retrieve the next page of results or empty if there are no more results in the list\n string next_page_token = 2;\n}\n')),(0,r.kt)("p",null,"To see the complete protobuf spec, please visit the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"},"protobuf directory.")),(0,r.kt)("h2",{id:"launching-the-apiserver"},"Launching the APIServer"),(0,r.kt)("p",null,"Both implementations are available as Docker images from Docker Hub as ",(0,r.kt)("inlineCode",{parentName:"p"},"fonoster/routr-pgdata")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"fonoster/routr-simpledata"),". "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"pgdata")),(0,r.kt)("p",null,"To launch the ",(0,r.kt)("inlineCode",{parentName:"p"},"pgdata")," implementation with Docker, you can use the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run -it \\\n -e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \\\n -p 51907:51907 \\\n -p 51908:51908 \\\n fonoster/routr-pgdata\n')),(0,r.kt)("p",null,"The port ",(0,r.kt)("inlineCode",{parentName:"p"},"51907")," is used for internal communication, and the port ",(0,r.kt)("inlineCode",{parentName:"p"},"51908")," is used for external communication. The CTL and SDK use the external port to manage the data."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"simpledata")),(0,r.kt)("p",null,"To launch the ",(0,r.kt)("inlineCode",{parentName:"p"},"simpledata")," implementation with Docker, you can use the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it \\\n -v /path/to/resources:/etc/routr/resources \\\n -p 51907:51907 \\\n fonoster/routr-simpledata\n")),(0,r.kt)("h2",{id:"quick-test-with-grpcurl"},"Quick Test with gRPCurl"),(0,r.kt)("p",null,"One easy way to interact with the APIServer for testing and development is to use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fullstorydev/grpcurl"},"gRPCurl"),". The following example shows how to send a request to the Agents service within the APIServer:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto agents.proto -d '{...}' \\\n localhost:51907 \\\n fonoster.routr.connect.agents.v2beta1.Agents/Get\n")),(0,r.kt)("p",null,"Please remember that the ",(0,r.kt)("inlineCode",{parentName:"p"},"simpledata")," implementation does not accept write operations."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7cf72cd4.cce3242e.js b/assets/js/7cf72cd4.cce3242e.js new file mode 100644 index 000000000..7347cc791 --- /dev/null +++ b/assets/js/7cf72cd4.cce3242e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8937],{1370:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=s(4848),r=s(8453);const i={},d="APIServer",c={id:"development/components/apiserver",title:"APIServer",description:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.",source:"@site/docs/development/components/apiserver.md",sourceDirName:"development/components",slug:"/development/components/apiserver",permalink:"/docs/2.0.0/development/components/apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"},next:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"}},o={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the APIServer",id:"launching-the-apiserver",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"apiserver",children:"APIServer"}),"\n",(0,t.jsx)(n.p,{children:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC."}),"\n",(0,t.jsxs)(n.p,{children:["The APIServer has two implementations: the ",(0,t.jsx)(n.code,{children:"pgdata"})," for persistent data storage in a PostgreSQL database and the ",(0,t.jsx)(n.code,{children:"simpledata"})," for storing data in files. The ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation is intended for testing and small deployments."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has several advantages over the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation. The first advantage is that the ",(0,t.jsx)(n.code,{children:"pgdata"})," allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the ",(0,t.jsx)(n.code,{children:"extended"})," attribute, enabling you to store additional data in the database in JSON format\u2014more on this in later sections."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Data Migration"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation uses ",(0,t.jsx)(n.a,{href:"https://www.prisma.io/",children:"Prisma"})," to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DATABASE_URL"})," - The URL of the PostgreSQL database. Example: ",(0,t.jsx)(n.code,{children:"postgresql://postgres:postgres@localhost:5432/routr"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"EXTERNAL_SERVER_BIND_ADDR"})," - The address where the APIServer will listen for HTTP requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51908"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TLS_ON"})," - Enables TLS for the gRPC server. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"VERIFY_CLIENT_CERT"})," - Enables client certificate verification. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"CACERT"})," - The path to the CA certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/ca.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SERVER_CERT"})," - The path to the server certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/server.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164"})," - Enables E164 validation for Numbers. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164_WITH_MOBILE_PREFIX"})," - Enables E164 validation for Numbers with mobile prefixes. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For details about connecting to the ",(0,t.jsx)(n.code,{children:"pgdata"})," to manage the data, see the ",(0,t.jsx)(n.a,{href:"/docs/2.0.0/connect/command-line/overview",children:"CTL"})," and ",(0,t.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"SDK"})," documentation."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"simpledata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PATH_TO_RESOURCES"})," - The path to the directory where the data will be stored. Example: ",(0,t.jsx)(n.code,{children:"/etc/routr/resources"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components."}),"\n",(0,t.jsx)(n.p,{children:"In your resources directory, you will find the following files:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"agents.yaml"})," - A list of Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"domains.yaml"})," - A list of Domains to which Agents belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"trunks.yaml"})," - Represents the list of Trunks"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"numbers.yaml"})," - A list of Numbers to which Trunks belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"peers.yaml"})," - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"credentials.yaml"})," - A list of Credentials for Peers and Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"acl.yaml"})," - The list of ACLs"]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["You may also provide a ",(0,t.jsx)(n.code,{children:".json"})," file instead of a ",(0,t.jsx)(n.code,{children:".yaml"})," file."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The Agents configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.domainRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.privacy"})}),(0,t.jsxs)(n.td,{children:["The privacy settings of the Agent (",(0,t.jsx)(n.code,{children:"Private"})," or ",(0,t.jsx)(n.code,{children:"None"}),")"]}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.enabled"})}),(0,t.jsx)(n.td,{children:"The enabled status of the Agent (reserved for future use)"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an Agents configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"agents.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n privacy: Private\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Agent ",(0,t.jsx)(n.code,{children:"agent-01"})," has the username ",(0,t.jsx)(n.code,{children:"1001"}),", belongs to the Domain ",(0,t.jsx)(n.code,{children:"domain-01"}),", and uses the Credentials ",(0,t.jsx)(n.code,{children:"credentials-01"}),". Both the Domain and the Credentials are required for the Agent to work."]}),"\n",(0,t.jsx)(n.p,{children:"The Domains configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.domainUri"})}),(0,t.jsx)(n.td,{children:"The domain URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies"})}),(0,t.jsx)(n.td,{children:"The list of egress policies"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].rule"})}),(0,t.jsx)(n.td,{children:"The regular expression to match the number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].numberRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Domains configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"domains.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Domain ",(0,t.jsx)(n.code,{children:"domain-01"})," has the Domain URI ",(0,t.jsx)(n.code,{children:"sip.local"})," and the egress policy ",(0,t.jsx)(n.code,{children:".*"})," that matches all numbers. The egress policy is associated with the Number ",(0,t.jsx)(n.code,{children:"number-01"}),". The Number ",(0,t.jsx)(n.code,{children:"number-01"})," is required for the Domain to work."]}),"\n",(0,t.jsx)(n.p,{children:"Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.city"})}),(0,t.jsx)(n.td,{children:"The city where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.country"})}),(0,t.jsx)(n.td,{children:"The country where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.countryISOCode"})}),(0,t.jsx)(n.td,{children:"The ISO code of the country"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.trunkRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.telUrl"})}),(0,t.jsx)(n.td,{children:"The tel URL of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.aorLink"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"})}),(0,t.jsx)(n.td,{children:"The session affinity header of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders"})}),(0,t.jsx)(n.td,{children:"The extra headers of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders[*].name"})}),(0,t.jsx)(n.td,{children:"The name of the extra header"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Tthe ' tel: ' scheme is required when setting the ",(0,t.jsx)(n.code,{children:"spec.location.telUrl"})," property. For example, ",(0,t.jsx)(n.code,{children:"tel:+17066041487"}),". Here, ",(0,t.jsx)(n.code,{children:"tel:"})," indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider."]}),"\n",(0,t.jsxs)(n.p,{children:["Another important property is the ",(0,t.jsx)(n.code,{children:"spec.location.aorLink"}),". The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"}),' tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the ',(0,t.jsx)(n.code,{children:"X-Room-Id"})," header to identify the session. The Location Service will use the header's value to identify the session."]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Numbers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"numbers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(706)604-1487"\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+17066041487\n aorLink: sip:conference@sip.local\n sessionAffinityHeader: X-Room-Id\n extraHeaders:\n - name: X-Room-Id\n value: jsa-shqm-iyo\n'})}),"\n",(0,t.jsx)(n.p,{children:"Numbers must be associated with a Trunk to work."}),"\n",(0,t.jsx)(n.p,{children:"The Trunks configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.region"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.uri"})}),(0,t.jsx)(n.td,{children:"The inbound URI of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.accessControlListRef"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.sendRegister"})}),(0,t.jsx)(n.td,{children:"Enables outbound registration"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris"})}),(0,t.jsx)(n.td,{children:"The list of outbound URIs"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].uri"})}),(0,t.jsx)(n.td,{children:"The outbound URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].priority"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].weight"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].enabled"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].transport"})}),(0,t.jsx)(n.td,{children:"The transport of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].user"})}),(0,t.jsx)(n.td,{children:"The user of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].host"})}),(0,t.jsx)(n.td,{children:"The host of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].port"})}),(0,t.jsx)(n.td,{children:"The port of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Trunks configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"trunks.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Trunk\n ref: trunk-01\n metadata:\n name: Test Trunk\n region: us-east1\n spec:\n inbound:\n uri: trunk01.acme.com\n accessControlListRef: acl-01\n outbound:\n sendRegister: true\n credentialsRef: credentials-04\n uris:\n - uri:\n user: pbx-1\n host: sip.provider.net\n port: 7060\n transport: udp\n enabled: true\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.inbound"})," section, the ",(0,t.jsx)(n.code,{children:"uri"})," property helps Routr to identify the Trunk. Calls from the PSTN using the ",(0,t.jsx)(n.code,{children:"uri"})," will be routed to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," property restricts the access to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," is optional."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.outbound"})," section, the ",(0,t.jsx)(n.code,{children:"sendRegister"})," property enables registration outbound registrations while the ",(0,t.jsx)(n.code,{children:"credentialsRef"})," property for authentication with your trunk provider."]}),"\n",(0,t.jsx)(n.p,{children:"In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.aor"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})}),(0,t.jsx)(n.td,{children:"Enables session affinity"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})}),(0,t.jsx)(n.td,{children:"The load balancing algorithm"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})," property enables session affinity, and the ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})," property sets the load-balancing algorithm. The available algorithms are ",(0,t.jsx)(n.code,{children:"least-sessions"})," and ",(0,t.jsx)(n.code,{children:"round-robin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Remember that for the ",(0,t.jsx)(n.code,{children:"least-sessions"})," algorithm to work, your SIP backend includes the special header ",(0,t.jsx)(n.code,{children:"X-Session-Count"})," with the number of active sessions as part of the registration request."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Peers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"peers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Peer\n ref: peer-01\n metadata:\n name: Asterisk (Media Server)\n spec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-03\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsx)(n.p,{children:"Credentials in Routr help Agents and Peers authenticate with Routr."}),"\n",(0,t.jsx)(n.p,{children:"The Credentials configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.username"})}),(0,t.jsx)(n.td,{children:"The username of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.password"})}),(0,t.jsx)(n.td,{children:"The password of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Credentials configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"credentials.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Credentials\n ref: credentials-01\n metadata:\n name: Agent Credentials\n spec:\n credentials:\n username: "1001"\n password: "1234"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains."}),"\n",(0,t.jsx)(n.p,{children:"The ACLs configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny"})}),(0,t.jsx)(n.td,{children:"The list of deny rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny[*]"})}),(0,t.jsx)(n.td,{children:"The deny rule"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow"})}),(0,t.jsx)(n.td,{children:"The list of allow rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow[*]"})}),(0,t.jsx)(n.td,{children:"The allow rule"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an ACLs configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"acl.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: AccessControlList\n ref: acl-01\n metadata:\n name: Europe ACL\n spec:\n accessControlList:\n deny:\n - 0.0.0.0/1\n allow:\n - 192.168.1.3/31\n - 127.0.0.1/8\n - 10.111.221.22/31\n"})}),"\n",(0,t.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(n.p,{children:"Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc."}),"\n",(0,t.jsx)(n.p,{children:"The following protobuf defines the Agent service interface:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.connect.agents.v2beta1;\n\n// The Agents service definition\nservice Agents {\n // Creates a new Agent\n rpc Create (CreateAgentRequest) returns (Agent) {}\n // Updates an existing Agent\n rpc Update (UpdateAgentRequest) returns (Agent) {}\n // Gets an existing Agent\n rpc Get (GetAgentRequest) returns (Agent) {}\n // Deletes an existing Agent\n rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}\n // Lists all Agents\n rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}\n // Find Agents by field name and value\n rpc FindBy (FindByRequest) returns (FindByResponse) {}\n}\n\nenum Privacy {\n PRIVATE = 0;\n NONE = 1;\n}\n\n// The message for the Agent resource\nmessage Agent {\n // The API version of the Agent\n string api_version = 1;\n // The unique identifier of the Agent\n string ref = 2;\n // The name of the Agent\n string name = 3;\n // The username of the Agent\n string username = 4;\n // The password of the Agent\n Privacy privacy = 5;\n // The enabled status of the Agent\n bool enabled = 6;\n // The created_at timestamp of the Agent\n int32 created_at = 7;\n // The updated_at timestamp of the Agent\n int32 updated_at = 8;\n // The domain of the Agent\n fonoster.routr.connect.domains.v2beta1.Domain domain = 9;\n // The credentials of the Agent\n fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 11; \n}\n\n// The request message for the Agents.Create method\nmessage CreateAgentRequest {\n // The name of the Agent\n string name = 1;\n // The username of the Agent\n string username = 2;\n // The password of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7; \n}\n\n// The request message for the Agents.Update method\nmessage UpdateAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n // The name of the Agent\n string name = 2;\n // The privacy settings of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7;\n}\n\n// The request message for the Agents.Get method\nmessage GetAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.Delete method\nmessage DeleteAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.FindBy method\nmessage FindByRequest {\n // The field name to search\n string field_name = 1;\n // The value to search\n string field_value = 2;\n}\n\n// The response message for the Agents.FindBy method\nmessage FindByResponse {\n // The list of Agents\n repeated Agent items = 1;\n} \n\n// The request message for the Agents.List method\nmessage ListAgentsRequest {\n // The maximum number of items in the list\n int32 page_size = 1;\n\n // The next_page_token value returned from the previous request, if any\n string page_token = 2;\n}\n\n// The response message for the Agents.List method\nmessage ListAgentsResponse {\n // List of Agents\n repeated Agent items = 1;\n\n // Token to retrieve the next page of results or empty if there are no more results in the list\n string next_page_token = 2;\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["To see the complete protobuf spec, please visit the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"protobuf directory."})]}),"\n",(0,t.jsx)(n.h2,{id:"launching-the-apiserver",children:"Launching the APIServer"}),"\n",(0,t.jsxs)(n.p,{children:["Both implementations are available as Docker images from Docker Hub as ",(0,t.jsx)(n.code,{children:"fonoster/routr-pgdata"})," and ",(0,t.jsx)(n.code,{children:"fonoster/routr-simpledata"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run -it \\\n -e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \\\n -p 51907:51907 \\\n -p 51908:51908 \\\n fonoster/routr-pgdata\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The port ",(0,t.jsx)(n.code,{children:"51907"})," is used for internal communication, and the port ",(0,t.jsx)(n.code,{children:"51908"})," is used for external communication. The CTL and SDK use the external port to manage the data."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -v /path/to/resources:/etc/routr/resources \\\n -p 51907:51907 \\\n fonoster/routr-simpledata\n"})}),"\n",(0,t.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,t.jsxs)(n.p,{children:["One easy way to interact with the APIServer for testing and development is to use ",(0,t.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Agents service within the APIServer:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto agents.proto -d '{...}' \\\n localhost:51907 \\\n fonoster.routr.connect.agents.v2beta1.Agents/Get\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Please remember that the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation does not accept write operations."]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>c});var t=s(6540);const r={},i=t.createContext(r);function d(e){const n=t.useContext(i);return t.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:d(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7df8ae3f.36f25f3b.js b/assets/js/7df8ae3f.36f25f3b.js deleted file mode 100644 index b89eb2679..000000000 --- a/assets/js/7df8ae3f.36f25f3b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3410],{3905:(t,e,r)=>{r.d(e,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function s(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?o(Object(r),!0).forEach((function(e){a(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function p(t,e){if(null==t)return{};var r,n,a=function(t,e){if(null==t)return{};var r,n,a={},o=Object.keys(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||(a[r]=t[r]);return a}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}var i=n.createContext({}),l=function(t){var e=n.useContext(i),r=e;return t&&(r="function"==typeof t?t(e):s(s({},e),t)),r},u=function(t){var e=l(t.components);return n.createElement(i.Provider,{value:e},t.children)},c="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var r=t.components,a=t.mdxType,o=t.originalType,i=t.parentName,u=p(t,["components","mdxType","originalType","parentName"]),c=l(r),d=a,f=c["".concat(i,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(f,s(s({ref:e},u),{},{components:r})):n.createElement(f,s({ref:e},u))}));function f(t,e){var r=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var o=r.length,s=new Array(o);s[0]=d;var p={};for(var i in e)hasOwnProperty.call(e,i)&&(p[i]=e[i]);p.originalType=t,p[c]="string"==typeof t?t:a,s[1]=p;for(var l=2;l<o;l++)s[l]=r[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},5305:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>i,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={},s="restartServer",p={unversionedId:"api/status/update",id:"version-1.x.x/api/status/update",title:"restartServer",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/status/update.md",sourceDirName:"api/status",slug:"/api/status/update",permalink:"/docs/1.x.x/api/status/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"},next:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"}},i={},l=[],u={toc:l},c="wrapper";function m(t){let{components:e,...r}=t;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"restartserver"},"restartServer"),(0,a.kt)("p",null,"This method returns information about the server."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/system/status/{status}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"status"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"This accepts either ",(0,a.kt)("inlineCode",{parentName:"td"},"down")," or ",(0,a.kt)("inlineCode",{parentName:"td"},"restarting")," parameters")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"now"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"boolean"),(0,a.kt)("td",{parentName:"tr",align:"left"},"If set to ",(0,a.kt)("inlineCode",{parentName:"td"},"true")," it will not wait for current calls to finish")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method causes the server to change its status."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/system/status/reload\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Request sent to server"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7df8ae3f.46854fda.js b/assets/js/7df8ae3f.46854fda.js new file mode 100644 index 000000000..a6bb36f31 --- /dev/null +++ b/assets/js/7df8ae3f.46854fda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2405],{5312:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=s(4848),r=s(8453);const i={},d="restartServer",o={id:"api/status/update",title:"restartServer",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/status/update.md",sourceDirName:"api/status",slug:"/api/status/update",permalink:"/docs/1.x.x/api/status/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"},next:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"}},l={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"restartserver",children:"restartServer"}),"\n",(0,n.jsx)(t.p,{children:"This method returns information about the server."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/system/status/{status}"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"POST"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"status"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:["This accepts either ",(0,n.jsx)(t.code,{children:"down"})," or ",(0,n.jsx)(t.code,{children:"restarting"})," parameters"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"now"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"boolean"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:["If set to ",(0,n.jsx)(t.code,{children:"true"})," it will not wait for current calls to finish"]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method causes the server to change its status."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/system/status/reload\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Request sent to server"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>o});var n=s(6540);const r={},i=n.createContext(r);function d(e){const t=n.useContext(i);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(r):e.components||r:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7efb1a82.15e4652c.js b/assets/js/7efb1a82.15e4652c.js new file mode 100644 index 000000000..25490dbcd --- /dev/null +++ b/assets/js/7efb1a82.15e4652c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[767],{9586:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var n=r(4848),s=r(8453);const o={},i="Numbers",d={id:"configuration/numbers",title:"Numbers",description:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.",source:"@site/versioned_docs/version-1.x.x/configuration/numbers.md",sourceDirName:"configuration",slug:"/configuration/numbers",permalink:"/docs/1.x.x/configuration/numbers",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/numbers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"General",permalink:"/docs/1.x.x/configuration/general"},next:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"}},c={},l=[{value:"Number Resource",id:"number-resource",level:2},{value:"Example",id:"example",level:2}];function a(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"numbers",children:"Numbers"}),"\n",(0,n.jsx)(t.p,{children:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways."}),"\n",(0,n.jsxs)(t.p,{children:["The Numbers configuration can be provided using the file ",(0,n.jsx)(t.code,{children:"config/numbers.yml"})," located at the root of your Routr installation."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"number-resource",children:"Number Resource"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"apiVersion"}),(0,n.jsx)(t.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"kind"}),(0,n.jsx)(t.td,{children:"Defines the type of resource"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.ref"}),(0,n.jsx)(t.td,{children:"Reference to this resource"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.gwRef"}),(0,n.jsx)(t.td,{children:"Reference to parent Gateway"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.city"}),(0,n.jsx)(t.td,{children:"City of the Number"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.country"}),(0,n.jsx)(t.td,{children:"Country of the Number"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.countryISOCode"}),(0,n.jsx)(t.td,{children:"The Country ISO code for the Number (i.e., US)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"spec.location.telUrl"}),(0,n.jsx)(t.td,{children:"Number URI available in the location server"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"spec.location.aorLink"}),(0,n.jsx)(t.td,{children:"Address of record of SIP device for call routing"}),(0,n.jsx)(t.td,{children:"Yes"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n ref: Number0001\n gwRef: GW0001\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local'\n"})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>d});var n=r(6540);const s={},o=n.createContext(s);function i(e){const t=n.useContext(o);return n.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(s):e.components||s:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7efb1a82.be8d2fd2.js b/assets/js/7efb1a82.be8d2fd2.js deleted file mode 100644 index 1a766e625..000000000 --- a/assets/js/7efb1a82.be8d2fd2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[433],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,f=c["".concat(u,".").concat(d)]||c[d]||s[d]||o;return r?n.createElement(f,l(l({ref:t},m),{},{components:r})):n.createElement(f,l({ref:t},m))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var p=2;p<o;p++)l[p]=r[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},9940:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={},l="Numbers",i={unversionedId:"configuration/numbers",id:"version-1.x.x/configuration/numbers",title:"Numbers",description:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.",source:"@site/versioned_docs/version-1.x.x/configuration/numbers.md",sourceDirName:"configuration",slug:"/configuration/numbers",permalink:"/docs/1.x.x/configuration/numbers",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/numbers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"General",permalink:"/docs/1.x.x/configuration/general"},next:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"}},u={},p=[{value:"Number Resource",id:"number-resource",level:2},{value:"Example",id:"example",level:2}],m={toc:p},c="wrapper";function s(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"numbers"},"Numbers"),(0,a.kt)("p",null,"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways."),(0,a.kt)("p",null,"The Numbers configuration can be provided using the file ",(0,a.kt)("inlineCode",{parentName:"p"},"config/numbers.yml")," located at the root of your Routr installation."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"If using Redis this configuration gets stored in the database.")),(0,a.kt)("h2",{id:"number-resource"},"Number Resource"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,a.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"kind"),(0,a.kt)("td",{parentName:"tr",align:null},"Defines the type of resource"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.ref"),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to this resource"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.gwRef"),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to parent Gateway"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.geoInfo.city"),(0,a.kt)("td",{parentName:"tr",align:null},"City of the Number"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.geoInfo.country"),(0,a.kt)("td",{parentName:"tr",align:null},"Country of the Number"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.geoInfo.countryISOCode"),(0,a.kt)("td",{parentName:"tr",align:null},"The Country ISO code for the Number (i.e., US)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.location.telUrl"),(0,a.kt)("td",{parentName:"tr",align:null},"Number URI available in the location server"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.location.aorLink"),(0,a.kt)("td",{parentName:"tr",align:null},"Address of record of SIP device for call routing"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Number\n metadata:\n ref: Number0001\n gwRef: GW0001\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local'\n")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/81e5f1d0.3eed5d07.js b/assets/js/81e5f1d0.3eed5d07.js deleted file mode 100644 index 5df7da302..000000000 --- a/assets/js/81e5f1d0.3eed5d07.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7279],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,g=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(g,l(l({ref:t},u),{},{components:n})):r.createElement(g,l({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},1239:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={},l="Domains",i={unversionedId:"configuration/domains",id:"version-1.x.x/configuration/domains",title:"Domains",description:"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and",source:"@site/versioned_docs/version-1.x.x/configuration/domains.md",sourceDirName:"configuration",slug:"/configuration/domains",permalink:"/docs/1.x.x/configuration/domains",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/domains.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"},next:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"}},s={},c=[{value:"Domain Resource",id:"domain-resource",level:2},{value:"Example",id:"example",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"domains"},"Domains"),(0,a.kt)("p",null,"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and\noutgoing calling. The domains configuration can be provided using the file ",(0,a.kt)("inlineCode",{parentName:"p"},"config/domains.yml")," located at the root of your Routr installation."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"If using Redis this configuration gets stored in the database.")),(0,a.kt)("h2",{id:"domain-resource"},"Domain Resource"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,a.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"kind"),(0,a.kt)("td",{parentName:"tr",align:null},"Defines the type of resource"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.name"),(0,a.kt)("td",{parentName:"tr",align:null},"Friendly name for the SIP domain"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.context.domainUri"),(0,a.kt)("td",{parentName:"tr",align:null},"Domain URI. FQDN is recommended"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.context.egressPolicy.rule"),(0,a.kt)("td",{parentName:"tr",align:null},"Regular expression indicating when a call will be routed via ",(0,a.kt)("inlineCode",{parentName:"td"},"spec.context.egressPolicy.numberRef")),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.context.egressPolicy.numberRef"),(0,a.kt)("td",{parentName:"tr",align:null},"Reference to the Number that will route the call"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.context.accessControlList.allow","[*]"),(0,a.kt)("td",{parentName:"tr",align:null},"Traffic allow for Network in list"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.context.accessControlList.deny","[*]"),(0,a.kt)("td",{parentName:"tr",align:null},"Traffic disabled for Network in list"),(0,a.kt)("td",{parentName:"tr",align:null},"No")))),(0,a.kt)("p",null,"ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"0.0.0.0/1 # all"),(0,a.kt)("li",{parentName:"ul"},"192.168.1.0/255.255.255.0"),(0,a.kt)("li",{parentName:"ul"},"192.168.0.1/31")),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Server\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: Number0001\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/81e5f1d0.d7a2877e.js b/assets/js/81e5f1d0.d7a2877e.js new file mode 100644 index 000000000..dd7490ad0 --- /dev/null +++ b/assets/js/81e5f1d0.d7a2877e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9583],{4053:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var i=t(4848),s=t(8453);const r={},o="Domains",d={id:"configuration/domains",title:"Domains",description:"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and",source:"@site/versioned_docs/version-1.x.x/configuration/domains.md",sourceDirName:"configuration",slug:"/configuration/domains",permalink:"/docs/1.x.x/configuration/domains",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/domains.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"},next:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"}},c={},l=[{value:"Domain Resource",id:"domain-resource",level:2},{value:"Example",id:"example",level:2}];function a(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"domains",children:"Domains"}),"\n",(0,i.jsxs)(n.p,{children:["Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and\noutgoing calling. The domains configuration can be provided using the file ",(0,i.jsx)(n.code,{children:"config/domains.yml"})," located at the root of your Routr installation."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"domain-resource",children:"Domain Resource"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"apiVersion"}),(0,i.jsx)(n.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"kind"}),(0,i.jsx)(n.td,{children:"Defines the type of resource"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"metadata.name"}),(0,i.jsx)(n.td,{children:"Friendly name for the SIP domain"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.domainUri"}),(0,i.jsx)(n.td,{children:"Domain URI. FQDN is recommended"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.egressPolicy.rule"}),(0,i.jsxs)(n.td,{children:["Regular expression indicating when a call will be routed via ",(0,i.jsx)(n.code,{children:"spec.context.egressPolicy.numberRef"})]}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.egressPolicy.numberRef"}),(0,i.jsx)(n.td,{children:"Reference to the Number that will route the call"}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.accessControlList.allow[*]"}),(0,i.jsx)(n.td,{children:"Traffic allow for Network in list"}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.accessControlList.deny[*]"}),(0,i.jsx)(n.td,{children:"Traffic disabled for Network in list"}),(0,i.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0.0.0.0/1 # all"}),"\n",(0,i.jsx)(n.li,{children:"192.168.1.0/255.255.255.0"}),"\n",(0,i.jsx)(n.li,{children:"192.168.0.1/31"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Server\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: Number0001\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n"})})]})}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,t)=>{t.d(n,{R:()=>o,x:()=>d});var i=t(6540);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.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:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8613bfde.82349e8a.js b/assets/js/8613bfde.82349e8a.js new file mode 100644 index 000000000..4afc2e544 --- /dev/null +++ b/assets/js/8613bfde.82349e8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3296],{7499:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});var s=t(4848),r=t(8453);const o={},l="Sending Call Events to NATS",i={id:"connect/sending-call-events-to-nats",title:"Sending Call Events to NATS",description:"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:",source:"@site/docs/connect/sending-call-events-to-nats.md",sourceDirName:"connect",slug:"/connect/sending-call-events-to-nats",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/sending-call-events-to-nats.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"},next:{title:"Community",permalink:"/docs/2.0.0/community"}},c={},a=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"sending-call-events-to-nats",children:"Sending Call Events to NATS"}),"\n",(0,s.jsxs)(n.p,{children:["Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_ENABLED"})," to ",(0,s.jsx)(n.code,{children:"true"})," as well as the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_URL"})," to the URL of your NATS server. For example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "3"\nservices:\n routr:\n image: fonoster/routr-one:latest\n ports:\n - 51908:51908\n - 5060:5060/udp\n environment:\n - NATS_PUBLISHER_ENABLED=true\n - NATS_PUBLISHER_URL=nats:4222\n'})}),"\n",(0,s.jsx)(n.p,{children:"Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events.\nAs of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added."}),"\n",(0,s.jsx)(n.p,{children:"To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'nats context add nats \\\n --server demo.nats.io:4222 \\\n --description "nats events" \\\n --select\n'})}),"\n",(0,s.jsx)(n.p,{children:"You should then see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS context add",src:t(2774).A+"",width:"880",height:"430"})}),"\n",(0,s.jsxs)(n.p,{children:["In the previous command, we connected to the ",(0,s.jsx)(n.code,{children:"demo.nats.io"})," server, which is a public NATS server. You can use your own NATS server if you have one."]}),"\n",(0,s.jsxs)(n.p,{children:["Then, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.call.started"})," subject by running the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.started\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.started"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"from"}),": The caller's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"to"}),": The callee's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"startTime"}),": The time the call started formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Every header startarting with ",(0,s.jsx)(n.code,{children:"X-"})," is considered an extra header. For example, if you send a call with the following headers:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"X-My-Header: my-value\nX-Another-Header: another-value\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Then, the ",(0,s.jsx)(n.code,{children:"extraHeaders"})," field will contain the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "X-My-Header": "my-value",\n "X-Another-Header": "another-value"\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"After subscribing to the subject and making a call, you should see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS call started",src:t(2112).A+"",width:"880",height:"430"})}),"\n",(0,s.jsx)(n.p,{children:"Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.ended\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.ended"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"endTime"}),": The time the call ended formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"hangupCause"}),": The reason the call ended"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/edgeport/src/main/java/io/routr/HangupCauses.java",children:"HangupCause.java"})," class for a list of possible hangup causes."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Lastly, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," subject to receive endpoint registered events."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.endpoint.registered\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"aor"}),": The address of record of the endpoint"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"registeredAt"}),": The time the endpoint registered formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"expires"}),": The time in seconds the endpoint will remain registered"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_SUBJECT"})," environment variable to change the based subject name. For example, you can set it to ",(0,s.jsx)(n.code,{children:"myserver"})," to receive call events in the ",(0,s.jsx)(n.code,{children:"myserver.calls.started"})," subject."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2774:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-context-add-nats-7fe6194a7f1fbc08702107ea126c85fd.png"},2112:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-sub-routr-call-started-c75ef439e4a47b8697930de27b57552b.png"},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function l(e){const n=s.useContext(o);return s.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:l(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8613bfde.f3db3df3.js b/assets/js/8613bfde.f3db3df3.js deleted file mode 100644 index 246af81c6..000000000 --- a/assets/js/8613bfde.f3db3df3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5464],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,h=d["".concat(s,".").concat(m)]||d[m]||p[m]||l;return n?a.createElement(h,o(o({ref:t},u),{},{components:n})):a.createElement(h,o({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c<l;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},7549:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const l={},o="Sending Call Events to NATS",i={unversionedId:"connect/sending-call-events-to-nats",id:"connect/sending-call-events-to-nats",title:"Sending Call Events to NATS",description:"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:",source:"@site/docs/connect/sending-call-events-to-nats.md",sourceDirName:"connect",slug:"/connect/sending-call-events-to-nats",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/sending-call-events-to-nats.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"},next:{title:"Community",permalink:"/docs/2.0.0/community"}},s={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...l}=e;return(0,r.kt)(d,(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"sending-call-events-to-nats"},"Sending Call Events to NATS"),(0,r.kt)("p",null,"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable ",(0,r.kt)("inlineCode",{parentName:"p"},"NATS_PUBLISHER_ENABLED")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"true")," as well as the environment variable ",(0,r.kt)("inlineCode",{parentName:"p"},"NATS_PUBLISHER_URL")," to the URL of your NATS server. For example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'version: "3"\nservices:\n routr:\n image: fonoster/routr-one:latest\n ports:\n - 51908:51908\n - 5060:5060/udp\n environment:\n - NATS_PUBLISHER_ENABLED=true\n - NATS_PUBLISHER_URL=nats:4222\n')),(0,r.kt)("p",null,"Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events.\nAs of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added."),(0,r.kt)("p",null,"To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'nats context add nats \\\n --server demo.nats.io:4222 \\\n --description "nats events" \\\n --select\n')),(0,r.kt)("p",null,"You should then see something like this:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"NATS context add",src:n(3064).Z,width:"880",height:"430"})),(0,r.kt)("p",null,"In the previous command, we connected to the ",(0,r.kt)("inlineCode",{parentName:"p"},"demo.nats.io")," server, which is a public NATS server. You can use your own NATS server if you have one."),(0,r.kt)("p",null,"Then, you can subscribe to the ",(0,r.kt)("inlineCode",{parentName:"p"},"routr.call.started")," subject by running the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"nats sub routr.call.started\n")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"routr.call.started")," event contains the following fields:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"callId"),": The unique identifier of the call"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"from"),": The caller's phone number"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"to"),": The callee's phone number"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"startTime"),": The time the call started formatted as an ISO 8601 string"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"extraHeaders"),": Any extra headers that were sent with the call ")),(0,r.kt)("p",null,"Every header startarting with ",(0,r.kt)("inlineCode",{parentName:"p"},"X-")," is considered an extra header. For example, if you send a call with the following headers:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"X-My-Header: my-value\nX-Another-Header: another-value\n")),(0,r.kt)("p",null,"Then, the ",(0,r.kt)("inlineCode",{parentName:"p"},"extraHeaders")," field will contain the following:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "X-My-Header": "my-value",\n "X-Another-Header": "another-value"\n}\n')),(0,r.kt)("p",null,"After subscribing to the subject and making a call, you should see something like this:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"NATS call started",src:n(873).Z,width:"880",height:"430"})),(0,r.kt)("p",null,"Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"nats sub routr.call.ended\n")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"routr.call.ended")," event contains the following fields:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"callId"),": The unique identifier of the call"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"endTime"),": The time the call ended formatted as an ISO 8601 string"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"hangupCause"),": The reason the call ended"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"extraHeaders"),": Any extra headers that were sent with the call")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Please see the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/edgeport/src/main/java/io/routr/HangupCauses.java"},"HangupCause.java")," class for a list of possible hangup causes.")),(0,r.kt)("p",null,"Lastly, you can subscribe to the ",(0,r.kt)("inlineCode",{parentName:"p"},"routr.endpoint.registered")," subject to receive endpoint registered events. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"nats sub routr.endpoint.registered\n")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"routr.endpoint.registered")," event contains the following fields:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"aor"),": The address of record of the endpoint"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"registeredAt"),": The time the endpoint registered formatted as an ISO 8601 string"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"expires"),": The time in seconds the endpoint will remain registered"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"extraHeaders"),": Any extra headers that were sent with the call")),(0,r.kt)("p",null,"You can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"NATS_PUBLISHER_SUBJECT")," environment variable to change the based subject name. For example, you can set it to ",(0,r.kt)("inlineCode",{parentName:"p"},"myserver")," to receive call events in the ",(0,r.kt)("inlineCode",{parentName:"p"},"myserver.calls.started")," subject."))}p.isMDXComponent=!0},3064:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/nats-context-add-nats-7fe6194a7f1fbc08702107ea126c85fd.png"},873:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/nats-sub-routr-call-started-c75ef439e4a47b8697930de27b57552b.png"}}]); \ No newline at end of file diff --git a/assets/js/876e022a.bfbee56b.js b/assets/js/876e022a.bfbee56b.js deleted file mode 100644 index 09ce4aa72..000000000 --- a/assets/js/876e022a.bfbee56b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5664],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>g});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=p(a),m=r,g=c["".concat(s,".").concat(m)]||c[m]||u[m]||i;return a?n.createElement(g,o(o({ref:t},d),{},{components:a})):n.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},6163:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=a(7462),r=(a(7294),a(3905));const i={},o="Gateways",l={unversionedId:"configuration/gateways",id:"version-1.x.x/configuration/gateways",title:"Gateways",description:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.",source:"@site/versioned_docs/version-1.x.x/configuration/gateways.md",sourceDirName:"configuration",slug:"/configuration/gateways",permalink:"/docs/1.x.x/configuration/gateways",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/gateways.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"},next:{title:"General",permalink:"/docs/1.x.x/configuration/general"}},s={},p=[{value:"Gateway Resource",id:"gateway-resource",level:2},{value:"Example of Gateway in <code>Registration Mode</code>",id:"example-of-gateway-in-registration-mode",level:2},{value:"Example if Gateway using <code>Static Mode</code>",id:"example-if-gateway-using-static-mode",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"gateways"},"Gateways"),(0,r.kt)("p",null,"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN."),(0,r.kt)("p",null,"The Gateways configuration can be provided using the file ",(0,r.kt)("inlineCode",{parentName:"p"},"config/gateways.yml"),". The file is located at the root of your Routr installation, or as defined in the environment variable ",(0,r.kt)("inlineCode",{parentName:"p"},"CONFIG_FILE.")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"If using Redis this configuration gets stored in the database.")),(0,r.kt)("p",null,"For static IP authentication be sure to properly configure the ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.externAddr")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.localnets")," in ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml"),"."),(0,r.kt)("h2",{id:"gateway-resource"},"Gateway Resource"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Property"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Required"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,r.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"kind"),(0,r.kt)("td",{parentName:"tr",align:null},"Defines the type of resource"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"metadata.name"),(0,r.kt)("td",{parentName:"tr",align:null},"Friendly name for the SIP device"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"metadata.ref"),(0,r.kt)("td",{parentName:"tr",align:null},"Reference to this resource"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.sendRegister"),(0,r.kt)("td",{parentName:"tr",align:null},"Send SIP REGISTER package to gateway host. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.credentials.username"),(0,r.kt)("td",{parentName:"tr",align:null},"Gateway username. No required for static IP authentication"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.credentials.secret"),(0,r.kt)("td",{parentName:"tr",align:null},"Gateway secret. No required for static IP authentication"),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.host"),(0,r.kt)("td",{parentName:"tr",align:null},"Gateway host"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.transport"),(0,r.kt)("td",{parentName:"tr",align:null},"Transport protocol"),(0,r.kt)("td",{parentName:"tr",align:null},"Yes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.expires"),(0,r.kt)("td",{parentName:"tr",align:null},"Requested lifespan of the registration in seconds. Defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"600")),(0,r.kt)("td",{parentName:"tr",align:null},"No")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"spec.registries.","[*]"),(0,r.kt)("td",{parentName:"tr",align:null},"Additional registries for ingress calls"),(0,r.kt)("td",{parentName:"tr",align:null},"No")))),(0,r.kt)("h2",{id:"example-of-gateway-in-registration-mode"},"Example of Gateway in ",(0,r.kt)("inlineCode",{parentName:"h2"},"Registration Mode")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider, Inc\n ref: GW0001\n spec:\n host: sip.provider.com\n transport: tcp\n credentials:\n username: 'user'\n secret: changeit\n")),(0,r.kt)("h2",{id:"example-if-gateway-using-static-mode"},"Example if Gateway using ",(0,r.kt)("inlineCode",{parentName:"h2"},"Static Mode")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider 2, Inc\n ref: GW0002\n spec:\n host: sip2.provider.com\n port: 5080\n transport: tcp\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/876e022a.fec538fd.js b/assets/js/876e022a.fec538fd.js new file mode 100644 index 000000000..0185a71c1 --- /dev/null +++ b/assets/js/876e022a.fec538fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1214],{2481:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=n(4848),r=n(8453);const i={},d="Gateways",a={id:"configuration/gateways",title:"Gateways",description:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.",source:"@site/versioned_docs/version-1.x.x/configuration/gateways.md",sourceDirName:"configuration",slug:"/configuration/gateways",permalink:"/docs/1.x.x/configuration/gateways",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/gateways.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"},next:{title:"General",permalink:"/docs/1.x.x/configuration/general"}},o={},c=[{value:"Gateway Resource",id:"gateway-resource",level:2},{value:"Example of Gateway in <code>Registration Mode</code>",id:"example-of-gateway-in-registration-mode",level:2},{value:"Example if Gateway using <code>Static Mode</code>",id:"example-if-gateway-using-static-mode",level:2}];function l(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"gateways",children:"Gateways"}),"\n",(0,s.jsx)(t.p,{children:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN."}),"\n",(0,s.jsxs)(t.p,{children:["The Gateways configuration can be provided using the file ",(0,s.jsx)(t.code,{children:"config/gateways.yml"}),". The file is located at the root of your Routr installation, or as defined in the environment variable ",(0,s.jsx)(t.code,{children:"CONFIG_FILE."})]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For static IP authentication be sure to properly configure the ",(0,s.jsx)(t.code,{children:"spec.externAddr"})," and ",(0,s.jsx)(t.code,{children:"spec.localnets"})," in ",(0,s.jsx)(t.code,{children:"config.yml"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"gateway-resource",children:"Gateway Resource"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Property"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Required"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"apiVersion"}),(0,s.jsx)(t.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"kind"}),(0,s.jsx)(t.td,{children:"Defines the type of resource"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"metadata.name"}),(0,s.jsx)(t.td,{children:"Friendly name for the SIP device"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"metadata.ref"}),(0,s.jsx)(t.td,{children:"Reference to this resource"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.sendRegister"}),(0,s.jsxs)(t.td,{children:["Send SIP REGISTER package to gateway host. Defaults to ",(0,s.jsx)(t.code,{children:"false"})]}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.credentials.username"}),(0,s.jsx)(t.td,{children:"Gateway username. No required for static IP authentication"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.credentials.secret"}),(0,s.jsx)(t.td,{children:"Gateway secret. No required for static IP authentication"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.host"}),(0,s.jsx)(t.td,{children:"Gateway host"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.transport"}),(0,s.jsx)(t.td,{children:"Transport protocol"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.expires"}),(0,s.jsxs)(t.td,{children:["Requested lifespan of the registration in seconds. Defaults to ",(0,s.jsx)(t.code,{children:"600"})]}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.registries.[*]"}),(0,s.jsx)(t.td,{children:"Additional registries for ingress calls"}),(0,s.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,s.jsxs)(t.h2,{id:"example-of-gateway-in-registration-mode",children:["Example of Gateway in ",(0,s.jsx)(t.code,{children:"Registration Mode"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider, Inc\n ref: GW0001\n spec:\n host: sip.provider.com\n transport: tcp\n credentials:\n username: 'user'\n secret: changeit\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"example-if-gateway-using-static-mode",children:["Example if Gateway using ",(0,s.jsx)(t.code,{children:"Static Mode"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider 2, Inc\n ref: GW0002\n spec:\n host: sip2.provider.com\n port: 5080\n transport: tcp\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>a});var s=n(6540);const r={},i=s.createContext(r);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8894.92d1342d.js b/assets/js/8913.0805a9ae.js similarity index 55% rename from assets/js/8894.92d1342d.js rename to assets/js/8913.0805a9ae.js index 1df35a349..00e3bb783 100644 --- a/assets/js/8894.92d1342d.js +++ b/assets/js/8913.0805a9ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8894],{8894:(s,r,u)=>{u.r(r)}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8913],{8913:(s,r,u)=>{u.r(r)}}]); \ No newline at end of file diff --git a/assets/js/8a9effda.5b2b876e.js b/assets/js/8a9effda.5b2b876e.js new file mode 100644 index 000000000..09f91ef24 --- /dev/null +++ b/assets/js/8a9effda.5b2b876e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3741],{8662:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>a});var s=n(4848),i=n(8453);const r={},l="listDomains",o={id:"api/domains/list",title:"listDomains",description:"This method returns a list of Domain resources.",source:"@site/versioned_docs/version-1.x.x/api/domains/list.md",sourceDirName:"api/domains",slug:"/api/domains/list",permalink:"/docs/1.x.x/api/domains/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"},next:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"}},d={},a=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listdomains",children:"listDomains"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Domain resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Domain resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/domains\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Domain",\n \t"metadata": {\n \t\t"name": "Another Office",\n "ref": "dm6c87r2"\n \t},\n \t"spec": {\n \t\t"context": {\n \t\t\t"domainUri": "sip2.local"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.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:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a9effda.7535c462.js b/assets/js/8a9effda.7535c462.js deleted file mode 100644 index f4d46d0e8..000000000 --- a/assets/js/8a9effda.7535c462.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9092],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},m=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=p(n),d=a,f=u["".concat(s,".").concat(d)]||u[d]||c[d]||o;return n?r.createElement(f,i(i({ref:t},m),{},{components:n})):r.createElement(f,i({ref:t},m))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},4064:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={},i="listDomains",l={unversionedId:"api/domains/list",id:"version-1.x.x/api/domains/list",title:"listDomains",description:"This method returns a list of Domain resources.",source:"@site/versioned_docs/version-1.x.x/api/domains/list.md",sourceDirName:"api/domains",slug:"/api/domains/list",permalink:"/docs/1.x.x/api/domains/list",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"},next:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"}},s={},p=[],m={toc:p},u="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"listdomains"},"listDomains"),(0,a.kt)("p",null,"This method returns a list of Domain resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/domains")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"filter"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Use filter to narrow the elements shown")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,"Note: The filter parameter uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/json-path/JsonPath"},"JsonPath")," format"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a list of Domain resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/domains\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n "apiVersion": "v1beta1",\n "kind": "Domain",\n "metadata": {\n "name": "Another Office",\n "ref": "dm6c87r2"\n },\n "spec": {\n "context": {\n "domainUri": "sip2.local"\n }\n }\n }]\n}\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8ac6f1f4.56eaa81a.js b/assets/js/8ac6f1f4.56eaa81a.js new file mode 100644 index 000000000..2a09f27be --- /dev/null +++ b/assets/js/8ac6f1f4.56eaa81a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[620],{7001:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const s={},a="Overview",c={id:"connect/nodesdk/overview",title:"Overview",description:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.",source:"@site/docs/connect/nodesdk/overview.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/overview",permalink:"/docs/2.0.0/connect/nodesdk/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"},next:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"}},i={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.p,{children:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server."}),"\n",(0,t.jsx)(n.p,{children:"This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server."}),"\n",(0,t.jsx)(n.p,{children:"The following example demonstrates how you can use the Node.js SDK to create a new Domain."}),"\n",(0,t.jsx)(n.p,{children:"To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK."}),"\n",(0,t.jsx)(n.p,{children:"Let\u2019s begin by creating a new project:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir my-project \ncd my-project \nnpm init -y\n"})}),"\n",(0,t.jsx)(n.p,{children:'The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings.\nNext, install the SDK width:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --save @routr/sdk\n"})}),"\n",(0,t.jsx)(n.p,{children:"The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:"}),"\n",(0,t.jsx)(n.p,{children:"Filename: index.js"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-javascript",children:'const SDK = require("@routr/sdk");\nconst domains = new SDK.Domains();\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3", \n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: { "key": "value" } \n};\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,t.jsx)(n.p,{children:"In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool."}),"\n",(0,t.jsx)(n.p,{children:"The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)"}),"\n",(0,t.jsx)(n.p,{children:"Now, go ahead and run the code:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"node index.js\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/sdk",children:"https://www.npmjs.com/package/@routr/sdk"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.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:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ac6f1f4.6c72da16.js b/assets/js/8ac6f1f4.6c72da16.js deleted file mode 100644 index b471a3c2b..000000000 --- a/assets/js/8ac6f1f4.6c72da16.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),i=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=i(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=i(n),m=o,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[d]="string"==typeof e?e:o,s[1]=c;for(var i=2;i<a;i++)s[i]=n[i];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6691:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>i});var r=n(7462),o=(n(7294),n(3905));const a={},s="Overview",c={unversionedId:"connect/nodesdk/overview",id:"connect/nodesdk/overview",title:"Overview",description:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.",source:"@site/docs/connect/nodesdk/overview.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/overview",permalink:"/docs/2.0.0/connect/nodesdk/overview",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"},next:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"}},l={},i=[],u={toc:i},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server."),(0,o.kt)("p",null,"This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server."),(0,o.kt)("p",null,"The following example demonstrates how you can use the Node.js SDK to create a new Domain."),(0,o.kt)("p",null,"To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK."),(0,o.kt)("p",null,"Let\u2019s begin by creating a new project:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"mkdir my-project \ncd my-project \nnpm init -y\n")),(0,o.kt)("p",null,'The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings.\nNext, install the SDK width:'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm install --save @routr/sdk\n")),(0,o.kt)("p",null,"The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code: "),(0,o.kt)("p",null,"Filename: index.js"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-javascript"},'const SDK = require("@routr/sdk");\nconst domains = new SDK.Domains();\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3", \n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: { "key": "value" } \n};\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n')),(0,o.kt)("p",null,"In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool."),(0,o.kt)("p",null,"The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)"),(0,o.kt)("p",null,"Now, go ahead and run the code:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"node index.js\n")),(0,o.kt)("p",null,"If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at ",(0,o.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@routr/sdk"},"https://www.npmjs.com/package/@routr/sdk"),". "),(0,o.kt)("p",null,"Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"},"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d7e75fb.121f3c52.js b/assets/js/8d7e75fb.121f3c52.js deleted file mode 100644 index ab42f449a..000000000 --- a/assets/js/8d7e75fb.121f3c52.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1839],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function u(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),s=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=s(e.components);return o.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,l=u(e,["components","mdxType","originalType","parentName"]),d=s(r),h=n,f=d["".concat(c,".").concat(h)]||d[h]||p[h]||i;return r?o.createElement(f,a(a({ref:t},l),{},{components:r})):o.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=h;var u={};for(var c in t)hasOwnProperty.call(t,c)&&(u[c]=t[c]);u.originalType=e,u[d]="string"==typeof e?e:n,a[1]=u;for(var s=2;s<i;s++)a[s]=r[s];return o.createElement.apply(null,a)}return o.createElement.apply(null,r)}h.displayName="MDXCreateElement"},3507:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>u,toc:()=>s});var o=r(7462),n=(r(7294),r(3905));const i={id:"introduction",sidebar_label:"Introduction",hide_title:!0},a=void 0,u={unversionedId:"overview/introduction",id:"overview/introduction",title:"introduction",description:"Community banner",source:"@site/docs/overview/introduction.md",sourceDirName:"overview",slug:"/overview/introduction",permalink:"/docs/2.0.0/overview/introduction",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/introduction.md",tags:[],version:"current",frontMatter:{id:"introduction",sidebar_label:"Introduction",hide_title:!0},sidebar:"tutorialSidebar",next:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"}},c={},s=[{value:"Welcome",id:"welcome",level:2},{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Why Routr?",id:"why-routr",level:2},{value:"Who is Routr for?",id:"who-is-routr-for",level:2},{value:"What is the difference between Routr and other SIP servers?",id:"what-is-the-difference-between-routr-and-other-sip-servers",level:2}],l={toc:s},d="wrapper";function p(e){let{components:t,...i}=e;return(0,n.kt)(d,(0,o.Z)({},l,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("br",null),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Community banner",src:r(1334).Z,width:"1600",height:"400"})),(0,n.kt)("h2",{id:"welcome"},"Welcome"),(0,n.kt)("p",null,"On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs."),(0,n.kt)("h2",{id:"what-is-routr"},"What is Routr?"),(0,n.kt)("p",null,"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."),(0,n.kt)("h2",{id:"why-routr"},"Why Routr?"),(0,n.kt)("p",null,"At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr."),(0,n.kt)("p",null,"We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow."),(0,n.kt)("h2",{id:"who-is-routr-for"},"Who is Routr for?"),(0,n.kt)("p",null,"Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community."),(0,n.kt)("h2",{id:"what-is-the-difference-between-routr-and-other-sip-servers"},"What is the difference between Routr and other SIP servers?"),(0,n.kt)("p",null,"Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze."),(0,n.kt)("p",null,"We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality."))}p.isMDXComponent=!0},1334:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/community-8d918291304e0da9dc2ce1fa68832947.png"}}]); \ No newline at end of file diff --git a/assets/js/8d7e75fb.639e4c36.js b/assets/js/8d7e75fb.639e4c36.js new file mode 100644 index 000000000..75a24e20f --- /dev/null +++ b/assets/js/8d7e75fb.639e4c36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4719],{6102:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var r=o(4848),i=o(8453);const n={id:"introduction",sidebar_label:"Introduction",hide_title:!0},s=void 0,a={id:"overview/introduction",title:"introduction",description:"Community banner",source:"@site/docs/overview/introduction.md",sourceDirName:"overview",slug:"/overview/introduction",permalink:"/docs/2.0.0/overview/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/introduction.md",tags:[],version:"current",frontMatter:{id:"introduction",sidebar_label:"Introduction",hide_title:!0},sidebar:"tutorialSidebar",next:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"}},c={},d=[{value:"Welcome",id:"welcome",level:2},{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Why Routr?",id:"why-routr",level:2},{value:"Who is Routr for?",id:"who-is-routr-for",level:2},{value:"What is the difference between Routr and other SIP servers?",id:"what-is-the-difference-between-routr-and-other-sip-servers",level:2}];function u(e){const t={h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("br",{}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Community banner",src:o(496).A+"",width:"1600",height:"400"})}),"\n",(0,r.jsx)(t.h2,{id:"welcome",children:"Welcome"}),"\n",(0,r.jsx)(t.p,{children:"On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,r.jsx)(t.h2,{id:"why-routr",children:"Why Routr?"}),"\n",(0,r.jsx)(t.p,{children:"At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr."}),"\n",(0,r.jsx)(t.p,{children:"We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow."}),"\n",(0,r.jsx)(t.h2,{id:"who-is-routr-for",children:"Who is Routr for?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-the-difference-between-routr-and-other-sip-servers",children:"What is the difference between Routr and other SIP servers?"}),"\n",(0,r.jsx)(t.p,{children:"Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze."}),"\n",(0,r.jsx)(t.p,{children:"We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},496:(e,t,o)=>{o.d(t,{A:()=>r});const r=o.p+"assets/images/community-8d918291304e0da9dc2ce1fa68832947.png"},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var r=o(6540);const i={},n=r.createContext(i);function s(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8f5f22a9.a0d44d2a.js b/assets/js/8f5f22a9.a0d44d2a.js deleted file mode 100644 index d75ed8f73..000000000 --- a/assets/js/8f5f22a9.a0d44d2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3731],{2315:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"1.x.x","label":"1.x.x","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-1.x.x","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Welcome","href":"/docs/1.x.x/welcome","docId":"welcome"},{"type":"category","label":"Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/1.x.x/introduction/overview","docId":"introduction/overview"},{"type":"link","label":"Installation","href":"/docs/1.x.x/introduction/installation","docId":"introduction/installation"},{"type":"link","label":"Comparison","href":"/docs/1.x.x/introduction/comparison","docId":"introduction/comparison"},{"type":"link","label":"Community","href":"/docs/1.x.x/introduction/community","docId":"introduction/community"},{"type":"link","label":"Roadmap","href":"/docs/1.x.x/introduction/roadmap","docId":"introduction/roadmap"},{"type":"link","label":"FAQ","href":"/docs/1.x.x/introduction/faq","docId":"introduction/faq"},{"type":"link","label":"Glossary","href":"/docs/1.x.x/introduction/glossary","docId":"introduction/glossary"},{"type":"link","label":"Media","href":"/docs/1.x.x/introduction/media","docId":"introduction/media"},{"type":"link","label":"Routr 1.0RC3 - User Location Lookup Performance Tests","href":"/docs/1.x.x/introduction/performance-tests/user-location","docId":"introduction/performance-tests/user-location"},{"type":"link","label":"Test Plan","href":"/docs/1.x.x/introduction/test-plan","docId":"introduction/test-plan"}]},{"type":"link","label":"Concepts","href":"/docs/1.x.x/concepts","docId":"concepts"},{"type":"category","label":"Administration","items":[{"type":"link","label":"Cheatsheet","href":"/docs/1.x.x/administration/cli/cheatsheet","docId":"administration/cli/cheatsheet"},{"type":"link","label":"Installation","href":"/docs/1.x.x/administration/cli/installation","docId":"administration/cli/installation"},{"type":"link","label":"Remote Access","href":"/docs/1.x.x/administration/cli/remote-access","docId":"administration/cli/remote-access"},{"type":"link","label":"WebUI","href":"/docs/1.x.x/administration/webconsole","docId":"administration/webconsole"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Configuration","items":[{"type":"link","label":"Agents","href":"/docs/1.x.x/configuration/agents","docId":"configuration/agents"},{"type":"link","label":"Domains","href":"/docs/1.x.x/configuration/domains","docId":"configuration/domains"},{"type":"link","label":"Gateways","href":"/docs/1.x.x/configuration/gateways","docId":"configuration/gateways"},{"type":"link","label":"General","href":"/docs/1.x.x/configuration/general","docId":"configuration/general"},{"type":"link","label":"Numbers","href":"/docs/1.x.x/configuration/numbers","docId":"configuration/numbers"},{"type":"link","label":"Peers","href":"/docs/1.x.x/configuration/peers","docId":"configuration/peers"},{"type":"link","label":"Users","href":"/docs/1.x.x/configuration/users","docId":"configuration/users"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Guides","items":[{"type":"link","label":"Basic Setup","href":"/docs/1.x.x/guides/basic-setup","docId":"guides/basic-setup"},{"type":"link","label":"Routr as Asterisk frontend","href":"/docs/1.x.x/guides/routr-as-asterisk-frontend","docId":"guides/routr-as-asterisk-frontend"},{"type":"link","label":"Running on Kubernetes","href":"/docs/1.x.x/guides/running-on-kubernetes","docId":"guides/running-on-kubernetes"},{"type":"link","label":"Running with Docker","href":"/docs/1.x.x/guides/running-with-docker-or-compose","docId":"guides/running-with-docker-or-compose"},{"type":"link","label":"Securing the signaling path","href":"/docs/1.x.x/guides/securing-the-signaling-path","docId":"guides/securing-the-signaling-path"}],"collapsed":true,"collapsible":true},{"type":"category","label":"API Docs","items":[{"type":"link","label":"overview","href":"/docs/1.x.x/api/overview","docId":"api/overview"},{"type":"link","label":"createAgent","href":"/docs/1.x.x/api/agents/create","docId":"api/agents/create"},{"type":"link","label":"deleteAgent","href":"/docs/1.x.x/api/agents/delete","docId":"api/agents/delete"},{"type":"link","label":"getAgent","href":"/docs/1.x.x/api/agents/get","docId":"api/agents/get"},{"type":"link","label":"listAgents","href":"/docs/1.x.x/api/agents/list","docId":"api/agents/list"},{"type":"link","label":"updateAgent","href":"/docs/1.x.x/api/agents/update","docId":"api/agents/update"},{"type":"link","label":"getConfiguration","href":"/docs/1.x.x/api/config/get","docId":"api/config/get"},{"type":"link","label":"updateConfiguration","href":"/docs/1.x.x/api/config/update","docId":"api/config/update"},{"type":"link","label":"createDomain","href":"/docs/1.x.x/api/domains/create","docId":"api/domains/create"},{"type":"link","label":"deleteDomain","href":"/docs/1.x.x/api/domains/delete","docId":"api/domains/delete"},{"type":"link","label":"getDomain","href":"/docs/1.x.x/api/domains/get","docId":"api/domains/get"},{"type":"link","label":"listDomains","href":"/docs/1.x.x/api/domains/list","docId":"api/domains/list"},{"type":"link","label":"updateDomain","href":"/docs/1.x.x/api/domains/update","docId":"api/domains/update"},{"type":"link","label":"createGateway","href":"/docs/1.x.x/api/gateways/create","docId":"api/gateways/create"},{"type":"link","label":"deleteGateway","href":"/docs/1.x.x/api/gateways/delete","docId":"api/gateways/delete"},{"type":"link","label":"getGateway","href":"/docs/1.x.x/api/gateways/get","docId":"api/gateways/get"},{"type":"link","label":"listGateways","href":"/docs/1.x.x/api/gateways/list","docId":"api/gateways/list"},{"type":"link","label":"updateGateways","href":"/docs/1.x.x/api/gateways/update","docId":"api/gateways/update"},{"type":"link","label":"addEndpoint","href":"/docs/1.x.x/api/location/create","docId":"api/location/create"},{"type":"link","label":"evictEndpoint","href":"/docs/1.x.x/api/location/delete","docId":"api/location/delete"},{"type":"link","label":"listEndpoints","href":"/docs/1.x.x/api/location/list","docId":"api/location/list"},{"type":"link","label":"createNumber","href":"/docs/1.x.x/api/numbers/create","docId":"api/numbers/create"},{"type":"link","label":"deleteNumber","href":"/docs/1.x.x/api/numbers/delete","docId":"api/numbers/delete"},{"type":"link","label":"getNumber","href":"/docs/1.x.x/api/numbers/get","docId":"api/numbers/get"},{"type":"link","label":"listNumbers","href":"/docs/1.x.x/api/numbers/list","docId":"api/numbers/list"},{"type":"link","label":"updateNumber","href":"/docs/1.x.x/api/numbers/update","docId":"api/numbers/update"},{"type":"link","label":"createPeer","href":"/docs/1.x.x/api/peers/create","docId":"api/peers/create"},{"type":"link","label":"deletePeer","href":"/docs/1.x.x/api/peers/delete","docId":"api/peers/delete"},{"type":"link","label":"getPeer","href":"/docs/1.x.x/api/peers/get","docId":"api/peers/get"},{"type":"link","label":"listPeers","href":"/docs/1.x.x/api/peers/list","docId":"api/peers/list"},{"type":"link","label":"updatePeer","href":"/docs/1.x.x/api/peers/update","docId":"api/peers/update"},{"type":"link","label":"registry","href":"/docs/1.x.x/api/registry","docId":"api/registry"},{"type":"link","label":"checkSystemStatus","href":"/docs/1.x.x/api/status/get","docId":"api/status/get"},{"type":"link","label":"restartServer","href":"/docs/1.x.x/api/status/update","docId":"api/status/update"},{"type":"link","label":"getServerInfo","href":"/docs/1.x.x/api/sys/info","docId":"api/sys/info"},{"type":"link","label":"getServerLogs","href":"/docs/1.x.x/api/sys/logs","docId":"api/sys/logs"},{"type":"link","label":"token","href":"/docs/1.x.x/api/token","docId":"api/token"}],"collapsed":true,"collapsible":true}]},"docs":{"administration/cli/cheatsheet":{"id":"administration/cli/cheatsheet","title":"Cheatsheet","description":"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.","sidebar":"tutorialSidebar"},"administration/cli/installation":{"id":"administration/cli/installation","title":"Installation","description":"To get the Routr Command-Line Tool run the following command:","sidebar":"tutorialSidebar"},"administration/cli/remote-access":{"id":"administration/cli/remote-access","title":"Remote Access","description":"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.","sidebar":"tutorialSidebar"},"administration/webconsole":{"id":"administration/webconsole","title":"WebUI","description":"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.","sidebar":"tutorialSidebar"},"api/agents/create":{"id":"api/agents/create","title":"createAgent","description":"Creates a new Agent resource. The Domain must exist before creating the Agent.","sidebar":"tutorialSidebar"},"api/agents/delete":{"id":"api/agents/delete","title":"deleteAgent","description":"Removes an Agent resource from a persistent database.","sidebar":"tutorialSidebar"},"api/agents/get":{"id":"api/agents/get","title":"getAgent","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/agents/list":{"id":"api/agents/list","title":"listAgents","description":"This method returns a list of Agent resources.","sidebar":"tutorialSidebar"},"api/agents/update":{"id":"api/agents/update","title":"updateAgent","description":"Updates an existing Agent resource.","sidebar":"tutorialSidebar"},"api/config/get":{"id":"api/config/get","title":"getConfiguration","description":"This method returns the servers\' configuration.","sidebar":"tutorialSidebar"},"api/config/update":{"id":"api/config/update","title":"updateConfiguration","description":"This method updates the servers\' configuration.","sidebar":"tutorialSidebar"},"api/domains/create":{"id":"api/domains/create","title":"createDomain","description":"Creates a new Domain resource.","sidebar":"tutorialSidebar"},"api/domains/delete":{"id":"api/domains/delete","title":"deleteDomain","description":"Removes a Domain resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/domains/get":{"id":"api/domains/get","title":"getDomain","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/domains/list":{"id":"api/domains/list","title":"listDomains","description":"This method returns a list of Domain resources.","sidebar":"tutorialSidebar"},"api/domains/update":{"id":"api/domains/update","title":"updateDomain","description":"Updates an existing Domain resource.","sidebar":"tutorialSidebar"},"api/gateways/create":{"id":"api/gateways/create","title":"createGateway","description":"Creates a new Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/delete":{"id":"api/gateways/delete","title":"deleteGateway","description":"Removes a Gateway resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/gateways/get":{"id":"api/gateways/get","title":"getGateway","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/list":{"id":"api/gateways/list","title":"listGateways","description":"This method returns a list of Gateways resources.","sidebar":"tutorialSidebar"},"api/gateways/update":{"id":"api/gateways/update","title":"updateGateways","description":"Updates an existing Gateway resource.","sidebar":"tutorialSidebar"},"api/location/create":{"id":"api/location/create","title":"addEndpoint","description":"Adds an entry into the location table","sidebar":"tutorialSidebar"},"api/location/delete":{"id":"api/location/delete","title":"evictEndpoint","description":"Evicts an entry from the location table","sidebar":"tutorialSidebar"},"api/location/list":{"id":"api/location/list","title":"listEndpoints","description":"Gets a list of registered devices.","sidebar":"tutorialSidebar"},"api/numbers/create":{"id":"api/numbers/create","title":"createNumber","description":"Creates a new Number. The Gateway must exist before creating the Number.","sidebar":"tutorialSidebar"},"api/numbers/delete":{"id":"api/numbers/delete","title":"deleteNumber","description":"Removes a Number from a persistent database.","sidebar":"tutorialSidebar"},"api/numbers/get":{"id":"api/numbers/get","title":"getNumber","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/numbers/list":{"id":"api/numbers/list","title":"listNumbers","description":"This method returns a list of Numbers.","sidebar":"tutorialSidebar"},"api/numbers/update":{"id":"api/numbers/update","title":"updateNumber","description":"Updates an existing Number.","sidebar":"tutorialSidebar"},"api/overview":{"id":"api/overview","title":"overview","description":"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.","sidebar":"tutorialSidebar"},"api/peers/create":{"id":"api/peers/create","title":"createPeer","description":"Creates a new Peer resource.","sidebar":"tutorialSidebar"},"api/peers/delete":{"id":"api/peers/delete","title":"deletePeer","description":"Removes a Peer resource from a persistent database.","sidebar":"tutorialSidebar"},"api/peers/get":{"id":"api/peers/get","title":"getPeer","description":"This method returns a Peer resource.","sidebar":"tutorialSidebar"},"api/peers/list":{"id":"api/peers/list","title":"listPeers","description":"This method returns a list of Peer resources.","sidebar":"tutorialSidebar"},"api/peers/update":{"id":"api/peers/update","title":"updatePeer","description":"Updates an existing Peer resource.","sidebar":"tutorialSidebar"},"api/registry":{"id":"api/registry","title":"registry","description":"This method gets a list of available(online) gateways.","sidebar":"tutorialSidebar"},"api/status/get":{"id":"api/status/get","title":"checkSystemStatus","description":"Pings an instance of Routr engine.","sidebar":"tutorialSidebar"},"api/status/update":{"id":"api/status/update","title":"restartServer","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/info":{"id":"api/sys/info","title":"getServerInfo","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/logs":{"id":"api/sys/logs","title":"getServerLogs","description":"This method returns logs from the server","sidebar":"tutorialSidebar"},"api/token":{"id":"api/token","title":"token","description":"This method gets a token for subsequent API calls.","sidebar":"tutorialSidebar"},"concepts":{"id":"concepts","title":"Concepts","description":"The following are some key concepts, including some of the essential routing strategies implemented in Routr.","sidebar":"tutorialSidebar"},"configuration/agents":{"id":"configuration/agents","title":"Agents","description":"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.","sidebar":"tutorialSidebar"},"configuration/domains":{"id":"configuration/domains","title":"Domains","description":"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and","sidebar":"tutorialSidebar"},"configuration/gateways":{"id":"configuration/gateways","title":"Gateways","description":"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.","sidebar":"tutorialSidebar"},"configuration/general":{"id":"configuration/general","title":"General","description":"The general configuration affects your entire Routr instance. The general configuration","sidebar":"tutorialSidebar"},"configuration/numbers":{"id":"configuration/numbers","title":"Numbers","description":"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.","sidebar":"tutorialSidebar"},"configuration/peers":{"id":"configuration/peers","title":"Peers","description":"Like Agents, Peers represent SIP endpoints such as Media Servers.","sidebar":"tutorialSidebar"},"configuration/users":{"id":"configuration/users","title":"Users","description":"Users exist in Routr to perform administrative actions on a Routr instance.","sidebar":"tutorialSidebar"},"guides/basic-setup":{"id":"guides/basic-setup","title":"Basic Setup","description":"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.","sidebar":"tutorialSidebar"},"guides/routr-as-asterisk-frontend":{"id":"guides/routr-as-asterisk-frontend","title":"Routr as Asterisk frontend","description":"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:","sidebar":"tutorialSidebar"},"guides/running-on-kubernetes":{"id":"guides/running-on-kubernetes","title":"Running on Kubernetes","description":"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.","sidebar":"tutorialSidebar"},"guides/running-with-docker-or-compose":{"id":"guides/running-with-docker-or-compose","title":"Running with Docker","description":"Please refer to Docker Hub for a detail guide on how to use Routr\'s docker image.","sidebar":"tutorialSidebar"},"guides/securing-the-signaling-path":{"id":"guides/securing-the-signaling-path","title":"Securing the signaling path","description":"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.","sidebar":"tutorialSidebar"},"introduction/community":{"id":"introduction/community","title":"Community","description":"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:","sidebar":"tutorialSidebar"},"introduction/comparison":{"id":"introduction/comparison","title":"Comparison","description":"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.","sidebar":"tutorialSidebar"},"introduction/faq":{"id":"introduction/faq","title":"FAQ","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/glossary":{"id":"introduction/glossary","title":"Glossary","description":"This following table features some essential concepts, including the different routing types implemented by the server.","sidebar":"tutorialSidebar"},"introduction/installation":{"id":"introduction/installation","title":"Installation","description":"Instant Server Installation with Snaps","sidebar":"tutorialSidebar"},"introduction/media":{"id":"introduction/media","title":"Media","description":"There is a subreddit collecting all Routr-related resources on the internet.","sidebar":"tutorialSidebar"},"introduction/overview":{"id":"introduction/overview","title":"Overview","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/performance-tests/user-location":{"id":"introduction/performance-tests/user-location","title":"Routr 1.0RC3 - User Location Lookup Performance Tests","description":"Author:","sidebar":"tutorialSidebar"},"introduction/roadmap":{"id":"introduction/roadmap","title":"Roadmap","description":"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.","sidebar":"tutorialSidebar"},"introduction/test-plan":{"id":"introduction/test-plan","title":"Test Plan","description":"DUT and Endpoints Configuration","sidebar":"tutorialSidebar"},"welcome":{"id":"welcome","title":"Welcome","description":"Use the left-hand to navigate to find topics of interest.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/8f5f22a9.b0c4d9ca.js b/assets/js/8f5f22a9.b0c4d9ca.js new file mode 100644 index 000000000..b30a96c75 --- /dev/null +++ b/assets/js/8f5f22a9.b0c4d9ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5362],{2556:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"1.x.x","label":"1.x.x","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-1.x.x","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Welcome","href":"/docs/1.x.x/welcome","docId":"welcome","unlisted":false},{"type":"category","label":"Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/1.x.x/introduction/overview","docId":"introduction/overview","unlisted":false},{"type":"link","label":"Installation","href":"/docs/1.x.x/introduction/installation","docId":"introduction/installation","unlisted":false},{"type":"link","label":"Comparison","href":"/docs/1.x.x/introduction/comparison","docId":"introduction/comparison","unlisted":false},{"type":"link","label":"Community","href":"/docs/1.x.x/introduction/community","docId":"introduction/community","unlisted":false},{"type":"link","label":"Roadmap","href":"/docs/1.x.x/introduction/roadmap","docId":"introduction/roadmap","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/1.x.x/introduction/faq","docId":"introduction/faq","unlisted":false},{"type":"link","label":"Glossary","href":"/docs/1.x.x/introduction/glossary","docId":"introduction/glossary","unlisted":false},{"type":"link","label":"Media","href":"/docs/1.x.x/introduction/media","docId":"introduction/media","unlisted":false},{"type":"link","label":"Routr 1.0RC3 - User Location Lookup Performance Tests","href":"/docs/1.x.x/introduction/performance-tests/user-location","docId":"introduction/performance-tests/user-location","unlisted":false},{"type":"link","label":"Test Plan","href":"/docs/1.x.x/introduction/test-plan","docId":"introduction/test-plan","unlisted":false}]},{"type":"link","label":"Concepts","href":"/docs/1.x.x/concepts","docId":"concepts","unlisted":false},{"type":"category","label":"Administration","items":[{"type":"link","label":"Cheatsheet","href":"/docs/1.x.x/administration/cli/cheatsheet","docId":"administration/cli/cheatsheet","unlisted":false},{"type":"link","label":"Installation","href":"/docs/1.x.x/administration/cli/installation","docId":"administration/cli/installation","unlisted":false},{"type":"link","label":"Remote Access","href":"/docs/1.x.x/administration/cli/remote-access","docId":"administration/cli/remote-access","unlisted":false},{"type":"link","label":"WebUI","href":"/docs/1.x.x/administration/webconsole","docId":"administration/webconsole","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Configuration","items":[{"type":"link","label":"Agents","href":"/docs/1.x.x/configuration/agents","docId":"configuration/agents","unlisted":false},{"type":"link","label":"Domains","href":"/docs/1.x.x/configuration/domains","docId":"configuration/domains","unlisted":false},{"type":"link","label":"Gateways","href":"/docs/1.x.x/configuration/gateways","docId":"configuration/gateways","unlisted":false},{"type":"link","label":"General","href":"/docs/1.x.x/configuration/general","docId":"configuration/general","unlisted":false},{"type":"link","label":"Numbers","href":"/docs/1.x.x/configuration/numbers","docId":"configuration/numbers","unlisted":false},{"type":"link","label":"Peers","href":"/docs/1.x.x/configuration/peers","docId":"configuration/peers","unlisted":false},{"type":"link","label":"Users","href":"/docs/1.x.x/configuration/users","docId":"configuration/users","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Guides","items":[{"type":"link","label":"Basic Setup","href":"/docs/1.x.x/guides/basic-setup","docId":"guides/basic-setup","unlisted":false},{"type":"link","label":"Routr as Asterisk frontend","href":"/docs/1.x.x/guides/routr-as-asterisk-frontend","docId":"guides/routr-as-asterisk-frontend","unlisted":false},{"type":"link","label":"Running on Kubernetes","href":"/docs/1.x.x/guides/running-on-kubernetes","docId":"guides/running-on-kubernetes","unlisted":false},{"type":"link","label":"Running with Docker","href":"/docs/1.x.x/guides/running-with-docker-or-compose","docId":"guides/running-with-docker-or-compose","unlisted":false},{"type":"link","label":"Securing the signaling path","href":"/docs/1.x.x/guides/securing-the-signaling-path","docId":"guides/securing-the-signaling-path","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"API Docs","items":[{"type":"link","label":"overview","href":"/docs/1.x.x/api/overview","docId":"api/overview","unlisted":false},{"type":"link","label":"createAgent","href":"/docs/1.x.x/api/agents/create","docId":"api/agents/create","unlisted":false},{"type":"link","label":"deleteAgent","href":"/docs/1.x.x/api/agents/delete","docId":"api/agents/delete","unlisted":false},{"type":"link","label":"getAgent","href":"/docs/1.x.x/api/agents/get","docId":"api/agents/get","unlisted":false},{"type":"link","label":"listAgents","href":"/docs/1.x.x/api/agents/list","docId":"api/agents/list","unlisted":false},{"type":"link","label":"updateAgent","href":"/docs/1.x.x/api/agents/update","docId":"api/agents/update","unlisted":false},{"type":"link","label":"getConfiguration","href":"/docs/1.x.x/api/config/get","docId":"api/config/get","unlisted":false},{"type":"link","label":"updateConfiguration","href":"/docs/1.x.x/api/config/update","docId":"api/config/update","unlisted":false},{"type":"link","label":"createDomain","href":"/docs/1.x.x/api/domains/create","docId":"api/domains/create","unlisted":false},{"type":"link","label":"deleteDomain","href":"/docs/1.x.x/api/domains/delete","docId":"api/domains/delete","unlisted":false},{"type":"link","label":"getDomain","href":"/docs/1.x.x/api/domains/get","docId":"api/domains/get","unlisted":false},{"type":"link","label":"listDomains","href":"/docs/1.x.x/api/domains/list","docId":"api/domains/list","unlisted":false},{"type":"link","label":"updateDomain","href":"/docs/1.x.x/api/domains/update","docId":"api/domains/update","unlisted":false},{"type":"link","label":"createGateway","href":"/docs/1.x.x/api/gateways/create","docId":"api/gateways/create","unlisted":false},{"type":"link","label":"deleteGateway","href":"/docs/1.x.x/api/gateways/delete","docId":"api/gateways/delete","unlisted":false},{"type":"link","label":"getGateway","href":"/docs/1.x.x/api/gateways/get","docId":"api/gateways/get","unlisted":false},{"type":"link","label":"listGateways","href":"/docs/1.x.x/api/gateways/list","docId":"api/gateways/list","unlisted":false},{"type":"link","label":"updateGateways","href":"/docs/1.x.x/api/gateways/update","docId":"api/gateways/update","unlisted":false},{"type":"link","label":"addEndpoint","href":"/docs/1.x.x/api/location/create","docId":"api/location/create","unlisted":false},{"type":"link","label":"evictEndpoint","href":"/docs/1.x.x/api/location/delete","docId":"api/location/delete","unlisted":false},{"type":"link","label":"listEndpoints","href":"/docs/1.x.x/api/location/list","docId":"api/location/list","unlisted":false},{"type":"link","label":"createNumber","href":"/docs/1.x.x/api/numbers/create","docId":"api/numbers/create","unlisted":false},{"type":"link","label":"deleteNumber","href":"/docs/1.x.x/api/numbers/delete","docId":"api/numbers/delete","unlisted":false},{"type":"link","label":"getNumber","href":"/docs/1.x.x/api/numbers/get","docId":"api/numbers/get","unlisted":false},{"type":"link","label":"listNumbers","href":"/docs/1.x.x/api/numbers/list","docId":"api/numbers/list","unlisted":false},{"type":"link","label":"updateNumber","href":"/docs/1.x.x/api/numbers/update","docId":"api/numbers/update","unlisted":false},{"type":"link","label":"createPeer","href":"/docs/1.x.x/api/peers/create","docId":"api/peers/create","unlisted":false},{"type":"link","label":"deletePeer","href":"/docs/1.x.x/api/peers/delete","docId":"api/peers/delete","unlisted":false},{"type":"link","label":"getPeer","href":"/docs/1.x.x/api/peers/get","docId":"api/peers/get","unlisted":false},{"type":"link","label":"listPeers","href":"/docs/1.x.x/api/peers/list","docId":"api/peers/list","unlisted":false},{"type":"link","label":"updatePeer","href":"/docs/1.x.x/api/peers/update","docId":"api/peers/update","unlisted":false},{"type":"link","label":"registry","href":"/docs/1.x.x/api/registry","docId":"api/registry","unlisted":false},{"type":"link","label":"checkSystemStatus","href":"/docs/1.x.x/api/status/get","docId":"api/status/get","unlisted":false},{"type":"link","label":"restartServer","href":"/docs/1.x.x/api/status/update","docId":"api/status/update","unlisted":false},{"type":"link","label":"getServerInfo","href":"/docs/1.x.x/api/sys/info","docId":"api/sys/info","unlisted":false},{"type":"link","label":"getServerLogs","href":"/docs/1.x.x/api/sys/logs","docId":"api/sys/logs","unlisted":false},{"type":"link","label":"token","href":"/docs/1.x.x/api/token","docId":"api/token","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"administration/cli/cheatsheet":{"id":"administration/cli/cheatsheet","title":"Cheatsheet","description":"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.","sidebar":"tutorialSidebar"},"administration/cli/installation":{"id":"administration/cli/installation","title":"Installation","description":"To get the Routr Command-Line Tool run the following command:","sidebar":"tutorialSidebar"},"administration/cli/remote-access":{"id":"administration/cli/remote-access","title":"Remote Access","description":"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.","sidebar":"tutorialSidebar"},"administration/webconsole":{"id":"administration/webconsole","title":"WebUI","description":"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.","sidebar":"tutorialSidebar"},"api/agents/create":{"id":"api/agents/create","title":"createAgent","description":"Creates a new Agent resource. The Domain must exist before creating the Agent.","sidebar":"tutorialSidebar"},"api/agents/delete":{"id":"api/agents/delete","title":"deleteAgent","description":"Removes an Agent resource from a persistent database.","sidebar":"tutorialSidebar"},"api/agents/get":{"id":"api/agents/get","title":"getAgent","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/agents/list":{"id":"api/agents/list","title":"listAgents","description":"This method returns a list of Agent resources.","sidebar":"tutorialSidebar"},"api/agents/update":{"id":"api/agents/update","title":"updateAgent","description":"Updates an existing Agent resource.","sidebar":"tutorialSidebar"},"api/config/get":{"id":"api/config/get","title":"getConfiguration","description":"This method returns the servers\' configuration.","sidebar":"tutorialSidebar"},"api/config/update":{"id":"api/config/update","title":"updateConfiguration","description":"This method updates the servers\' configuration.","sidebar":"tutorialSidebar"},"api/domains/create":{"id":"api/domains/create","title":"createDomain","description":"Creates a new Domain resource.","sidebar":"tutorialSidebar"},"api/domains/delete":{"id":"api/domains/delete","title":"deleteDomain","description":"Removes a Domain resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/domains/get":{"id":"api/domains/get","title":"getDomain","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/domains/list":{"id":"api/domains/list","title":"listDomains","description":"This method returns a list of Domain resources.","sidebar":"tutorialSidebar"},"api/domains/update":{"id":"api/domains/update","title":"updateDomain","description":"Updates an existing Domain resource.","sidebar":"tutorialSidebar"},"api/gateways/create":{"id":"api/gateways/create","title":"createGateway","description":"Creates a new Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/delete":{"id":"api/gateways/delete","title":"deleteGateway","description":"Removes a Gateway resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/gateways/get":{"id":"api/gateways/get","title":"getGateway","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/list":{"id":"api/gateways/list","title":"listGateways","description":"This method returns a list of Gateways resources.","sidebar":"tutorialSidebar"},"api/gateways/update":{"id":"api/gateways/update","title":"updateGateways","description":"Updates an existing Gateway resource.","sidebar":"tutorialSidebar"},"api/location/create":{"id":"api/location/create","title":"addEndpoint","description":"Adds an entry into the location table","sidebar":"tutorialSidebar"},"api/location/delete":{"id":"api/location/delete","title":"evictEndpoint","description":"Evicts an entry from the location table","sidebar":"tutorialSidebar"},"api/location/list":{"id":"api/location/list","title":"listEndpoints","description":"Gets a list of registered devices.","sidebar":"tutorialSidebar"},"api/numbers/create":{"id":"api/numbers/create","title":"createNumber","description":"Creates a new Number. The Gateway must exist before creating the Number.","sidebar":"tutorialSidebar"},"api/numbers/delete":{"id":"api/numbers/delete","title":"deleteNumber","description":"Removes a Number from a persistent database.","sidebar":"tutorialSidebar"},"api/numbers/get":{"id":"api/numbers/get","title":"getNumber","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/numbers/list":{"id":"api/numbers/list","title":"listNumbers","description":"This method returns a list of Numbers.","sidebar":"tutorialSidebar"},"api/numbers/update":{"id":"api/numbers/update","title":"updateNumber","description":"Updates an existing Number.","sidebar":"tutorialSidebar"},"api/overview":{"id":"api/overview","title":"overview","description":"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.","sidebar":"tutorialSidebar"},"api/peers/create":{"id":"api/peers/create","title":"createPeer","description":"Creates a new Peer resource.","sidebar":"tutorialSidebar"},"api/peers/delete":{"id":"api/peers/delete","title":"deletePeer","description":"Removes a Peer resource from a persistent database.","sidebar":"tutorialSidebar"},"api/peers/get":{"id":"api/peers/get","title":"getPeer","description":"This method returns a Peer resource.","sidebar":"tutorialSidebar"},"api/peers/list":{"id":"api/peers/list","title":"listPeers","description":"This method returns a list of Peer resources.","sidebar":"tutorialSidebar"},"api/peers/update":{"id":"api/peers/update","title":"updatePeer","description":"Updates an existing Peer resource.","sidebar":"tutorialSidebar"},"api/registry":{"id":"api/registry","title":"registry","description":"This method gets a list of available(online) gateways.","sidebar":"tutorialSidebar"},"api/status/get":{"id":"api/status/get","title":"checkSystemStatus","description":"Pings an instance of Routr engine.","sidebar":"tutorialSidebar"},"api/status/update":{"id":"api/status/update","title":"restartServer","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/info":{"id":"api/sys/info","title":"getServerInfo","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/logs":{"id":"api/sys/logs","title":"getServerLogs","description":"This method returns logs from the server","sidebar":"tutorialSidebar"},"api/token":{"id":"api/token","title":"token","description":"This method gets a token for subsequent API calls.","sidebar":"tutorialSidebar"},"concepts":{"id":"concepts","title":"Concepts","description":"The following are some key concepts, including some of the essential routing strategies implemented in Routr.","sidebar":"tutorialSidebar"},"configuration/agents":{"id":"configuration/agents","title":"Agents","description":"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.","sidebar":"tutorialSidebar"},"configuration/domains":{"id":"configuration/domains","title":"Domains","description":"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and","sidebar":"tutorialSidebar"},"configuration/gateways":{"id":"configuration/gateways","title":"Gateways","description":"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.","sidebar":"tutorialSidebar"},"configuration/general":{"id":"configuration/general","title":"General","description":"The general configuration affects your entire Routr instance. The general configuration","sidebar":"tutorialSidebar"},"configuration/numbers":{"id":"configuration/numbers","title":"Numbers","description":"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.","sidebar":"tutorialSidebar"},"configuration/peers":{"id":"configuration/peers","title":"Peers","description":"Like Agents, Peers represent SIP endpoints such as Media Servers.","sidebar":"tutorialSidebar"},"configuration/users":{"id":"configuration/users","title":"Users","description":"Users exist in Routr to perform administrative actions on a Routr instance.","sidebar":"tutorialSidebar"},"guides/basic-setup":{"id":"guides/basic-setup","title":"Basic Setup","description":"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.","sidebar":"tutorialSidebar"},"guides/routr-as-asterisk-frontend":{"id":"guides/routr-as-asterisk-frontend","title":"Routr as Asterisk frontend","description":"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:","sidebar":"tutorialSidebar"},"guides/running-on-kubernetes":{"id":"guides/running-on-kubernetes","title":"Running on Kubernetes","description":"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.","sidebar":"tutorialSidebar"},"guides/running-with-docker-or-compose":{"id":"guides/running-with-docker-or-compose","title":"Running with Docker","description":"Please refer to Docker Hub for a detail guide on how to use Routr\'s docker image.","sidebar":"tutorialSidebar"},"guides/securing-the-signaling-path":{"id":"guides/securing-the-signaling-path","title":"Securing the signaling path","description":"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.","sidebar":"tutorialSidebar"},"introduction/community":{"id":"introduction/community","title":"Community","description":"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:","sidebar":"tutorialSidebar"},"introduction/comparison":{"id":"introduction/comparison","title":"Comparison","description":"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.","sidebar":"tutorialSidebar"},"introduction/faq":{"id":"introduction/faq","title":"FAQ","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/glossary":{"id":"introduction/glossary","title":"Glossary","description":"This following table features some essential concepts, including the different routing types implemented by the server.","sidebar":"tutorialSidebar"},"introduction/installation":{"id":"introduction/installation","title":"Installation","description":"Instant Server Installation with Snaps","sidebar":"tutorialSidebar"},"introduction/media":{"id":"introduction/media","title":"Media","description":"There is a subreddit collecting all Routr-related resources on the internet.","sidebar":"tutorialSidebar"},"introduction/overview":{"id":"introduction/overview","title":"Overview","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/performance-tests/user-location":{"id":"introduction/performance-tests/user-location","title":"Routr 1.0RC3 - User Location Lookup Performance Tests","description":"Author:","sidebar":"tutorialSidebar"},"introduction/roadmap":{"id":"introduction/roadmap","title":"Roadmap","description":"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.","sidebar":"tutorialSidebar"},"introduction/test-plan":{"id":"introduction/test-plan","title":"Test Plan","description":"DUT and Endpoints Configuration","sidebar":"tutorialSidebar"},"welcome":{"id":"welcome","title":"Welcome","description":"Use the left-hand to navigate to find topics of interest.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/918bfdcb.858bb8f9.js b/assets/js/918bfdcb.858bb8f9.js deleted file mode 100644 index fe8462ae5..000000000 --- a/assets/js/918bfdcb.858bb8f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6186],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},d=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=u(n),g=o,m=c["".concat(l,".").concat(g)]||c[g]||p[g]||i;return n?r.createElement(m,a(a({ref:t},d),{},{components:n})):r.createElement(m,a({ref:t},d))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,a[1]=s;for(var u=2;u<i;u++)a[u]=n[u];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},890:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var r=n(7462),o=(n(7294),n(3905));const i={},a="Glossary",s={unversionedId:"introduction/glossary",id:"version-1.x.x/introduction/glossary",title:"Glossary",description:"This following table features some essential concepts, including the different routing types implemented by the server.",source:"@site/versioned_docs/version-1.x.x/introduction/glossary.md",sourceDirName:"introduction",slug:"/introduction/glossary",permalink:"/docs/1.x.x/introduction/glossary",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/glossary.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"},next:{title:"Media",permalink:"/docs/1.x.x/introduction/media"}},l={},u=[{value:"User",id:"user",level:3},{value:"Agent",id:"agent",level:3},{value:"Domain",id:"domain",level:3},{value:"Peer",id:"peer",level:3},{value:"Gateway",id:"gateway",level:3},{value:"Number",id:"number",level:3},{value:"Intra-Domain Routing (IDR)",id:"intra-domain-routing-idr",level:3},{value:"Domain Ingress Routing (DIR)",id:"domain-ingress-routing-dir",level:3},{value:"Domain Egress Routing (DER)",id:"domain-egress-routing-der",level:3},{value:"Peer Egress Routing (PER)",id:"peer-egress-routing-per",level:3}],d={toc:u},c="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"glossary"},"Glossary"),(0,o.kt)("p",null,"This following table features some essential concepts, including the different routing types implemented by the server."),(0,o.kt)("h3",{id:"user"},"User"),(0,o.kt)("p",null,"Users perform administrative actions on the server. "),(0,o.kt)("h3",{id:"agent"},"Agent"),(0,o.kt)("p",null,"Agents represent SIP endpoints such as softphones and IP phones, or paging speakers."),(0,o.kt)("h3",{id:"domain"},"Domain"),(0,o.kt)("p",null,"Enables the creation of isolated groups of Agents"),(0,o.kt)("h3",{id:"peer"},"Peer"),(0,o.kt)("p",null,"Similar to Agents but without Domain boundaries"),(0,o.kt)("h3",{id:"gateway"},"Gateway"),(0,o.kt)("p",null,"IP entity that allows call termination"),(0,o.kt)("h3",{id:"number"},"Number"),(0,o.kt)("p",null,"Routes and translate calls between the PSTN and Routr"),(0,o.kt)("h3",{id:"intra-domain-routing-idr"},"Intra-Domain Routing (IDR)"),(0,o.kt)("p",null,"Routing strategy for signaling within the same Domain"),(0,o.kt)("h3",{id:"domain-ingress-routing-dir"},"Domain Ingress Routing (DIR)"),(0,o.kt)("p",null,"Routing strategy used when an Agent or Peer must go outside the Domain using\na Gateway"),(0,o.kt)("h3",{id:"domain-egress-routing-der"},"Domain Egress Routing (DER)"),(0,o.kt)("p",null,"Calling from an Agent to the PSTN thru a Gateway"),(0,o.kt)("h3",{id:"peer-egress-routing-per"},"Peer Egress Routing (PER)"),(0,o.kt)("p",null,"Similar to ",(0,o.kt)("em",{parentName:"p"},"DER")," but applies only to Peers."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/918bfdcb.982771c7.js b/assets/js/918bfdcb.982771c7.js new file mode 100644 index 000000000..36ae2c438 --- /dev/null +++ b/assets/js/918bfdcb.982771c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1870],{1264:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var i=t(4848),r=t(8453);const s={},o="Glossary",a={id:"introduction/glossary",title:"Glossary",description:"This following table features some essential concepts, including the different routing types implemented by the server.",source:"@site/versioned_docs/version-1.x.x/introduction/glossary.md",sourceDirName:"introduction",slug:"/introduction/glossary",permalink:"/docs/1.x.x/introduction/glossary",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/glossary.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"},next:{title:"Media",permalink:"/docs/1.x.x/introduction/media"}},d={},l=[{value:"User",id:"user",level:3},{value:"Agent",id:"agent",level:3},{value:"Domain",id:"domain",level:3},{value:"Peer",id:"peer",level:3},{value:"Gateway",id:"gateway",level:3},{value:"Number",id:"number",level:3},{value:"Intra-Domain Routing (IDR)",id:"intra-domain-routing-idr",level:3},{value:"Domain Ingress Routing (DIR)",id:"domain-ingress-routing-dir",level:3},{value:"Domain Egress Routing (DER)",id:"domain-egress-routing-der",level:3},{value:"Peer Egress Routing (PER)",id:"peer-egress-routing-per",level:3}];function u(e){const n={em:"em",h1:"h1",h3:"h3",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"glossary",children:"Glossary"}),"\n",(0,i.jsx)(n.p,{children:"This following table features some essential concepts, including the different routing types implemented by the server."}),"\n",(0,i.jsx)(n.h3,{id:"user",children:"User"}),"\n",(0,i.jsx)(n.p,{children:"Users perform administrative actions on the server."}),"\n",(0,i.jsx)(n.h3,{id:"agent",children:"Agent"}),"\n",(0,i.jsx)(n.p,{children:"Agents represent SIP endpoints such as softphones and IP phones, or paging speakers."}),"\n",(0,i.jsx)(n.h3,{id:"domain",children:"Domain"}),"\n",(0,i.jsx)(n.p,{children:"Enables the creation of isolated groups of Agents"}),"\n",(0,i.jsx)(n.h3,{id:"peer",children:"Peer"}),"\n",(0,i.jsx)(n.p,{children:"Similar to Agents but without Domain boundaries"}),"\n",(0,i.jsx)(n.h3,{id:"gateway",children:"Gateway"}),"\n",(0,i.jsx)(n.p,{children:"IP entity that allows call termination"}),"\n",(0,i.jsx)(n.h3,{id:"number",children:"Number"}),"\n",(0,i.jsx)(n.p,{children:"Routes and translate calls between the PSTN and Routr"}),"\n",(0,i.jsx)(n.h3,{id:"intra-domain-routing-idr",children:"Intra-Domain Routing (IDR)"}),"\n",(0,i.jsx)(n.p,{children:"Routing strategy for signaling within the same Domain"}),"\n",(0,i.jsx)(n.h3,{id:"domain-ingress-routing-dir",children:"Domain Ingress Routing (DIR)"}),"\n",(0,i.jsx)(n.p,{children:"Routing strategy used when an Agent or Peer must go outside the Domain using\na Gateway"}),"\n",(0,i.jsx)(n.h3,{id:"domain-egress-routing-der",children:"Domain Egress Routing (DER)"}),"\n",(0,i.jsx)(n.p,{children:"Calling from an Agent to the PSTN thru a Gateway"}),"\n",(0,i.jsx)(n.h3,{id:"peer-egress-routing-per",children:"Peer Egress Routing (PER)"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to ",(0,i.jsx)(n.em,{children:"DER"})," but applies only to Peers."]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});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 a(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/assets/js/92a92b88.2c0f2381.js b/assets/js/92a92b88.2c0f2381.js new file mode 100644 index 000000000..1e0f03dee --- /dev/null +++ b/assets/js/92a92b88.2c0f2381.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7940],{7149:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=s(4848),t=s(8453);const a={},o="Building a Processor",i={id:"development/building-a-processor",title:"Building a Processor",description:"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.",source:"@site/docs/development/building-a-processor.md",sourceDirName:"development",slug:"/development/building-a-processor",permalink:"/docs/2.0.0/development/building-a-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-processor.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"},next:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"}},l={},c=[{value:"Processor Contract",id:"processor-contract",level:2},{value:"Building a Processor from a Template",id:"building-a-processor-from-a-template",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"building-a-processor",children:"Building a Processor"}),"\n",(0,r.jsxs)(n.p,{children:["Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the ",(0,r.jsx)(n.a,{href:"/docs/2.0.0/overview/concepts#alterations",children:"Alterations API"})," to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network."]}),"\n",(0,r.jsx)(n.p,{children:"Here is a non-exhaustive list of things you can do with a Processor:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Build an instant messaging application"}),"\n",(0,r.jsx)(n.li,{children:"Create a custom logic for a SCAIP system"}),"\n",(0,r.jsx)(n.li,{children:"Build a SIP Recorder when combined with RTPEngine"}),"\n",(0,r.jsx)(n.li,{children:"Doorbell Camera System integration"}),"\n",(0,r.jsx)(n.li,{children:"Custom logic for a SIP IoT system"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"processor-contract",children:"Processor Contract"}),"\n",(0,r.jsxs)(n.p,{children:["A Processor is a gRPC service that implements the ",(0,r.jsx)(n.code,{children:"Processor"})," interface. The interface is defined in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"processor.proto"})," file."]}),"\n",(0,r.jsx)(n.p,{children:"Here is the definition of the Processor interface:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly."}),"\n",(0,r.jsx)(n.p,{children:"You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS."}),"\n",(0,r.jsx)(n.p,{children:"One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript."}),"\n",(0,r.jsx)(n.p,{children:"As an example, here is the JSON representation of a SIP REGISTER message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "ref": "AynhXaFtbdXwHrUEzt_rUQ..",\n "edgePortRef": "edgeport-01",\n "method": "REGISTER",\n "externalAddrs": ["200.22.21.42"],\n "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],\n "listeningPoints": [\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "TCP"\n },\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "UDP"\n }\n ],\n "sender": {\n "host": "127.0.0.1",\n "port": 36214,\n "transport": "TCP"\n },\n "message": {\n "via": [\n {\n "host": "proxy",\n "port": 5060,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n },\n {\n "host": "127.0.0.1",\n "port": 36214,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n }\n ],\n "extensions": [\n {\n "name": "CSeq",\n "value": "14 REGISTER"\n },\n {\n "name": "Allow",\n "value": "INVITE"\n },\n {\n "name": "User-Agent",\n "value": "Z 5.4.12 v2.10.13.2"\n },\n {\n "name": "Allow-Events",\n "value": "presence"\n }\n ],\n "from": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "UDP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "John Doe",\n "wildcard": false\n },\n "tag": "9041462a"\n },\n "to": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "tag": ""\n },\n "contact": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "127.0.0.1",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 36214,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "expires": -1,\n "qValue": -1\n },\n "callId": {\n "callId": "AynhXaFtbdXwHrUEzt_rUQ.."\n },\n "contentLength": {\n "contentLength": 0\n },\n "maxForwards": {\n "maxForwards": 70\n },\n "expires": {\n "expires": 60\n },\n "recordRoute": [\n {\n "parameters": {\n "a": "1",\n "b": "2"\n },\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "route": [\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.127",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n },\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.128",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "authorization": {\n "realm": "sip.local",\n "scheme": "Digest",\n "cNonce": "acbcc60094edde23f49b01e18bafd34e",\n "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",\n "algorithm": "MD5",\n "qop": "",\n "opaque": "",\n "response": "227fe247ff0b9fa4fcf2706b587bf995",\n "username": "1001",\n "uri": "sip:sip.local;transport=TCP",\n "nonceCount": 13\n },\n "requestUri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "messageType": "REQUEST"\n }\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"building-a-processor-from-a-template",children:"Building a Processor from a Template"}),"\n",(0,r.jsxs)(n.p,{children:["To make it easier to build processors, we provide a template you can use to get started. The template is available in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/nodejs-processor",children:"routr-processor-template."})]}),"\n",(0,r.jsxs)(n.p,{children:["To use the template, you must have ",(0,r.jsx)(n.a,{href:"https://nodejs.org/en/",children:"NodeJS"})," installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"npx degit fonoster/nodejs-processor my-processor\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The previous command will create a new folder called ",(0,r.jsx)(n.code,{children:"my-processor"})," with the following structure:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:".\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 commitlint.config.js\n\u251c\u2500\u2500 compose.yaml\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u251c\u2500\u2500 src\n\u2502 \u251c\u2500\u2500 envs.ts\n\u2502 \u251c\u2500\u2500 handlers.ts\n\u2502 \u2514\u2500\u2500 index.ts\n\u251c\u2500\u2500 test\n\u2502 \u2514\u2500\u2500 unit.test.ts\n\u2514\u2500\u2500 tsconfig.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The most important file is the ",(0,r.jsx)(n.code,{children:"handlers.ts"})," file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor."]}),"\n",(0,r.jsx)(n.p,{children:"From there, you can install the dependencies and start the processor:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd my-processor\nnpm install\nnpm start\n"})}),"\n",(0,r.jsx)(n.p,{children:"You may now start sending SIP messages to your processor from EdgePort or Dispatcher."})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},a=r.createContext(t);function o(e){const n=r.useContext(a);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(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/92a92b88.573f4f56.js b/assets/js/92a92b88.573f4f56.js deleted file mode 100644 index 74f668bf9..000000000 --- a/assets/js/92a92b88.573f4f56.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[257],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>f});var r=t(7294);function s(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){s(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function i(e,n){if(null==e)return{};var t,r,s=function(e,n){if(null==e)return{};var t,r,s={},a=Object.keys(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||(s[t]=e[t]);return s}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var l=r.createContext({}),c=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(l.Provider,{value:n},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},u=r.forwardRef((function(e,n){var t=e.components,s=e.mdxType,a=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=c(t),u=s,f=m["".concat(l,".").concat(u)]||m[u]||d[u]||a;return t?r.createElement(f,o(o({ref:n},p),{},{components:t})):r.createElement(f,o({ref:n},p))}));function f(e,n){var t=arguments,s=n&&n.mdxType;if("string"==typeof e||s){var a=t.length,o=new Array(a);o[0]=u;var i={};for(var l in n)hasOwnProperty.call(n,l)&&(i[l]=n[l]);i.originalType=e,i[m]="string"==typeof e?e:s,o[1]=i;for(var c=2;c<a;c++)o[c]=t[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,t)}u.displayName="MDXCreateElement"},3986:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=t(7462),s=(t(7294),t(3905));const a={},o="Building a Processor",i={unversionedId:"development/building-a-processor",id:"development/building-a-processor",title:"Building a Processor",description:"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.",source:"@site/docs/development/building-a-processor.md",sourceDirName:"development",slug:"/development/building-a-processor",permalink:"/docs/2.0.0/development/building-a-processor",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-processor.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"},next:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"}},l={},c=[{value:"Processor Contract",id:"processor-contract",level:2},{value:"Building a Processor from a Template",id:"building-a-processor-from-a-template",level:2}],p={toc:c},m="wrapper";function d(e){let{components:n,...t}=e;return(0,s.kt)(m,(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"building-a-processor"},"Building a Processor"),(0,s.kt)("p",null,"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the ",(0,s.kt)("a",{parentName:"p",href:"/docs/overview/concepts#alterations"},"Alterations API")," to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network."),(0,s.kt)("p",null,"Here is a non-exhaustive list of things you can do with a Processor:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Build an instant messaging application"),(0,s.kt)("li",{parentName:"ul"},"Create a custom logic for a SCAIP system"),(0,s.kt)("li",{parentName:"ul"},"Build a SIP Recorder when combined with RTPEngine"),(0,s.kt)("li",{parentName:"ul"},"Doorbell Camera System integration"),(0,s.kt)("li",{parentName:"ul"},"Custom logic for a SIP IoT system")),(0,s.kt)("h2",{id:"processor-contract"},"Processor Contract"),(0,s.kt)("p",null,"A Processor is a gRPC service that implements the ",(0,s.kt)("inlineCode",{parentName:"p"},"Processor")," interface. The interface is defined in the ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto"},"processor.proto")," file. "),(0,s.kt)("p",null,"Here is the definition of the Processor interface:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n')),(0,s.kt)("p",null,"As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly."),(0,s.kt)("p",null,"You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS."),(0,s.kt)("p",null,"One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript."),(0,s.kt)("p",null,"As an example, here is the JSON representation of a SIP REGISTER message:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-json"},'{\n "ref": "AynhXaFtbdXwHrUEzt_rUQ..",\n "edgePortRef": "edgeport-01",\n "method": "REGISTER",\n "externalAddrs": ["200.22.21.42"],\n "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],\n "listeningPoints": [\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "TCP"\n },\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "UDP"\n }\n ],\n "sender": {\n "host": "127.0.0.1",\n "port": 36214,\n "transport": "TCP"\n },\n "message": {\n "via": [\n {\n "host": "proxy",\n "port": 5060,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n },\n {\n "host": "127.0.0.1",\n "port": 36214,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n }\n ],\n "extensions": [\n {\n "name": "CSeq",\n "value": "14 REGISTER"\n },\n {\n "name": "Allow",\n "value": "INVITE"\n },\n {\n "name": "User-Agent",\n "value": "Z 5.4.12 v2.10.13.2"\n },\n {\n "name": "Allow-Events",\n "value": "presence"\n }\n ],\n "from": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "UDP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "John Doe",\n "wildcard": false\n },\n "tag": "9041462a"\n },\n "to": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "tag": ""\n },\n "contact": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "127.0.0.1",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 36214,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "expires": -1,\n "qValue": -1\n },\n "callId": {\n "callId": "AynhXaFtbdXwHrUEzt_rUQ.."\n },\n "contentLength": {\n "contentLength": 0\n },\n "maxForwards": {\n "maxForwards": 70\n },\n "expires": {\n "expires": 60\n },\n "recordRoute": [\n {\n "parameters": {\n "a": "1",\n "b": "2"\n },\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "route": [\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.127",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n },\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.128",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "authorization": {\n "realm": "sip.local",\n "scheme": "Digest",\n "cNonce": "acbcc60094edde23f49b01e18bafd34e",\n "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",\n "algorithm": "MD5",\n "qop": "",\n "opaque": "",\n "response": "227fe247ff0b9fa4fcf2706b587bf995",\n "username": "1001",\n "uri": "sip:sip.local;transport=TCP",\n "nonceCount": 13\n },\n "requestUri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "messageType": "REQUEST"\n }\n}\n')),(0,s.kt)("h2",{id:"building-a-processor-from-a-template"},"Building a Processor from a Template"),(0,s.kt)("p",null,"To make it easier to build processors, we provide a template you can use to get started. The template is available in the ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/fonoster/nodejs-processor"},"routr-processor-template.")),(0,s.kt)("p",null,"To use the template, you must have ",(0,s.kt)("a",{parentName:"p",href:"https://nodejs.org/en/"},"NodeJS")," installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-bash"},"npx degit fonoster/nodejs-processor my-processor\n")),(0,s.kt)("p",null,"The previous command will create a new folder called ",(0,s.kt)("inlineCode",{parentName:"p"},"my-processor")," with the following structure:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-bash"},".\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 commitlint.config.js\n\u251c\u2500\u2500 compose.yaml\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u251c\u2500\u2500 src\n\u2502 \u251c\u2500\u2500 envs.ts\n\u2502 \u251c\u2500\u2500 handlers.ts\n\u2502 \u2514\u2500\u2500 index.ts\n\u251c\u2500\u2500 test\n\u2502 \u2514\u2500\u2500 unit.test.ts\n\u2514\u2500\u2500 tsconfig.json\n")),(0,s.kt)("p",null,"The most important file is the ",(0,s.kt)("inlineCode",{parentName:"p"},"handlers.ts")," file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor."),(0,s.kt)("p",null,"From there, you can install the dependencies and start the processor:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-bash"},"cd my-processor\nnpm install\nnpm start\n")),(0,s.kt)("p",null,"You may now start sending SIP messages to your processor from EdgePort or Dispatcher."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.7f970a9d.js b/assets/js/935f2afb.7f970a9d.js deleted file mode 100644 index 9e2a41555..000000000 --- a/assets/js/935f2afb.7f970a9d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"2.0.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Overview","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/overview/introduction","docId":"overview/introduction"},{"type":"link","label":"Architecture","href":"/docs/2.0.0/overview/architecture","docId":"overview/architecture"},{"type":"link","label":"Concepts","href":"/docs/2.0.0/overview/concepts","docId":"overview/concepts"},{"type":"link","label":"Deploy with Docker","href":"/docs/2.0.0/overview/deploy-with-docker","docId":"overview/deploy-with-docker"}]},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/development/introduction","docId":"development/introduction"},{"type":"link","label":"Quick Start","href":"/docs/2.0.0/development/quick-start","docId":"development/quick-start"},{"type":"link","label":"Development with Gitpod","href":"/docs/2.0.0/development/development-mode-with-gitpod","docId":"development/development-mode-with-gitpod"},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/components/overview","docId":"development/components/overview"},{"type":"link","label":"EdgePort","href":"/docs/2.0.0/development/components/edgeport","docId":"development/components/edgeport"},{"type":"link","label":"Message Dispatcher","href":"/docs/2.0.0/development/components/dispatcher","docId":"development/components/dispatcher"},{"type":"link","label":"Location Service","href":"/docs/2.0.0/development/components/location","docId":"development/components/location"},{"type":"link","label":"Registry Service","href":"/docs/2.0.0/development/components/registry","docId":"development/components/registry"},{"type":"link","label":"Requester","href":"/docs/2.0.0/development/components/requester","docId":"development/components/requester"},{"type":"link","label":"RTPRelay","href":"/docs/2.0.0/development/components/rtprelay","docId":"development/components/rtprelay"},{"type":"link","label":"APIServer","href":"/docs/2.0.0/development/components/apiserver","docId":"development/components/apiserver"},{"type":"link","label":"SimpleAuth Service","href":"/docs/2.0.0/development/components/simpleauth","docId":"development/components/simpleauth"}]},{"type":"category","label":"Alterations API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/alterations/overview","docId":"development/alterations/overview"},{"type":"link","label":"Alteration Methods","href":"/docs/2.0.0/development/alterations/methods","docId":"development/alterations/methods"}]},{"type":"link","label":"Building a Processor","href":"/docs/2.0.0/development/building-a-processor","docId":"development/building-a-processor"},{"type":"link","label":"Building a Middleware","href":"/docs/2.0.0/development/building-a-middleware","docId":"development/building-a-middleware"},{"type":"link","label":"Custom data with the APIServer","href":"/docs/2.0.0/development/custom-data-with-the-apiserver","docId":"development/custom-data-with-the-apiserver"},{"type":"link","label":"Extending the Command-Line Tool","href":"/docs/2.0.0/development/extending-the-ctl","docId":"development/extending-the-ctl"}]},{"type":"category","label":"Connect Mode","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/connect/introduction","docId":"connect/introduction"},{"type":"link","label":"Concepts","href":"/docs/2.0.0/connect/concepts","docId":"connect/concepts"},{"type":"category","label":"Quick Start","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker installation","href":"/docs/2.0.0/connect/quick-start/docker","docId":"connect/quick-start/docker"},{"type":"link","label":"Installing in Kubernetes","href":"/docs/2.0.0/connect/quick-start/kubernetes","docId":"connect/quick-start/kubernetes"}]},{"type":"category","label":"Command-Line Tool","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/command-line/overview","docId":"connect/command-line/overview"},{"type":"link","label":"CTL","href":"/docs/2.0.0/connect/command-line/ctl","docId":"connect/command-line/ctl"}]},{"type":"category","label":"Node.js SDK","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/nodesdk/overview","docId":"connect/nodesdk/overview"},{"type":"link","label":"SDK","href":"/docs/2.0.0/connect/nodesdk/sdk","docId":"connect/nodesdk/sdk"}]},{"type":"link","label":"Home or Office Setup","href":"/docs/2.0.0/connect/home-or-office-setup","docId":"connect/home-or-office-setup"},{"type":"link","label":"WebRTC Support","href":"/docs/2.0.0/connect/webrtc-support","docId":"connect/webrtc-support"},{"type":"link","label":"Securing the Server","href":"/docs/2.0.0/connect/securing-the-server","docId":"connect/securing-the-server"},{"type":"link","label":"Sending Call Events to NATS","href":"/docs/2.0.0/connect/sending-call-events-to-nats","docId":"connect/sending-call-events-to-nats"}]},{"type":"link","label":"Community","href":"/docs/2.0.0/community","docId":"community"},{"type":"link","label":"Contributing Guide","href":"/docs/2.0.0/contributing","docId":"contributing"},{"type":"link","label":"FAQs","href":"/docs/2.0.0/faqs","docId":"faqs"},{"type":"link","label":"Changelog","href":"/docs/2.0.0/changelog","docId":"changelog"}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"Coming soon.","sidebar":"tutorialSidebar"},"community":{"id":"community","title":"Community","description":"We are developing Routr in the open. These are the channels we use for communication and contribution:","sidebar":"tutorialSidebar"},"connect/command-line/ctl":{"id":"connect/command-line/ctl","title":"CTL","description":"Command-Line for Routr server.","sidebar":"tutorialSidebar"},"connect/command-line/overview":{"id":"connect/command-line/overview","title":"Overview","description":"The command-line tool contains all commands you will need to manage your Routr Connect server.","sidebar":"tutorialSidebar"},"connect/concepts":{"id":"connect/concepts","title":"Concepts","description":"The Connect Mode is Routr\'s implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.","sidebar":"tutorialSidebar"},"connect/home-or-office-setup":{"id":"connect/home-or-office-setup","title":"Home or Office Setup","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/introduction":{"id":"connect/introduction","title":"Introduction","description":"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.","sidebar":"tutorialSidebar"},"connect/nodesdk/overview":{"id":"connect/nodesdk/overview","title":"Overview","description":"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.","sidebar":"tutorialSidebar"},"connect/nodesdk/sdk":{"id":"connect/nodesdk/sdk","title":"SDK","description":"* Installation","sidebar":"tutorialSidebar"},"connect/quick-start/docker":{"id":"connect/quick-start/docker","title":"Docker installation","description":"First, create a directory named \\"routr\\". Navigate into the new folder, and then copy the content below:","sidebar":"tutorialSidebar"},"connect/quick-start/kubernetes":{"id":"connect/quick-start/kubernetes","title":"Installing in Kubernetes","description":"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.","sidebar":"tutorialSidebar"},"connect/securing-the-server":{"id":"connect/securing-the-server","title":"Securing the Server","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/sending-call-events-to-nats":{"id":"connect/sending-call-events-to-nats","title":"Sending Call Events to NATS","description":"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:","sidebar":"tutorialSidebar"},"connect/webrtc-support":{"id":"connect/webrtc-support","title":"WebRTC Support","description":"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.","sidebar":"tutorialSidebar"},"contributing":{"id":"contributing","title":"Contributing Guide","description":"* New Contributor Guide","sidebar":"tutorialSidebar"},"development/alterations/methods":{"id":"development/alterations/methods","title":"Alteration Methods","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/alterations/overview":{"id":"development/alterations/overview","title":"Overview","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/building-a-chat-application":{"id":"development/building-a-chat-application","title":"Building a Chat Application","description":"Comin soon."},"development/building-a-middleware":{"id":"development/building-a-middleware","title":"Building a Middleware","description":"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.","sidebar":"tutorialSidebar"},"development/building-a-processor":{"id":"development/building-a-processor","title":"Building a Processor","description":"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.","sidebar":"tutorialSidebar"},"development/building-a-scaip-processor":{"id":"development/building-a-scaip-processor","title":"Building a SCAIP Processor","description":"Comin soon."},"development/components/apiserver":{"id":"development/components/apiserver","title":"APIServer","description":"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.","sidebar":"tutorialSidebar"},"development/components/dispatcher":{"id":"development/components/dispatcher","title":"Message Dispatcher","description":"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.","sidebar":"tutorialSidebar"},"development/components/edgeport":{"id":"development/components/edgeport","title":"EdgePort","description":"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.","sidebar":"tutorialSidebar"},"development/components/location":{"id":"development/components/location","title":"Location Service","description":"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.","sidebar":"tutorialSidebar"},"development/components/overview":{"id":"development/components/overview","title":"Overview","description":"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.","sidebar":"tutorialSidebar"},"development/components/registry":{"id":"development/components/registry","title":"Registry Service","description":"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.","sidebar":"tutorialSidebar"},"development/components/requester":{"id":"development/components/requester","title":"Requester","description":"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.","sidebar":"tutorialSidebar"},"development/components/rtprelay":{"id":"development/components/rtprelay","title":"RTPRelay","description":"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.","sidebar":"tutorialSidebar"},"development/components/simpleauth":{"id":"development/components/simpleauth","title":"SimpleAuth Service","description":"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.","sidebar":"tutorialSidebar"},"development/custom-data-with-the-apiserver":{"id":"development/custom-data-with-the-apiserver","title":"Custom data with the APIServer","description":"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.","sidebar":"tutorialSidebar"},"development/development-mode-with-gitpod":{"id":"development/development-mode-with-gitpod","title":"Development with Gitpod","description":"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.","sidebar":"tutorialSidebar"},"development/extending-the-ctl":{"id":"development/extending-the-ctl","title":"Extending the Command-Line Tool","description":"Routr\'s command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.","sidebar":"tutorialSidebar"},"development/introduction":{"id":"development/introduction","title":"Introduction","description":"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you\'ll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.","sidebar":"tutorialSidebar"},"development/metrics-events-logs-and-traces":{"id":"development/metrics-events-logs-and-traces","title":"Everything about MELT","description":"Comin soon."},"development/orchestration-with-docker":{"id":"development/orchestration-with-docker","title":"Orchestration with Docker","description":"Coming soon."},"development/orchestration-with-kubernetes":{"id":"development/orchestration-with-kubernetes","title":"Orchestration with Kubernetes","description":"Coming soon."},"development/quick-start":{"id":"development/quick-start","title":"Quick Start","description":"Before starting the development, you need to install the following tools:","sidebar":"tutorialSidebar"},"development/testing-with-seet":{"id":"development/testing-with-seet","title":"Testing with SEET","description":"Coming soon."},"faqs":{"id":"faqs","title":"FAQs","description":"What is Routr?","sidebar":"tutorialSidebar"},"overview/architecture":{"id":"overview/architecture","title":"Architecture","description":"Routr\'s architecture diagram","sidebar":"tutorialSidebar"},"overview/concepts":{"id":"overview/concepts","title":"Concepts","description":"Routr\'s approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.","sidebar":"tutorialSidebar"},"overview/deploy-with-docker":{"id":"overview/deploy-with-docker","title":"Deploy with Docker","description":"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.","sidebar":"tutorialSidebar"},"overview/introduction":{"id":"overview/introduction","title":"introduction","description":"Community banner","sidebar":"tutorialSidebar"},"tutorials/deploying-to-civo-with-helm":{"id":"tutorials/deploying-to-civo-with-helm","title":"Deploying to Civo with Helm","description":"Coming soon."},"tutorials/ephemeral-agents-in-the-browser":{"id":"tutorials/ephemeral-agents-in-the-browser","title":"Ephemeral Agents in the Browser","description":"Coming soon."},"tutorials/intercom-system-with-routr-and-kubernetes":{"id":"tutorials/intercom-system-with-routr-and-kubernetes","title":"Intercom System with Routr and Kubernetes","description":"Coming soon."},"tutorials/load-balancing-asterisk-with-routr":{"id":"tutorials/load-balancing-asterisk-with-routr","title":"Load-balancing Asterisk with Routr","description":"Coming soon."}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.9b7d34d8.js b/assets/js/935f2afb.9b7d34d8.js new file mode 100644 index 000000000..11f2f56eb --- /dev/null +++ b/assets/js/935f2afb.9b7d34d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"2.0.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Overview","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/overview/introduction","docId":"overview/introduction","unlisted":false},{"type":"link","label":"Architecture","href":"/docs/2.0.0/overview/architecture","docId":"overview/architecture","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.0.0/overview/concepts","docId":"overview/concepts","unlisted":false},{"type":"link","label":"Deploy with Docker","href":"/docs/2.0.0/overview/deploy-with-docker","docId":"overview/deploy-with-docker","unlisted":false}]},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/development/introduction","docId":"development/introduction","unlisted":false},{"type":"link","label":"Quick Start","href":"/docs/2.0.0/development/quick-start","docId":"development/quick-start","unlisted":false},{"type":"link","label":"Development with Gitpod","href":"/docs/2.0.0/development/development-mode-with-gitpod","docId":"development/development-mode-with-gitpod","unlisted":false},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/components/overview","docId":"development/components/overview","unlisted":false},{"type":"link","label":"EdgePort","href":"/docs/2.0.0/development/components/edgeport","docId":"development/components/edgeport","unlisted":false},{"type":"link","label":"Message Dispatcher","href":"/docs/2.0.0/development/components/dispatcher","docId":"development/components/dispatcher","unlisted":false},{"type":"link","label":"Location Service","href":"/docs/2.0.0/development/components/location","docId":"development/components/location","unlisted":false},{"type":"link","label":"Registry Service","href":"/docs/2.0.0/development/components/registry","docId":"development/components/registry","unlisted":false},{"type":"link","label":"Requester","href":"/docs/2.0.0/development/components/requester","docId":"development/components/requester","unlisted":false},{"type":"link","label":"RTPRelay","href":"/docs/2.0.0/development/components/rtprelay","docId":"development/components/rtprelay","unlisted":false},{"type":"link","label":"APIServer","href":"/docs/2.0.0/development/components/apiserver","docId":"development/components/apiserver","unlisted":false},{"type":"link","label":"SimpleAuth Service","href":"/docs/2.0.0/development/components/simpleauth","docId":"development/components/simpleauth","unlisted":false}]},{"type":"category","label":"Alterations API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/alterations/overview","docId":"development/alterations/overview","unlisted":false},{"type":"link","label":"Alteration Methods","href":"/docs/2.0.0/development/alterations/methods","docId":"development/alterations/methods","unlisted":false}]},{"type":"link","label":"Building a Processor","href":"/docs/2.0.0/development/building-a-processor","docId":"development/building-a-processor","unlisted":false},{"type":"link","label":"Building a Middleware","href":"/docs/2.0.0/development/building-a-middleware","docId":"development/building-a-middleware","unlisted":false},{"type":"link","label":"Custom data with the APIServer","href":"/docs/2.0.0/development/custom-data-with-the-apiserver","docId":"development/custom-data-with-the-apiserver","unlisted":false},{"type":"link","label":"Extending the Command-Line Tool","href":"/docs/2.0.0/development/extending-the-ctl","docId":"development/extending-the-ctl","unlisted":false}]},{"type":"category","label":"Connect Mode","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/connect/introduction","docId":"connect/introduction","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.0.0/connect/concepts","docId":"connect/concepts","unlisted":false},{"type":"category","label":"Quick Start","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker installation","href":"/docs/2.0.0/connect/quick-start/docker","docId":"connect/quick-start/docker","unlisted":false},{"type":"link","label":"Installing in Kubernetes","href":"/docs/2.0.0/connect/quick-start/kubernetes","docId":"connect/quick-start/kubernetes","unlisted":false}]},{"type":"category","label":"Command-Line Tool","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/command-line/overview","docId":"connect/command-line/overview","unlisted":false},{"type":"link","label":"CTL","href":"/docs/2.0.0/connect/command-line/ctl","docId":"connect/command-line/ctl","unlisted":false}]},{"type":"category","label":"Node.js SDK","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/nodesdk/overview","docId":"connect/nodesdk/overview","unlisted":false},{"type":"link","label":"SDK","href":"/docs/2.0.0/connect/nodesdk/sdk","docId":"connect/nodesdk/sdk","unlisted":false}]},{"type":"link","label":"Home or Office Setup","href":"/docs/2.0.0/connect/home-or-office-setup","docId":"connect/home-or-office-setup","unlisted":false},{"type":"link","label":"WebRTC Support","href":"/docs/2.0.0/connect/webrtc-support","docId":"connect/webrtc-support","unlisted":false},{"type":"link","label":"Securing the Server","href":"/docs/2.0.0/connect/securing-the-server","docId":"connect/securing-the-server","unlisted":false},{"type":"link","label":"Sending Call Events to NATS","href":"/docs/2.0.0/connect/sending-call-events-to-nats","docId":"connect/sending-call-events-to-nats","unlisted":false}]},{"type":"link","label":"Community","href":"/docs/2.0.0/community","docId":"community","unlisted":false},{"type":"link","label":"Contributing Guide","href":"/docs/2.0.0/contributing","docId":"contributing","unlisted":false},{"type":"link","label":"FAQs","href":"/docs/2.0.0/faqs","docId":"faqs","unlisted":false},{"type":"link","label":"Changelog","href":"/docs/2.0.0/changelog","docId":"changelog","unlisted":false}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"Coming soon.","sidebar":"tutorialSidebar"},"community":{"id":"community","title":"Community","description":"We are developing Routr in the open. These are the channels we use for communication and contribution:","sidebar":"tutorialSidebar"},"connect/command-line/ctl":{"id":"connect/command-line/ctl","title":"CTL","description":"Command-Line for Routr server.","sidebar":"tutorialSidebar"},"connect/command-line/overview":{"id":"connect/command-line/overview","title":"Overview","description":"The command-line tool contains all commands you will need to manage your Routr Connect server.","sidebar":"tutorialSidebar"},"connect/concepts":{"id":"connect/concepts","title":"Concepts","description":"The Connect Mode is Routr\'s implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.","sidebar":"tutorialSidebar"},"connect/home-or-office-setup":{"id":"connect/home-or-office-setup","title":"Home or Office Setup","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/introduction":{"id":"connect/introduction","title":"Introduction","description":"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.","sidebar":"tutorialSidebar"},"connect/nodesdk/overview":{"id":"connect/nodesdk/overview","title":"Overview","description":"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.","sidebar":"tutorialSidebar"},"connect/nodesdk/sdk":{"id":"connect/nodesdk/sdk","title":"SDK","description":"* Installation","sidebar":"tutorialSidebar"},"connect/quick-start/docker":{"id":"connect/quick-start/docker","title":"Docker installation","description":"First, create a directory named \\"routr\\". Navigate into the new folder, and then copy the content below:","sidebar":"tutorialSidebar"},"connect/quick-start/kubernetes":{"id":"connect/quick-start/kubernetes","title":"Installing in Kubernetes","description":"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.","sidebar":"tutorialSidebar"},"connect/securing-the-server":{"id":"connect/securing-the-server","title":"Securing the Server","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/sending-call-events-to-nats":{"id":"connect/sending-call-events-to-nats","title":"Sending Call Events to NATS","description":"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:","sidebar":"tutorialSidebar"},"connect/webrtc-support":{"id":"connect/webrtc-support","title":"WebRTC Support","description":"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.","sidebar":"tutorialSidebar"},"contributing":{"id":"contributing","title":"Contributing Guide","description":"* New Contributor Guide","sidebar":"tutorialSidebar"},"development/alterations/methods":{"id":"development/alterations/methods","title":"Alteration Methods","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/alterations/overview":{"id":"development/alterations/overview","title":"Overview","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/building-a-chat-application":{"id":"development/building-a-chat-application","title":"Building a Chat Application","description":"Comin soon."},"development/building-a-middleware":{"id":"development/building-a-middleware","title":"Building a Middleware","description":"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.","sidebar":"tutorialSidebar"},"development/building-a-processor":{"id":"development/building-a-processor","title":"Building a Processor","description":"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.","sidebar":"tutorialSidebar"},"development/building-a-scaip-processor":{"id":"development/building-a-scaip-processor","title":"Building a SCAIP Processor","description":"Comin soon."},"development/components/apiserver":{"id":"development/components/apiserver","title":"APIServer","description":"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.","sidebar":"tutorialSidebar"},"development/components/dispatcher":{"id":"development/components/dispatcher","title":"Message Dispatcher","description":"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.","sidebar":"tutorialSidebar"},"development/components/edgeport":{"id":"development/components/edgeport","title":"EdgePort","description":"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.","sidebar":"tutorialSidebar"},"development/components/location":{"id":"development/components/location","title":"Location Service","description":"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.","sidebar":"tutorialSidebar"},"development/components/overview":{"id":"development/components/overview","title":"Overview","description":"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.","sidebar":"tutorialSidebar"},"development/components/registry":{"id":"development/components/registry","title":"Registry Service","description":"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.","sidebar":"tutorialSidebar"},"development/components/requester":{"id":"development/components/requester","title":"Requester","description":"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.","sidebar":"tutorialSidebar"},"development/components/rtprelay":{"id":"development/components/rtprelay","title":"RTPRelay","description":"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.","sidebar":"tutorialSidebar"},"development/components/simpleauth":{"id":"development/components/simpleauth","title":"SimpleAuth Service","description":"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.","sidebar":"tutorialSidebar"},"development/custom-data-with-the-apiserver":{"id":"development/custom-data-with-the-apiserver","title":"Custom data with the APIServer","description":"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.","sidebar":"tutorialSidebar"},"development/development-mode-with-gitpod":{"id":"development/development-mode-with-gitpod","title":"Development with Gitpod","description":"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.","sidebar":"tutorialSidebar"},"development/extending-the-ctl":{"id":"development/extending-the-ctl","title":"Extending the Command-Line Tool","description":"Routr\'s command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.","sidebar":"tutorialSidebar"},"development/introduction":{"id":"development/introduction","title":"Introduction","description":"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you\'ll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.","sidebar":"tutorialSidebar"},"development/metrics-events-logs-and-traces":{"id":"development/metrics-events-logs-and-traces","title":"Everything about MELT","description":"Comin soon."},"development/orchestration-with-docker":{"id":"development/orchestration-with-docker","title":"Orchestration with Docker","description":"Coming soon."},"development/orchestration-with-kubernetes":{"id":"development/orchestration-with-kubernetes","title":"Orchestration with Kubernetes","description":"Coming soon."},"development/quick-start":{"id":"development/quick-start","title":"Quick Start","description":"Before starting the development, you need to install the following tools:","sidebar":"tutorialSidebar"},"development/testing-with-seet":{"id":"development/testing-with-seet","title":"Testing with SEET","description":"Coming soon."},"faqs":{"id":"faqs","title":"FAQs","description":"What is Routr?","sidebar":"tutorialSidebar"},"overview/architecture":{"id":"overview/architecture","title":"Architecture","description":"Routr\'s architecture diagram","sidebar":"tutorialSidebar"},"overview/concepts":{"id":"overview/concepts","title":"Concepts","description":"Routr\'s approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.","sidebar":"tutorialSidebar"},"overview/deploy-with-docker":{"id":"overview/deploy-with-docker","title":"Deploy with Docker","description":"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.","sidebar":"tutorialSidebar"},"overview/introduction":{"id":"overview/introduction","title":"introduction","description":"Community banner","sidebar":"tutorialSidebar"},"tutorials/deploying-to-civo-with-helm":{"id":"tutorials/deploying-to-civo-with-helm","title":"Deploying to Civo with Helm","description":"Coming soon."},"tutorials/ephemeral-agents-in-the-browser":{"id":"tutorials/ephemeral-agents-in-the-browser","title":"Ephemeral Agents in the Browser","description":"Coming soon."},"tutorials/intercom-system-with-routr-and-kubernetes":{"id":"tutorials/intercom-system-with-routr-and-kubernetes","title":"Intercom System with Routr and Kubernetes","description":"Coming soon."},"tutorials/load-balancing-asterisk-with-routr":{"id":"tutorials/load-balancing-asterisk-with-routr","title":"Load-balancing Asterisk with Routr","description":"Coming soon."}}}')}}]); \ No newline at end of file diff --git a/assets/js/943e77c3.86023bb0.js b/assets/js/943e77c3.86023bb0.js deleted file mode 100644 index 1bc6748d8..000000000 --- a/assets/js/943e77c3.86023bb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[867],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},l=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=c(r),m=a,y=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return r?n.createElement(y,p(p({ref:t},l),{},{components:r})):n.createElement(y,p({ref:t},l))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:a,p[1]=i;for(var c=2;c<o;c++)p[c]=r[c];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},8148:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={},p="createGateway",i={unversionedId:"api/gateways/create",id:"version-1.x.x/api/gateways/create",title:"createGateway",description:"Creates a new Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/create.md",sourceDirName:"api/gateways",slug:"/api/gateways/create",permalink:"/docs/1.x.x/api/gateways/create",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"},next:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"}},s={},c=[],l={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"creategateway"},"createGateway"),(0,a.kt)("p",null,"Creates a new Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/gateways")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/configuration/gateways"},"Gateway")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method creates a Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/gateways\n{\n "apiVersion": "v1beta1",\n "kind": "Gateway",\n "metadata": {\n "name": "Provider Inc."\n },\n "spec": {\n "host": "sip.provider.net",\n "credentials": {\n "username": "youruser",\n "secret": "yoursecret"\n },\n "transport": "udp"\n }\n}\n\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "gw5c77t2"\n}\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/943e77c3.c18b42bc.js b/assets/js/943e77c3.c18b42bc.js new file mode 100644 index 000000000..7d7fdc5fd --- /dev/null +++ b/assets/js/943e77c3.c18b42bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1224],{9334:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>d});var r=n(4848),s=n(8453);const a={},o="createGateway",c={id:"api/gateways/create",title:"createGateway",description:"Creates a new Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/create.md",sourceDirName:"api/gateways",slug:"/api/gateways/create",permalink:"/docs/1.x.x/api/gateways/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"},next:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"}},i={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"creategateway",children:"createGateway"}),"\n",(0,r.jsx)(t.p,{children:"Creates a new Gateway resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/gateways"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"POST"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(t.p,{children:["A file containing a ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/configuration/gateways",children:"Gateway"})," resource in ",(0,r.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method creates a Gateway resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/gateways\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Gateway",\n\t"metadata": {\n\t\t"name": "Provider Inc."\n\t},\n\t"spec": {\n\t\t"host": "sip.provider.net",\n\t\t"credentials": {\n\t\t\t"username": "youruser",\n\t\t\t"secret": "yoursecret"\n\t\t},\n\t\t"transport": "udp"\n\t}\n}\n\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "gw5c77t2"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},a=r.createContext(s);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1426.99e9e261.js b/assets/js/9462.7d4144d6.js similarity index 76% rename from assets/js/1426.99e9e261.js rename to assets/js/9462.7d4144d6.js index 166dc777d..63d42f331 100644 --- a/assets/js/1426.99e9e261.js +++ b/assets/js/9462.7d4144d6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1426],{1426:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];r&&clearTimeout(r),r=setTimeout((function(){return e.apply(void 0,o)}),t)}}function o(e){return e!==Object(e)}function i(e,t){if(e===t)return!0;if(o(e)||o(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var r=0,n=Object.keys(e);r<n.length;r++){var a=n[r];if(!(a in t))return!1;if(!i(e[a],t[a]))return!1}return!0}r.r(t),r.d(t,{DocSearchModal:()=>pn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var s=["items"],f=["items"];function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function p(e){return function(e){if(Array.isArray(e))return v(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return v(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return v(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function d(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?y(Object(r),!0).forEach((function(t){b(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):y(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function b(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==m(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===m(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function g(e){return e.map((function(e){var t=e.items,r=d(e,s);return h(h({},r),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||r.objectIDs})}))}function O(e){var t,r,n,o=(t=l((e.version||"").split(".").map(Number),2),r=t[0],n=t[1],r>=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n<e.objectIDs.length;n+=t)r.push(h(h({},e),{},{objectIDs:e.objectIDs.slice(n,n+t)}));return r}(h(h({},n),{},{objectIDs:(null==r?void 0:r.map((function(e){return e.objectID})))||n.objectIDs})).map((function(e){return{items:r,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function I(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function D(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?I(Object(r),!0).forEach((function(t){A(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):I(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function A(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==w(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==w(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===w(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k="2.6.0",x="https://cdn.jsdelivr.net/npm/search-insights@".concat(k,"/dist/search-insights.min.js"),C=n((function(e){var t=e.onItemsChange,r=e.items,n=e.insights,o=e.state;t({insights:n,insightsEvents:S({items:r}).map((function(e){return D({eventName:"Items Viewed"},e)})),state:o})}),400);function _(e){var t=function(e){return D({onItemsChange:function(e){var t=e.insights,r=e.insightsEvents;t.viewedObjectIDs.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onSelect:function(e){var t=e.insights,r=e.insightsEvents;t.clickedObjectIDsAfterSearch.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onActive:a},e)}(e),r=t.insightsClient,o=t.onItemsChange,l=t.onSelect,u=t.onActive,s=r;r||function(e){if("undefined"!=typeof window)e({window:window})}((function(e){var t=e.window,r=t.AlgoliaAnalyticsObject||"aa";"string"==typeof r&&(s=t[r]),s||(t.AlgoliaAnalyticsObject=r,t[r]||(t[r]=function(){t[r].queue||(t[r].queue=[]);for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];t[r].queue.push(n)}),t[r].version=k,s=t[r],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var r=e.document.createElement("script");r.async=!0,r.src=x,r.onerror=function(){console.error(t)},document.body.appendChild(r)}catch(n){console.error(t)}}(t))}));var f=O(s),m={current:[]},p=n((function(e){var t=e.state;if(t.isOpen){var r=t.collections.reduce((function(e,t){return[].concat(E(e),E(t.items))}),[]).filter(j);i(m.current.map((function(e){return e.objectID})),r.map((function(e){return e.objectID})))||(m.current=r,r.length>0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==N(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==N(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===N(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){q(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({},o);o=e(o,{type:n,props:t,payload:i}),r({state:o,prevState:a})},pendingRequests:(n=[],{add:function(e){return n.push(e),e.finally((function(){n=n.filter((function(t){return t!==e}))}))},cancelAll:function(){n.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===n.length}})}}function L(e){return e.reduce((function(e,t){return e.concat(t)}),[])}function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?H(Object(r),!0).forEach((function(t){U(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):H(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function U(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==M(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==M(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===M(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function B(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var V=0;function K(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?K(Object(r),!0).forEach((function(t){J(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):K(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function J(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==z(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==z(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===z(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function z(e){return z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},z(e)}function W(e){return W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},W(e)}function Q(e){return function(e){if(Array.isArray(e))return Z(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Z(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function G(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function X(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?G(Object(r),!0).forEach((function(t){Y(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):G(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Y(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==W(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==W(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===W(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ee(e,t){var r,n="undefined"!=typeof window?window:{},o=e.plugins||[];return X(X({debug:!1,openOnFocus:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:!1,environment:n,shouldPanelOpen:function(e){return B(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?re(Object(r),!0).forEach((function(t){oe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):re(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function oe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==te(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function ae(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ce(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ae(Object(r),!0).forEach((function(t){le(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ae(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function le(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ie(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ie(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ie(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ue(e){return function(e){if(Array.isArray(e))return se(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return se(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return se(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function fe(e){return Boolean(e.execute)}function me(e,t,r){if(o=e,Boolean(null==o?void 0:o.execute)){var n="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(ue(Object.keys(r.context).map((function(e){var t;return null===(t=r.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return ce(ce({},e),{},{requests:e.queries.map((function(r){return{query:"algolia"===e.requesterId?ce(ce({},r),{},{params:ce(ce({},n),r.params)}):r,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}function pe(e){var t=e.reduce((function(e,t){if(!fe(t))return e.push(t),e;var r=t.searchClient,n=t.execute,o=t.requesterId,i=t.requests,a=e.find((function(e){return fe(t)&&fe(e)&&e.searchClient===r&&Boolean(o)&&e.requesterId===o}));if(a){var c;(c=a.items).push.apply(c,ue(i))}else{var l={execute:n,requesterId:o,items:i,searchClient:r};e.push(l)}return e}),[]).map((function(e){if(!fe(e))return Promise.resolve(e);var t=e,r=t.execute,n=t.items;return r({searchClient:t.searchClient,requests:n})}));return Promise.all(t).then((function(e){return L(e)}))}function ve(e,t,r){return t.map((function(t){var n,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),a=o[0].transformResponse,c=a?a({results:n=i,hits:n.map((function(e){return e.hits})).filter(Boolean),facetHits:n.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:c,state:r.getState()}),Array.isArray(c),c.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:c}}))}function de(e,t){var r=t;return{then:function(t,n){return de(e.then(be(t,r,e),be(n,r,e)),r)},catch:function(t){return de(e.catch(be(t,r,e)),r)},finally:function(t){return t&&r.onCancelList.push(t),de(e.finally(be(t&&function(){return r.onCancelList=[],t()},r,e)),r)},cancel:function(){r.isCanceled=!0;var e=r.onCancelList;r.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===r.isCanceled}}}function ye(e){return de(new Promise((function(t,r){return e(t,r)})),{isCanceled:!1,onCancelList:[]})}function he(e){return de(e,{isCanceled:!1,onCancelList:[]})}function be(e,t,r){return e?function(r){return t.isCanceled?r:e(r)}:r}function ge(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,r){var n=(e[r-1]||0)+t;return e.push(n),e}),[]).reduce((function(t,r){return r<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var r=t.items[function(e){for(var t=e.state,r=e.collection,n=!1,o=0,i=0;!1===n;){var a=t.collections[o];if(a===r){n=!0;break}i+=a.items.length,o++}return t.activeItemId-i}({state:e,collection:t})],n=t.source;return{item:r,itemInputValue:n.getItemInputValue({item:r,state:e}),itemUrl:n.getItemUrl({item:r,state:e}),source:n}}function Oe(e){return Oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Oe(e)}ye.resolve=function(e){return he(Promise.resolve(e))},ye.reject=function(e){return he(Promise.reject(e))};var Se=["event","nextState","props","query","refresh","store"];function je(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function we(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?je(Object(r),!0).forEach((function(t){Ee(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):je(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Ee(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Oe(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Oe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Pe(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t<De?Ae:(De=t,Ae=e,e)}))});function Ce(e){var t=e.event,r=e.nextState,n=void 0===r?{}:r,o=e.props,i=e.query,a=e.refresh,c=e.store,l=Pe(e,Se);ke&&o.environment.clearTimeout(ke);var u=l.setCollections,s=l.setIsOpen,f=l.setQuery,m=l.setActiveItemId,p=l.setStatus;if(f(i),m(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=c.getState().collections.map((function(e){return we(we({},e),{},{items:[]})}));p("idle"),u(d),s(null!==(v=n.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:c.getState()}));var y=he(xe(d).then((function(){return Promise.resolve()})));return c.pendingRequests.add(y)}p("loading"),ke=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var h=he(xe(o.getSources(we({query:i,refresh:a,state:c.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(we({query:i,refresh:a,state:c.getState()},l))).then((function(t){return me(t,e.sourceId,c.getState())}))}))).then(pe).then((function(t){return ve(t,e,c)})).then((function(e){return function(e){var t=e.collections,r=e.props,n=e.state,o=t.reduce((function(e,t){return ne(ne({},e),{},oe({},t.source.sourceId,ne(ne({},t.source),{},{getItems:function(){return L(t.items)}})))}),{}),i=r.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:o,state:n}).sourcesBySourceId;return L(r.reshape({sourcesBySourceId:i,sources:Object.values(i),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:c.getState()})}))})))).then((function(e){var r;p("idle"),u(e);var f=o.shouldPanelOpen({state:c.getState()});s(null!==(r=n.isOpen)&&void 0!==r?r:o.openOnFocus&&!i&&f||f);var m=ge(c.getState());if(null!==c.getState().activeItemId&&m){var v=m.item,d=m.itemInputValue,y=m.itemUrl,h=m.source;h.onActive(we({event:t,item:v,itemInputValue:d,itemUrl:y,refresh:a,source:h,state:c.getState()},l))}})).finally((function(){p("idle"),ke&&o.environment.clearTimeout(ke)}));return c.pendingRequests.add(h)}function _e(e){return _e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_e(e)}var Ne=["event","props","refresh","store"];function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function qe(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Te(Object(r),!0).forEach((function(t){Re(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Te(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Re(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_e(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_e(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_e(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Le(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ze(Object(r),!0).forEach((function(t){Qe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ze(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Qe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==He(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==He(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===He(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ze(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,Ne);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?et(Object(r),!0).forEach((function(t){rt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):et(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function rt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Ye(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Ye(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nt(e){var t,r,n,o,i=e.plugins,a=e.options,c=null===(t=((null===(r=a.__autocomplete_metadata)||void 0===r?void 0:r.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=c?rt({},c,Object.keys((null===(n=a.__autocomplete_metadata)||void 0===n?void 0:n.options)||{})):{};return{plugins:i.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:tt({"autocomplete-core":Object.keys(a)},l),ua:Xe.concat((null===(o=a.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function ot(e){var t,r=e.state;return!1===r.isOpen||null===r.activeItemId?null:(null===(t=ge(r))||void 0===t?void 0:t.itemInputValue)||null}function it(e,t,r,n){if(!r)return null;if(e<0&&(null===t||null!==n&&0===t))return r+e;var o=(null===t?-1:t)+e;return o<=-1||o>=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ct(Object(r),!0).forEach((function(t){ut(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ct(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function ut(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==at(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var st=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return lt(lt({},e),{},{activeItemId:t.payload});case"setQuery":return lt(lt({},e),{},{query:t.payload,completion:null});case"setCollections":return lt(lt({},e),{},{collections:t.payload});case"setIsOpen":return lt(lt({},e),{},{isOpen:t.payload});case"setStatus":return lt(lt({},e),{},{status:t.payload});case"setContext":return lt(lt({},e),{},{context:lt(lt({},e.context),t.payload)});case"ArrowDown":var r=lt(lt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:it(1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},r),{},{completion:ot({state:r})});case"ArrowUp":var n=lt(lt({},e),{},{activeItemId:it(-1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},n),{},{completion:ot({state:n})});case"Escape":return e.isOpen?lt(lt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):lt(lt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return lt(lt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return lt(lt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",query:""});case"focus":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:lt(lt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function ft(e){return ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ft(e)}function mt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function pt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?mt(Object(r),!0).forEach((function(t){vt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):mt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function vt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ft(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ft(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ft(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function dt(e){var t=[],r=ee(e,t),n=R(st,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(pt({prevState:t,state:n,refresh:a,navigator:r.navigator},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return F(F({},e),{},{items:L(e.items).map((function(e){return F(F({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=Ge(pt({props:r,refresh:a,store:n,navigator:r.navigator},o));function a(){return Ce(pt({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,navigator:r.navigator,query:n.getState().query,refresh:a,store:n},o))}if(e.insights&&!r.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var c="boolean"==typeof e.insights?{}:e.insights;r.plugins.push(_(c))}return r.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,pt(pt({},o),{},{navigator:r.navigator,refresh:a,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var i=o.document.createElement("meta"),a=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(n),a.appendChild(i)}),0)}}({metadata:nt({plugins:r.plugins,options:e}),environment:r.environment}),pt(pt({refresh:a,navigator:r.navigator},i),o)}var yt=r(7294),ht=64;function bt(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return yt.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},yt.createElement("span",{className:"DocSearch-Label"},n),yt.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},yt.createElement("defs",null,yt.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),yt.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),yt.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),yt.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),yt.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),yt.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function gt(e){return yt.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},yt.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ot(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,i=r.selectKeyAriaLabel,a=void 0===i?"Enter key":i,c=r.navigateText,l=void 0===c?"to navigate":c,u=r.navigateUpKeyAriaLabel,s=void 0===u?"Arrow up":u,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,v=void 0===p?"to close":p,d=r.closeKeyAriaLabel,y=void 0===d?"Escape key":d,h=r.searchByText,b=void 0===h?"Search by":h;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Logo"},yt.createElement(bt,{translations:{searchByText:b}})),yt.createElement("ul",{className:"DocSearch-Commands"},yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:a},yt.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),yt.createElement("span",{className:"DocSearch-Label"},o)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:m},yt.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:s},yt.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),yt.createElement("span",{className:"DocSearch-Label"},l)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:y},yt.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),yt.createElement("span",{className:"DocSearch-Label"},v))))}function St(e){var t=e.hit,r=e.children;return yt.createElement("a",{href:t.url},r)}function jt(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function wt(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,i=r.helpText,a=void 0===i?"You might want to check your network connection.":i;return yt.createElement("div",{className:"DocSearch-ErrorScreen"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(jt,null)),yt.createElement("p",{className:"DocSearch-Title"},o),yt.createElement("p",{className:"DocSearch-Help"},a))}function Et(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Pt=["translations"];function It(e){return function(e){if(Array.isArray(e))return Dt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Dt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Dt(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Dt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function At(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(Nt,null);default:return yt.createElement(_t,null)}}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Rt(Object(r),!0).forEach((function(t){Mt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Rt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Mt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ht(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Kt(){return Kt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Kt.apply(this,arguments)}function $t(e){return e.collection&&0!==e.collection.items.length?yt.createElement("section",{className:"DocSearch-Hits"},yt.createElement("div",{className:"DocSearch-Hit-source"},e.title),yt.createElement("ul",e.getListProps(),e.collection.items.map((function(t,r){return yt.createElement(Jt,Kt({key:[e.title,t.objectID].join(":"),item:t,index:r},e))})))):null}function Jt(e){var t=e.item,r=e.index,n=e.renderIcon,o=e.renderAction,i=e.getItemProps,a=e.onItemClick,c=e.collection,l=e.hitComponent,u=Bt(yt.useState(!1),2),s=u[0],f=u[1],m=Bt(yt.useState(!1),2),p=m[0],v=m[1],d=yt.useRef(null),y=l;return yt.createElement("li",Kt({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",s&&"DocSearch-Hit--deleting",p&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){d.current&&d.current()}},i({item:t,source:c.source,onClick:function(e){a(t,e)}})),yt.createElement(y,{hit:t},yt.createElement("div",{className:"DocSearch-Hit-Container"},n({item:t,index:r}),t.hierarchy[t.type]&&"lvl1"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),o({item:t,runDeleteTransition:function(e){f(!0),d.current=e},runFavoriteTransition:function(e){v(!0),d.current=e}}))))}var zt=/(<mark>|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Zt.apply(this,arguments)}function Gt(e){return yt.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var r=Qt(t.items[0]);return yt.createElement($t,Zt({},e,{key:t.source.sourceId,title:r,collection:t,renderIcon:function(e){var r,n=e.item,o=e.index;return yt.createElement(yt.Fragment,null,n.__docsearch_parent&&yt.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},n.__docsearch_parent!==(null===(r=t.items[o+1])||void 0===r?void 0:r.__docsearch_parent)?yt.createElement("path",{d:"M8 6v21M20 27H8.3"}):yt.createElement("path",{d:"M8 6v42M20 27H8.3"}))),yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Ct,{type:n.type})))},renderAction:function(){return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement(Tt,null))}}))})),e.resultsFooterComponent&&yt.createElement("section",{className:"DocSearch-HitsFooter"},yt.createElement(e.resultsFooterComponent,{state:e.state})))}function Xt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),yt.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Yt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function er(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var tr=["translations"];function rr(){return rr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},rr.apply(this,arguments)}function nr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ar.apply(this,arguments)}function cr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(830),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},mr.apply(this,arguments)}function pr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+t<r)})));i(a)})();const r=JSON.stringify(t);return o()[r]})).then((e=>Promise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.20.0",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function _r(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const Nr={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>_r(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===Nr.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==Nr.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>_r(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===Nr.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:Nr.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};function Gr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}})}})}Gr.version=Pr;const Xr=Gr;var Yr="3.5.2";function en(){}function tn(e){return e}function rn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function nn(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var on=["footer","searchBox"];function an(){return an=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},an.apply(this,arguments)}function cn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ln(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?cn(Object(r),!0).forEach((function(t){un(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):cn(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function un(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function sn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return fn(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return fn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function fn(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function mn(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?en:l,s=e.transformItems,f=void 0===s?tn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?tn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,_=mn(I,on),N=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=N[0],q=N[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Xr(e,t);return n.addAlgoliaAgent("docsearch",Yr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",Yr),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:ln({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=nn(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length<Object.keys(p).length&&l({searchSuggestions:Object.keys(p)}),l({nbHits:s});var v={};return m&&(v={__autocomplete_indexName:n,__autocomplete_queryID:o.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:r}}),Object.values(p).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(nn(e,(function(e){return e.hierarchy.lvl1}),c)).map(f).map((function(e){return e.map((function(t){var r=null,n=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&n&&(r=n),ln(ln({},t),{},{__docsearch_parent:r},v)}))})).flat()}}}))}))}})}),[n,a,c,K,u,J,$,z,V,i,y,f,j,k,t,r]),Z=Q.getEnvironmentProps,G=Q.getRootProps,X=Q.refresh;return function(e){var t=e.getEnvironmentProps,r=e.panelElement,n=e.formElement,o=e.inputElement;yt.useEffect((function(){if(r&&n&&o){var e=t({panelElement:r,formElement:n,inputElement:o}),i=e.onTouchStart,a=e.onTouchMove;return window.addEventListener("touchstart",i),window.addEventListener("touchmove",a),function(){window.removeEventListener("touchstart",i),window.removeEventListener("touchmove",a)}}}),[t,r,n,o])}({getEnvironmentProps:Z,panelElement:H.current,formElement:M.current,inputElement:F.current}),function(e){var t=e.container;yt.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),r=e[0],n=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===r&&(e.preventDefault(),n.focus()):document.activeElement===n&&(e.preventDefault(),r.focus()))}}),[t])}({container:R.current}),yt.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,b)}}),[]),yt.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(U.current=5)}),[]),yt.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[T.query]),yt.useEffect((function(){V.length>0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",an({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,an({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,an({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:_,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),rn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9462],{9462:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];r&&clearTimeout(r),r=setTimeout((function(){return e.apply(void 0,o)}),t)}}function o(e){return e!==Object(e)}function i(e,t){if(e===t)return!0;if(o(e)||o(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var r=0,n=Object.keys(e);r<n.length;r++){var a=n[r];if(!(a in t))return!1;if(!i(e[a],t[a]))return!1}return!0}r.r(t),r.d(t,{DocSearchModal:()=>pn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var s=["items"],f=["items"];function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function p(e){return function(e){if(Array.isArray(e))return v(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return v(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return v(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function d(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?y(Object(r),!0).forEach((function(t){b(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):y(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function b(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==m(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===m(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function g(e){return e.map((function(e){var t=e.items,r=d(e,s);return h(h({},r),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||r.objectIDs})}))}function O(e){var t,r,n,o=(t=l((e.version||"").split(".").map(Number),2),r=t[0],n=t[1],r>=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n<e.objectIDs.length;n+=t)r.push(h(h({},e),{},{objectIDs:e.objectIDs.slice(n,n+t)}));return r}(h(h({},n),{},{objectIDs:(null==r?void 0:r.map((function(e){return e.objectID})))||n.objectIDs})).map((function(e){return{items:r,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function I(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function D(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?I(Object(r),!0).forEach((function(t){A(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):I(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function A(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==w(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==w(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===w(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k="2.6.0",x="https://cdn.jsdelivr.net/npm/search-insights@".concat(k,"/dist/search-insights.min.js"),C=n((function(e){var t=e.onItemsChange,r=e.items,n=e.insights,o=e.state;t({insights:n,insightsEvents:S({items:r}).map((function(e){return D({eventName:"Items Viewed"},e)})),state:o})}),400);function _(e){var t=function(e){return D({onItemsChange:function(e){var t=e.insights,r=e.insightsEvents;t.viewedObjectIDs.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onSelect:function(e){var t=e.insights,r=e.insightsEvents;t.clickedObjectIDsAfterSearch.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onActive:a},e)}(e),r=t.insightsClient,o=t.onItemsChange,l=t.onSelect,u=t.onActive,s=r;r||function(e){if("undefined"!=typeof window)e({window:window})}((function(e){var t=e.window,r=t.AlgoliaAnalyticsObject||"aa";"string"==typeof r&&(s=t[r]),s||(t.AlgoliaAnalyticsObject=r,t[r]||(t[r]=function(){t[r].queue||(t[r].queue=[]);for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];t[r].queue.push(n)}),t[r].version=k,s=t[r],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var r=e.document.createElement("script");r.async=!0,r.src=x,r.onerror=function(){console.error(t)},document.body.appendChild(r)}catch(n){console.error(t)}}(t))}));var f=O(s),m={current:[]},p=n((function(e){var t=e.state;if(t.isOpen){var r=t.collections.reduce((function(e,t){return[].concat(E(e),E(t.items))}),[]).filter(j);i(m.current.map((function(e){return e.objectID})),r.map((function(e){return e.objectID})))||(m.current=r,r.length>0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==N(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==N(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===N(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){q(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({},o);o=e(o,{type:n,props:t,payload:i}),r({state:o,prevState:a})},pendingRequests:(n=[],{add:function(e){return n.push(e),e.finally((function(){n=n.filter((function(t){return t!==e}))}))},cancelAll:function(){n.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===n.length}})}}function L(e){return e.reduce((function(e,t){return e.concat(t)}),[])}function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?H(Object(r),!0).forEach((function(t){U(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):H(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function U(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==M(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==M(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===M(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function B(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var V=0;function K(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?K(Object(r),!0).forEach((function(t){J(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):K(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function J(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==z(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==z(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===z(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function z(e){return z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},z(e)}function W(e){return W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},W(e)}function Q(e){return function(e){if(Array.isArray(e))return Z(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Z(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function G(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function X(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?G(Object(r),!0).forEach((function(t){Y(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):G(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Y(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==W(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==W(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===W(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ee(e,t){var r,n="undefined"!=typeof window?window:{},o=e.plugins||[];return X(X({debug:!1,openOnFocus:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:!1,environment:n,shouldPanelOpen:function(e){return B(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?re(Object(r),!0).forEach((function(t){oe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):re(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function oe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==te(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function ae(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ce(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ae(Object(r),!0).forEach((function(t){le(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ae(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function le(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ie(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ie(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ie(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ue(e){return function(e){if(Array.isArray(e))return se(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return se(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return se(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function fe(e){return Boolean(e.execute)}function me(e,t,r){if(o=e,Boolean(null==o?void 0:o.execute)){var n="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(ue(Object.keys(r.context).map((function(e){var t;return null===(t=r.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return ce(ce({},e),{},{requests:e.queries.map((function(r){return{query:"algolia"===e.requesterId?ce(ce({},r),{},{params:ce(ce({},n),r.params)}):r,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}function pe(e){var t=e.reduce((function(e,t){if(!fe(t))return e.push(t),e;var r=t.searchClient,n=t.execute,o=t.requesterId,i=t.requests,a=e.find((function(e){return fe(t)&&fe(e)&&e.searchClient===r&&Boolean(o)&&e.requesterId===o}));if(a){var c;(c=a.items).push.apply(c,ue(i))}else{var l={execute:n,requesterId:o,items:i,searchClient:r};e.push(l)}return e}),[]).map((function(e){if(!fe(e))return Promise.resolve(e);var t=e,r=t.execute,n=t.items;return r({searchClient:t.searchClient,requests:n})}));return Promise.all(t).then((function(e){return L(e)}))}function ve(e,t,r){return t.map((function(t){var n,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),a=o[0].transformResponse,c=a?a({results:n=i,hits:n.map((function(e){return e.hits})).filter(Boolean),facetHits:n.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:c,state:r.getState()}),Array.isArray(c),c.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:c}}))}function de(e,t){var r=t;return{then:function(t,n){return de(e.then(be(t,r,e),be(n,r,e)),r)},catch:function(t){return de(e.catch(be(t,r,e)),r)},finally:function(t){return t&&r.onCancelList.push(t),de(e.finally(be(t&&function(){return r.onCancelList=[],t()},r,e)),r)},cancel:function(){r.isCanceled=!0;var e=r.onCancelList;r.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===r.isCanceled}}}function ye(e){return de(new Promise((function(t,r){return e(t,r)})),{isCanceled:!1,onCancelList:[]})}function he(e){return de(e,{isCanceled:!1,onCancelList:[]})}function be(e,t,r){return e?function(r){return t.isCanceled?r:e(r)}:r}function ge(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,r){var n=(e[r-1]||0)+t;return e.push(n),e}),[]).reduce((function(t,r){return r<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var r=t.items[function(e){for(var t=e.state,r=e.collection,n=!1,o=0,i=0;!1===n;){var a=t.collections[o];if(a===r){n=!0;break}i+=a.items.length,o++}return t.activeItemId-i}({state:e,collection:t})],n=t.source;return{item:r,itemInputValue:n.getItemInputValue({item:r,state:e}),itemUrl:n.getItemUrl({item:r,state:e}),source:n}}function Oe(e){return Oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Oe(e)}ye.resolve=function(e){return he(Promise.resolve(e))},ye.reject=function(e){return he(Promise.reject(e))};var Se=["event","nextState","props","query","refresh","store"];function je(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function we(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?je(Object(r),!0).forEach((function(t){Ee(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):je(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Ee(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Oe(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Oe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Pe(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t<De?Ae:(De=t,Ae=e,e)}))});function Ce(e){var t=e.event,r=e.nextState,n=void 0===r?{}:r,o=e.props,i=e.query,a=e.refresh,c=e.store,l=Pe(e,Se);ke&&o.environment.clearTimeout(ke);var u=l.setCollections,s=l.setIsOpen,f=l.setQuery,m=l.setActiveItemId,p=l.setStatus;if(f(i),m(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=c.getState().collections.map((function(e){return we(we({},e),{},{items:[]})}));p("idle"),u(d),s(null!==(v=n.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:c.getState()}));var y=he(xe(d).then((function(){return Promise.resolve()})));return c.pendingRequests.add(y)}p("loading"),ke=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var h=he(xe(o.getSources(we({query:i,refresh:a,state:c.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(we({query:i,refresh:a,state:c.getState()},l))).then((function(t){return me(t,e.sourceId,c.getState())}))}))).then(pe).then((function(t){return ve(t,e,c)})).then((function(e){return function(e){var t=e.collections,r=e.props,n=e.state,o=t.reduce((function(e,t){return ne(ne({},e),{},oe({},t.source.sourceId,ne(ne({},t.source),{},{getItems:function(){return L(t.items)}})))}),{}),i=r.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:o,state:n}).sourcesBySourceId;return L(r.reshape({sourcesBySourceId:i,sources:Object.values(i),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:c.getState()})}))})))).then((function(e){var r;p("idle"),u(e);var f=o.shouldPanelOpen({state:c.getState()});s(null!==(r=n.isOpen)&&void 0!==r?r:o.openOnFocus&&!i&&f||f);var m=ge(c.getState());if(null!==c.getState().activeItemId&&m){var v=m.item,d=m.itemInputValue,y=m.itemUrl,h=m.source;h.onActive(we({event:t,item:v,itemInputValue:d,itemUrl:y,refresh:a,source:h,state:c.getState()},l))}})).finally((function(){p("idle"),ke&&o.environment.clearTimeout(ke)}));return c.pendingRequests.add(h)}function _e(e){return _e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_e(e)}var Ne=["event","props","refresh","store"];function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function qe(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Te(Object(r),!0).forEach((function(t){Re(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Te(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Re(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_e(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_e(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_e(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Le(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ze(Object(r),!0).forEach((function(t){Qe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ze(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Qe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==He(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==He(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===He(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ze(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,Ne);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?et(Object(r),!0).forEach((function(t){rt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):et(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function rt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Ye(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Ye(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nt(e){var t,r,n,o,i=e.plugins,a=e.options,c=null===(t=((null===(r=a.__autocomplete_metadata)||void 0===r?void 0:r.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=c?rt({},c,Object.keys((null===(n=a.__autocomplete_metadata)||void 0===n?void 0:n.options)||{})):{};return{plugins:i.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:tt({"autocomplete-core":Object.keys(a)},l),ua:Xe.concat((null===(o=a.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function ot(e){var t,r=e.state;return!1===r.isOpen||null===r.activeItemId?null:(null===(t=ge(r))||void 0===t?void 0:t.itemInputValue)||null}function it(e,t,r,n){if(!r)return null;if(e<0&&(null===t||null!==n&&0===t))return r+e;var o=(null===t?-1:t)+e;return o<=-1||o>=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ct(Object(r),!0).forEach((function(t){ut(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ct(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function ut(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==at(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var st=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return lt(lt({},e),{},{activeItemId:t.payload});case"setQuery":return lt(lt({},e),{},{query:t.payload,completion:null});case"setCollections":return lt(lt({},e),{},{collections:t.payload});case"setIsOpen":return lt(lt({},e),{},{isOpen:t.payload});case"setStatus":return lt(lt({},e),{},{status:t.payload});case"setContext":return lt(lt({},e),{},{context:lt(lt({},e.context),t.payload)});case"ArrowDown":var r=lt(lt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:it(1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},r),{},{completion:ot({state:r})});case"ArrowUp":var n=lt(lt({},e),{},{activeItemId:it(-1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},n),{},{completion:ot({state:n})});case"Escape":return e.isOpen?lt(lt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):lt(lt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return lt(lt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return lt(lt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",query:""});case"focus":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:lt(lt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function ft(e){return ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ft(e)}function mt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function pt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?mt(Object(r),!0).forEach((function(t){vt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):mt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function vt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ft(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ft(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ft(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function dt(e){var t=[],r=ee(e,t),n=R(st,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(pt({prevState:t,state:n,refresh:a,navigator:r.navigator},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return F(F({},e),{},{items:L(e.items).map((function(e){return F(F({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=Ge(pt({props:r,refresh:a,store:n,navigator:r.navigator},o));function a(){return Ce(pt({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,navigator:r.navigator,query:n.getState().query,refresh:a,store:n},o))}if(e.insights&&!r.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var c="boolean"==typeof e.insights?{}:e.insights;r.plugins.push(_(c))}return r.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,pt(pt({},o),{},{navigator:r.navigator,refresh:a,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var i=o.document.createElement("meta"),a=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(n),a.appendChild(i)}),0)}}({metadata:nt({plugins:r.plugins,options:e}),environment:r.environment}),pt(pt({refresh:a,navigator:r.navigator},i),o)}var yt=r(6540),ht=64;function bt(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return yt.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},yt.createElement("span",{className:"DocSearch-Label"},n),yt.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},yt.createElement("defs",null,yt.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),yt.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),yt.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),yt.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),yt.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),yt.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function gt(e){return yt.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},yt.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ot(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,i=r.selectKeyAriaLabel,a=void 0===i?"Enter key":i,c=r.navigateText,l=void 0===c?"to navigate":c,u=r.navigateUpKeyAriaLabel,s=void 0===u?"Arrow up":u,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,v=void 0===p?"to close":p,d=r.closeKeyAriaLabel,y=void 0===d?"Escape key":d,h=r.searchByText,b=void 0===h?"Search by":h;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Logo"},yt.createElement(bt,{translations:{searchByText:b}})),yt.createElement("ul",{className:"DocSearch-Commands"},yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:a},yt.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),yt.createElement("span",{className:"DocSearch-Label"},o)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:m},yt.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:s},yt.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),yt.createElement("span",{className:"DocSearch-Label"},l)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:y},yt.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),yt.createElement("span",{className:"DocSearch-Label"},v))))}function St(e){var t=e.hit,r=e.children;return yt.createElement("a",{href:t.url},r)}function jt(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function wt(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,i=r.helpText,a=void 0===i?"You might want to check your network connection.":i;return yt.createElement("div",{className:"DocSearch-ErrorScreen"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(jt,null)),yt.createElement("p",{className:"DocSearch-Title"},o),yt.createElement("p",{className:"DocSearch-Help"},a))}function Et(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Pt=["translations"];function It(e){return function(e){if(Array.isArray(e))return Dt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Dt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Dt(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Dt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function At(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(Nt,null);default:return yt.createElement(_t,null)}}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Rt(Object(r),!0).forEach((function(t){Mt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Rt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Mt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ht(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Kt(){return Kt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Kt.apply(this,arguments)}function $t(e){return e.collection&&0!==e.collection.items.length?yt.createElement("section",{className:"DocSearch-Hits"},yt.createElement("div",{className:"DocSearch-Hit-source"},e.title),yt.createElement("ul",e.getListProps(),e.collection.items.map((function(t,r){return yt.createElement(Jt,Kt({key:[e.title,t.objectID].join(":"),item:t,index:r},e))})))):null}function Jt(e){var t=e.item,r=e.index,n=e.renderIcon,o=e.renderAction,i=e.getItemProps,a=e.onItemClick,c=e.collection,l=e.hitComponent,u=Bt(yt.useState(!1),2),s=u[0],f=u[1],m=Bt(yt.useState(!1),2),p=m[0],v=m[1],d=yt.useRef(null),y=l;return yt.createElement("li",Kt({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",s&&"DocSearch-Hit--deleting",p&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){d.current&&d.current()}},i({item:t,source:c.source,onClick:function(e){a(t,e)}})),yt.createElement(y,{hit:t},yt.createElement("div",{className:"DocSearch-Hit-Container"},n({item:t,index:r}),t.hierarchy[t.type]&&"lvl1"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),o({item:t,runDeleteTransition:function(e){f(!0),d.current=e},runFavoriteTransition:function(e){v(!0),d.current=e}}))))}var zt=/(<mark>|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Zt.apply(this,arguments)}function Gt(e){return yt.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var r=Qt(t.items[0]);return yt.createElement($t,Zt({},e,{key:t.source.sourceId,title:r,collection:t,renderIcon:function(e){var r,n=e.item,o=e.index;return yt.createElement(yt.Fragment,null,n.__docsearch_parent&&yt.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},n.__docsearch_parent!==(null===(r=t.items[o+1])||void 0===r?void 0:r.__docsearch_parent)?yt.createElement("path",{d:"M8 6v21M20 27H8.3"}):yt.createElement("path",{d:"M8 6v42M20 27H8.3"}))),yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Ct,{type:n.type})))},renderAction:function(){return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement(Tt,null))}}))})),e.resultsFooterComponent&&yt.createElement("section",{className:"DocSearch-HitsFooter"},yt.createElement(e.resultsFooterComponent,{state:e.state})))}function Xt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),yt.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Yt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function er(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var tr=["translations"];function rr(){return rr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},rr.apply(this,arguments)}function nr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ar.apply(this,arguments)}function cr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(9188),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},mr.apply(this,arguments)}function pr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+t<r)})));i(a)})();const r=JSON.stringify(t);return o()[r]})).then((e=>Promise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.22.1",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function _r(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const Nr={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>_r(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===Nr.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==Nr.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>_r(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===Nr.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:Nr.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};function Gr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}})}})}Gr.version=Pr;const Xr=Gr;var Yr="3.5.2";function en(){}function tn(e){return e}function rn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function nn(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var on=["footer","searchBox"];function an(){return an=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},an.apply(this,arguments)}function cn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ln(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?cn(Object(r),!0).forEach((function(t){un(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):cn(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function un(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function sn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return fn(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return fn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function fn(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function mn(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?en:l,s=e.transformItems,f=void 0===s?tn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?tn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,_=mn(I,on),N=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=N[0],q=N[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Xr(e,t);return n.addAlgoliaAgent("docsearch",Yr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",Yr),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:ln({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=nn(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length<Object.keys(p).length&&l({searchSuggestions:Object.keys(p)}),l({nbHits:s});var v={};return m&&(v={__autocomplete_indexName:n,__autocomplete_queryID:o.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:r}}),Object.values(p).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(nn(e,(function(e){return e.hierarchy.lvl1}),c)).map(f).map((function(e){return e.map((function(t){var r=null,n=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&n&&(r=n),ln(ln({},t),{},{__docsearch_parent:r},v)}))})).flat()}}}))}))}})}),[n,a,c,K,u,J,$,z,V,i,y,f,j,k,t,r]),Z=Q.getEnvironmentProps,G=Q.getRootProps,X=Q.refresh;return function(e){var t=e.getEnvironmentProps,r=e.panelElement,n=e.formElement,o=e.inputElement;yt.useEffect((function(){if(r&&n&&o){var e=t({panelElement:r,formElement:n,inputElement:o}),i=e.onTouchStart,a=e.onTouchMove;return window.addEventListener("touchstart",i),window.addEventListener("touchmove",a),function(){window.removeEventListener("touchstart",i),window.removeEventListener("touchmove",a)}}}),[t,r,n,o])}({getEnvironmentProps:Z,panelElement:H.current,formElement:M.current,inputElement:F.current}),function(e){var t=e.container;yt.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),r=e[0],n=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===r&&(e.preventDefault(),n.focus()):document.activeElement===n&&(e.preventDefault(),r.focus()))}}),[t])}({container:R.current}),yt.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,b)}}),[]),yt.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(U.current=5)}),[]),yt.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[T.query]),yt.useEffect((function(){V.length>0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",an({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,an({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,an({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:_,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),rn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file diff --git a/assets/js/95069fb2.b3b4552d.js b/assets/js/95069fb2.b3b4552d.js new file mode 100644 index 000000000..4df64667c --- /dev/null +++ b/assets/js/95069fb2.b3b4552d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2358],{5203:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=t(4848),s=t(8453);const i={},o="updatePeer",c={id:"api/peers/update",title:"updatePeer",description:"Updates an existing Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/update.md",sourceDirName:"api/peers",slug:"/api/peers/update",permalink:"/docs/1.x.x/api/peers/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"},next:{title:"registry",permalink:"/docs/1.x.x/api/registry"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"updatepeer",children:"updatePeer"}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/peers/{ref}"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"PUT"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing a ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/peers",children:"Peer"})," resource in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"If successful this method updates a Peer resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/peers/pr2c77f4\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Peer",\n\t"metadata": {\n\t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n\t},\n\t"spec": {\n\t\t"credentials": {\n\t\t\t"username": "ast",\n\t\t\t"secret": "1234"\n\t\t}\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.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(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95069fb2.d264ec03.js b/assets/js/95069fb2.d264ec03.js deleted file mode 100644 index 6bffbd7ba..000000000 --- a/assets/js/95069fb2.d264ec03.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1408],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),l=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(i.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(r),m=a,f=c["".concat(i,".").concat(m)]||c[m]||d[m]||p;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var l=2;l<p;l++)o[l]=r[l];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},6499:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>p,metadata:()=>s,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const p={},o="updatePeer",s={unversionedId:"api/peers/update",id:"version-1.x.x/api/peers/update",title:"updatePeer",description:"Updates an existing Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/update.md",sourceDirName:"api/peers",slug:"/api/peers/update",permalink:"/docs/1.x.x/api/peers/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"},next:{title:"registry",permalink:"/docs/1.x.x/api/registry"}},i={},l=[],u={toc:l},c="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"updatepeer"},"updatePeer"),(0,a.kt)("p",null,"Updates an existing Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/peers/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"PUT")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/configuration/peers"},"Peer")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method updates a Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'PUT /api/v1beta1/peers/pr2c77f4\n{\n "apiVersion": "v1beta1",\n "kind": "Peer",\n "metadata": {\n "name": "Asterisk PBX",\n "ref": "pr2c77f4"\n },\n "spec": {\n "credentials": {\n "username": "ast",\n "secret": "1234"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/956a4ea6.65e6eb8e.js b/assets/js/956a4ea6.65e6eb8e.js new file mode 100644 index 000000000..393661e69 --- /dev/null +++ b/assets/js/956a4ea6.65e6eb8e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4050],{6009:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(4848),i=n(8453);const o={},d="Building a Middleware",s={id:"development/building-a-middleware",title:"Building a Middleware",description:"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.",source:"@site/docs/development/building-a-middleware.md",sourceDirName:"development",slug:"/development/building-a-middleware",permalink:"/docs/2.0.0/development/building-a-middleware",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-middleware.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"},next:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"}},a={},l=[];function c(e){const t={a:"a",h1:"h1",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"building-a-middleware",children:"Building a Middleware"}),"\n",(0,r.jsxs)(t.p,{children:["Building a Middleware is the same as ",(0,r.jsx)(t.a,{href:"/docs/2.0.0/development/building-a-processor",children:"building a Processor"}),". Both share the same protobuf definition. Please refer to the ",(0,r.jsx)(t.a,{href:"/docs/2.0.0/overview/concepts",children:"Concepts Overview"})," for more information on the differences between a Processor and a Middleware."]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>s});var r=n(6540);const i={},o=r.createContext(i);function d(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/956a4ea6.9e74849b.js b/assets/js/956a4ea6.9e74849b.js deleted file mode 100644 index 88e28beb9..000000000 --- a/assets/js/956a4ea6.9e74849b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1995],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>f});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function l(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var d=n.createContext({}),c=function(e){var r=n.useContext(d),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},s=function(e){var r=c(e.components);return n.createElement(d.Provider,{value:r},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,i=e.originalType,d=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=c(t),m=o,f=p["".concat(d,".").concat(m)]||p[m]||u[m]||i;return t?n.createElement(f,a(a({ref:r},s),{},{components:t})):n.createElement(f,a({ref:r},s))}));function f(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var i=t.length,a=new Array(i);a[0]=m;var l={};for(var d in r)hasOwnProperty.call(r,d)&&(l[d]=r[d]);l.originalType=e,l[p]="string"==typeof e?e:o,a[1]=l;for(var c=2;c<i;c++)a[c]=t[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,t)}m.displayName="MDXCreateElement"},4220:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=t(7462),o=(t(7294),t(3905));const i={},a="Building a Middleware",l={unversionedId:"development/building-a-middleware",id:"development/building-a-middleware",title:"Building a Middleware",description:"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.",source:"@site/docs/development/building-a-middleware.md",sourceDirName:"development",slug:"/development/building-a-middleware",permalink:"/docs/2.0.0/development/building-a-middleware",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-middleware.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"},next:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"}},d={},c=[],s={toc:c},p="wrapper";function u(e){let{components:r,...t}=e;return(0,o.kt)(p,(0,n.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"building-a-middleware"},"Building a Middleware"),(0,o.kt)("p",null,"Building a Middleware is the same as ",(0,o.kt)("a",{parentName:"p",href:"/docs/2.0.0/development/building-a-processor"},"building a Processor"),". Both share the same protobuf definition. Please refer to the ",(0,o.kt)("a",{parentName:"p",href:"/docs/2.0.0/overview/concepts"},"Concepts Overview")," for more information on the differences between a Processor and a Middleware."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9799683e.1d8d20ca.js b/assets/js/9799683e.1d8d20ca.js deleted file mode 100644 index 1ea388de1..000000000 --- a/assets/js/9799683e.1d8d20ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[12],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},s=Object.keys(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},l=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,p=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),c=u(n),d=a,f=c["".concat(p,".").concat(d)]||c[d]||m[d]||s;return n?r.createElement(f,o(o({ref:t},l),{},{components:n})):r.createElement(f,o({ref:t},l))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,o=new Array(s);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:a,o[1]=i;for(var u=2;u<s;u++)o[u]=n[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},9256:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var r=n(7462),a=(n(7294),n(3905));const s={},o="checkSystemStatus",i={unversionedId:"api/status/get",id:"version-1.x.x/api/status/get",title:"checkSystemStatus",description:"Pings an instance of Routr engine.",source:"@site/versioned_docs/version-1.x.x/api/status/get.md",sourceDirName:"api/status",slug:"/api/status/get",permalink:"/docs/1.x.x/api/status/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"registry",permalink:"/docs/1.x.x/api/registry"},next:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"}},p={},u=[],l={toc:u},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"checksystemstatus"},"checkSystemStatus"),(0,a.kt)("p",null,"Pings an instance of Routr engine."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/system/status")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful, this method will return a ",(0,a.kt)("inlineCode",{parentName:"p"},"status = 200"),'. A client implementing\nthis method can assumed that no answer or a bad answer means that the server\nus down or "unhealthy."'),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/system/status\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data": "up"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9799683e.8030dda4.js b/assets/js/9799683e.8030dda4.js new file mode 100644 index 000000000..3daedca22 --- /dev/null +++ b/assets/js/9799683e.8030dda4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6695],{1721:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var n=s(4848),r=s(8453);const i={},o="checkSystemStatus",c={id:"api/status/get",title:"checkSystemStatus",description:"Pings an instance of Routr engine.",source:"@site/versioned_docs/version-1.x.x/api/status/get.md",sourceDirName:"api/status",slug:"/api/status/get",permalink:"/docs/1.x.x/api/status/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"registry",permalink:"/docs/1.x.x/api/registry"},next:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"}},a={},d=[];function u(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"checksystemstatus",children:"checkSystemStatus"}),"\n",(0,n.jsx)(t.p,{children:"Pings an instance of Routr engine."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/system/status"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsxs)(t.p,{children:["If successful, this method will return a ",(0,n.jsx)(t.code,{children:"status = 200"}),'. A client implementing\nthis method can assumed that no answer or a bad answer means that the server\nus down or "unhealthy."']}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/system/status\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data": "up"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>c});var n=s(6540);const r={},i=n.createContext(r);function o(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9840208a.22624fd6.js b/assets/js/9840208a.22624fd6.js new file mode 100644 index 000000000..d0289f39a --- /dev/null +++ b/assets/js/9840208a.22624fd6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8167],{4321:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var s=t(4848),r=t(8453);const o={},a="createAgent",i={id:"api/agents/create",title:"createAgent",description:"Creates a new Agent resource. The Domain must exist before creating the Agent.",source:"@site/versioned_docs/version-1.x.x/api/agents/create.md",sourceDirName:"api/agents",slug:"/api/agents/create",permalink:"/docs/1.x.x/api/agents/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"overview",permalink:"/docs/1.x.x/api/overview"},next:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"}},c={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"createagent",children:"createAgent"}),"\n",(0,s.jsxs)(n.p,{children:["Creates a new Agent resource. The Domain must exist before creating the Agent.\nOtherwise, this method responds with a ",(0,s.jsx)(n.code,{children:"UNFULFILLED_DEPENDENCY_RESPONSE"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/agents"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"POST"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing an ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/agents",children:"Agent"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method creates an Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/agents\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "ag3f77f6"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function a(e){const n=s.useContext(o);return s.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:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9840208a.8f21b249.js b/assets/js/9840208a.8f21b249.js deleted file mode 100644 index c53f41e99..000000000 --- a/assets/js/9840208a.8f21b249.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7851],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),c=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(g,i(i({ref:t},l),{},{components:n})):r.createElement(g,i({ref:t},l))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},9747:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={},i="createAgent",s={unversionedId:"api/agents/create",id:"version-1.x.x/api/agents/create",title:"createAgent",description:"Creates a new Agent resource. The Domain must exist before creating the Agent.",source:"@site/versioned_docs/version-1.x.x/api/agents/create.md",sourceDirName:"api/agents",slug:"/api/agents/create",permalink:"/docs/1.x.x/api/agents/create",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"overview",permalink:"/docs/1.x.x/api/overview"},next:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"}},p={},c=[],l={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"createagent"},"createAgent"),(0,a.kt)("p",null,"Creates a new Agent resource. The Domain must exist before creating the Agent.\nOtherwise, this method responds with a ",(0,a.kt)("inlineCode",{parentName:"p"},"UNFULFILLED_DEPENDENCY_RESPONSE"),"."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/agents")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing an ",(0,a.kt)("a",{parentName:"p",href:"/configuration/agents"},"Agent")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method creates an Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/agents\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe"\n },\n "spec": {\n "credentials": {\n "username": "1001",\n "secret": "1234"\n },\n "domains": [\n "sip.local"\n ]\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "ag3f77f6"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/99f83bea.8a078a9e.js b/assets/js/99f83bea.8a078a9e.js deleted file mode 100644 index 66b3d281f..000000000 --- a/assets/js/99f83bea.8a078a9e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9917],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=l(n),d=a,b=c["".concat(s,".").concat(d)]||c[d]||m[d]||o;return n?r.createElement(b,i(i({ref:t},u),{},{components:n})):r.createElement(b,i({ref:t},u))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[c]="string"==typeof e?e:a,i[1]=p;for(var l=2;l<o;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},9943:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>l});var r=n(7462),a=(n(7294),n(3905));const o={},i="createNumber",p={unversionedId:"api/numbers/create",id:"version-1.x.x/api/numbers/create",title:"createNumber",description:"Creates a new Number. The Gateway must exist before creating the Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/create.md",sourceDirName:"api/numbers",slug:"/api/numbers/create",permalink:"/docs/1.x.x/api/numbers/create",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"},next:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"}},s={},l=[],u={toc:l},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"createnumber"},"createNumber"),(0,a.kt)("p",null,"Creates a new Number. The Gateway must exist before creating the Number.\nOtherwise, this method responds with a ",(0,a.kt)("inlineCode",{parentName:"p"},"UNFULFILLED_DEPENDENCY_RESPONSE"),"."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/numbers")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/configuration/numbers"},"Number")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method creates a Number."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/numbers\n{\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "dd50baa4"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/99f83bea.e53f7fb4.js b/assets/js/99f83bea.e53f7fb4.js new file mode 100644 index 000000000..b5fbf021d --- /dev/null +++ b/assets/js/99f83bea.e53f7fb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4682],{1079:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=n(4848),s=n(8453);const i={},o="createNumber",c={id:"api/numbers/create",title:"createNumber",description:"Creates a new Number. The Gateway must exist before creating the Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/create.md",sourceDirName:"api/numbers",slug:"/api/numbers/create",permalink:"/docs/1.x.x/api/numbers/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"},next:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"}},a={},d=[];function l(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"createnumber",children:"createNumber"}),"\n",(0,r.jsxs)(t.p,{children:["Creates a new Number. The Gateway must exist before creating the Number.\nOtherwise, this method responds with a ",(0,r.jsx)(t.code,{children:"UNFULFILLED_DEPENDENCY_RESPONSE"}),"."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/numbers"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"POST"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(t.p,{children:["A file containing a ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/configuration/numbers",children:"Number"})," resource in ",(0,r.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method creates a Number."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/numbers\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Number",\n\t"metadata": {\n\t\t"gwRef": "gweef506",\n\t\t"geoInfo": {\n\t\t\t"city": "City, State",\n\t\t\t"country": "Country",\n\t\t\t"countryISOCode": "US"\n\t\t}\n\t},\n\t"spec": {\n\t\t"location": {\n\t\t\t"telUrl": "tel:0000000000",\n\t\t\t"aorLink": "sip:1001@sip.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "dd50baa4"\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a4dfeaa.58e82486.js b/assets/js/9a4dfeaa.58e82486.js deleted file mode 100644 index 31d718d7f..000000000 --- a/assets/js/9a4dfeaa.58e82486.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7580],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),i=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=i(r),d=a,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||p;return r?n.createElement(f,o(o({ref:t},c),{},{components:r})):n.createElement(f,o({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var i=2;i<p;i++)o[i]=r[i];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},7350:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>p,metadata:()=>l,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const p={},o="getPeer",l={unversionedId:"api/peers/get",id:"version-1.x.x/api/peers/get",title:"getPeer",description:"This method returns a Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/get.md",sourceDirName:"api/peers",slug:"/api/peers/get",permalink:"/docs/1.x.x/api/peers/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"},next:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"}},s={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getpeer"},"getPeer"),(0,a.kt)("p",null,"This method returns a Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/peers/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Peer",\n "metadata": {\n "name": "Asterisk PBX",\n "ref": "pr2c77f4"\n },\n "spec": {\n "credentials": {\n "username": "ast",\n "secret": "1234"\n }\n }\n }\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9a4dfeaa.a4107647.js b/assets/js/9a4dfeaa.a4107647.js new file mode 100644 index 000000000..faebf6ff0 --- /dev/null +++ b/assets/js/9a4dfeaa.a4107647.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7408],{8084:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>p,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var r=n(4848),s=n(8453);const i={},c="getPeer",d={id:"api/peers/get",title:"getPeer",description:"This method returns a Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/get.md",sourceDirName:"api/peers",slug:"/api/peers/get",permalink:"/docs/1.x.x/api/peers/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"},next:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"}},o={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"getpeer",children:"getPeer"}),"\n",(0,r.jsx)(t.p,{children:"This method returns a Peer resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/peers/{ref}"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"GET"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter Name"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ref"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method returns a Peer resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Peer",\n \t"metadata": {\n \t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n \t},\n \t"spec": {\n \t\t"credentials": {\n \t\t\t"username": "ast",\n \t\t\t"secret": "1234"\n \t\t}\n \t}\n }\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>d});var r=n(6540);const s={},i=r.createContext(s);function c(e){const t=r.useContext(i);return r.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(s):e.components||s:c(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a5a69d5.1e1e317b.js b/assets/js/9a5a69d5.1e1e317b.js new file mode 100644 index 000000000..a08073a9e --- /dev/null +++ b/assets/js/9a5a69d5.1e1e317b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7337],{1979:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=n(4848),a=n(8453);const r={},o="updateGateways",i={id:"api/gateways/update",title:"updateGateways",description:"Updates an existing Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/update.md",sourceDirName:"api/gateways",slug:"/api/gateways/update",permalink:"/docs/1.x.x/api/gateways/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"},next:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"}},c={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"updategateways",children:"updateGateways"}),"\n",(0,s.jsx)(t.p,{children:"Updates an existing Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"PUT"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(t.p,{children:["A file containing a ",(0,s.jsx)(t.a,{href:"/docs/1.x.x/configuration/gateways",children:"Gateway"})," resource in ",(0,s.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method updates a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'PUT /api/v1beta1/gateways/gw5c77t2\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Gateway",\n\t"metadata": {\n\t\t"name": "Provider Inc.",\n\t\t"ref": "gw5c77t2"\n\t},\n\t"spec": {\n\t\t"host": "sip.provider.net",\n\t\t"credentials": {\n\t\t\t"username": "youruser",\n\t\t\t"secret": "yoursecret"\n\t\t},\n\t\t"transport": "udp"\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var s=n(6540);const a={},r=s.createContext(a);function o(e){const t=s.useContext(r);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:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a5a69d5.91d3f7b3.js b/assets/js/9a5a69d5.91d3f7b3.js deleted file mode 100644 index e82a1227d..000000000 --- a/assets/js/9a5a69d5.91d3f7b3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7025],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>y});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),l=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(i.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(n),m=a,y=c["".concat(i,".").concat(m)]||c[m]||d[m]||o;return n?r.createElement(y,p(p({ref:t},u),{},{components:n})):r.createElement(y,p({ref:t},u))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[c]="string"==typeof e?e:a,p[1]=s;for(var l=2;l<o;l++)p[l]=n[l];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},4677:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(7462),a=(n(7294),n(3905));const o={},p="updateGateways",s={unversionedId:"api/gateways/update",id:"version-1.x.x/api/gateways/update",title:"updateGateways",description:"Updates an existing Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/update.md",sourceDirName:"api/gateways",slug:"/api/gateways/update",permalink:"/docs/1.x.x/api/gateways/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"},next:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"}},i={},l=[],u={toc:l},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"updategateways"},"updateGateways"),(0,a.kt)("p",null,"Updates an existing Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/gateways/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"PUT")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/configuration/gateways"},"Gateway")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method updates a Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'PUT /api/v1beta1/gateways/gw5c77t2\n{\n "apiVersion": "v1beta1",\n "kind": "Gateway",\n "metadata": {\n "name": "Provider Inc.",\n "ref": "gw5c77t2"\n },\n "spec": {\n "host": "sip.provider.net",\n "credentials": {\n "username": "youruser",\n "secret": "yoursecret"\n },\n "transport": "udp"\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9beb87c2.5ebf1e1f.js b/assets/js/9beb87c2.5ebf1e1f.js new file mode 100644 index 000000000..d2aa38acb --- /dev/null +++ b/assets/js/9beb87c2.5ebf1e1f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3539],{4520:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var o=t(4848),r=t(8453);const s={},c="Changelog",i={id:"changelog",title:"Changelog",description:"Coming soon.",source:"@site/docs/changelog.md",sourceDirName:".",slug:"/changelog",permalink:"/docs/2.0.0/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/changelog.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},a={},u=[];function l(e){const n={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"changelog",children:"Changelog"}),"\n",(0,o.jsx)(n.p,{children:"Coming soon."})]})}function d(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/assets/js/9beb87c2.ada17958.js b/assets/js/9beb87c2.ada17958.js deleted file mode 100644 index d89a3e166..000000000 --- a/assets/js/9beb87c2.ada17958.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[80],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(r),g=o,m=s["".concat(l,".").concat(g)]||s[g]||f[g]||a;return r?n.createElement(m,c(c({ref:t},u),{},{components:r})):n.createElement(m,c({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=g;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[s]="string"==typeof e?e:o,c[1]=i;for(var p=2;p<a;p++)c[p]=r[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}g.displayName="MDXCreateElement"},1016:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a={},c="Changelog",i={unversionedId:"changelog",id:"changelog",title:"Changelog",description:"Coming soon.",source:"@site/docs/changelog.md",sourceDirName:".",slug:"/changelog",permalink:"/docs/2.0.0/changelog",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/changelog.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},l={},p=[],u={toc:p},s="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"changelog"},"Changelog"),(0,o.kt)("p",null,"Coming soon."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d10a623.4e6d4ada.js b/assets/js/9d10a623.4e6d4ada.js new file mode 100644 index 000000000..c200bd6b5 --- /dev/null +++ b/assets/js/9d10a623.4e6d4ada.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9955],{4374:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var r=t(4848),s=t(8453);const o={},i="createDomain",a={id:"api/domains/create",title:"createDomain",description:"Creates a new Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/create.md",sourceDirName:"api/domains",slug:"/api/domains/create",permalink:"/docs/1.x.x/api/domains/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"},next:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"}},c={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"createdomain",children:"createDomain"}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/domains"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"POST"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing a ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/domains",children:"Domain"})," resource in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"If successful this method creates a Domain resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/domains\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Domain",\n\t"metadata": {\n\t\t"name": "Another Office"\n\t},\n\t"spec": {\n\t\t"context": {\n\t\t\t"domainUri": "sip2.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "dm6c87r2"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});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 a(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/assets/js/9d10a623.bd4bd866.js b/assets/js/9d10a623.bd4bd866.js deleted file mode 100644 index f7a4a7c52..000000000 --- a/assets/js/9d10a623.bd4bd866.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3794],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(f,i(i({ref:t},l),{},{components:n})):r.createElement(f,i({ref:t},l))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[u]="string"==typeof e?e:a,i[1]=p;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},1014:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={},i="createDomain",p={unversionedId:"api/domains/create",id:"version-1.x.x/api/domains/create",title:"createDomain",description:"Creates a new Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/create.md",sourceDirName:"api/domains",slug:"/api/domains/create",permalink:"/docs/1.x.x/api/domains/create",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"},next:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"}},s={},c=[],l={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"createdomain"},"createDomain"),(0,a.kt)("p",null,"Creates a new Domain resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/domains")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"POST")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/docs/configuration/domains"},"Domain")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method creates a Domain resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'POST /api/{apiversion}/domains\n{\n "apiVersion": "v1beta1",\n "kind": "Domain",\n "metadata": {\n "name": "Another Office"\n },\n "spec": {\n "context": {\n "domainUri": "sip2.local"\n }\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "dm6c87r2"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9fcefd11.b4c4cbab.js b/assets/js/9fcefd11.b4c4cbab.js deleted file mode 100644 index e2b757fdc..000000000 --- a/assets/js/9fcefd11.b4c4cbab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8389],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(h,l(l({ref:t},p),{},{components:n})):r.createElement(h,l({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,l=new Array(a);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,l[1]=i;for(var c=2;c<a;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},2357:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={},l="Quick Start",i={unversionedId:"development/quick-start",id:"development/quick-start",title:"Quick Start",description:"Before starting the development, you need to install the following tools:",source:"@site/docs/development/quick-start.md",sourceDirName:"development",slug:"/development/quick-start",permalink:"/docs/2.0.0/development/quick-start",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/quick-start.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"},next:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"}},s={},c=[{value:"Clone and Build the Project",id:"clone-and-build-the-project",level:2},{value:"Run the Project",id:"run-the-project",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"quick-start"},"Quick Start"),(0,o.kt)("p",null,"Before starting the development, you need to install the following tools:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"NodeJS (>=16.14)"),(0,o.kt)("li",{parentName:"ul"},"JDK (>=11)")),(0,o.kt)("p",null,"For NodeJS, we recommend using ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/nvm-sh/nvm"},"nvm")," to manage your NodeJS versions."),(0,o.kt)("h2",{id:"clone-and-build-the-project"},"Clone and Build the Project"),(0,o.kt)("p",null,"To get started, first, clone the repository:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/fonoster/routr\n")),(0,o.kt)("p",null,"The previous command will create a directory called ",(0,o.kt)("inlineCode",{parentName:"p"},"routr")," with the project's source code. "),(0,o.kt)("p",null,"Next, set the JAVA_HOME environment variable to the location of your JDK installation:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"export JAVA_HOME=/path/to/jdk\n")),(0,o.kt)("p",null,"Finally, build the project:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"cd routr\nnpm run make\n")),(0,o.kt)("p",null,"The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors."),(0,o.kt)("h2",{id:"run-the-project"},"Run the Project"),(0,o.kt)("p",null,"To run all the components, you can use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm run start\n")),(0,o.kt)("p",null,"The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry. "),(0,o.kt)("p",null,"As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart."),(0,o.kt)("p",null,"You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:"),(0,o.kt)("p",null,"In one terminal:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm run start:edgeport\n")),(0,o.kt)("p",null,"Example output:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"> start:edgeport\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh\n\n2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0\n2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]\n2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]\n2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz\n")),(0,o.kt)("p",null,"In a separate terminal:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm run start:location\n")),(0,o.kt)("p",null,"Example output:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'> start:location\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner\n\n[nodemon] 2.0.20\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching path(s): mods/**/*\n[nodemon] watching extensions: ts\n[nodemon] starting `ts-node mods/location/src/runner.ts`\n2023-09-05 12:41:38.733 [verbose]: (grpc-health-check) /node_modules/@fonoster/grpc-health-check/dist/add-health-to-server.js added healthcheck service {}\n2023-09-05 12:41:38.735 [info]: (location) /mods/location/src/service.ts using memory as cache provider {}\n2023-09-05 12:41:38.739 [info]: (common) /mods/common/dist/service.js starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}\n')),(0,o.kt)("p",null,"Please see the ",(0,o.kt)("inlineCode",{parentName:"p"},"scripts")," section of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/package.json"},"package.json")," for a complete list of available commands."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9fcefd11.f0fb126c.js b/assets/js/9fcefd11.f0fb126c.js new file mode 100644 index 000000000..5ae2a050b --- /dev/null +++ b/assets/js/9fcefd11.f0fb126c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3102],{4730:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var o=t(4848),r=t(8453);const s={},a="Quick Start",i={id:"development/quick-start",title:"Quick Start",description:"Before starting the development, you need to install the following tools:",source:"@site/docs/development/quick-start.md",sourceDirName:"development",slug:"/development/quick-start",permalink:"/docs/2.0.0/development/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/quick-start.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"},next:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"}},c={},l=[{value:"Clone and Build the Project",id:"clone-and-build-the-project",level:2},{value:"Run the Project",id:"run-the-project",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"quick-start",children:"Quick Start"}),"\n",(0,o.jsx)(n.p,{children:"Before starting the development, you need to install the following tools:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"NodeJS (>=16.14)"}),"\n",(0,o.jsx)(n.li,{children:"JDK (>=11)"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For NodeJS, we recommend using ",(0,o.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," to manage your NodeJS versions."]}),"\n",(0,o.jsx)(n.h2,{id:"clone-and-build-the-project",children:"Clone and Build the Project"}),"\n",(0,o.jsx)(n.p,{children:"To get started, first, clone the repository:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fonoster/routr\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous command will create a directory called ",(0,o.jsx)(n.code,{children:"routr"})," with the project's source code."]}),"\n",(0,o.jsx)(n.p,{children:"Next, set the JAVA_HOME environment variable to the location of your JDK installation:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export JAVA_HOME=/path/to/jdk\n"})}),"\n",(0,o.jsx)(n.p,{children:"Finally, build the project:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd routr\nnpm run make\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors."}),"\n",(0,o.jsx)(n.h2,{id:"run-the-project",children:"Run the Project"}),"\n",(0,o.jsx)(n.p,{children:"To run all the components, you can use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry."}),"\n",(0,o.jsx)(n.p,{children:"As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart."}),"\n",(0,o.jsx)(n.p,{children:"You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:"}),"\n",(0,o.jsx)(n.p,{children:"In one terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:edgeport\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"> start:edgeport\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh\n\n2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0\n2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]\n2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]\n2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz\n"})}),"\n",(0,o.jsx)(n.p,{children:"In a separate terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:location\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'> start:location\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner\n\n[nodemon] 2.0.20\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching path(s): mods/**/*\n[nodemon] watching extensions: ts\n[nodemon] starting `ts-node mods/location/src/runner.ts`\n2023-09-05 12:41:38.733 [verbose]: (grpc-health-check) /node_modules/@fonoster/grpc-health-check/dist/add-health-to-server.js added healthcheck service {}\n2023-09-05 12:41:38.735 [info]: (location) /mods/location/src/service.ts using memory as cache provider {}\n2023-09-05 12:41:38.739 [info]: (common) /mods/common/dist/service.js starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Please see the ",(0,o.jsx)(n.code,{children:"scripts"})," section of ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/package.json",children:"package.json"})," for a complete list of available commands."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function a(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:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a0c5838c.46f903f4.js b/assets/js/a0c5838c.5b15e2b4.js similarity index 65% rename from assets/js/a0c5838c.46f903f4.js rename to assets/js/a0c5838c.5b15e2b4.js index b118cce9a..3c2eaacb3 100644 --- a/assets/js/a0c5838c.46f903f4.js +++ b/assets/js/a0c5838c.5b15e2b4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1328],{7085:e=>{e.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3688],{7757:e=>{e.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a30498ab.812d55ec.js b/assets/js/a30498ab.812d55ec.js new file mode 100644 index 000000000..a85ced401 --- /dev/null +++ b/assets/js/a30498ab.812d55ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3857],{4036:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=t(4848),r=t(8453);const i={},o="Agents",d={id:"configuration/agents",title:"Agents",description:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.",source:"@site/versioned_docs/version-1.x.x/configuration/agents.md",sourceDirName:"configuration",slug:"/configuration/agents",permalink:"/docs/1.x.x/configuration/agents",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/agents.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"},next:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"}},c={},a=[{value:"Agent Resource",id:"agent-resource",level:2},{value:"Example",id:"example",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"agents",children:"Agents"}),"\n",(0,s.jsx)(n.p,{children:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.\nA Domain binds agents together. An Agent can belong to one or multiple Domains."}),"\n",(0,s.jsxs)(n.p,{children:["The Agents configuration can be provided using the file ",(0,s.jsx)(n.code,{children:"config/agents.yml"})," located at the root of your Routr installation."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"agent-resource",children:"Agent Resource"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Description"}),(0,s.jsx)(n.th,{children:"Required"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"apiVersion"}),(0,s.jsx)(n.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"kind"}),(0,s.jsx)(n.td,{children:"Defines the type of resource"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"metadata.name"}),(0,s.jsx)(n.td,{children:"Friendly name for the SIP device"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.privacy"}),(0,s.jsxs)(n.td,{children:["If set to ",(0,s.jsx)(n.code,{children:"Private"})," the server removes identifiable information for the requests. Defaults to ",(0,s.jsx)(n.code,{children:"None"})]}),(0,s.jsx)(n.td,{children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.credentials.username"}),(0,s.jsx)(n.td,{children:"Agent's credential username"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.credentials.secret"}),(0,s.jsx)(n.td,{children:"Agent's credential secret"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.domains[*]"}),(0,s.jsx)(n.td,{children:"Context/s in which this Agent is allowed to communicate. FQDN is recommended"}),(0,s.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.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(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a30498ab.b83e40ec.js b/assets/js/a30498ab.b83e40ec.js deleted file mode 100644 index ef703abec..000000000 --- a/assets/js/a30498ab.b83e40ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1186],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(g,i(i({ref:t},c),{},{components:n})):r.createElement(g,i({ref:t},c))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},7941:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={},i="Agents",l={unversionedId:"configuration/agents",id:"version-1.x.x/configuration/agents",title:"Agents",description:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.",source:"@site/versioned_docs/version-1.x.x/configuration/agents.md",sourceDirName:"configuration",slug:"/configuration/agents",permalink:"/docs/1.x.x/configuration/agents",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/agents.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"},next:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"}},s={},p=[{value:"Agent Resource",id:"agent-resource",level:2},{value:"Example",id:"example",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"agents"},"Agents"),(0,a.kt)("p",null,"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.\nA Domain binds agents together. An Agent can belong to one or multiple Domains."),(0,a.kt)("p",null,"The Agents configuration can be provided using the file ",(0,a.kt)("inlineCode",{parentName:"p"},"config/agents.yml")," located at the root of your Routr installation."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"If using Redis this configuration gets stored in the database.")),(0,a.kt)("h2",{id:"agent-resource"},"Agent Resource"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,a.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"kind"),(0,a.kt)("td",{parentName:"tr",align:null},"Defines the type of resource"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.name"),(0,a.kt)("td",{parentName:"tr",align:null},"Friendly name for the SIP device"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.privacy"),(0,a.kt)("td",{parentName:"tr",align:null},"If set to ",(0,a.kt)("inlineCode",{parentName:"td"},"Private")," the server removes identifiable information for the requests. Defaults to ",(0,a.kt)("inlineCode",{parentName:"td"},"None")),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.credentials.username"),(0,a.kt)("td",{parentName:"tr",align:null},"Agent's credential username"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.credentials.secret"),(0,a.kt)("td",{parentName:"tr",align:null},"Agent's credential secret"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.domains","[*]"),(0,a.kt)("td",{parentName:"tr",align:null},"Context/s in which this Agent is allowed to communicate. FQDN is recommended"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")))),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a40a3312.2b4c3cf4.js b/assets/js/a40a3312.2b4c3cf4.js new file mode 100644 index 000000000..7d6ddc11c --- /dev/null +++ b/assets/js/a40a3312.2b4c3cf4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9922],{2738:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var r=o(4848),n=o(8453);const s={},i="FAQ",d={id:"introduction/faq",title:"FAQ",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/faq.md",sourceDirName:"introduction",slug:"/introduction/faq",permalink:"/docs/1.x.x/introduction/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/faq.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"},next:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"}},a={},u=[{value:"What is Routr?",id:"what-is-routr",level:3},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:3},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:3},{value:"What language is used to develop Routr?",id:"what-language-is-used-to-develop-routr",level:3},{value:"What license does Routr uses?",id:"what-license-does-routr-uses",level:3}];function c(e){const t={a:"a",h1:"h1",h3:"h3",p:"p",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"faq",children:"FAQ"}),"\n",(0,r.jsx)(t.h3,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsxs)(t.p,{children:["Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/introduction/overview",children:"overview"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,r.jsx)(t.p,{children:"Routr server runs standalone and has no external dependencies. However,\nyou might need to use Redis depending in the complexity of your requirements."}),"\n",(0,r.jsx)(t.h3,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,r.jsxs)(t.p,{children:["See the ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/introduction/comparison",children:"comparison page"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-language-is-used-to-develop-routr",children:"What language is used to develop Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Most components in Routr are written in Javascript(with Oracle's GraalJS)."}),"\n",(0,r.jsx)(t.h3,{id:"what-license-does-routr-uses",children:"What license does Routr uses?"}),"\n",(0,r.jsxs)(t.p,{children:["Routr is released under the ",(0,r.jsx)(t.a,{href:"https://opensource.org/licenses/MIT",children:"MIT"})," license."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>d});var r=o(6540);const n={},s=r.createContext(n);function i(e){const t=r.useContext(s);return r.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(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a40a3312.9ec213d1.js b/assets/js/a40a3312.9ec213d1.js deleted file mode 100644 index 131fe0ba3..000000000 --- a/assets/js/a40a3312.9ec213d1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7388],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>v});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=o.createContext({}),c=function(e){var t=o.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=c(e.components);return o.createElement(u.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=n,v=d["".concat(u,".").concat(h)]||d[h]||p[h]||i;return r?o.createElement(v,a(a({ref:t},l),{},{components:r})):o.createElement(v,a({ref:t},l))}));function v(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=h;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[d]="string"==typeof e?e:n,a[1]=s;for(var c=2;c<i;c++)a[c]=r[c];return o.createElement.apply(null,a)}return o.createElement.apply(null,r)}h.displayName="MDXCreateElement"},6751:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var o=r(7462),n=(r(7294),r(3905));const i={},a="FAQ",s={unversionedId:"introduction/faq",id:"version-1.x.x/introduction/faq",title:"FAQ",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/faq.md",sourceDirName:"introduction",slug:"/introduction/faq",permalink:"/docs/1.x.x/introduction/faq",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/faq.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"},next:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"}},u={},c=[{value:"What is Routr?",id:"what-is-routr",level:3},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:3},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:3},{value:"What language is used to develop Routr?",id:"what-language-is-used-to-develop-routr",level:3},{value:"What license does Routr uses?",id:"what-license-does-routr-uses",level:3}],l={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,o.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"faq"},"FAQ"),(0,n.kt)("h3",{id:"what-is-routr"},"What is Routr?"),(0,n.kt)("p",null,"Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the ",(0,n.kt)("a",{parentName:"p",href:"/docs/introduction/overview"},"overview"),"."),(0,n.kt)("h3",{id:"what-dependencies-does-routr-have"},"What dependencies does Routr have?"),(0,n.kt)("p",null,"Routr server runs standalone and has no external dependencies. However,\nyou might need to use Redis depending in the complexity of your requirements."),(0,n.kt)("h3",{id:"how-does-routr-compare-with-other-sip-servers"},"How does Routr compare with other SIP servers"),(0,n.kt)("p",null,"See the ",(0,n.kt)("a",{parentName:"p",href:"/docs/introduction/comparison"},"comparison page"),"."),(0,n.kt)("h3",{id:"what-language-is-used-to-develop-routr"},"What language is used to develop Routr?"),(0,n.kt)("p",null,"Most components in Routr are written in Javascript(with Oracle's GraalJS)."),(0,n.kt)("h3",{id:"what-license-does-routr-uses"},"What license does Routr uses?"),(0,n.kt)("p",null,"Routr is released under the ",(0,n.kt)("a",{parentName:"p",href:"https://opensource.org/licenses/MIT"},"MIT")," license."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a4cb0559.b622069b.js b/assets/js/a4cb0559.b622069b.js new file mode 100644 index 000000000..5783e9255 --- /dev/null +++ b/assets/js/a4cb0559.b622069b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9188],{8255:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var n=r(4848),i=r(8453);const o={},s="Overview",a={id:"introduction/overview",title:"Overview",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/overview.md",sourceDirName:"introduction",slug:"/introduction/overview",permalink:"/docs/1.x.x/introduction/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Welcome",permalink:"/docs/1.x.x/welcome"},next:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"}},c={},l=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Features",id:"features",level:2},{value:"Components",id:"components",level:2},{value:"Architecture",id:"architecture",level:2},{value:"Use cases",id:"use-cases",level:2}];function h(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,n.jsxs)(t.p,{children:["Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at ",(0,n.jsx)(t.a,{href:"https://twitter.com/fonoster",children:"@fonoster"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,n.jsx)(t.p,{children:"Routr's main features are:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Typical Sip Server functions; Proxy, Registrar, Location Service"}),"\n",(0,n.jsx)(t.li,{children:"Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List"}),"\n",(0,n.jsx)(t.li,{children:"Transport: TCP, UDP, TLS, WebSocket"}),"\n",(0,n.jsx)(t.li,{children:"Routr currently supports Redis, HTTP Requests, and YAML files as the data source"}),"\n",(0,n.jsx)(t.li,{children:"Server management and monitoring with the RESTful API, CLI, and Web Console"}),"\n",(0,n.jsx)(t.li,{children:"Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"components",children:"Components"}),"\n",(0,n.jsx)(t.p,{children:"The Routr ecosystem consists of three main components:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr",children:"Routr server"})," which is the main component of the ecosystem"]}),"\n",(0,n.jsxs)(t.li,{children:["The command-line interface, ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ctl",children:"rctl"}),", for remote management of the server"]}),"\n",(0,n.jsxs)(t.li,{children:["An optional ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ui",children:"web console"})," for easy management of the server"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"architecture",children:"Architecture"}),"\n",(0,n.jsx)(t.p,{children:"This diagram illustrates the architecture of Routr and some of its ecosystem components:"}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("img",{src:"/img/architecture.png"}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.p,{children:"At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software."}),"\n",(0,n.jsx)(t.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,n.jsxs)(t.p,{children:["Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in ",(0,n.jsx)(t.a,{href:"https://www.docker.com/",children:"Docker"}),", and ",(0,n.jsx)(t.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI."})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>a});var n=r(6540);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a4cb0559.cb3c8eb0.js b/assets/js/a4cb0559.cb3c8eb0.js deleted file mode 100644 index fb391857c..000000000 --- a/assets/js/a4cb0559.cb3c8eb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3902],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=o,f=p["".concat(l,".").concat(d)]||p[d]||m[d]||i;return r?n.createElement(f,a(a({ref:t},u),{},{components:r})):n.createElement(f,a({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var c=2;c<i;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},5280:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const i={},a="Overview",s={unversionedId:"introduction/overview",id:"version-1.x.x/introduction/overview",title:"Overview",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/overview.md",sourceDirName:"introduction",slug:"/introduction/overview",permalink:"/docs/1.x.x/introduction/overview",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Welcome",permalink:"/docs/1.x.x/welcome"},next:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"}},l={},c=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Features",id:"features",level:2},{value:"Components",id:"components",level:2},{value:"Architecture",id:"architecture",level:2},{value:"Use cases",id:"use-cases",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("h2",{id:"what-is-routr"},"What is Routr?"),(0,o.kt)("p",null,"Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at ",(0,o.kt)("a",{parentName:"p",href:"https://twitter.com/fonoster"},"@fonoster"),"."),(0,o.kt)("h2",{id:"features"},"Features"),(0,o.kt)("p",null,"Routr's main features are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Typical Sip Server functions; Proxy, Registrar, Location Service"),(0,o.kt)("li",{parentName:"ul"},"Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List"),(0,o.kt)("li",{parentName:"ul"},"Transport: TCP, UDP, TLS, WebSocket"),(0,o.kt)("li",{parentName:"ul"},"Routr currently supports Redis, HTTP Requests, and YAML files as the data source"),(0,o.kt)("li",{parentName:"ul"},"Server management and monitoring with the RESTful API, CLI, and Web Console"),(0,o.kt)("li",{parentName:"ul"},"Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress")),(0,o.kt)("h2",{id:"components"},"Components"),(0,o.kt)("p",null,"The Routr ecosystem consists of three main components:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr"},"Routr server")," which is the main component of the ecosystem"),(0,o.kt)("li",{parentName:"ul"},"The command-line interface, ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr-ctl"},"rctl"),", for remote management of the server"),(0,o.kt)("li",{parentName:"ul"},"An optional ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr-ui"},"web console")," for easy management of the server")),(0,o.kt)("h2",{id:"architecture"},"Architecture"),(0,o.kt)("p",null,"This diagram illustrates the architecture of Routr and some of its ecosystem components:"),(0,o.kt)("br",null),(0,o.kt)("img",{src:"/img/architecture.png"}),(0,o.kt)("br",null),(0,o.kt)("br",null),(0,o.kt)("p",null,"At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software."),(0,o.kt)("h2",{id:"use-cases"},"Use cases"),(0,o.kt)("p",null,"Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in ",(0,o.kt)("a",{parentName:"p",href:"https://www.docker.com/"},"Docker"),", and ",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.io/"},"Kubernetes"),"."),(0,o.kt)("p",null,"Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a552b93b.1ba3f9b1.js b/assets/js/a552b93b.1ba3f9b1.js deleted file mode 100644 index 4c03138bd..000000000 --- a/assets/js/a552b93b.1ba3f9b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7409],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),i=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=i(r),d=a,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return r?n.createElement(f,p(p({ref:t},c),{},{components:r})):n.createElement(f,p({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,p[1]=l;for(var i=2;i<o;i++)p[i]=r[i];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},5591:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const o={},p="deletePeer",l={unversionedId:"api/peers/delete",id:"version-1.x.x/api/peers/delete",title:"deletePeer",description:"Removes a Peer resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/peers/delete.md",sourceDirName:"api/peers",slug:"/api/peers/delete",permalink:"/docs/1.x.x/api/peers/delete",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"},next:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"}},s={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deletepeer"},"deletePeer"),(0,a.kt)("p",null,"Removes a Peer resource from a persistent database."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/peers/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"DELETE")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method removes a Peer resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'DELETE /api/v1beta1/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a552b93b.6326ae55.js b/assets/js/a552b93b.6326ae55.js new file mode 100644 index 000000000..5f078d831 --- /dev/null +++ b/assets/js/a552b93b.6326ae55.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5872],{1013:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var s=r(4848),n=r(8453);const i={},d="deletePeer",l={id:"api/peers/delete",title:"deletePeer",description:"Removes a Peer resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/peers/delete.md",sourceDirName:"api/peers",slug:"/api/peers/delete",permalink:"/docs/1.x.x/api/peers/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"},next:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"}},c={},o=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletepeer",children:"deletePeer"}),"\n",(0,s.jsx)(t.p,{children:"Removes a Peer resource from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/peers/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Peer resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var s=r(6540);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.eccafe3d.js b/assets/js/a7bd4aaa.eccafe3d.js new file mode 100644 index 000000000..2b6eb6cf7 --- /dev/null +++ b/assets/js/a7bd4aaa.eccafe3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7098],{4532:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(9024),o=s(2967),t=s(2252),c=s(2831),i=s(1463),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:(0,o.tU)(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function d(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a7c6e145.844e278e.js b/assets/js/a7c6e145.844e278e.js deleted file mode 100644 index 43d9bff70..000000000 --- a/assets/js/a7c6e145.844e278e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4920],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=o.createContext({}),u=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=u(e.components);return o.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=u(n),d=r,h=m["".concat(c,".").concat(d)]||m[d]||p[d]||a;return n?o.createElement(h,l(l({ref:t},s),{},{components:n})):o.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[m]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<a;u++)l[u]=n[u];return o.createElement.apply(null,l)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},4617:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var o=n(7462),r=(n(7294),n(3905));const a={},l="Extending the Command-Line Tool",i={unversionedId:"development/extending-the-ctl",id:"development/extending-the-ctl",title:"Extending the Command-Line Tool",description:"Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.",source:"@site/docs/development/extending-the-ctl.md",sourceDirName:"development",slug:"/development/extending-the-ctl",permalink:"/docs/2.0.0/development/extending-the-ctl",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/extending-the-ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"},next:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"}},c={},u=[{value:"Installing the Command-Line Tool",id:"installing-the-command-line-tool",level:2},{value:"Using the Command-Line Tool",id:"using-the-command-line-tool",level:2},{value:"Creating a plugin",id:"creating-a-plugin",level:2}],s={toc:u},m="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,o.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"extending-the-command-line-tool"},"Extending the Command-Line Tool"),(0,r.kt)("p",null,"Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with ",(0,r.kt)("a",{parentName:"p",href:"https://oclif.io/"},"Oclif"),", a framework for creating command-line tools in Node.js."),(0,r.kt)("p",null,"You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins."),(0,r.kt)("h2",{id:"installing-the-command-line-tool"},"Installing the Command-Line Tool"),(0,r.kt)("p",null,"The CTL comes as an npm package. To install it, you run the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install --location=global @routr/ctl\n")),(0,r.kt)("h2",{id:"using-the-command-line-tool"},"Using the Command-Line Tool"),(0,r.kt)("p",null,"The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands."),(0,r.kt)("p",null,"Most commands adopt the ",(0,r.kt)("inlineCode",{parentName:"p"},"{substantive} {verb}")," pattern. For instance, ",(0,r.kt)("inlineCode",{parentName:"p"},"rctl agents get")," retrieves a list of agents."),(0,r.kt)("p",null,"If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins."),(0,r.kt)("h2",{id:"creating-a-plugin"},"Creating a plugin"),(0,r.kt)("p",null,"To create a new plugin, you start by running the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx oclif generate mycommand\n")),(0,r.kt)("p",null,"The system will prompt you for some information about your plugin. For this example, let's choose ",(0,r.kt)("inlineCode",{parentName:"p"},"mycommand")," as the name."),(0,r.kt)("p",null,"In your mycommand directory, you'll find the following structure:"),(0,r.kt)("p",null,"[Directory structure omitted for brevity]"),(0,r.kt)("p",null,"Looking at the ",(0,r.kt)("inlineCode",{parentName:"p"},"src/commands/hello/index.ts")," file, you see the following code:"),(0,r.kt)("p",null,"[Sample TypeScript code omitted for brevity]"),(0,r.kt)("p",null,"This code defines a simple command that takes two arguments, ",(0,r.kt)("inlineCode",{parentName:"p"},"person")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"from,")," and then prints a greeting to the console."),(0,r.kt)("p",null,"After you update your plugin, you install and test it by running the following command from within the plugin directory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rctl plugins link . # Installing in development mode\n")),(0,r.kt)("p",null,"For production mode installation of your plugin, you use the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rctl plugins install .\n")),(0,r.kt)("p",null,"If you have published your plugin to ",(0,r.kt)("a",{parentName:"p",href:"https://npmjs.com"},"NPM"),", you can install it with this command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rctl plugins install mycommand\n")),(0,r.kt)("p",null,"To see your new command in action, you run the command with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--help")," flag and follow the instructions."),(0,r.kt)("p",null,"With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the ",(0,r.kt)("a",{parentName:"p",href:"/docs/2.0.0/connect/nodesdk/sdk"},"Node.js SDK")," to interact with the server."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7c6e145.b8df2a42.js b/assets/js/a7c6e145.b8df2a42.js new file mode 100644 index 000000000..03f65bdf2 --- /dev/null +++ b/assets/js/a7c6e145.b8df2a42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1079],{5138:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(4848),i=t(8453);const l={},r="Extending the Command-Line Tool",s={id:"development/extending-the-ctl",title:"Extending the Command-Line Tool",description:"Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.",source:"@site/docs/development/extending-the-ctl.md",sourceDirName:"development",slug:"/development/extending-the-ctl",permalink:"/docs/2.0.0/development/extending-the-ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/extending-the-ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"},next:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"}},a={},c=[{value:"Installing the Command-Line Tool",id:"installing-the-command-line-tool",level:2},{value:"Using the Command-Line Tool",id:"using-the-command-line-tool",level:2},{value:"Creating a plugin",id:"creating-a-plugin",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"extending-the-command-line-tool",children:"Extending the Command-Line Tool"}),"\n",(0,o.jsxs)(n.p,{children:["Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with ",(0,o.jsx)(n.a,{href:"https://oclif.io/",children:"Oclif"}),", a framework for creating command-line tools in Node.js."]}),"\n",(0,o.jsx)(n.p,{children:"You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins."}),"\n",(0,o.jsx)(n.h2,{id:"installing-the-command-line-tool",children:"Installing the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL comes as an npm package. To install it, you run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.h2,{id:"using-the-command-line-tool",children:"Using the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands."}),"\n",(0,o.jsxs)(n.p,{children:["Most commands adopt the ",(0,o.jsx)(n.code,{children:"{substantive} {verb}"})," pattern. For instance, ",(0,o.jsx)(n.code,{children:"rctl agents get"})," retrieves a list of agents."]}),"\n",(0,o.jsx)(n.p,{children:"If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins."}),"\n",(0,o.jsx)(n.h2,{id:"creating-a-plugin",children:"Creating a plugin"}),"\n",(0,o.jsx)(n.p,{children:"To create a new plugin, you start by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npx oclif generate mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The system will prompt you for some information about your plugin. For this example, let's choose ",(0,o.jsx)(n.code,{children:"mycommand"})," as the name."]}),"\n",(0,o.jsx)(n.p,{children:"In your mycommand directory, you'll find the following structure:"}),"\n",(0,o.jsx)(n.p,{children:"[Directory structure omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["Looking at the ",(0,o.jsx)(n.code,{children:"src/commands/hello/index.ts"})," file, you see the following code:"]}),"\n",(0,o.jsx)(n.p,{children:"[Sample TypeScript code omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["This code defines a simple command that takes two arguments, ",(0,o.jsx)(n.code,{children:"person"})," and ",(0,o.jsx)(n.code,{children:"from,"})," and then prints a greeting to the console."]}),"\n",(0,o.jsx)(n.p,{children:"After you update your plugin, you install and test it by running the following command from within the plugin directory:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins link . # Installing in development mode\n"})}),"\n",(0,o.jsx)(n.p,{children:"For production mode installation of your plugin, you use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install .\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you have published your plugin to ",(0,o.jsx)(n.a,{href:"https://npmjs.com",children:"NPM"}),", you can install it with this command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["To see your new command in action, you run the command with the ",(0,o.jsx)(n.code,{children:"--help"})," flag and follow the instructions."]}),"\n",(0,o.jsxs)(n.p,{children:["With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the ",(0,o.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"Node.js SDK"})," to interact with the server."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var o=t(6540);const i={},l=o.createContext(i);function r(e){const n=o.useContext(l);return o.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:r(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.75b37e51.js b/assets/js/a94703ab.75b37e51.js new file mode 100644 index 000000000..775a27420 --- /dev/null +++ b/assets/js/a94703ab.75b37e51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9048],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(8215),i=n(9024),s=n(7559),l=n(1754),r=n(6588),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),j=n(4581),f=n(6342),_=n(3465);function v(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)(v,{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}),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:j}}}=(0,f.p)(),_=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),v=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!v&&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:v,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&j&&k(!0)}),[h,N,c,k,j]),(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":v}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,"aria-expanded":h?!g:void 0,href:h?_??"#":_,...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.Mj)(),[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,f.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(_.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(2069);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,j.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)(v,{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(8215),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/assets/js/a9d63626.61eab5bf.js b/assets/js/a9d63626.61eab5bf.js deleted file mode 100644 index c9550497e..000000000 --- a/assets/js/a9d63626.61eab5bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8845],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=i,h=u["".concat(l,".").concat(d)]||u[d]||g[d]||a;return n?r.createElement(h,o(o({ref:t},p),{},{components:n})):r.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:i,o[1]=s;for(var c=2;c<a;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},5033:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(7462),i=(n(7294),n(3905));const a={},o="Securing the signaling path",s={unversionedId:"guides/securing-the-signaling-path",id:"version-1.x.x/guides/securing-the-signaling-path",title:"Securing the signaling path",description:"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.",source:"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",sourceDirName:"guides",slug:"/guides/securing-the-signaling-path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"},next:{title:"overview",permalink:"/docs/1.x.x/api/overview"}},l={},c=[{value:"Creating a Java Keystore(.JKS) certificate",id:"creating-a-java-keystorejks-certificate",level:2},{value:"Creating a self-signed Certificate",id:"creating-a-self-signed-certificate",level:3},{value:"Creating a Certificate using Let's Encrypt",id:"creating-a-certificate-using-lets-encrypt",level:3},{value:"Installing the Certificate in Routr",id:"installing-the-certificate-in-routr",level:2},{value:"Setting up the Sip Phones",id:"setting-up-the-sip-phones",level:2}],p={toc:c},u="wrapper";function g(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"securing-the-signaling-path"},"Securing the signaling path"),(0,i.kt)("p",null,"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that ",(0,i.kt)("em",{parentName:"p"},"Routr")," only secures the signaling and that the endpoints are ultimately responsible for securing the media."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path")),(0,i.kt)("img",{src:"/img/secure_signaling.png",width:"600",vspace:"30"}),(0,i.kt)("h2",{id:"creating-a-java-keystorejks-certificate"},"Creating a Java Keystore(.JKS) certificate"),(0,i.kt)("p",null,"We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free ",(0,i.kt)("a",{parentName:"p",href:"https://letsencrypt.org/"},"Let's Encrypt service"),"."),(0,i.kt)("h3",{id:"creating-a-self-signed-certificate"},"Creating a self-signed Certificate"),(0,i.kt)("p",null,"Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into ",(0,i.kt)("inlineCode",{parentName:"p"},"etc/certs")," in your Routr installation and run the following script:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'keytool -genkey -keyalg RSA \\\n -noprompt \\\n -alias routr \\\n -keystore domains-cert.jks \\\n -storepass changeit \\\n -keypass changeit \\\n -validity 365 \\\n -keysize 2048 \\\n -dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n -ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1\n')),(0,i.kt)("p",null,"Remember to adjust the values to match your project's information."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("inlineCode",{parentName:"p"},"WSS")," does not work with a self-signed certificate. However, you can add a security exception by using ",(0,i.kt)("inlineCode",{parentName:"p"},"https")," instead of ",(0,i.kt)("inlineCode",{parentName:"p"},"wss")," in your browser's search bar and then accepting the security certificate.")),(0,i.kt)("h3",{id:"creating-a-certificate-using-lets-encrypt"},"Creating a Certificate using Let's Encrypt"),(0,i.kt)("p",null,"The recommended way to create a valid certificate for Routr is using the free service ",(0,i.kt)("a",{parentName:"p",href:"https://letsencrypt.org"},"Let's Encrypt"),". Please go to ",(0,i.kt)("a",{parentName:"p",href:"https://letsencrypt.org/"},"https://letsencrypt.org/")," for details on how to install the required tooling. To generate the certificate, use the following steps:"),(0,i.kt)("p",null,"\u278a"," Create keys"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com\n")),(0,i.kt)("p",null,"Change to the directory where we created the certificates(generally at /etc/letsencrypt/live/sip.ocean.com)."),(0,i.kt)("p",null,"\u278b"," Create a PKCS12 file containing full chain and private key"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 -name domains-cert.jks\n")),(0,i.kt)("p",null,"Please make a note of the password since you need it in the next step."),(0,i.kt)("p",null,"\u278c"," Convert PKCS12 to Keystore"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks\n")),(0,i.kt)("h2",{id:"installing-the-certificate-in-routr"},"Installing the Certificate in Routr"),(0,i.kt)("p",null,"To enable secure signaling in Routr, copy your certificate in ",(0,i.kt)("inlineCode",{parentName:"p"},"etc/certs")," and edit the file ",(0,i.kt)("inlineCode",{parentName:"p"},"config/config.yml")," to look like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yml"},"apiVersion: v1beta1\nmetadata:\n userAgent: Routr v1.0\nspec:\n securityContext:\n keyStore: etc/certs/domains-cert.jks\n trustStore: etc/certs/domains-cert.jks\n keyStorePassword: 'changeit'\n trustStorePassword: 'changeit'\n keyStoreType: 'jks'\n debugging: true # Enabled debug only for testing\n transport:\n - protocol: tls\n port: 5061\n...\n")),(0,i.kt)("p",null,"If you set the property ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.securityContext.debugging")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"openssl s_client -host 192.168.1.2 -port 5061 # Remember to use Routr's IP\n")),(0,i.kt)("h2",{id:"setting-up-the-sip-phones"},"Setting up the Sip Phones"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"For this guide, we are using ",(0,i.kt)("inlineCode",{parentName:"p"},"Blink Pro"),".")),(0,i.kt)("p",null,"Go to the account that you want to secure, select ",(0,i.kt)("inlineCode",{parentName:"p"},"Advanced -> Sip Signaling")," and change the parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"Primary Proxy")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"${proxyHost}:${proxyPort};transport=tls"),". See the example in the following image:"),(0,i.kt)("img",{src:"/img/blinkpro_tls_config.png",width:"600"}),(0,i.kt)("p",null,"If everything went well, you should see a green padlock like the one in the image below:"),(0,i.kt)("img",{src:"/img/blinkpro_tls_secured.png",width:"400"}))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a9d63626.ef9d935a.js b/assets/js/a9d63626.ef9d935a.js new file mode 100644 index 000000000..ae0d2185c --- /dev/null +++ b/assets/js/a9d63626.ef9d935a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7372],{1068:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=n(4848),s=n(8453);const r={},o="Securing the signaling path",c={id:"guides/securing-the-signaling-path",title:"Securing the signaling path",description:"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.",source:"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",sourceDirName:"guides",slug:"/guides/securing-the-signaling-path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"},next:{title:"overview",permalink:"/docs/1.x.x/api/overview"}},a={},l=[{value:"Creating a Java Keystore(.JKS) certificate",id:"creating-a-java-keystorejks-certificate",level:2},{value:"Creating a self-signed Certificate",id:"creating-a-self-signed-certificate",level:3},{value:"Creating a Certificate using Let's Encrypt",id:"creating-a-certificate-using-lets-encrypt",level:3},{value:"Installing the Certificate in Routr",id:"installing-the-certificate-in-routr",level:2},{value:"Setting up the Sip Phones",id:"setting-up-the-sip-phones",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"securing-the-signaling-path",children:"Securing the signaling path"}),"\n",(0,i.jsxs)(t.p,{children:["Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that ",(0,i.jsx)(t.em,{children:"Routr"})," only secures the signaling and that the endpoints are ultimately responsible for securing the media."]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path"}),"\n"]}),"\n",(0,i.jsx)("img",{src:"/img/secure_signaling.png",width:"600",vspace:"30"}),"\n",(0,i.jsx)(t.h2,{id:"creating-a-java-keystorejks-certificate",children:"Creating a Java Keystore(.JKS) certificate"}),"\n",(0,i.jsxs)(t.p,{children:["We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt service"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"creating-a-self-signed-certificate",children:"Creating a self-signed Certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into ",(0,i.jsx)(t.code,{children:"etc/certs"})," in your Routr installation and run the following script:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'keytool -genkey -keyalg RSA \\\n -noprompt \\\n -alias routr \\\n -keystore domains-cert.jks \\\n -storepass changeit \\\n -keypass changeit \\\n -validity 365 \\\n -keysize 2048 \\\n -dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n -ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1\n'})}),"\n",(0,i.jsx)(t.p,{children:"Remember to adjust the values to match your project's information."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"WSS"})," does not work with a self-signed certificate. However, you can add a security exception by using ",(0,i.jsx)(t.code,{children:"https"})," instead of ",(0,i.jsx)(t.code,{children:"wss"})," in your browser's search bar and then accepting the security certificate."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"creating-a-certificate-using-lets-encrypt",children:"Creating a Certificate using Let's Encrypt"}),"\n",(0,i.jsxs)(t.p,{children:["The recommended way to create a valid certificate for Routr is using the free service ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org",children:"Let's Encrypt"}),". Please go to ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org/",children:"https://letsencrypt.org/"})," for details on how to install the required tooling. To generate the certificate, use the following steps:"]}),"\n",(0,i.jsx)(t.p,{children:"\u278a Create keys"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com\n"})}),"\n",(0,i.jsx)(t.p,{children:"Change to the directory where we created the certificates(generally at /etc/letsencrypt/live/sip.ocean.com)."}),"\n",(0,i.jsx)(t.p,{children:"\u278b Create a PKCS12 file containing full chain and private key"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 -name domains-cert.jks\n"})}),"\n",(0,i.jsx)(t.p,{children:"Please make a note of the password since you need it in the next step."}),"\n",(0,i.jsx)(t.p,{children:"\u278c Convert PKCS12 to Keystore"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks\n"})}),"\n",(0,i.jsx)(t.h2,{id:"installing-the-certificate-in-routr",children:"Installing the Certificate in Routr"}),"\n",(0,i.jsxs)(t.p,{children:["To enable secure signaling in Routr, copy your certificate in ",(0,i.jsx)(t.code,{children:"etc/certs"})," and edit the file ",(0,i.jsx)(t.code,{children:"config/config.yml"})," to look like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yml",children:"apiVersion: v1beta1\nmetadata:\n userAgent: Routr v1.0\nspec:\n securityContext:\n keyStore: etc/certs/domains-cert.jks\n trustStore: etc/certs/domains-cert.jks\n keyStorePassword: 'changeit'\n trustStorePassword: 'changeit'\n keyStoreType: 'jks'\n debugging: true # Enabled debug only for testing\n transport:\n - protocol: tls\n port: 5061\n...\n"})}),"\n",(0,i.jsxs)(t.p,{children:["If you set the property ",(0,i.jsx)(t.code,{children:"spec.securityContext.debugging"})," to ",(0,i.jsx)(t.code,{children:"true"}),", you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"openssl s_client -host 192.168.1.2 -port 5061 # Remember to use Routr's IP\n"})}),"\n",(0,i.jsx)(t.h2,{id:"setting-up-the-sip-phones",children:"Setting up the Sip Phones"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["For this guide, we are using ",(0,i.jsx)(t.code,{children:"Blink Pro"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Go to the account that you want to secure, select ",(0,i.jsx)(t.code,{children:"Advanced -> Sip Signaling"})," and change the parameter ",(0,i.jsx)(t.code,{children:"Primary Proxy"})," to ",(0,i.jsx)(t.code,{children:"${proxyHost}:${proxyPort};transport=tls"}),". See the example in the following image:"]}),"\n",(0,i.jsx)("img",{src:"/img/blinkpro_tls_config.png",width:"600"}),"\n",(0,i.jsx)(t.p,{children:"If everything went well, you should see a green padlock like the one in the image below:"}),"\n",(0,i.jsx)("img",{src:"/img/blinkpro_tls_secured.png",width:"400"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var i=n(6540);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b1e2c3e5.55924adb.js b/assets/js/b1e2c3e5.55924adb.js deleted file mode 100644 index 18660f393..000000000 --- a/assets/js/b1e2c3e5.55924adb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5528],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),d=a,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(f,i(i({ref:t},c),{},{components:n})):r.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[u]="string"==typeof e?e:a,i[1]=p;for(var l=2;l<o;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},8360:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>l});var r=n(7462),a=(n(7294),n(3905));const o={},i="updateDomain",p={unversionedId:"api/domains/update",id:"version-1.x.x/api/domains/update",title:"updateDomain",description:"Updates an existing Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/update.md",sourceDirName:"api/domains",slug:"/api/domains/update",permalink:"/docs/1.x.x/api/domains/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"},next:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"}},s={},l=[],c={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"updatedomain"},"updateDomain"),(0,a.kt)("p",null,"Updates an existing Domain resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/domains/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"PUT")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("p",null,"This method does not receive any parameters."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"A file containing a ",(0,a.kt)("a",{parentName:"p",href:"/docs/configuration/domains"},"Domain")," resource in ",(0,a.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method updates a Domain resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'PUT /api/v1beta1/domains/dm6c87r2\n{\n "apiVersion": "v1beta1",\n "kind": "Domain",\n "metadata": {\n "name": "Another Office",\n "ref": "dm6c87r2"\n },\n "spec": {\n "context": {\n "domainUri": "sip2.local"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b1e2c3e5.f009a04f.js b/assets/js/b1e2c3e5.f009a04f.js new file mode 100644 index 000000000..d9159cf8b --- /dev/null +++ b/assets/js/b1e2c3e5.f009a04f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1953],{6891:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(4848),i=t(8453);const r={},o="updateDomain",a={id:"api/domains/update",title:"updateDomain",description:"Updates an existing Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/update.md",sourceDirName:"api/domains",slug:"/api/domains/update",permalink:"/docs/1.x.x/api/domains/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"},next:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"}},d={},c=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updatedomain",children:"updateDomain"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Domain resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing a ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/domains",children:"Domain"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates a Domain resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/domains/dm6c87r2\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Domain",\n\t"metadata": {\n\t\t"name": "Another Office",\n "ref": "dm6c87r2"\n\t},\n\t"spec": {\n\t\t"context": {\n\t\t\t"domainUri": "sip2.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.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(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b396445b.4d16d64d.js b/assets/js/b396445b.4d16d64d.js new file mode 100644 index 000000000..2acb21fd1 --- /dev/null +++ b/assets/js/b396445b.4d16d64d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4082],{5286:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=n(4848),r=n(8453);const i={},s="Overview",a={id:"development/alterations/overview",title:"Overview",description:"Coming soon.",source:"@site/docs/development/alterations/overview.md",sourceDirName:"development/alterations",slug:"/development/alterations/overview",permalink:"/docs/2.0.0/development/alterations/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"},next:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"}},c={},l=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const r={},i=o.createContext(r);function s(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b396445b.cb86b0d2.js b/assets/js/b396445b.cb86b0d2.js deleted file mode 100644 index b9b0a8169..000000000 --- a/assets/js/b396445b.cb86b0d2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7043],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",v={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=p(r),m=o,d=u["".concat(c,".").concat(m)]||u[m]||v[m]||i;return r?n.createElement(d,a(a({ref:t},s),{},{components:r})):n.createElement(d,a({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:o,a[1]=l;for(var p=2;p<i;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},2443:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>v,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={},a="Overview",l={unversionedId:"development/alterations/overview",id:"development/alterations/overview",title:"Overview",description:"Coming soon.",source:"@site/docs/development/alterations/overview.md",sourceDirName:"development/alterations",slug:"/development/alterations/overview",permalink:"/docs/2.0.0/development/alterations/overview",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"},next:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"}},c={},p=[],s={toc:p},u="wrapper";function v(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"Coming soon."))}v.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b3bbf2ca.021d4da0.js b/assets/js/b3bbf2ca.021d4da0.js deleted file mode 100644 index 94647f26a..000000000 --- a/assets/js/b3bbf2ca.021d4da0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3411],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),l=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=l(n),f=o,m=s["".concat(p,".").concat(f)]||s[f]||d[f]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:o,i[1]=c;for(var l=2;l<a;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},3313:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={},i="Building a Chat Application",c={unversionedId:"development/building-a-chat-application",id:"development/building-a-chat-application",title:"Building a Chat Application",description:"Comin soon.",source:"@site/docs/development/building-a-chat-application.md",sourceDirName:"development",slug:"/development/building-a-chat-application",permalink:"/docs/2.0.0/development/building-a-chat-application",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-chat-application.md",tags:[],version:"current",frontMatter:{}},p={},l=[],u={toc:l},s="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(s,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"building-a-chat-application"},"Building a Chat Application"),(0,o.kt)("p",null,"Comin soon."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b3bbf2ca.60bb6537.js b/assets/js/b3bbf2ca.60bb6537.js new file mode 100644 index 000000000..2a00e50db --- /dev/null +++ b/assets/js/b3bbf2ca.60bb6537.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8190],{3036:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>p});var o=e(4848),i=e(8453);const a={},c="Building a Chat Application",r={id:"development/building-a-chat-application",title:"Building a Chat Application",description:"Comin soon.",source:"@site/docs/development/building-a-chat-application.md",sourceDirName:"development",slug:"/development/building-a-chat-application",permalink:"/docs/2.0.0/development/building-a-chat-application",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-chat-application.md",tags:[],version:"current",frontMatter:{}},s={},p=[];function l(t){const n={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"building-a-chat-application",children:"Building a Chat Application"}),"\n",(0,o.jsx)(n.p,{children:"Comin soon."})]})}function d(t={}){const{wrapper:n}={...(0,i.R)(),...t.components};return n?(0,o.jsx)(n,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>c,x:()=>r});var o=e(6540);const i={},a=o.createContext(i);function c(t){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function r(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:c(t.components),o.createElement(a.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4dd6982.a5471632.js b/assets/js/b4dd6982.a5471632.js new file mode 100644 index 000000000..f5c6cdf92 --- /dev/null +++ b/assets/js/b4dd6982.a5471632.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8732],{1744:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=t(4848),s=t(8453);const i={},o="updateConfiguration",c={id:"api/config/update",title:"updateConfiguration",description:"This method updates the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/update.md",sourceDirName:"api/config",slug:"/api/config/update",permalink:"/docs/1.x.x/api/config/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"},next:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"updateconfiguration",children:"updateConfiguration"}),"\n",(0,r.jsx)(n.p,{children:"This method updates the servers' configuration."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/system/config"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"PUT"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing the ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/general",children:"servers' configuration"})," in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"The changes will take effect on the next time the instance restart."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'PUT /api/{apiversion}/config\n{\n "apiVersion": "v1beta1",\n "spec": {\n "dataSource": {\n "provider": "redis_data_provider"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.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(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4dd6982.b556540b.js b/assets/js/b4dd6982.b556540b.js deleted file mode 100644 index e5502aaeb..000000000 --- a/assets/js/b4dd6982.b556540b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1424],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),u=s(n),d=o,m=u["".concat(c,".").concat(d)]||u[d]||f[d]||a;return n?r.createElement(m,i(i({ref:t},l),{},{components:n})):r.createElement(m,i({ref:t},l))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p[u]="string"==typeof e?e:o,i[1]=p;for(var s=2;s<a;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},5629:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>f,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={},i="updateConfiguration",p={unversionedId:"api/config/update",id:"version-1.x.x/api/config/update",title:"updateConfiguration",description:"This method updates the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/update.md",sourceDirName:"api/config",slug:"/api/config/update",permalink:"/docs/1.x.x/api/config/update",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"},next:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"}},c={},s=[],l={toc:s},u="wrapper";function f(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"updateconfiguration"},"updateConfiguration"),(0,o.kt)("p",null,"This method updates the servers' configuration."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"URL")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"/system/config")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Method")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"PUT")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Parameters")),(0,o.kt)("p",null,"This method does not receive any parameters."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Request body")),(0,o.kt)("p",null,"A file containing the ",(0,o.kt)("a",{parentName:"p",href:"/api/config/general"},"servers' configuration")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"json")," format."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Response")),(0,o.kt)("p",null,"The changes will take effect on the next time the instance restart."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Sample Call")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'PUT /api/{apiversion}/config\n{\n "apiVersion": "v1beta1",\n "spec": {\n "dataSource": {\n "provider": "redis_data_provider"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b5de05fe.0471e697.js b/assets/js/b5de05fe.0471e697.js deleted file mode 100644 index bb452e003..000000000 --- a/assets/js/b5de05fe.0471e697.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1965],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(s,".").concat(d)]||u[d]||m[d]||l;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:a,o[1]=i;for(var c=2;c<l;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},6648:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const l={},o="Cheatsheet",i={unversionedId:"administration/cli/cheatsheet",id:"version-1.x.x/administration/cli/cheatsheet",title:"Cheatsheet",description:"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.",source:"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",sourceDirName:"administration/cli",slug:"/administration/cli/cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/1.x.x/concepts"},next:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"}},s={},c=[{value:"Installation",id:"installation",level:2},{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Examples: Common operations",id:"examples-common-operations",level:3},{value:"Cheat Sheet",id:"cheat-sheet",level:2},{value:"Request and store token",id:"request-and-store-token",level:3},{value:"Clear out the session credentials",id:"clear-out-the-session-credentials",level:3},{value:"Launch the Web Console",id:"launch-the-web-console",level:3},{value:"Showing the Registry",id:"showing-the-registry",level:3},{value:"Locating SIP Devices",id:"locating-sip-devices",level:3},{value:"Creating Resources",id:"creating-resources",level:3},{value:"Finding Resources",id:"finding-resources",level:3},{value:"Deleting Resources",id:"deleting-resources",level:3},{value:"Updating Resources",id:"updating-resources",level:3},{value:"Dump all available logs",id:"dump-all-available-logs",level:3},{value:"Restart the engine",id:"restart-the-engine",level:3},{value:"Stop the engine",id:"stop-the-engine",level:3},{value:"Check the engine status",id:"check-the-engine-status",level:3},{value:"Display version information",id:"display-version-information",level:3},{value:"Manage general configuration",id:"manage-general-configuration",level:3}],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"cheatsheet"},"Cheatsheet"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl")," is a command-line interface for running commands against a Routr server. This overview covers ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl")," syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server."),(0,a.kt)("h2",{id:"installation"},"Installation"),(0,a.kt)("p",null,"To get the Routr Command-Line Tool run the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm install -g routr-ctl\n")),(0,a.kt)("p",null,"The command-line tool is now globally accessible."),(0,a.kt)("h2",{id:"login-to-a-routr-server"},"Login to a Routr server"),(0,a.kt)("p",null,"To login to a Routr server, use the login command."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"The current API version is v1beta1")),(0,a.kt)("h2",{id:"syntax"},"Syntax"),(0,a.kt)("p",null,"Use the following syntax to run ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl")," commands from your terminal window:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"rctl COMMAND [REF] [flags]\n")),(0,a.kt)("p",null,"where ",(0,a.kt)("inlineCode",{parentName:"p"},"COMMAND"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"subcommand")," ",(0,a.kt)("inlineCode",{parentName:"p"},"REF"),", and ",(0,a.kt)("inlineCode",{parentName:"p"},"flags")," are:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"p"},"COMMAND"),": Specifies the operation that you want to perform on one or more resources. For example, create, get, delete, locate(loc).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"p"},"subcommand"),": Specifies the resource type. Resource types are case-sensitive, and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output:"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"}," $ rctl get gateway gweef506\n $ rctl get gateways gweef506\n $ rctl get gw gweef506\n")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"p"},"REF"),": Specifies the reference to the resource. References are case-sensitive. For a full list, omit the reference. For example, ",(0,a.kt)("inlineCode",{parentName:"p"},"$ rctl get agents"),".")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"p"},"flags"),": Specifies optional flags. For example, you can use the --filter to further reduce the output of the ",(0,a.kt)("inlineCode",{parentName:"p"},"get")," command ."))),(0,a.kt)("p",null,"The --filter flag uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/json-path/JsonPath"},"JsonPath")," to perform the filtering. The root is always '$'.\nAll you need to add is the path to the property and the filter operators. For example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# This returns all the Numbers in Gateway 'gweef506'\nrctl get numbers --filter \"@.metadata.gwRef=='gweef506'\" \n")),(0,a.kt)("p",null,"If you need help, just run ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl --help")," from the terminal window."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ rctl --help\nusage: rctl [-h] [-v] COMMAND ...\n\nA tool for the management of a Routr instance\n\nnamed arguments:\n -h, --help show this help message and exit\n -v, --version print version information and quit\n\nCommands:\n COMMAND\n get display a list of resources\n create (crea) creates new resource(s)\n apply apply changes over existing resource(s)\n delete (del) delete an existing resource(s)\n locate (loc) locate sip device(s)\n registry (reg) shows gateways registrations\n proxy run a proxy to the server (beta)\n login sets connection info\n logout clear session credentials\n logs dumps all the available system logs\n restart restarts the engine\n stop stops the engine\n ping checks engine status\n version (ver) obtain rctl's version information\n config manage routr configuration\n\nRun 'rctl COMMAND --help' for more information on a command\n")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Important: Some commands (i.e.: create, delete) are not available in the default implementation of the ",(0,a.kt)("inlineCode",{parentName:"p"},"resources")," modules. Only persistent implementations support these commands.")),(0,a.kt)("h3",{id:"examples-common-operations"},"Examples: Common operations"),(0,a.kt)("p",null,"Use the following set of examples to help you familiarize yourself with running the commonly used ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl")," operations:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"rctl locate")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl loc")," - Locate a sip device registered on the Routr server"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"// Locate all Sip Devices registered against a Routr server\n$ rctl loc\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"rctl registry")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"rctl reg")," - Shows Gateways current registration."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"// Shows the registry\n$ rctl reg\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"rctl get")," - List one or more resources."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"// List all numbers\n$ rctl get numbers\n\n// List all numbers that belong to gateway reference gweef506\n$ rctl get numbers --filter \"@.metadata.ref=='gweef506'\"\n\n// List number by reference\n$ rctl get numbers dd50baa4\n\n// List all agents\n$ rctl get agents\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"rctl create")," - create a new resource."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"// Create a new gateway(s) using a .yaml or .yml file\n$ rctl create -f new-gateway.yaml\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"rctl apply")," - update an existing resource(s)"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"// Update an existing resource(s) .yaml or .yml.\n$ rctl apply -f new-gateway.yaml\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"rctl delete")," - delete a resource."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"// Delete all numbers for gateway reference gweef506\n$ rctl delete numbers --filter \"@.metadata.gwRef=='gweef506'\"\n\n// Delete a single agent (using delete alias)\n$ rctl del agent ag3f77f6\n")),(0,a.kt)("h2",{id:"cheat-sheet"},"Cheat Sheet"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Create, delete, and update are only available in some implementations of the ",(0,a.kt)("inlineCode",{parentName:"p"},"resources")," module.")),(0,a.kt)("h3",{id:"request-and-store-token"},"Request and store token"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Request authentication for subsequent commands\n$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n")),(0,a.kt)("h3",{id:"clear-out-the-session-credentials"},"Clear out the session credentials"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Clear session credentials\n$ rctl logout\n")),(0,a.kt)("h3",{id:"launch-the-web-console"},"Launch the Web Console"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# The Web Console re-uses the credentials of your Command-Line Tool\nrctl proxy\n")),(0,a.kt)("h3",{id:"showing-the-registry"},"Showing the Registry"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Shows all the Gateways that are currently available\n$ rctl registry # Shows only current registrations. You may use `reg` for short\n")),(0,a.kt)("h3",{id:"locating-sip-devices"},"Locating SIP Devices"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Find all sip devices available at the location service\n$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes\n")),(0,a.kt)("h3",{id:"creating-resources"},"Creating Resources"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Create new peers and agents\n$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml\n")),(0,a.kt)("h3",{id:"finding-resources"},"Finding Resources"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Get Numbers\n$ rctl get numbers # List all available Numbers\n$ rctl get number # List all available Numbers\n$ rctl get number --filter \"@.metadata.ref=='dd50baa4'\" # Shows Number with reference 'Number0001'\n$ rctl get number --filter \"@.metadata.gwRef=='gweef506'\" # Shows Numbers with Gateway reference 'GW1232'\n\n# Get agents\n$ rctl get agents # List all Agents\n")),(0,a.kt)("h3",{id:"deleting-resources"},"Deleting Resources"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# Delete command by refernce or filter\n$ rctl delete agent ag3f77f6 # Delete Agent by reference\n$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter\n")),(0,a.kt)("h3",{id:"updating-resources"},"Updating Resources"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ rctl apply -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml\n")),(0,a.kt)("h3",{id:"dump-all-available-logs"},"Dump all available logs"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ rctl logs\n")),(0,a.kt)("h3",{id:"restart-the-engine"},"Restart the engine"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# To restart the engine immediately use the --now flag\n$ rctl restart --now\n")),(0,a.kt)("h3",{id:"stop-the-engine"},"Stop the engine"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# To stop the engine immediately use the --now flag\n$ rctl restart --now\n")),(0,a.kt)("h3",{id:"check-the-engine-status"},"Check the engine status"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ rctl ping\n")),(0,a.kt)("h3",{id:"display-version-information"},"Display version information"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ rctl ver\n")),(0,a.kt)("h3",{id:"manage-general-configuration"},"Manage general configuration"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# To update configuration use the apply subommand\n$ rctl config apply -f /path/to/config.yml\n\n# To see the configuration use the describe subcommand\n$ rctl config describe --full\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b5de05fe.2a9dab58.js b/assets/js/b5de05fe.2a9dab58.js new file mode 100644 index 000000000..6a4b06549 --- /dev/null +++ b/assets/js/b5de05fe.2a9dab58.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[803],{547:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=r(4848),s=r(8453);const i={},l="Cheatsheet",a={id:"administration/cli/cheatsheet",title:"Cheatsheet",description:"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.",source:"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",sourceDirName:"administration/cli",slug:"/administration/cli/cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/1.x.x/concepts"},next:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"}},o={},c=[{value:"Installation",id:"installation",level:2},{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Examples: Common operations",id:"examples-common-operations",level:3},{value:"Cheat Sheet",id:"cheat-sheet",level:2},{value:"Request and store token",id:"request-and-store-token",level:3},{value:"Clear out the session credentials",id:"clear-out-the-session-credentials",level:3},{value:"Launch the Web Console",id:"launch-the-web-console",level:3},{value:"Showing the Registry",id:"showing-the-registry",level:3},{value:"Locating SIP Devices",id:"locating-sip-devices",level:3},{value:"Creating Resources",id:"creating-resources",level:3},{value:"Finding Resources",id:"finding-resources",level:3},{value:"Deleting Resources",id:"deleting-resources",level:3},{value:"Updating Resources",id:"updating-resources",level:3},{value:"Dump all available logs",id:"dump-all-available-logs",level:3},{value:"Restart the engine",id:"restart-the-engine",level:3},{value:"Stop the engine",id:"stop-the-engine",level:3},{value:"Check the engine status",id:"check-the-engine-status",level:3},{value:"Display version information",id:"display-version-information",level:3},{value:"Manage general configuration",id:"manage-general-configuration",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cheatsheet",children:"Cheatsheet"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"rctl"})," is a command-line interface for running commands against a Routr server. This overview covers ",(0,t.jsx)(n.code,{children:"rctl"})," syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"To get the Routr Command-Line Tool run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install -g routr-ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"The command-line tool is now globally accessible."}),"\n",(0,t.jsx)(n.h2,{id:"login-to-a-routr-server",children:"Login to a Routr server"}),"\n",(0,t.jsx)(n.p,{children:"To login to a Routr server, use the login command."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The current API version is v1beta1"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"syntax",children:"Syntax"}),"\n",(0,t.jsxs)(n.p,{children:["Use the following syntax to run ",(0,t.jsx)(n.code,{children:"rctl"})," commands from your terminal window:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"rctl COMMAND [REF] [flags]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["where ",(0,t.jsx)(n.code,{children:"COMMAND"}),", ",(0,t.jsx)(n.code,{children:"subcommand"})," ",(0,t.jsx)(n.code,{children:"REF"}),", and ",(0,t.jsx)(n.code,{children:"flags"})," are:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"COMMAND"}),": Specifies the operation that you want to perform on one or more resources. For example, create, get, delete, locate(loc)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"subcommand"}),": Specifies the resource type. Resource types are case-sensitive, and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" $ rctl get gateway gweef506\n $ rctl get gateways gweef506\n $ rctl get gw gweef506\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"REF"}),": Specifies the reference to the resource. References are case-sensitive. For a full list, omit the reference. For example, ",(0,t.jsx)(n.code,{children:"$ rctl get agents"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"flags"}),": Specifies optional flags. For example, you can use the --filter to further reduce the output of the ",(0,t.jsx)(n.code,{children:"get"})," command ."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The --filter flag uses ",(0,t.jsx)(n.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," to perform the filtering. The root is always '$'.\nAll you need to add is the path to the property and the filter operators. For example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# This returns all the Numbers in Gateway 'gweef506'\nrctl get numbers --filter \"@.metadata.gwRef=='gweef506'\" \n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you need help, just run ",(0,t.jsx)(n.code,{children:"rctl --help"})," from the terminal window."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl --help\nusage: rctl [-h] [-v] COMMAND ...\n\nA tool for the management of a Routr instance\n\nnamed arguments:\n -h, --help show this help message and exit\n -v, --version print version information and quit\n\nCommands:\n COMMAND\n get display a list of resources\n create (crea) creates new resource(s)\n apply apply changes over existing resource(s)\n delete (del) delete an existing resource(s)\n locate (loc) locate sip device(s)\n registry (reg) shows gateways registrations\n proxy run a proxy to the server (beta)\n login sets connection info\n logout clear session credentials\n logs dumps all the available system logs\n restart restarts the engine\n stop stops the engine\n ping checks engine status\n version (ver) obtain rctl's version information\n config manage routr configuration\n\nRun 'rctl COMMAND --help' for more information on a command\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Important: Some commands (i.e.: create, delete) are not available in the default implementation of the ",(0,t.jsx)(n.code,{children:"resources"})," modules. Only persistent implementations support these commands."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples-common-operations",children:"Examples: Common operations"}),"\n",(0,t.jsxs)(n.p,{children:["Use the following set of examples to help you familiarize yourself with running the commonly used ",(0,t.jsx)(n.code,{children:"rctl"})," operations:"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl locate"})," or ",(0,t.jsx)(n.code,{children:"rctl loc"})," - Locate a sip device registered on the Routr server"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Locate all Sip Devices registered against a Routr server\n$ rctl loc\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl registry"})," or ",(0,t.jsx)(n.code,{children:"rctl reg"})," - Shows Gateways current registration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Shows the registry\n$ rctl reg\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl get"})," - List one or more resources."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// List all numbers\n$ rctl get numbers\n\n// List all numbers that belong to gateway reference gweef506\n$ rctl get numbers --filter \"@.metadata.ref=='gweef506'\"\n\n// List number by reference\n$ rctl get numbers dd50baa4\n\n// List all agents\n$ rctl get agents\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl create"})," - create a new resource."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Create a new gateway(s) using a .yaml or .yml file\n$ rctl create -f new-gateway.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl apply"})," - update an existing resource(s)"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Update an existing resource(s) .yaml or .yml.\n$ rctl apply -f new-gateway.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl delete"})," - delete a resource."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Delete all numbers for gateway reference gweef506\n$ rctl delete numbers --filter \"@.metadata.gwRef=='gweef506'\"\n\n// Delete a single agent (using delete alias)\n$ rctl del agent ag3f77f6\n"})}),"\n",(0,t.jsx)(n.h2,{id:"cheat-sheet",children:"Cheat Sheet"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Create, delete, and update are only available in some implementations of the ",(0,t.jsx)(n.code,{children:"resources"})," module."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"request-and-store-token",children:"Request and store token"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Request authentication for subsequent commands\n$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,t.jsx)(n.h3,{id:"clear-out-the-session-credentials",children:"Clear out the session credentials"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Clear session credentials\n$ rctl logout\n"})}),"\n",(0,t.jsx)(n.h3,{id:"launch-the-web-console",children:"Launch the Web Console"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# The Web Console re-uses the credentials of your Command-Line Tool\nrctl proxy\n"})}),"\n",(0,t.jsx)(n.h3,{id:"showing-the-registry",children:"Showing the Registry"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Shows all the Gateways that are currently available\n$ rctl registry # Shows only current registrations. You may use `reg` for short\n"})}),"\n",(0,t.jsx)(n.h3,{id:"locating-sip-devices",children:"Locating SIP Devices"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Find all sip devices available at the location service\n$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes\n"})}),"\n",(0,t.jsx)(n.h3,{id:"creating-resources",children:"Creating Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Create new peers and agents\n$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml\n"})}),"\n",(0,t.jsx)(n.h3,{id:"finding-resources",children:"Finding Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Get Numbers\n$ rctl get numbers # List all available Numbers\n$ rctl get number # List all available Numbers\n$ rctl get number --filter \"@.metadata.ref=='dd50baa4'\" # Shows Number with reference 'Number0001'\n$ rctl get number --filter \"@.metadata.gwRef=='gweef506'\" # Shows Numbers with Gateway reference 'GW1232'\n\n# Get agents\n$ rctl get agents # List all Agents\n"})}),"\n",(0,t.jsx)(n.h3,{id:"deleting-resources",children:"Deleting Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Delete command by refernce or filter\n$ rctl delete agent ag3f77f6 # Delete Agent by reference\n$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter\n"})}),"\n",(0,t.jsx)(n.h3,{id:"updating-resources",children:"Updating Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl apply -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml\n"})}),"\n",(0,t.jsx)(n.h3,{id:"dump-all-available-logs",children:"Dump all available logs"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl logs\n"})}),"\n",(0,t.jsx)(n.h3,{id:"restart-the-engine",children:"Restart the engine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To restart the engine immediately use the --now flag\n$ rctl restart --now\n"})}),"\n",(0,t.jsx)(n.h3,{id:"stop-the-engine",children:"Stop the engine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To stop the engine immediately use the --now flag\n$ rctl restart --now\n"})}),"\n",(0,t.jsx)(n.h3,{id:"check-the-engine-status",children:"Check the engine status"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl ping\n"})}),"\n",(0,t.jsx)(n.h3,{id:"display-version-information",children:"Display version information"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl ver\n"})}),"\n",(0,t.jsx)(n.h3,{id:"manage-general-configuration",children:"Manage general configuration"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To update configuration use the apply subommand\n$ rctl config apply -f /path/to/config.yml\n\n# To see the configuration use the describe subcommand\n$ rctl config describe --full\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>a});var t=r(6540);const s={},i=t.createContext(s);function l(e){const n=t.useContext(i);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(s):e.components||s:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8ab588d.06e68070.js b/assets/js/b8ab588d.06e68070.js new file mode 100644 index 000000000..d711e222e --- /dev/null +++ b/assets/js/b8ab588d.06e68070.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5659],{5212:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=n(4848),r=n(8453);const a={},i="getGateway",o={id:"api/gateways/get",title:"getGateway",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/get.md",sourceDirName:"api/gateways",slug:"/api/gateways/get",permalink:"/docs/1.x.x/api/gateways/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"},next:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"}},c={},d=[];function l(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getgateway",children:"getGateway"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Gateway",\n \t"metadata": {\n \t\t"name": "Provider Inc.",\n "ref": "gw5c77t2"\n \t},\n \t"spec": {\n \t\t"host": "sip.provider.net",\n \t\t"credentials": {\n \t\t\t"username": "youruser",\n \t\t\t"secret": "yoursecret"\n \t\t},\n \t\t"transport": "udp"\n \t}\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var s=n(6540);const r={},a=s.createContext(r);function i(e){const t=s.useContext(a);return s.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(r):e.components||r:i(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8ab588d.a4431753.js b/assets/js/b8ab588d.a4431753.js deleted file mode 100644 index fd9528e5e..000000000 --- a/assets/js/b8ab588d.a4431753.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4532],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),i=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=i(r),d=a,y=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return r?n.createElement(y,p(p({ref:t},c),{},{components:r})):n.createElement(y,p({ref:t},c))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,p[1]=l;for(var i=2;i<o;i++)p[i]=r[i];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},3183:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const o={},p="getGateway",l={unversionedId:"api/gateways/get",id:"version-1.x.x/api/gateways/get",title:"getGateway",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/get.md",sourceDirName:"api/gateways",slug:"/api/gateways/get",permalink:"/docs/1.x.x/api/gateways/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"},next:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"}},s={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getgateway"},"getGateway"),(0,a.kt)("p",null,"This method returns a Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/gateways/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Gateway",\n "metadata": {\n "name": "Provider Inc.",\n "ref": "gw5c77t2"\n },\n "spec": {\n "host": "sip.provider.net",\n "credentials": {\n "username": "youruser",\n "secret": "yoursecret"\n },\n "transport": "udp"\n }\n }\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bb373259.696b16d2.js b/assets/js/bb373259.696b16d2.js deleted file mode 100644 index 029d611c1..000000000 --- a/assets/js/bb373259.696b16d2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[849],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=n,f=p["".concat(l,".").concat(d)]||p[d]||m[d]||i;return r?o.createElement(f,a(a({ref:t},u),{},{components:r})):o.createElement(f,a({ref:t},u))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:n,a[1]=s;for(var c=2;c<i;c++)a[c]=r[c];return o.createElement.apply(null,a)}return o.createElement.apply(null,r)}d.displayName="MDXCreateElement"},3149:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var o=r(7462),n=(r(7294),r(3905));const i={},a="Comparison",s={unversionedId:"introduction/comparison",id:"version-1.x.x/introduction/comparison",title:"Comparison",description:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.",source:"@site/versioned_docs/version-1.x.x/introduction/comparison.md",sourceDirName:"introduction",slug:"/introduction/comparison",permalink:"/docs/1.x.x/introduction/comparison",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/comparison.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"},next:{title:"Community",permalink:"/docs/1.x.x/introduction/community"}},l={},c=[{value:"Routr vs Asterisk/FreeSWITCH?",id:"routr-vs-asteriskfreeswitch",level:2},{value:"Routr vs Kamailio/OpenSER?",id:"routr-vs-kamailioopenser",level:2},{value:"So what is the problem with Kamailio/OpenSER?",id:"so-what-is-the-problem-with-kamailioopenser",level:2},{value:"What can we do to make it better?",id:"what-can-we-do-to-make-it-better",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"comparison"},"Comparison"),(0,n.kt)("p",null,"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX."),(0,n.kt)("h2",{id:"routr-vs-asteriskfreeswitch"},"Routr vs Asterisk/FreeSWITCH?"),(0,n.kt)("p",null,"Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses."),(0,n.kt)("p",null,"Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role."),(0,n.kt)("h2",{id:"routr-vs-kamailioopenser"},"Routr vs Kamailio/OpenSER?"),(0,n.kt)("p",null,"Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Proxy, Registrar, Location, Forking, Redirect"),(0,n.kt)("li",{parentName:"ul"},"Load Balancing"),(0,n.kt)("li",{parentName:"ul"},"Session Border Controller"),(0,n.kt)("li",{parentName:"ul"},"Gateway to the PSTN")),(0,n.kt)("p",null,"Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach."),(0,n.kt)("h2",{id:"so-what-is-the-problem-with-kamailioopenser"},"So what is the problem with Kamailio/OpenSER?"),(0,n.kt)("p",null,"Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code."),(0,n.kt)("h2",{id:"what-can-we-do-to-make-it-better"},"What can we do to make it better?"),(0,n.kt)("p",null,"Our vision for a Next-generation SIP Server can be summarized as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Make Routr Cloud-Native (After all it is 2019)"),(0,n.kt)("li",{parentName:"ul"},"It does not require any coding / Most use-cases are configurable"),(0,n.kt)("li",{parentName:"ul"},"Offer the tooling and APIs for easy extensibility"),(0,n.kt)("li",{parentName:"ul"},"Great documentation")),(0,n.kt)("p",null,"If you want to support the initiative, please ",(0,n.kt)("a",{parentName:"p",href:"https://routr.io/docs/2.0.0/community"},"join the discussion"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bb373259.887e1edb.js b/assets/js/bb373259.887e1edb.js new file mode 100644 index 000000000..c02eb8ff3 --- /dev/null +++ b/assets/js/bb373259.887e1edb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5804],{6501:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=t(4848),r=t(8453);const n={},s="Comparison",a={id:"introduction/comparison",title:"Comparison",description:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.",source:"@site/versioned_docs/version-1.x.x/introduction/comparison.md",sourceDirName:"introduction",slug:"/introduction/comparison",permalink:"/docs/1.x.x/introduction/comparison",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/comparison.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"},next:{title:"Community",permalink:"/docs/1.x.x/introduction/community"}},l={},c=[{value:"Routr vs Asterisk/FreeSWITCH?",id:"routr-vs-asteriskfreeswitch",level:2},{value:"Routr vs Kamailio/OpenSER?",id:"routr-vs-kamailioopenser",level:2},{value:"So what is the problem with Kamailio/OpenSER?",id:"so-what-is-the-problem-with-kamailioopenser",level:2},{value:"What can we do to make it better?",id:"what-can-we-do-to-make-it-better",level:2}];function d(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"comparison",children:"Comparison"}),"\n",(0,i.jsx)(o.p,{children:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX."}),"\n",(0,i.jsx)(o.h2,{id:"routr-vs-asteriskfreeswitch",children:"Routr vs Asterisk/FreeSWITCH?"}),"\n",(0,i.jsx)(o.p,{children:"Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses."}),"\n",(0,i.jsx)(o.p,{children:"Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role."}),"\n",(0,i.jsx)(o.h2,{id:"routr-vs-kamailioopenser",children:"Routr vs Kamailio/OpenSER?"}),"\n",(0,i.jsx)(o.p,{children:"Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Proxy, Registrar, Location, Forking, Redirect"}),"\n",(0,i.jsx)(o.li,{children:"Load Balancing"}),"\n",(0,i.jsx)(o.li,{children:"Session Border Controller"}),"\n",(0,i.jsx)(o.li,{children:"Gateway to the PSTN"}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach."}),"\n",(0,i.jsx)(o.h2,{id:"so-what-is-the-problem-with-kamailioopenser",children:"So what is the problem with Kamailio/OpenSER?"}),"\n",(0,i.jsx)(o.p,{children:"Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code."}),"\n",(0,i.jsx)(o.h2,{id:"what-can-we-do-to-make-it-better",children:"What can we do to make it better?"}),"\n",(0,i.jsx)(o.p,{children:"Our vision for a Next-generation SIP Server can be summarized as follows:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Make Routr Cloud-Native (After all it is 2019)"}),"\n",(0,i.jsx)(o.li,{children:"It does not require any coding / Most use-cases are configurable"}),"\n",(0,i.jsx)(o.li,{children:"Offer the tooling and APIs for easy extensibility"}),"\n",(0,i.jsx)(o.li,{children:"Great documentation"}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["If you want to support the initiative, please ",(0,i.jsx)(o.a,{href:"https://routr.io/docs/2.0.0/community",children:"join the discussion"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var i=t(6540);const r={},n=i.createContext(r);function s(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc1a89ad.4d932593.js b/assets/js/bc1a89ad.4d932593.js deleted file mode 100644 index 34f2907f8..000000000 --- a/assets/js/bc1a89ad.4d932593.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4732],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=l(n),d=o,f=m["".concat(s,".").concat(d)]||m[d]||u[d]||a;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[m]="string"==typeof e?e:o,i[1]=c;for(var l=2;l<a;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},8926:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={},i="Remote Access",c={unversionedId:"administration/cli/remote-access",id:"version-1.x.x/administration/cli/remote-access",title:"Remote Access",description:"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.",source:"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",sourceDirName:"administration/cli",slug:"/administration/cli/remote-access",permalink:"/docs/1.x.x/administration/cli/remote-access",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/remote-access.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"},next:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"}},s={},l=[],p={toc:l},m="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"remote-access"},"Remote Access"),(0,o.kt)("p",null,"By default, Routr installs a certificate that only allows for connections using the ",(0,o.kt)("inlineCode",{parentName:"p"},"localhost")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"127.0.0.1"),". To use ",(0,o.kt)("inlineCode",{parentName:"p"},"rctl")," tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the ",(0,o.kt)("inlineCode",{parentName:"p"},"spec.restService")," section of the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.yml"),"."),(0,o.kt)("p",null,"Here is an example using a self-signed certificate(usually enough)."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'keytool -genkey -keyalg RSA \\\n-noprompt \\\n-alias routr \\\n-keystore api-cert.jks \\\n-storepass changeit \\\n-keypass changeit \\\n-validity 365 \\\n-keysize 2048 \\\n-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1\n')),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Remember to place the certificate in the ",(0,o.kt)("inlineCode",{parentName:"p"},"etc/certs")," folder")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bc1a89ad.81431dea.js b/assets/js/bc1a89ad.81431dea.js new file mode 100644 index 000000000..2f94fa207 --- /dev/null +++ b/assets/js/bc1a89ad.81431dea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6346],{9866:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>m,frontMatter:()=>c,metadata:()=>r,toc:()=>l});var o=n(4848),s=n(8453);const c={},i="Remote Access",r={id:"administration/cli/remote-access",title:"Remote Access",description:"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.",source:"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",sourceDirName:"administration/cli",slug:"/administration/cli/remote-access",permalink:"/docs/1.x.x/administration/cli/remote-access",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/remote-access.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"},next:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"}},a={},l=[];function d(e){const t={blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"remote-access",children:"Remote Access"}),"\n",(0,o.jsxs)(t.p,{children:["By default, Routr installs a certificate that only allows for connections using the ",(0,o.jsx)(t.code,{children:"localhost"})," or ",(0,o.jsx)(t.code,{children:"127.0.0.1"}),". To use ",(0,o.jsx)(t.code,{children:"rctl"})," tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the ",(0,o.jsx)(t.code,{children:"spec.restService"})," section of the ",(0,o.jsx)(t.code,{children:"config.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"Here is an example using a self-signed certificate(usually enough)."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'keytool -genkey -keyalg RSA \\\n-noprompt \\\n-alias routr \\\n-keystore api-cert.jks \\\n-storepass changeit \\\n-keypass changeit \\\n-validity 365 \\\n-keysize 2048 \\\n-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1\n'})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Remember to place the certificate in the ",(0,o.jsx)(t.code,{children:"etc/certs"})," folder"]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var o=n(6540);const s={},c=o.createContext(s);function i(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc2f9ced.b395469f.js b/assets/js/bc2f9ced.b395469f.js deleted file mode 100644 index 448ed0a94..000000000 --- a/assets/js/bc2f9ced.b395469f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7795],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),i=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=i(r),d=a,f=m["".concat(s,".").concat(d)]||m[d]||c[d]||l;return r?n.createElement(f,p(p({ref:t},u),{},{components:r})):n.createElement(f,p({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:a,p[1]=o;for(var i=2;i<l;i++)p[i]=r[i];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},4468:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const l={},p="listPeers",o={unversionedId:"api/peers/list",id:"version-1.x.x/api/peers/list",title:"listPeers",description:"This method returns a list of Peer resources.",source:"@site/versioned_docs/version-1.x.x/api/peers/list.md",sourceDirName:"api/peers",slug:"/api/peers/list",permalink:"/docs/1.x.x/api/peers/list",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"},next:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"}},s={},i=[],u={toc:i},m="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"listpeers"},"listPeers"),(0,a.kt)("p",null,"This method returns a list of Peer resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/peers")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"filter"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Use filter to narrow the elements shown")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Pagination index")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"itemsPerPage"),(0,a.kt)("td",{parentName:"tr",align:"left"},"query"),(0,a.kt)("td",{parentName:"tr",align:"left"},"number"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Number of elements per request")))),(0,a.kt)("p",null,"Note: The filter parameter uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/json-path/JsonPath"},"JsonPath")," format"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a list of Peer resources."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/peers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n "apiVersion": "v1beta1",\n "kind": "Peer",\n "metadata": {\n "name": "Asterisk PBX",\n "ref": "pr2c77f4"\n },\n "spec": {\n "credentials": {\n "username": "ast",\n "secret": "1234"\n }\n }\n }]\n}\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bc2f9ced.dba43639.js b/assets/js/bc2f9ced.dba43639.js new file mode 100644 index 000000000..6040f127b --- /dev/null +++ b/assets/js/bc2f9ced.dba43639.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5365],{4734:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var n=s(4848),r=s(8453);const i={},l="listPeers",d={id:"api/peers/list",title:"listPeers",description:"This method returns a list of Peer resources.",source:"@site/versioned_docs/version-1.x.x/api/peers/list.md",sourceDirName:"api/peers",slug:"/api/peers/list",permalink:"/docs/1.x.x/api/peers/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"},next:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"}},o={},c=[];function a(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"listpeers",children:"listPeers"}),"\n",(0,n.jsx)(t.p,{children:"This method returns a list of Peer resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/peers"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"filter"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"page"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"itemsPerPage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,n.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method returns a list of Peer resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/peers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Peer",\n \t"metadata": {\n \t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n \t},\n \t"spec": {\n \t\t"credentials": {\n \t\t\t"username": "ast",\n \t\t\t"secret": "1234"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>d});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.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:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc843d59.3700be61.js b/assets/js/bc843d59.3700be61.js deleted file mode 100644 index f3f8dbcb8..000000000 --- a/assets/js/bc843d59.3700be61.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1996],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>g});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(r),c=a,g=u["".concat(s,".").concat(c)]||u[c]||m[c]||o;return r?n.createElement(g,i(i({ref:t},d),{},{components:r})):n.createElement(g,i({ref:t},d))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}c.displayName="MDXCreateElement"},9655:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={},i="Registry Service",l={unversionedId:"development/components/registry",id:"development/components/registry",title:"Registry Service",description:"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.",source:"@site/docs/development/components/registry.md",sourceDirName:"development/components",slug:"/development/components/registry",permalink:"/docs/2.0.0/development/components/registry",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/registry.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"},next:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"}},s={},p=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Registry Service with Docker",id:"launching-the-registry-service-with-docker",level:2}],d={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"registry-service"},"Registry Service"),(0,a.kt)("p",null,"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the ",(0,a.kt)("inlineCode",{parentName:"p"},"spec.sendRegister")," field set to true. The Registry service relies on the Requester service to send requests to the EdgePort."),(0,a.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,a.kt)("p",null,"To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"requesterAddr")),(0,a.kt)("td",{parentName:"tr",align:null},"Address of service to send requests"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"apiAddr")),(0,a.kt)("td",{parentName:"tr",align:null},"Address of API service"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"registerInterval")),(0,a.kt)("td",{parentName:"tr",align:null},"Interval for sending registration requests (Defaults to ",(0,a.kt)("inlineCode",{parentName:"td"},"60s"),")"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"cache")),(0,a.kt)("td",{parentName:"tr",align:null},"Cache configuration"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"cache.provider")),(0,a.kt)("td",{parentName:"tr",align:null},"Accepts either ",(0,a.kt)("inlineCode",{parentName:"td"},"memory")," or ",(0,a.kt)("inlineCode",{parentName:"td"},"redis")),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"cache.parameters")),(0,a.kt)("td",{parentName:"tr",align:null},"Comma-separated key-value pairs"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"methods")),(0,a.kt)("td",{parentName:"tr",align:null},"Acceptable SIP Methods (reserved for future use)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"edgePorts")),(0,a.kt)("td",{parentName:"tr",align:null},"List of EdgePorts for outbound registrations"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"edgePorts.address")),(0,a.kt)("td",{parentName:"tr",align:null},"Address of EdgePort"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"edgePorts.region")),(0,a.kt)("td",{parentName:"tr",align:null},"Region of EdgePort (reserved for future use)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")))),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"cache.parameters")," property is only needed if you are using the Redis provider. "),(0,a.kt)("p",null,"The following table shows the available parameters for the Redis provider."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"username")),(0,a.kt)("td",{parentName:"tr",align:null},"Username (if required by Redis)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"password")),(0,a.kt)("td",{parentName:"tr",align:null},"Password (if required by Redis)"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"host")),(0,a.kt)("td",{parentName:"tr",align:null},"Redis host (Defaults to ",(0,a.kt)("inlineCode",{parentName:"td"},"localhost"),")"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"port")),(0,a.kt)("td",{parentName:"tr",align:null},"Redis port (Defaults to ",(0,a.kt)("inlineCode",{parentName:"td"},"6379"),")"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"secure")),(0,a.kt)("td",{parentName:"tr",align:null},"Use secure connection for Redis"),(0,a.kt)("td",{parentName:"tr",align:null},"No")))),(0,a.kt)("p",null,"Here is an example of a configuration file:"),(0,a.kt)("p",null,"Filename: ",(0,a.kt)("inlineCode",{parentName:"p"},"registry.yaml")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"registry.json")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n")),(0,a.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,a.kt)("p",null,"The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n')),(0,a.kt)("p",null,"Link to the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto"},"protobuf definition.")),(0,a.kt)("h2",{id:"launching-the-registry-service-with-docker"},"Launching the Registry Service with Docker"),(0,a.kt)("p",null,"The Registry Service is available as a Docker image from ",(0,a.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-registry"},"Docker Hub"),". To launch the Registry Service with Docker, you can use the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry\n")),(0,a.kt)("p",null,"The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address ",(0,a.kt)("inlineCode",{parentName:"p"},"requester:51909")," and the API service using the address ",(0,a.kt)("inlineCode",{parentName:"p"},"apiserver:51907"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bc843d59.b0cc575a.js b/assets/js/bc843d59.b0cc575a.js new file mode 100644 index 000000000..919eac30b --- /dev/null +++ b/assets/js/bc843d59.b0cc575a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3797],{142:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>a,frontMatter:()=>i,metadata:()=>d,toc:()=>h});var t=s(4848),n=s(8453);const i={},o="Registry Service",d={id:"development/components/registry",title:"Registry Service",description:"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.",source:"@site/docs/development/components/registry.md",sourceDirName:"development/components",slug:"/development/components/registry",permalink:"/docs/2.0.0/development/components/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/registry.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"},next:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"}},c={},h=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Registry Service with Docker",id:"launching-the-registry-service-with-docker",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"registry-service",children:"Registry Service"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the ",(0,t.jsx)(r.code,{children:"spec.sendRegister"})," field set to true. The Registry service relies on the Requester service to send requests to the EdgePort."]}),"\n",(0,t.jsx)(r.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(r.p,{children:"To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"requesterAddr"})}),(0,t.jsx)(r.td,{children:"Address of service to send requests"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"apiAddr"})}),(0,t.jsx)(r.td,{children:"Address of API service"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registerInterval"})}),(0,t.jsxs)(r.td,{children:["Interval for sending registration requests (Defaults to ",(0,t.jsx)(r.code,{children:"60s"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache"})}),(0,t.jsx)(r.td,{children:"Cache configuration"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.provider"})}),(0,t.jsxs)(r.td,{children:["Accepts either ",(0,t.jsx)(r.code,{children:"memory"})," or ",(0,t.jsx)(r.code,{children:"redis"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.parameters"})}),(0,t.jsx)(r.td,{children:"Comma-separated key-value pairs"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"methods"})}),(0,t.jsx)(r.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts"})}),(0,t.jsx)(r.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.address"})}),(0,t.jsx)(r.td,{children:"Address of EdgePort"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.region"})}),(0,t.jsx)(r.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,t.jsx)(r.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"username"})}),(0,t.jsx)(r.td,{children:"Username (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"password"})}),(0,t.jsx)(r.td,{children:"Password (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"host"})}),(0,t.jsxs)(r.td,{children:["Redis host (Defaults to ",(0,t.jsx)(r.code,{children:"localhost"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"port"})}),(0,t.jsxs)(r.td,{children:["Redis port (Defaults to ",(0,t.jsx)(r.code,{children:"6379"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"secure"})}),(0,t.jsx)(r.td,{children:"Use secure connection for Redis"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.p,{children:"Here is an example of a configuration file:"}),"\n",(0,t.jsxs)(r.p,{children:["Filename: ",(0,t.jsx)(r.code,{children:"registry.yaml"})," or ",(0,t.jsx)(r.code,{children:"registry.json"})]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(r.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(r.p,{children:"The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,t.jsxs)(r.p,{children:["Link to the ",(0,t.jsx)(r.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,t.jsx)(r.h2,{id:"launching-the-registry-service-with-docker",children:"Launching the Registry Service with Docker"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry Service is available as a Docker image from ",(0,t.jsx)(r.a,{href:"https://hub.docker.com/r/fonoster/routr-registry",children:"Docker Hub"}),". To launch the Registry Service with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry\n"})}),"\n",(0,t.jsxs)(r.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address ",(0,t.jsx)(r.code,{children:"requester:51909"})," and the API service using the address ",(0,t.jsx)(r.code,{children:"apiserver:51907"}),"."]})]})}function a(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var t=s(6540);const n={},i=t.createContext(n);function o(e){const r=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2ef5137.98ec0fa4.js b/assets/js/c2ef5137.98ec0fa4.js new file mode 100644 index 000000000..1dc91f769 --- /dev/null +++ b/assets/js/c2ef5137.98ec0fa4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9465],{6237:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=n(4848),o=n(8453);const s={},i="Ephemeral Agents in the Browser",a={id:"tutorials/ephemeral-agents-in-the-browser",title:"Ephemeral Agents in the Browser",description:"Coming soon.",source:"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",sourceDirName:"tutorials",slug:"/tutorials/ephemeral-agents-in-the-browser",permalink:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/ephemeral-agents-in-the-browser.md",tags:[],version:"current",frontMatter:{}},c={},u=[];function l(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ephemeral-agents-in-the-browser",children:"Ephemeral Agents in the Browser"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2ef5137.b9f7a6ae.js b/assets/js/c2ef5137.b9f7a6ae.js deleted file mode 100644 index e0ec68ee3..000000000 --- a/assets/js/c2ef5137.b9f7a6ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1968],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>b});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(r),f=o,b=u["".concat(c,".").concat(f)]||u[f]||m[f]||a;return r?n.createElement(b,i(i({ref:t},p),{},{components:r})):n.createElement(b,i({ref:t},p))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var l=2;l<a;l++)i[l]=r[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},8380:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={},i="Ephemeral Agents in the Browser",s={unversionedId:"tutorials/ephemeral-agents-in-the-browser",id:"tutorials/ephemeral-agents-in-the-browser",title:"Ephemeral Agents in the Browser",description:"Coming soon.",source:"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",sourceDirName:"tutorials",slug:"/tutorials/ephemeral-agents-in-the-browser",permalink:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/ephemeral-agents-in-the-browser.md",tags:[],version:"current",frontMatter:{}},c={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"ephemeral-agents-in-the-browser"},"Ephemeral Agents in the Browser"),(0,o.kt)("p",null,"Coming soon."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.4659817a.js b/assets/js/c4f5d8e4.4659817a.js new file mode 100644 index 000000000..a752ea6ed --- /dev/null +++ b/assets/js/c4f5d8e4.4659817a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2634],{192:(u,r,e)=>{e.r(r),e.d(r,{default:()=>s});e(6540);function s(){return null}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.7093b4d3.js b/assets/js/c4f5d8e4.7093b4d3.js deleted file mode 100644 index fcf5e3434..000000000 --- a/assets/js/c4f5d8e4.7093b4d3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4195],{2841:(u,r,e)=>{e.r(r),e.d(r,{default:()=>s});e(7294);function s(){return null}}}]); \ No newline at end of file diff --git a/assets/js/c60c73ac.ad8b41b4.js b/assets/js/c60c73ac.ad8b41b4.js deleted file mode 100644 index 94961ba6b..000000000 --- a/assets/js/c60c73ac.ad8b41b4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1583],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,u=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),p=c(r),h=o,d=p["".concat(u,".").concat(h)]||p[h]||m[h]||s;return r?n.createElement(d,a(a({ref:t},l),{},{components:r})):n.createElement(d,a({ref:t},l))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,a=new Array(s);a[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var c=2;c<s;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},3732:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const s={},a="Requester",i={unversionedId:"development/components/requester",id:"development/components/requester",title:"Requester",description:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.",source:"@site/docs/development/components/requester.md",sourceDirName:"development/components",slug:"/development/components/requester",permalink:"/docs/2.0.0/development/components/requester",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/requester.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"},next:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"}},u={},c=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Requester with Docker",id:"launching-the-requester-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}],l={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"requester"},"Requester"),(0,o.kt)("p",null,"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses."),(0,o.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,o.kt)("p",null,"The Requester service does not have a configuration file. However the following environment variables are available:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"BIND_ADDR")," - Address to bind the service (Defaults to ",(0,o.kt)("inlineCode",{parentName:"li"},"0.0.0.0:51909"),")"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ENABLE_HEALTHCHECKS")," - Enable health checks (Defaults to ",(0,o.kt)("inlineCode",{parentName:"li"},"true"),")")),(0,o.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,o.kt)("p",null,"Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n')),(0,o.kt)("p",null,"Link to the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto"},"protobuf definition.")),(0,o.kt)("h2",{id:"launching-the-requester-with-docker"},"Launching the Requester with Docker"),(0,o.kt)("p",null,"The Requester is available as a Docker image from ",(0,o.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-requester"},"Docker Hub"),". To launch the Requester with Docker, you can use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it -p 51909:51909 fonoster/routr-requester\n")),(0,o.kt)("p",null,"The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port ",(0,o.kt)("inlineCode",{parentName:"p"},"51909")," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port ",(0,o.kt)("inlineCode",{parentName:"p"},"51909"),"."),(0,o.kt)("h2",{id:"quick-test-with-grpcurl"},"Quick Test with gRPCurl"),(0,o.kt)("p",null,"One easy way to interact with the Requester for testing and development is to use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fullstorydev/grpcurl"},"gRPCurl"),". The following example shows how to send a request to the Requester using gRPCurl:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto requester.proto -d '{...}' \\\n localhost:51909 \\\n fonoster.routr.requester.v2beta1.Requester/SendMessage\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c60c73ac.f7a57bd6.js b/assets/js/c60c73ac.f7a57bd6.js new file mode 100644 index 000000000..a50b8ec81 --- /dev/null +++ b/assets/js/c60c73ac.f7a57bd6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9537],{9175:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Requester",c={id:"development/components/requester",title:"Requester",description:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.",source:"@site/docs/development/components/requester.md",sourceDirName:"development/components",slug:"/development/components/requester",permalink:"/docs/2.0.0/development/components/requester",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/requester.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"},next:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"}},u={},a=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Requester with Docker",id:"launching-the-requester-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"requester",children:"Requester"}),"\n",(0,r.jsx)(t.p,{children:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses."}),"\n",(0,r.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(t.p,{children:"The Requester service does not have a configuration file. However the following environment variables are available:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"BIND_ADDR"})," - Address to bind the service (Defaults to ",(0,r.jsx)(t.code,{children:"0.0.0.0:51909"}),")"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"ENABLE_HEALTHCHECKS"})," - Enable health checks (Defaults to ",(0,r.jsx)(t.code,{children:"true"}),")"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(t.p,{children:"Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Link to the ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(t.h2,{id:"launching-the-requester-with-docker",children:"Launching the Requester with Docker"}),"\n",(0,r.jsxs)(t.p,{children:["The Requester is available as a Docker image from ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-requester",children:"Docker Hub"}),". To launch the Requester with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"docker run -it -p 51909:51909 fonoster/routr-requester\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port ",(0,r.jsx)(t.code,{children:"51909"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port ",(0,r.jsx)(t.code,{children:"51909"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(t.p,{children:["One easy way to interact with the Requester for testing and development is to use ",(0,r.jsx)(t.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Requester using gRPCurl:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto requester.proto -d '{...}' \\\n localhost:51909 \\\n fonoster.routr.requester.v2beta1.Requester/SendMessage\n"})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d3c35fce.653aa120.js b/assets/js/d3c35fce.653aa120.js deleted file mode 100644 index 8fc097ff6..000000000 --- a/assets/js/d3c35fce.653aa120.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9108],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=s(n),d=a,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(f,i(i({ref:t},c),{},{components:n})):r.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},4744:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},i="getDomain",l={unversionedId:"api/domains/get",id:"version-1.x.x/api/domains/get",title:"getDomain",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/get.md",sourceDirName:"api/domains",slug:"/api/domains/get",permalink:"/docs/1.x.x/api/domains/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"},next:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"}},p={},s=[],c={toc:s},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getdomain"},"getDomain"),(0,a.kt)("p",null,"This method returns a Gateway resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/domains/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a Domain resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Domain",\n "metadata": {\n "name": "Another Office",\n "ref": "dm6c87r2"\n },\n "spec": {\n "context": {\n "domainUri": "sip2.local"\n }\n }\n }\n}\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d3c35fce.81e9ce52.js b/assets/js/d3c35fce.81e9ce52.js new file mode 100644 index 000000000..69082f143 --- /dev/null +++ b/assets/js/d3c35fce.81e9ce52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2607],{6652:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},o="getDomain",d={id:"api/domains/get",title:"getDomain",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/get.md",sourceDirName:"api/domains",slug:"/api/domains/get",permalink:"/docs/1.x.x/api/domains/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"},next:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"}},c={},a=[];function l(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getdomain",children:"getDomain"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a Domain resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Domain",\n \t"metadata": {\n \t\t"name": "Another Office",\n "ref": "dm6c87r2"\n \t},\n \t"spec": {\n \t\t"context": {\n \t\t\t"domainUri": "sip2.local"\n \t\t}\n \t}\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.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:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d72ac48e.2388c19c.js b/assets/js/d72ac48e.2388c19c.js deleted file mode 100644 index 3de47888f..000000000 --- a/assets/js/d72ac48e.2388c19c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6513],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=o.createContext({}),u=function(e){var t=o.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=u(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),p=u(r),f=n,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||i;return r?o.createElement(m,c(c({ref:t},l),{},{components:r})):o.createElement(m,c({ref:t},l))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[p]="string"==typeof e?e:n,c[1]=a;for(var u=2;u<i;u++)c[u]=r[u];return o.createElement.apply(null,c)}return o.createElement.apply(null,r)}f.displayName="MDXCreateElement"},5577:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var o=r(7462),n=(r(7294),r(3905));const i={},c="Architecture",a={unversionedId:"overview/architecture",id:"overview/architecture",title:"Architecture",description:"Routr's architecture diagram",source:"@site/docs/overview/architecture.md",sourceDirName:"overview",slug:"/overview/architecture",permalink:"/docs/2.0.0/overview/architecture",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/architecture.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/overview/introduction"},next:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"}},s={},u=[],l={toc:u},p="wrapper";function d(e){let{components:t,...i}=e;return(0,n.kt)(p,(0,o.Z)({},l,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"architecture"},"Architecture"),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Routr's architecture diagram",src:r(6995).Z,width:"1221",height:"491"})),(0,n.kt)("h1",{id:"summary"},"Summary"),(0,n.kt)("p",null,"Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled."),(0,n.kt)("h1",{id:"specification"},"Specification"),(0,n.kt)("p",null,"With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr/blob/master/docs/specs/CORE.md"},"Core Specification")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/fonoster/routr/blob/master/docs/specs/CONNECT.md"},"Connect Specification"))),(0,n.kt)("p",null,"The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing."),(0,n.kt)("p",null,"The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more."),(0,n.kt)("p",null,"Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them."))}d.isMDXComponent=!0},6995:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/architecture_v2-d563de2e0748455c8332bf19f5e68090.png"}}]); \ No newline at end of file diff --git a/assets/js/d72ac48e.b02011c0.js b/assets/js/d72ac48e.b02011c0.js new file mode 100644 index 000000000..948e23b5e --- /dev/null +++ b/assets/js/d72ac48e.b02011c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7063],{577:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var i=r(4848),o=r(8453);const n={},c="Architecture",s={id:"overview/architecture",title:"Architecture",description:"Routr's architecture diagram",source:"@site/docs/overview/architecture.md",sourceDirName:"overview",slug:"/overview/architecture",permalink:"/docs/2.0.0/overview/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/architecture.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/overview/introduction"},next:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"}},a={},d=[];function u(e){const t={a:"a",h1:"h1",img:"img",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Routr's architecture diagram",src:r(5763).A+"",width:"1221",height:"491"})}),"\n",(0,i.jsx)(t.h1,{id:"summary",children:"Summary"}),"\n",(0,i.jsx)(t.p,{children:"Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled."}),"\n",(0,i.jsx)(t.h1,{id:"specification",children:"Specification"}),"\n",(0,i.jsx)(t.p,{children:"With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CORE.md",children:"Core Specification"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CONNECT.md",children:"Connect Specification"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing."}),"\n",(0,i.jsx)(t.p,{children:"The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more."}),"\n",(0,i.jsx)(t.p,{children:"Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},5763:(e,t,r)=>{r.d(t,{A:()=>i});const i=r.p+"assets/images/architecture_v2-d563de2e0748455c8332bf19f5e68090.png"},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>s});var i=r(6540);const o={},n=i.createContext(o);function c(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d7a9d534.a8a822f5.js b/assets/js/d7a9d534.a8a822f5.js deleted file mode 100644 index c892ee6b7..000000000 --- a/assets/js/d7a9d534.a8a822f5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3375],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function a(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),l=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(n),d=r,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||i;return n?o.createElement(f,c(c({ref:t},u),{},{components:n})):o.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,c=new Array(i);c[0]=d;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[p]="string"==typeof e?e:r,c[1]=a;for(var l=2;l<i;l++)c[l]=n[l];return o.createElement.apply(null,c)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},616:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=n(7462),r=(n(7294),n(3905));const i={},c="Introduction",a={unversionedId:"connect/introduction",id:"connect/introduction",title:"Introduction",description:"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.",source:"@site/docs/connect/introduction.md",sourceDirName:"connect",slug:"/connect/introduction",permalink:"/docs/2.0.0/connect/introduction",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"},next:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"}},s={},l=[],u={toc:l},p="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of ",(0,r.kt)("inlineCode",{parentName:"p"},"Agents"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"Peers"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"Trunks"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"Numbers"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"Credentials"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"ACL"),". It is the most common way to deploy Routr."),(0,r.kt)("p",null,"In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr."),(0,r.kt)("p",null,"Some of the use cases for the Connect Mode are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Power your office or home phone system"),(0,r.kt)("li",{parentName:"ul"},"Create an Intercom network"),(0,r.kt)("li",{parentName:"ul"},"Power a SIP network on a CPaaS"),(0,r.kt)("li",{parentName:"ul"},"Connect your phone system to the PSTN"),(0,r.kt)("li",{parentName:"ul"},"Connect your phone system to Microsoft Teams (coming soon)"),(0,r.kt)("li",{parentName:"ul"},"Connect your phone system to AWS Chime (coming soon)")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d7a9d534.acc28f6a.js b/assets/js/d7a9d534.acc28f6a.js new file mode 100644 index 000000000..ccb479946 --- /dev/null +++ b/assets/js/d7a9d534.acc28f6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[286],{5151:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>a,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var t=o(4848),r=o(8453);const c={},s="Introduction",i={id:"connect/introduction",title:"Introduction",description:"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.",source:"@site/docs/connect/introduction.md",sourceDirName:"connect",slug:"/connect/introduction",permalink:"/docs/2.0.0/connect/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"},next:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"}},d={},l=[];function u(e){const n={code:"code",h1:"h1",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of ",(0,t.jsx)(n.code,{children:"Agents"}),", ",(0,t.jsx)(n.code,{children:"Peers"}),", ",(0,t.jsx)(n.code,{children:"Trunks"}),", ",(0,t.jsx)(n.code,{children:"Numbers"}),", ",(0,t.jsx)(n.code,{children:"Credentials"}),", and ",(0,t.jsx)(n.code,{children:"ACL"}),". It is the most common way to deploy Routr."]}),"\n",(0,t.jsx)(n.p,{children:"In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr."}),"\n",(0,t.jsx)(n.p,{children:"Some of the use cases for the Connect Mode are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Power your office or home phone system"}),"\n",(0,t.jsx)(n.li,{children:"Create an Intercom network"}),"\n",(0,t.jsx)(n.li,{children:"Power a SIP network on a CPaaS"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to the PSTN"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to Microsoft Teams (coming soon)"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to AWS Chime (coming soon)"}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>i});var t=o(6540);const r={},c=t.createContext(r);function s(e){const n=t.useContext(c);return t.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:s(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/da51cc8f.0a51a822.js b/assets/js/da51cc8f.0a51a822.js deleted file mode 100644 index 717abd6c9..000000000 --- a/assets/js/da51cc8f.0a51a822.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1535],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,i=function(e,t){if(null==e)return{};var n,a,i={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),d=i,g=c["".concat(s,".").concat(d)]||c[d]||m[d]||r;return n?a.createElement(g,o(o({ref:t},u),{},{components:n})):a.createElement(g,o({ref:t},u))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var p=2;p<r;p++)o[p]=n[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},7238:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const r={},o="Basic Setup",l={unversionedId:"guides/basic-setup",id:"version-1.x.x/guides/basic-setup",title:"Basic Setup",description:"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.",source:"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",sourceDirName:"guides",slug:"/guides/basic-setup",permalink:"/docs/1.x.x/guides/basic-setup",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/basic-setup.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Users",permalink:"/docs/1.x.x/configuration/users"},next:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"}},s={},p=[{value:"Requirements",id:"requirements",level:2},{value:"Setting up the Server",id:"setting-up-the-server",level:2},{value:"Configuring the Gateway",id:"configuring-the-gateway",level:3},{value:"Configuring the Number",id:"configuring-the-number",level:3},{value:"Creating a new Domain and EgressPolicy",id:"creating-a-new-domain-and-egresspolicy",level:3},{value:"Creating the Agents",id:"creating-the-agents",level:3},{value:"Configuring the SIP devices",id:"configuring-the-sip-devices",level:2},{value:"Making calls",id:"making-calls",level:2},{value:"What's Next?",id:"whats-next",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,i.kt)(c,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"basic-setup"},"Basic Setup"),(0,i.kt)("p",null,"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like ",(0,i.kt)("inlineCode",{parentName:"p"},"voip.ms")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"did.logic.com"),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Content")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#requirements"},"Requirements")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#setting-up-the-server"},"Setting up the Server"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#configuring-the-gateway"},"Configuring the Gateway")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#configuring-the-number"},"Configuring the Number ")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#creating-a-new-domain-and-egresspolicy"},"Creating a new Domain and EgressPolicy")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#creating-the-agents"},"Creating the Agents")))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#configuring-the-sip-devices"},"Configuring the SIP devices")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#making-calls"},"Making calls")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"whats-next"},"What's Next"))),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"This tutorial assumes the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Two SIP phones connected to the same LAN"),(0,i.kt)("li",{parentName:"ul"},"A fresh installation of Routr"),(0,i.kt)("li",{parentName:"ul"},"SIP providers such as ",(0,i.kt)("inlineCode",{parentName:"li"},"voip.ms")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"did.logic.com"))),(0,i.kt)("h2",{id:"setting-up-the-server"},"Setting up the Server"),(0,i.kt)("p",null,"A set of sample configuration covering this scenario is available in the Github ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/tree/master/config"},"repo"),". You might overwrite the files in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config")," folder if you wish to skip this section."),(0,i.kt)("h3",{id:"configuring-the-gateway"},"Configuring the Gateway"),(0,i.kt)("p",null,"To configure the Gateway, you must consult your SIP provider and obtain the credentials and ",(0,i.kt)("inlineCode",{parentName:"p"},"registration host"),". The key fields for the configuration are ",(0,i.kt)("inlineCode",{parentName:"p"},"metadata.ref"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.regService.host")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.regService.credentials"),". Here is an example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yml"},"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider Inc\n spec:\n host: sip.provider.net\n credentials:\n username: 'youruser'\n secret: 'yoursecret'\n transport: udp\n")),(0,i.kt)("h3",{id:"configuring-the-number"},"Configuring the Number"),(0,i.kt)("p",null,"To configure your Number or virtual number, you must open and edit the file ",(0,i.kt)("inlineCode",{parentName:"p"},"config/numbers.yml"),". Notice in the example below, how your reference the Gateway by using the field ",(0,i.kt)("inlineCode",{parentName:"p"},"metadata.geRef"),". The key field while configuring Numbers are ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.location.telUrl")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.location.aorLink"),". Keep in mind that the value in ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.location.telUrl")," must be formatted, precisely, as sent by the provider."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yml"},"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: gweef506\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:1001@sip.local'\n")),(0,i.kt)("h3",{id:"creating-a-new-domain-and-egresspolicy"},"Creating a new Domain and EgressPolicy"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Routr")," is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an ",(0,i.kt)("em",{parentName:"p"},"EgressPolicy")," to allow calls outside the Domain. Here is how the file ",(0,i.kt)("inlineCode",{parentName:"p"},"config/domains.yml")," needs to look like:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yml"},"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: dd50baa4\n")),(0,i.kt)("h3",{id:"creating-the-agents"},"Creating the Agents"),(0,i.kt)("p",null,"We now create the Agents ",(0,i.kt)("inlineCode",{parentName:"p"},"1001")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"1002"),". Keep in mind that field ",(0,i.kt)("inlineCode",{parentName:"p"},"spec.credentials.username")," can be alphanumeric, so ",(0,i.kt)("inlineCode",{parentName:"p"},"john")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"john001")," is also acceptable."),(0,i.kt)("p",null,"Pay close attention to the credentials block since it contains the username and secret for both Agents."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yml"},"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: '1001'\n secret: '1234'\n domains: [sip.local]\n- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: '1002'\n secret: '1234'\n domains: [sip.local]\n")),(0,i.kt)("p",null,"To verify your configuration, start the server by issuing the command ",(0,i.kt)("inlineCode",{parentName:"p"},"routr"),". In a separate window, use the following commands:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"rctl get gateway")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"rctl get number")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"rctl get domain")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"rctl get agents"))),(0,i.kt)("p",null,"Your output should be as follows:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Starting the Server")),(0,i.kt)("img",{src:"/img/starting_server.png",width:"600"}),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Verifying the Configuration")),(0,i.kt)("img",{src:"/img/verify_configuration.png",width:"600"}),(0,i.kt)("h2",{id:"configuring-the-sip-devices"},"Configuring the SIP devices"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},'We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.')),(0,i.kt)("p",null,"Configure your softphone using the information you gather in the last step. Start by completing only the required information: ",(0,i.kt)("em",{parentName:"p"},"username"),", ",(0,i.kt)("em",{parentName:"p"},"domain"),", ",(0,i.kt)("em",{parentName:"p"},"password"),". Also, In the advanced section use the server's ",(0,i.kt)("strong",{parentName:"p"},"IP")," as your ",(0,i.kt)("em",{parentName:"p"},"Registry Server")," and ",(0,i.kt)("em",{parentName:"p"},"Proxy"),". Here is how mine looks like:"),(0,i.kt)("img",{src:"/img/telephone_config_general.png",width:"500"}),(0,i.kt)("img",{src:"/img/telephone_config_advanced.png",width:"500"}),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},'Make sure to check the box "Use this account" to register your device')),(0,i.kt)("p",null,"If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the ",(0,i.kt)("inlineCode",{parentName:"p"},".rctl locate")," to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both ",(0,i.kt)("inlineCode",{parentName:"p"},"1001")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"1002")," are present in the location service and therefore, can reach each other."),(0,i.kt)("img",{src:"/img/locate_agents.png",width:"600"}),(0,i.kt)("h2",{id:"making-calls"},"Making calls"),(0,i.kt)("p",null,"The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: ",(0,i.kt)("a",{parentName:"p",href:"mailto:1001@sip.local"},"1001@sip.local")," or ",(0,i.kt)("a",{parentName:"p",href:"mailto:7853178060@sip.local"},"7853178060@sip.local"),")."),(0,i.kt)("h2",{id:"whats-next"},"What's Next?"),(0,i.kt)("p",null,"You can check out the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fonoster../wiki/Home"},"https://github.com/fonoster../wiki/Home")," to see more examples. If you have any questions, start an issue or contact us via:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Twitter: ",(0,i.kt)("a",{parentName:"li",href:"https://twitter.com/fonoster"},"@fonoster")),(0,i.kt)("li",{parentName:"ul"},"Email: ",(0,i.kt)("a",{parentName:"li",href:"mailto:fonosterteam@fonoster.com"},"fonosterteam@fonoster.com"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/da51cc8f.b5045421.js b/assets/js/da51cc8f.b5045421.js new file mode 100644 index 000000000..26dc573a6 --- /dev/null +++ b/assets/js/da51cc8f.b5045421.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9692],{3997:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var s=i(4848),t=i(8453);const r={},o="Basic Setup",c={id:"guides/basic-setup",title:"Basic Setup",description:"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.",source:"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",sourceDirName:"guides",slug:"/guides/basic-setup",permalink:"/docs/1.x.x/guides/basic-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/basic-setup.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Users",permalink:"/docs/1.x.x/configuration/users"},next:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"}},a={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Setting up the Server",id:"setting-up-the-server",level:2},{value:"Configuring the Gateway",id:"configuring-the-gateway",level:3},{value:"Configuring the Number",id:"configuring-the-number",level:3},{value:"Creating a new Domain and EgressPolicy",id:"creating-a-new-domain-and-egresspolicy",level:3},{value:"Creating the Agents",id:"creating-the-agents",level:3},{value:"Configuring the SIP devices",id:"configuring-the-sip-devices",level:2},{value:"Making calls",id:"making-calls",level:2},{value:"What's Next?",id:"whats-next",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"basic-setup",children:"Basic Setup"}),"\n",(0,s.jsxs)(n.p,{children:["This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like ",(0,s.jsx)(n.code,{children:"voip.ms"})," or ",(0,s.jsx)(n.code,{children:"did.logic.com"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Content"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#requirements",children:"Requirements"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#setting-up-the-server",children:"Setting up the Server"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-gateway",children:"Configuring the Gateway"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-number",children:"Configuring the Number "})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-a-new-domain-and-egresspolicy",children:"Creating a new Domain and EgressPolicy"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-the-agents",children:"Creating the Agents"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-sip-devices",children:"Configuring the SIP devices"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#making-calls",children:"Making calls"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#whats-next",children:"What's Next"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,s.jsx)(n.p,{children:"This tutorial assumes the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Two SIP phones connected to the same LAN"}),"\n",(0,s.jsx)(n.li,{children:"A fresh installation of Routr"}),"\n",(0,s.jsxs)(n.li,{children:["SIP providers such as ",(0,s.jsx)(n.code,{children:"voip.ms"})," or ",(0,s.jsx)(n.code,{children:"did.logic.com"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-the-server",children:"Setting up the Server"}),"\n",(0,s.jsxs)(n.p,{children:["A set of sample configuration covering this scenario is available in the Github ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/master/config",children:"repo"}),". You might overwrite the files in the ",(0,s.jsx)(n.code,{children:"config"})," folder if you wish to skip this section."]}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-gateway",children:"Configuring the Gateway"}),"\n",(0,s.jsxs)(n.p,{children:["To configure the Gateway, you must consult your SIP provider and obtain the credentials and ",(0,s.jsx)(n.code,{children:"registration host"}),". The key fields for the configuration are ",(0,s.jsx)(n.code,{children:"metadata.ref"}),", ",(0,s.jsx)(n.code,{children:"spec.regService.host"})," and ",(0,s.jsx)(n.code,{children:"spec.regService.credentials"}),". Here is an example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider Inc\n spec:\n host: sip.provider.net\n credentials:\n username: 'youruser'\n secret: 'yoursecret'\n transport: udp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-number",children:"Configuring the Number"}),"\n",(0,s.jsxs)(n.p,{children:["To configure your Number or virtual number, you must open and edit the file ",(0,s.jsx)(n.code,{children:"config/numbers.yml"}),". Notice in the example below, how your reference the Gateway by using the field ",(0,s.jsx)(n.code,{children:"metadata.geRef"}),". The key field while configuring Numbers are ",(0,s.jsx)(n.code,{children:"spec.location.telUrl"})," and ",(0,s.jsx)(n.code,{children:"spec.location.aorLink"}),". Keep in mind that the value in ",(0,s.jsx)(n.code,{children:"spec.location.telUrl"})," must be formatted, precisely, as sent by the provider."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: gweef506\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:1001@sip.local'\n"})}),"\n",(0,s.jsx)(n.h3,{id:"creating-a-new-domain-and-egresspolicy",children:"Creating a new Domain and EgressPolicy"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Routr"})," is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an ",(0,s.jsx)(n.em,{children:"EgressPolicy"})," to allow calls outside the Domain. Here is how the file ",(0,s.jsx)(n.code,{children:"config/domains.yml"})," needs to look like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: dd50baa4\n"})}),"\n",(0,s.jsx)(n.h3,{id:"creating-the-agents",children:"Creating the Agents"}),"\n",(0,s.jsxs)(n.p,{children:["We now create the Agents ",(0,s.jsx)(n.code,{children:"1001"})," and ",(0,s.jsx)(n.code,{children:"1002"}),". Keep in mind that field ",(0,s.jsx)(n.code,{children:"spec.credentials.username"})," can be alphanumeric, so ",(0,s.jsx)(n.code,{children:"john"})," or ",(0,s.jsx)(n.code,{children:"john001"})," is also acceptable."]}),"\n",(0,s.jsx)(n.p,{children:"Pay close attention to the credentials block since it contains the username and secret for both Agents."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: '1001'\n secret: '1234'\n domains: [sip.local]\n- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: '1002'\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["To verify your configuration, start the server by issuing the command ",(0,s.jsx)(n.code,{children:"routr"}),". In a separate window, use the following commands:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get gateway"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get number"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get domain"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get agents"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Your output should be as follows:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Starting the Server"})}),"\n",(0,s.jsx)("img",{src:"/img/starting_server.png",width:"600"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Verifying the Configuration"})}),"\n",(0,s.jsx)("img",{src:"/img/verify_configuration.png",width:"600"}),"\n",(0,s.jsx)(n.h2,{id:"configuring-the-sip-devices",children:"Configuring the SIP devices"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Configure your softphone using the information you gather in the last step. Start by completing only the required information: ",(0,s.jsx)(n.em,{children:"username"}),", ",(0,s.jsx)(n.em,{children:"domain"}),", ",(0,s.jsx)(n.em,{children:"password"}),". Also, In the advanced section use the server's ",(0,s.jsx)(n.strong,{children:"IP"})," as your ",(0,s.jsx)(n.em,{children:"Registry Server"})," and ",(0,s.jsx)(n.em,{children:"Proxy"}),". Here is how mine looks like:"]}),"\n",(0,s.jsx)("img",{src:"/img/telephone_config_general.png",width:"500"}),"\n",(0,s.jsx)("img",{src:"/img/telephone_config_advanced.png",width:"500"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'Make sure to check the box "Use this account" to register your device'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the ",(0,s.jsx)(n.code,{children:".rctl locate"})," to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both ",(0,s.jsx)(n.code,{children:"1001"})," and ",(0,s.jsx)(n.code,{children:"1002"})," are present in the location service and therefore, can reach each other."]}),"\n",(0,s.jsx)("img",{src:"/img/locate_agents.png",width:"600"}),"\n",(0,s.jsx)(n.h2,{id:"making-calls",children:"Making calls"}),"\n",(0,s.jsxs)(n.p,{children:["The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: ",(0,s.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"})," or ",(0,s.jsx)(n.a,{href:"mailto:7853178060@sip.local",children:"7853178060@sip.local"}),")."]}),"\n",(0,s.jsx)(n.h2,{id:"whats-next",children:"What's Next?"}),"\n",(0,s.jsxs)(n.p,{children:["You can check out the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster../wiki/Home",children:"https://github.com/fonoster../wiki/Home"})," to see more examples. If you have any questions, start an issue or contact us via:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Twitter: ",(0,s.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@fonoster"})]}),"\n",(0,s.jsxs)(n.li,{children:["Email: ",(0,s.jsx)(n.a,{href:"mailto:fonosterteam@fonoster.com",children:"fonosterteam@fonoster.com"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.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:()=>o,x:()=>c});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.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),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/db70960d.1ab329cc.js b/assets/js/db70960d.1ab329cc.js deleted file mode 100644 index 6f1e99fdf..000000000 --- a/assets/js/db70960d.1ab329cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4155],{3905:(t,e,r)=>{r.d(e,{Zo:()=>u,kt:()=>b});var n=r(7294);function o(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function a(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function i(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?a(Object(r),!0).forEach((function(e){o(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function c(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r,n,o={},a=Object.keys(t);for(n=0;n<a.length;n++)r=a[n],e.indexOf(r)>=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n<a.length;n++)r=a[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}var l=n.createContext({}),s=function(t){var e=n.useContext(l),r=e;return t&&(r="function"==typeof t?t(e):i(i({},e),t)),r},u=function(t){var e=s(t.components);return n.createElement(l.Provider,{value:e},t.children)},p="mdxType",f={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var r=t.components,o=t.mdxType,a=t.originalType,l=t.parentName,u=c(t,["components","mdxType","originalType","parentName"]),p=s(r),d=o,b=p["".concat(l,".").concat(d)]||p[d]||f[d]||a;return r?n.createElement(b,i(i({ref:e},u),{},{components:r})):n.createElement(b,i({ref:e},u))}));function b(t,e){var r=arguments,o=e&&e.mdxType;if("string"==typeof t||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var l in e)hasOwnProperty.call(e,l)&&(c[l]=e[l]);c.originalType=t,c[p]="string"==typeof t?t:o,i[1]=c;for(var s=2;s<a;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},801:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>f,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={},i="Load-balancing Asterisk with Routr",c={unversionedId:"tutorials/load-balancing-asterisk-with-routr",id:"tutorials/load-balancing-asterisk-with-routr",title:"Load-balancing Asterisk with Routr",description:"Coming soon.",source:"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",sourceDirName:"tutorials",slug:"/tutorials/load-balancing-asterisk-with-routr",permalink:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/load-balancing-asterisk-with-routr.md",tags:[],version:"current",frontMatter:{}},l={},s=[],u={toc:s},p="wrapper";function f(t){let{components:e,...r}=t;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"load-balancing-asterisk-with-routr"},"Load-balancing Asterisk with Routr"),(0,o.kt)("p",null,"Coming soon."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db70960d.892a5e80.js b/assets/js/db70960d.892a5e80.js new file mode 100644 index 000000000..ebe3971ce --- /dev/null +++ b/assets/js/db70960d.892a5e80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6549],{5214:(t,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=o(4848),e=o(8453);const s={},i="Load-balancing Asterisk with Routr",a={id:"tutorials/load-balancing-asterisk-with-routr",title:"Load-balancing Asterisk with Routr",description:"Coming soon.",source:"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",sourceDirName:"tutorials",slug:"/tutorials/load-balancing-asterisk-with-routr",permalink:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/load-balancing-asterisk-with-routr.md",tags:[],version:"current",frontMatter:{}},c={},u=[];function l(t){const n={h1:"h1",p:"p",...(0,e.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"load-balancing-asterisk-with-routr",children:"Load-balancing Asterisk with Routr"}),"\n",(0,r.jsx)(n.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:n}={...(0,e.R)(),...t.components};return n?(0,r.jsx)(n,{...t,children:(0,r.jsx)(l,{...t})}):l(t)}},8453:(t,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var r=o(6540);const e={},s=r.createContext(e);function i(t){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(e):t.components||e:i(t.components),r.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/deaab6a5.85ad07f4.js b/assets/js/deaab6a5.e271f229.js similarity index 65% rename from assets/js/deaab6a5.85ad07f4.js rename to assets/js/deaab6a5.e271f229.js index e0e21cde2..e061dab07 100644 --- a/assets/js/deaab6a5.85ad07f4.js +++ b/assets/js/deaab6a5.e271f229.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4987],{3769:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6782],{1966:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/e10372bb.4a2d306c.js b/assets/js/e10372bb.4a2d306c.js deleted file mode 100644 index 54f443eb3..000000000 --- a/assets/js/e10372bb.4a2d306c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9124],{3905:(e,t,o)=>{o.d(t,{Zo:()=>c,kt:()=>f});var n=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function s(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?i(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):i(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function a(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)o=i[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)o=i[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var u=n.createContext({}),l=function(e){var t=n.useContext(u),o=t;return e&&(o="function"==typeof e?e(t):s(s({},t),e)),o},c=function(e){var t=l(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,c=a(e,["components","mdxType","originalType","parentName"]),p=l(o),d=r,f=p["".concat(u,".").concat(d)]||p[d]||m[d]||i;return o?n.createElement(f,s(s({ref:t},c),{},{components:o})):n.createElement(f,s({ref:t},c))}));function f(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=o.length,s=new Array(i);s[0]=d;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a[p]="string"==typeof e?e:r,s[1]=a;for(var l=2;l<i;l++)s[l]=o[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,o)}d.displayName="MDXCreateElement"},2117:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var n=o(7462),r=(o(7294),o(3905));const i={},s="Community",a={unversionedId:"introduction/community",id:"version-1.x.x/introduction/community",title:"Community",description:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:",source:"@site/versioned_docs/version-1.x.x/introduction/community.md",sourceDirName:"introduction",slug:"/introduction/community",permalink:"/docs/1.x.x/introduction/community",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/community.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"},next:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"}},u={},l=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}],c={toc:l},p="wrapper";function m(e){let{components:t,...o}=e;return(0,r.kt)(p,(0,n.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"community"},"Community"),(0,r.kt)("p",null,"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://discord.com/invite/mpWSRUhG7e"},"Discord community"),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/discussions"},"GitHub Discussions")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"User mailing lists:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://groups.google.com/forum/#!forum/routr-announce"},"routr-announce")," \u2013 for announcements like new releases"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://groups.google.com/forum/#!forum/routr-users"},"routr-users")," \u2013 for discussions around Routr usage and community support")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Twitter:")," ",(0,r.kt)("a",{parentName:"p",href:"https://twitter.com/fonoster"},"@Fonoster")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Issue tracker:")," Use the GitHub issue tracker for the various ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/"},"Routr repositories")," to file bugs and features request. If you need support, please send your questions to the routr-users mailing list rather than filing a GitHub issue."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below.")),(0,r.kt)("h2",{id:"contributing"},"Contributing"),(0,r.kt)("p",null,"We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request."),(0,r.kt)("p",null,"Development: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/discussions"},"GitHub Discussions")," \u2013 for discussions around Routr development"),(0,r.kt)("h2",{id:"developer-summits"},"Developer Summits"),(0,r.kt)("p",null,"We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019."),(0,r.kt)("p",null,"2019 developer summit notes (Come back to see updated link)"),(0,r.kt)("h2",{id:"code-of-conduct"},"Code of Conduct"),(0,r.kt)("p",null,"To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md"},"Contributor Covenant Code of Conduct"),"."),(0,r.kt)("h2",{id:"commercial-support"},"Commercial Support"),(0,r.kt)("p",null,"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/psanders"},"Pedro Sanders")," (independent contractor)"),(0,r.kt)("h2",{id:"acknowledgments"},"Acknowledgments"),(0,r.kt)("p",null,"Routr was developed initially by ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/psanders"},"Pedro Sanders"),". ",(0,r.kt)("a",{parentName:"p",href:"https://fonoster.com"},"Fonoster")," sponsored the majority of its development."),(0,r.kt)("p",null,"Pedro Sanders contributed Routr's logo."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e10372bb.f875b5b9.js b/assets/js/e10372bb.f875b5b9.js new file mode 100644 index 000000000..698735653 --- /dev/null +++ b/assets/js/e10372bb.f875b5b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[49],{123:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>u,contentTitle:()=>i,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=n(4848),s=n(8453);const r={},i="Community",c={id:"introduction/community",title:"Community",description:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:",source:"@site/versioned_docs/version-1.x.x/introduction/community.md",sourceDirName:"introduction",slug:"/introduction/community",permalink:"/docs/1.x.x/introduction/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/community.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"},next:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"}},u={},d=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function l(e){const o={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(o.p,{children:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://discord.com/invite/mpWSRUhG7e",children:"Discord community"}),"\n",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.strong,{children:"User mailing lists:"})}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.a,{href:"https://groups.google.com/forum/#!forum/routr-announce",children:"routr-announce"})," \u2013 for announcements like new releases"]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.a,{href:"https://groups.google.com/forum/#!forum/routr-users",children:"routr-users"})," \u2013 for discussions around Routr usage and community support"]}),"\n"]}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Twitter:"})," ",(0,t.jsx)(o.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for the various ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/",children:"Routr repositories"})," to file bugs and features request. If you need support, please send your questions to the routr-users mailing list rather than filing a GitHub issue."]}),"\n",(0,t.jsxs)(o.blockquote,{children:["\n",(0,t.jsx)(o.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsx)(o.p,{children:"We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request."}),"\n",(0,t.jsxs)(o.p,{children:["Development: ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(o.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(o.p,{children:"We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019."}),"\n",(0,t.jsx)(o.p,{children:"2019 developer summit notes (Come back to see updated link)"}),"\n",(0,t.jsx)(o.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(o.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(o.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(o.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (independent contractor)"]}),"\n",(0,t.jsx)(o.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(o.p,{children:["Routr was developed initially by ",(0,t.jsx)(o.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(o.a,{href:"https://fonoster.com",children:"Fonoster"})," sponsored the majority of its development."]}),"\n",(0,t.jsx)(o.p,{children:"Pedro Sanders contributed Routr's logo."})]})}function a(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>i,x:()=>c});var t=n(6540);const s={},r=t.createContext(s);function i(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea5491a0.29b4b762.js b/assets/js/ea5491a0.29b4b762.js deleted file mode 100644 index 43fa02980..000000000 --- a/assets/js/ea5491a0.29b4b762.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6807],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),d=o,f=m["".concat(i,".").concat(d)]||m[d]||p[d]||a;return n?r.createElement(f,c(c({ref:t},u),{},{components:n})):r.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,c=new Array(a);c[0]=d;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:o,c[1]=l;for(var s=2;s<a;s++)c[s]=n[s];return r.createElement.apply(null,c)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},6650:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={},c="Overview",l={unversionedId:"connect/command-line/overview",id:"connect/command-line/overview",title:"Overview",description:"The command-line tool contains all commands you will need to manage your Routr Connect server.",source:"@site/docs/connect/command-line/overview.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/overview",permalink:"/docs/2.0.0/connect/command-line/overview",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"},next:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"}},i={},s=[],u={toc:s},m="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"The command-line tool contains all commands you will need to manage your Routr Connect server."),(0,o.kt)("p",null,"To install Routr with npm, you will need to run the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-javascript"},"npm install --location=global @routr/ctl\n")),(0,o.kt)("p",null,'Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.'),(0,o.kt)("p",null,"Please see the following sections for more information on each command."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ea5491a0.a12d1751.js b/assets/js/ea5491a0.a12d1751.js new file mode 100644 index 000000000..74a6d3612 --- /dev/null +++ b/assets/js/ea5491a0.a12d1751.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4011],{7163:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>d,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var o=t(4848),r=t(8453);const c={},s="Overview",i={id:"connect/command-line/overview",title:"Overview",description:"The command-line tool contains all commands you will need to manage your Routr Connect server.",source:"@site/docs/connect/command-line/overview.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/overview",permalink:"/docs/2.0.0/connect/command-line/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"},next:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"}},a={},l=[];function m(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(n.p,{children:"The command-line tool contains all commands you will need to manage your Routr Connect server."}),"\n",(0,o.jsx)(n.p,{children:"To install Routr with npm, you will need to run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-javascript",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:'Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.'}),"\n",(0,o.jsx)(n.p,{children:"Please see the following sections for more information on each command."})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var o=t(6540);const r={},c=o.createContext(r);function s(e){const n=o.useContext(c);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:s(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec64d50d.25dae9fa.js b/assets/js/ec64d50d.25dae9fa.js deleted file mode 100644 index 2d009b7b9..000000000 --- a/assets/js/ec64d50d.25dae9fa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8229],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),i=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=i(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=i(n),g=a,d=u["".concat(s,".").concat(g)]||u[g]||m[g]||o;return n?r.createElement(d,l(l({ref:t},c),{},{components:n})):r.createElement(d,l({ref:t},c))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=g;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[u]="string"==typeof e?e:a,l[1]=p;for(var i=2;i<o;i++)l[i]=n[i];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},9523:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>i});var r=n(7462),a=(n(7294),n(3905));const o={},l="getAgent",p={unversionedId:"api/agents/get",id:"version-1.x.x/api/agents/get",title:"getAgent",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/get.md",sourceDirName:"api/agents",slug:"/api/agents/get",permalink:"/docs/1.x.x/api/agents/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"},next:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"}},s={},i=[],c={toc:i},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getagent"},"getAgent"),(0,a.kt)("p",null,"This method returns an Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/agents/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns an Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n "credentials": {\n "username": "1001",\n "secret": "1234"\n },\n "domains": [\n "sip.local"\n ]\n }\n }\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ec64d50d.390e4709.js b/assets/js/ec64d50d.390e4709.js new file mode 100644 index 000000000..ed7fd5073 --- /dev/null +++ b/assets/js/ec64d50d.390e4709.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9900],{3297:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="getAgent",d={id:"api/agents/get",title:"getAgent",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/get.md",sourceDirName:"api/agents",slug:"/api/agents/get",permalink:"/docs/1.x.x/api/agents/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"},next:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getagent",children:"getAgent"}),"\n",(0,s.jsx)(t.p,{children:"This method returns an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.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:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed175a37.09425780.js b/assets/js/ed175a37.09425780.js new file mode 100644 index 000000000..d931f0eb0 --- /dev/null +++ b/assets/js/ed175a37.09425780.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4236],{4995:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var r=t(4848),c=t(8453);const l={},s="CTL",i={id:"connect/command-line/ctl",title:"CTL",description:"Command-Line for Routr server.",source:"@site/docs/connect/command-line/ctl.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/ctl",permalink:"/docs/2.0.0/connect/command-line/ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"}},o={},d=[{value:"<code>rctl acl create</code>",id:"rctl-acl-create",level:2},{value:"<code>rctl acl delete [REF]</code>",id:"rctl-acl-delete-ref",level:2},{value:"<code>rctl acl describe [REF]</code>",id:"rctl-acl-describe-ref",level:2},{value:"<code>rctl acl get [REF]</code>",id:"rctl-acl-get-ref",level:2},{value:"<code>rctl acl update REF</code>",id:"rctl-acl-update-ref",level:2},{value:"<code>rctl agents create</code>",id:"rctl-agents-create",level:2},{value:"<code>rctl agents delete [REF]</code>",id:"rctl-agents-delete-ref",level:2},{value:"<code>rctl agents describe [REF]</code>",id:"rctl-agents-describe-ref",level:2},{value:"<code>rctl agents get [REF]</code>",id:"rctl-agents-get-ref",level:2},{value:"<code>rctl agents update REF</code>",id:"rctl-agents-update-ref",level:2},{value:"<code>rctl autocomplete [SHELL]</code>",id:"rctl-autocomplete-shell",level:2},{value:"<code>rctl credentials create</code>",id:"rctl-credentials-create",level:2},{value:"<code>rctl credentials delete [REF]</code>",id:"rctl-credentials-delete-ref",level:2},{value:"<code>rctl credentials describe [REF]</code>",id:"rctl-credentials-describe-ref",level:2},{value:"<code>rctl credentials get [REF]</code>",id:"rctl-credentials-get-ref",level:2},{value:"<code>rctl credentials update REF</code>",id:"rctl-credentials-update-ref",level:2},{value:"<code>rctl domains create</code>",id:"rctl-domains-create",level:2},{value:"<code>rctl domains delete [REF]</code>",id:"rctl-domains-delete-ref",level:2},{value:"<code>rctl domains describe [REF]</code>",id:"rctl-domains-describe-ref",level:2},{value:"<code>rctl domains get [REF]</code>",id:"rctl-domains-get-ref",level:2},{value:"<code>rctl domains update REF</code>",id:"rctl-domains-update-ref",level:2},{value:"<code>rctl numbers create</code>",id:"rctl-numbers-create",level:2},{value:"<code>rctl numbers delete [REF]</code>",id:"rctl-numbers-delete-ref",level:2},{value:"<code>rctl numbers describe [REF]</code>",id:"rctl-numbers-describe-ref",level:2},{value:"<code>rctl numbers get [REF]</code>",id:"rctl-numbers-get-ref",level:2},{value:"<code>rctl numbers update REF</code>",id:"rctl-numbers-update-ref",level:2},{value:"<code>rctl peers create</code>",id:"rctl-peers-create",level:2},{value:"<code>rctl peers delete [REF]</code>",id:"rctl-peers-delete-ref",level:2},{value:"<code>rctl peers describe [REF]</code>",id:"rctl-peers-describe-ref",level:2},{value:"<code>rctl peers get [REF]</code>",id:"rctl-peers-get-ref",level:2},{value:"<code>rctl peers update REF</code>",id:"rctl-peers-update-ref",level:2},{value:"<code>rctl plugins</code>",id:"rctl-plugins",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin",level:2},{value:"<code>rctl plugins:inspect PLUGIN...</code>",id:"rctl-pluginsinspect-plugin",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin-1",level:2},{value:"<code>rctl plugins:link PLUGIN</code>",id:"rctl-pluginslink-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-1",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-2",level:2},{value:"<code>rctl plugins update</code>",id:"rctl-plugins-update",level:2},{value:"<code>rctl trunks create</code>",id:"rctl-trunks-create",level:2},{value:"<code>rctl trunks delete [REF]</code>",id:"rctl-trunks-delete-ref",level:2},{value:"<code>rctl trunks describe [REF]</code>",id:"rctl-trunks-describe-ref",level:2},{value:"<code>rctl trunks get [REF]</code>",id:"rctl-trunks-get-ref",level:2},{value:"<code>rctl trunks update REF</code>",id:"rctl-trunks-update-ref",level:2}];function a(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"ctl",children:"CTL"}),"\n",(0,r.jsx)(n.p,{children:"Command-Line for Routr server."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#usage",children:"Usage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#commands",children:"Commands"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install -g @routr/ctl\n$ rctl COMMAND\nrunning command...\n$ rctl (--version)\n@routr/ctl/2.1.11 linux-x64 node-v18.17.1\n$ rctl --help [COMMAND]\nUSAGE\n $ rctl COMMAND\n...\n"})}),"\n",(0,r.jsx)(n.h1,{id:"commands",children:"Commands"}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-create",children:(0,r.jsx)(n.code,{children:"rctl acl create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new ACL\n\nEXAMPLES\n $ rctl acl create\n Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/create.ts",children:"dist/commands/acl/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl acl delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Access Control List"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Access Control List\n\nEXAMPLES\n $ rctl acl delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/delete.ts",children:"dist/commands/acl/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl acl describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an ACL\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/describe.ts",children:"dist/commands/acl/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-get-ref",children:(0,r.jsx)(n.code,{children:"rctl acl get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated ACLs or a single ACL if a ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated ACLs or a single ACL if a ref is provided\n\nEXAMPLES\n $ rctl acl get\n Ref Name Deny List Allow List\n 9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/get.ts",children:"dist/commands/acl/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-update-ref",children:(0,r.jsx)(n.code,{children:"rctl acl update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing ACL\n\nEXAMPLES\n $ rctl acl update\n Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/update.ts",children:"dist/commands/acl/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-create",children:(0,r.jsx)(n.code,{children:"rctl agents create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Agent\n\nEXAMPLES\n $ rctl agents create\n Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/create.ts",children:"dist/commands/agents/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl agents delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Agent\n\nEXAMPLES\n $ rctl agents delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/delete.ts",children:"dist/commands/agents/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl agents describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an Agent\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/describe.ts",children:"dist/commands/agents/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-get-ref",children:(0,r.jsx)(n.code,{children:"rctl agents get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Agents or a single Agent if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF Optional Agents reference\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] The number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Agents or a single Agent if ref is provided\n\nEXAMPLES\n $ rctl agents get\n Ref Name Username Domain Privacy Enabled\n d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/get.ts",children:"dist/commands/agents/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-update-ref",children:(0,r.jsx)(n.code,{children:"rctl agents update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Agent\n\nEXAMPLES\n $ rctl agents update\n Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/update.ts",children:"dist/commands/agents/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-autocomplete-shell",children:(0,r.jsx)(n.code,{children:"rctl autocomplete [SHELL]"})}),"\n",(0,r.jsx)(n.p,{children:"display autocomplete installation instructions"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl autocomplete [SHELL] [-r]\n\nARGUMENTS\n SHELL shell type\n\nFLAGS\n -r, --refresh-cache Refresh cache (ignores displaying instructions)\n\nDESCRIPTION\n display autocomplete installation instructions\n\nEXAMPLES\n $ rctl autocomplete\n\n $ rctl autocomplete bash\n\n $ rctl autocomplete zsh\n\n $ rctl autocomplete --refresh-cache\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-autocomplete/blob/v1.4.6/src/commands/autocomplete/index.ts",children:"@oclif/plugin-autocomplete"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-create",children:(0,r.jsx)(n.code,{children:"rctl credentials create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set of Credentials\n\nEXAMPLES\n $ rctl credentials create\n Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/create.ts",children:"dist/commands/credentials/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a set of Credentials\n\nEXAMPLES\n $ rctl credentials delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/delete.ts",children:"dist/commands/credentials/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a set of Credentials\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/describe.ts",children:"dist/commands/credentials/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-get-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Credentials or a single set if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Credentials or a single set if ref is provided\n\nEXAMPLES\n $ rctl credentials get\n Ref Name Deny List Allow List\n 80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/get.ts",children:"dist/commands/credentials/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-update-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl credentials update\n Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/update.ts",children:"dist/commands/credentials/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-create",children:(0,r.jsx)(n.code,{children:"rctl domains create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set Domain\n\nEXAMPLES\n $ rctl domains create\n Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/create.ts",children:"dist/commands/domains/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl domains delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Domain\n\nEXAMPLES\n $ rctl domains delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/delete.ts",children:"dist/commands/domains/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl domains describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"show details of a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n show details of a Domain\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/describe.ts",children:"dist/commands/domains/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-get-ref",children:(0,r.jsx)(n.code,{children:"rctl domains get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Domains or a single Domain if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Domains or a single Domain if ref is provided\n\nEXAMPLES\n $ rctl domains get\n Ref Name URI \n ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/get.ts",children:"dist/commands/domains/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-update-ref",children:(0,r.jsx)(n.code,{children:"rctl domains update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Domain\n\nEXAMPLES\n $ rctl domains update\n Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/update.ts",children:"dist/commands/domains/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-create",children:(0,r.jsx)(n.code,{children:"rctl numbers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Number\n\nEXAMPLES\n $ rctl numbers create\n Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/create.ts",children:"dist/commands/numbers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Number\n\nEXAMPLES\n $ rctl numbers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/delete.ts",children:"dist/commands/numbers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Number\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/describe.ts",children:"dist/commands/numbers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Numbers or a single Number if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Numbers or a single Number if ref is provided\n\nEXAMPLES\n $ rctl numbers get\n Ref Name Telephony URL AOR Link Geo \n a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/get.ts",children:"dist/commands/numbers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl numbers update\n Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/update.ts",children:"dist/commands/numbers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-create",children:(0,r.jsx)(n.code,{children:"rctl peers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Peer\n\nEXAMPLES\n $ rctl peers create\n Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/create.ts",children:"dist/commands/peers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl peers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Peer\n\nEXAMPLES\n $ rctl peers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/delete.ts",children:"dist/commands/peers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl peers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Peer\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/describe.ts",children:"dist/commands/peers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl peers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Peers or a single Peer if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Peers or a single Peer if ref is provided\n\nEXAMPLES\n $ rctl peers get\n Ref Name Username AOR Balancing Algorithm Session Affinity \n 6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/get.ts",children:"dist/commands/peers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl peers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Peer\n\nEXAMPLES\n $ rctl peers update\n Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/update.ts",children:"dist/commands/peers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins",children:(0,r.jsx)(n.code,{children:"rctl plugins"})}),"\n",(0,r.jsx)(n.p,{children:"List installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins [--core]\n\nFLAGS\n --core Show core plugins.\n\nDESCRIPTION\n List installed plugins.\n\nEXAMPLES\n $ rctl plugins\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/index.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinspect-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:inspect PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Displays installation properties of a plugin."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:inspect PLUGIN...\n\nARGUMENTS\n PLUGIN [default: .] Plugin to inspect.\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nGLOBAL FLAGS\n --json Format output as json.\n\nDESCRIPTION\n Displays installation properties of a plugin.\n\nEXAMPLES\n $ rctl plugins:inspect myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/inspect.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/install.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginslink-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:link PLUGIN"})}),"\n",(0,r.jsx)(n.p,{children:"Links a plugin into the CLI for development."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:link PLUGIN\n\nARGUMENTS\n PATH [default: .] path to plugin\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Links a plugin into the CLI for development.\n Installation of a linked plugin will override a user-installed or core plugin.\n\n e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'\n command will override the user-installed or core plugin implementation. This is useful for development work.\n\n\nEXAMPLES\n $ rctl plugins:link myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/link.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/uninstall.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-2",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins-update",children:(0,r.jsx)(n.code,{children:"rctl plugins update"})}),"\n",(0,r.jsx)(n.p,{children:"Update installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins update [-h] [-v]\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Update installed plugins.\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/update.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-create",children:(0,r.jsx)(n.code,{children:"rctl trunks create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Trunk\n\nEXAMPLES\n $ rctl trunks create\n Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/create.ts",children:"dist/commands/trunks/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Trunk\n\nEXAMPLES\n $ rctl trunks delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/delete.ts",children:"dist/commands/trunks/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Trunk\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/describe.ts",children:"dist/commands/trunks/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-get-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Trunks or a single Trunk if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Trunks or a single Trunk if ref is provided\n\nEXAMPLES\n $ rctl trunks get\n Ref Name Inbound SIP URI \n 8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/get.ts",children:"dist/commands/trunks/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-update-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Trunk\n\nEXAMPLES\n $ rctl trunks update\n Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/update.ts",children:"dist/commands/trunks/update.ts"})]})})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var r=t(6540);const c={},l=r.createContext(c);function s(e){const n=r.useContext(l);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(c):e.components||c:s(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed175a37.1f831195.js b/assets/js/ed175a37.1f831195.js deleted file mode 100644 index e5ac48667..000000000 --- a/assets/js/ed175a37.1f831195.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7237],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=s(n),m=l,h=d["".concat(i,".").concat(m)]||d[m]||p[m]||a;return n?r.createElement(h,o(o({ref:t},u),{},{components:n})):r.createElement(h,o({ref:t},u))}));function h(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=m;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[d]="string"==typeof e?e:l,o[1]=c;for(var s=2;s<a;s++)o[s]=n[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},4880:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var r=n(7462),l=(n(7294),n(3905));const a={},o="CTL",c={unversionedId:"connect/command-line/ctl",id:"connect/command-line/ctl",title:"CTL",description:"Command-Line for Routr server.",source:"@site/docs/connect/command-line/ctl.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/ctl",permalink:"/docs/2.0.0/connect/command-line/ctl",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"}},i={},s=[{value:"<code>rctl acl create</code>",id:"rctl-acl-create",level:2},{value:"<code>rctl acl delete [REF]</code>",id:"rctl-acl-delete-ref",level:2},{value:"<code>rctl acl describe [REF]</code>",id:"rctl-acl-describe-ref",level:2},{value:"<code>rctl acl get [REF]</code>",id:"rctl-acl-get-ref",level:2},{value:"<code>rctl acl update REF</code>",id:"rctl-acl-update-ref",level:2},{value:"<code>rctl agents create</code>",id:"rctl-agents-create",level:2},{value:"<code>rctl agents delete [REF]</code>",id:"rctl-agents-delete-ref",level:2},{value:"<code>rctl agents describe [REF]</code>",id:"rctl-agents-describe-ref",level:2},{value:"<code>rctl agents get [REF]</code>",id:"rctl-agents-get-ref",level:2},{value:"<code>rctl agents update REF</code>",id:"rctl-agents-update-ref",level:2},{value:"<code>rctl autocomplete [SHELL]</code>",id:"rctl-autocomplete-shell",level:2},{value:"<code>rctl credentials create</code>",id:"rctl-credentials-create",level:2},{value:"<code>rctl credentials delete [REF]</code>",id:"rctl-credentials-delete-ref",level:2},{value:"<code>rctl credentials describe [REF]</code>",id:"rctl-credentials-describe-ref",level:2},{value:"<code>rctl credentials get [REF]</code>",id:"rctl-credentials-get-ref",level:2},{value:"<code>rctl credentials update REF</code>",id:"rctl-credentials-update-ref",level:2},{value:"<code>rctl domains create</code>",id:"rctl-domains-create",level:2},{value:"<code>rctl domains delete [REF]</code>",id:"rctl-domains-delete-ref",level:2},{value:"<code>rctl domains describe [REF]</code>",id:"rctl-domains-describe-ref",level:2},{value:"<code>rctl domains get [REF]</code>",id:"rctl-domains-get-ref",level:2},{value:"<code>rctl domains update REF</code>",id:"rctl-domains-update-ref",level:2},{value:"<code>rctl numbers create</code>",id:"rctl-numbers-create",level:2},{value:"<code>rctl numbers delete [REF]</code>",id:"rctl-numbers-delete-ref",level:2},{value:"<code>rctl numbers describe [REF]</code>",id:"rctl-numbers-describe-ref",level:2},{value:"<code>rctl numbers get [REF]</code>",id:"rctl-numbers-get-ref",level:2},{value:"<code>rctl numbers update REF</code>",id:"rctl-numbers-update-ref",level:2},{value:"<code>rctl peers create</code>",id:"rctl-peers-create",level:2},{value:"<code>rctl peers delete [REF]</code>",id:"rctl-peers-delete-ref",level:2},{value:"<code>rctl peers describe [REF]</code>",id:"rctl-peers-describe-ref",level:2},{value:"<code>rctl peers get [REF]</code>",id:"rctl-peers-get-ref",level:2},{value:"<code>rctl peers update REF</code>",id:"rctl-peers-update-ref",level:2},{value:"<code>rctl plugins</code>",id:"rctl-plugins",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin",level:2},{value:"<code>rctl plugins:inspect PLUGIN...</code>",id:"rctl-pluginsinspect-plugin",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin-1",level:2},{value:"<code>rctl plugins:link PLUGIN</code>",id:"rctl-pluginslink-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-1",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-2",level:2},{value:"<code>rctl plugins update</code>",id:"rctl-plugins-update",level:2},{value:"<code>rctl trunks create</code>",id:"rctl-trunks-create",level:2},{value:"<code>rctl trunks delete [REF]</code>",id:"rctl-trunks-delete-ref",level:2},{value:"<code>rctl trunks describe [REF]</code>",id:"rctl-trunks-describe-ref",level:2},{value:"<code>rctl trunks get [REF]</code>",id:"rctl-trunks-get-ref",level:2},{value:"<code>rctl trunks update REF</code>",id:"rctl-trunks-update-ref",level:2}],u={toc:s},d="wrapper";function p(e){let{components:t,...n}=e;return(0,l.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"ctl"},"CTL"),(0,l.kt)("p",null,"Command-Line for Routr server."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"#usage"},"Usage")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"#commands"},"Commands"))),(0,l.kt)("h1",{id:"usage"},"Usage"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh-session"},"$ npm install -g @routr/ctl\n$ rctl COMMAND\nrunning command...\n$ rctl (--version)\n@routr/ctl/2.1.11 linux-x64 node-v18.17.1\n$ rctl --help [COMMAND]\nUSAGE\n $ rctl COMMAND\n...\n")),(0,l.kt)("h1",{id:"commands"},"Commands"),(0,l.kt)("h2",{id:"rctl-acl-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl acl create")),(0,l.kt)("p",null,"Creates a new ACL"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl acl create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new ACL\n\nEXAMPLES\n $ rctl acl create\n Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/create.ts"},"dist/commands/acl/create.ts"))),(0,l.kt)("h2",{id:"rctl-acl-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl acl delete [REF]")),(0,l.kt)("p",null,"Deletes an Access Control List"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Access Control List\n\nEXAMPLES\n $ rctl acl delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/delete.ts"},"dist/commands/acl/delete.ts"))),(0,l.kt)("h2",{id:"rctl-acl-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl acl describe [REF]")),(0,l.kt)("p",null,"shows details of an ACL"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an ACL\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/describe.ts"},"dist/commands/acl/describe.ts"))),(0,l.kt)("h2",{id:"rctl-acl-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl acl get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated ACLs or a single ACL if a ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated ACLs or a single ACL if a ref is provided\n\nEXAMPLES\n $ rctl acl get\n Ref Name Deny List Allow List\n 9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/get.ts"},"dist/commands/acl/get.ts"))),(0,l.kt)("h2",{id:"rctl-acl-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl acl update REF")),(0,l.kt)("p",null,"Updates an existing ACL"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl acl update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing ACL\n\nEXAMPLES\n $ rctl acl update\n Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/update.ts"},"dist/commands/acl/update.ts"))),(0,l.kt)("h2",{id:"rctl-agents-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl agents create")),(0,l.kt)("p",null,"Creates a new Agent"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl agents create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Agent\n\nEXAMPLES\n $ rctl agents create\n Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/create.ts"},"dist/commands/agents/create.ts"))),(0,l.kt)("h2",{id:"rctl-agents-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl agents delete [REF]")),(0,l.kt)("p",null,"Deletes an Agent"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Agent\n\nEXAMPLES\n $ rctl agents delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/delete.ts"},"dist/commands/agents/delete.ts"))),(0,l.kt)("h2",{id:"rctl-agents-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl agents describe [REF]")),(0,l.kt)("p",null,"shows details of an Agent"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an Agent\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/describe.ts"},"dist/commands/agents/describe.ts"))),(0,l.kt)("h2",{id:"rctl-agents-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl agents get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated Agents or a single Agent if ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF Optional Agents reference\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] The number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Agents or a single Agent if ref is provided\n\nEXAMPLES\n $ rctl agents get\n Ref Name Username Domain Privacy Enabled\n d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/get.ts"},"dist/commands/agents/get.ts"))),(0,l.kt)("h2",{id:"rctl-agents-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl agents update REF")),(0,l.kt)("p",null,"Updates an existing Agent"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl agents update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Agent\n\nEXAMPLES\n $ rctl agents update\n Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/update.ts"},"dist/commands/agents/update.ts"))),(0,l.kt)("h2",{id:"rctl-autocomplete-shell"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl autocomplete [SHELL]")),(0,l.kt)("p",null,"display autocomplete installation instructions"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl autocomplete [SHELL] [-r]\n\nARGUMENTS\n SHELL shell type\n\nFLAGS\n -r, --refresh-cache Refresh cache (ignores displaying instructions)\n\nDESCRIPTION\n display autocomplete installation instructions\n\nEXAMPLES\n $ rctl autocomplete\n\n $ rctl autocomplete bash\n\n $ rctl autocomplete zsh\n\n $ rctl autocomplete --refresh-cache\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-autocomplete/blob/v1.4.6/src/commands/autocomplete/index.ts"},"@oclif/plugin-autocomplete"))),(0,l.kt)("h2",{id:"rctl-credentials-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl credentials create")),(0,l.kt)("p",null,"Creates a new set of Credentials"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl credentials create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set of Credentials\n\nEXAMPLES\n $ rctl credentials create\n Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/create.ts"},"dist/commands/credentials/create.ts"))),(0,l.kt)("h2",{id:"rctl-credentials-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl credentials delete [REF]")),(0,l.kt)("p",null,"Deletes a set of Credentials"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a set of Credentials\n\nEXAMPLES\n $ rctl credentials delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/delete.ts"},"dist/commands/credentials/delete.ts"))),(0,l.kt)("h2",{id:"rctl-credentials-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl credentials describe [REF]")),(0,l.kt)("p",null,"shows details for a set of Credentials"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a set of Credentials\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/describe.ts"},"dist/commands/credentials/describe.ts"))),(0,l.kt)("h2",{id:"rctl-credentials-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl credentials get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated Credentials or a single set if ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Credentials or a single set if ref is provided\n\nEXAMPLES\n $ rctl credentials get\n Ref Name Deny List Allow List\n 80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/get.ts"},"dist/commands/credentials/get.ts"))),(0,l.kt)("h2",{id:"rctl-credentials-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl credentials update REF")),(0,l.kt)("p",null,"Updates an existing set of Credentials"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl credentials update\n Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/update.ts"},"dist/commands/credentials/update.ts"))),(0,l.kt)("h2",{id:"rctl-domains-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl domains create")),(0,l.kt)("p",null,"Creates a new set Domain"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl domains create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set Domain\n\nEXAMPLES\n $ rctl domains create\n Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/create.ts"},"dist/commands/domains/create.ts"))),(0,l.kt)("h2",{id:"rctl-domains-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl domains delete [REF]")),(0,l.kt)("p",null,"Deletes a Domain"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Domain\n\nEXAMPLES\n $ rctl domains delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/delete.ts"},"dist/commands/domains/delete.ts"))),(0,l.kt)("h2",{id:"rctl-domains-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl domains describe [REF]")),(0,l.kt)("p",null,"show details of a Domain"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n show details of a Domain\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/describe.ts"},"dist/commands/domains/describe.ts"))),(0,l.kt)("h2",{id:"rctl-domains-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl domains get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated Domains or a single Domain if ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Domains or a single Domain if ref is provided\n\nEXAMPLES\n $ rctl domains get\n Ref Name URI \n ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/get.ts"},"dist/commands/domains/get.ts"))),(0,l.kt)("h2",{id:"rctl-domains-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl domains update REF")),(0,l.kt)("p",null,"Updates an existing Domain"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl domains update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Domain\n\nEXAMPLES\n $ rctl domains update\n Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/update.ts"},"dist/commands/domains/update.ts"))),(0,l.kt)("h2",{id:"rctl-numbers-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl numbers create")),(0,l.kt)("p",null,"Creates a new Number"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl numbers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Number\n\nEXAMPLES\n $ rctl numbers create\n Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/create.ts"},"dist/commands/numbers/create.ts"))),(0,l.kt)("h2",{id:"rctl-numbers-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl numbers delete [REF]")),(0,l.kt)("p",null,"Deletes a Number"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Number\n\nEXAMPLES\n $ rctl numbers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/delete.ts"},"dist/commands/numbers/delete.ts"))),(0,l.kt)("h2",{id:"rctl-numbers-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl numbers describe [REF]")),(0,l.kt)("p",null,"shows details for a Number"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Number\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/describe.ts"},"dist/commands/numbers/describe.ts"))),(0,l.kt)("h2",{id:"rctl-numbers-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl numbers get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated Numbers or a single Number if ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Numbers or a single Number if ref is provided\n\nEXAMPLES\n $ rctl numbers get\n Ref Name Telephony URL AOR Link Geo \n a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/get.ts"},"dist/commands/numbers/get.ts"))),(0,l.kt)("h2",{id:"rctl-numbers-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl numbers update REF")),(0,l.kt)("p",null,"Updates an existing set of Credentials"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl numbers update\n Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/update.ts"},"dist/commands/numbers/update.ts"))),(0,l.kt)("h2",{id:"rctl-peers-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl peers create")),(0,l.kt)("p",null,"Creates a new Peer"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl peers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Peer\n\nEXAMPLES\n $ rctl peers create\n Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/create.ts"},"dist/commands/peers/create.ts"))),(0,l.kt)("h2",{id:"rctl-peers-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl peers delete [REF]")),(0,l.kt)("p",null,"Deletes a Peer"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Peer\n\nEXAMPLES\n $ rctl peers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/delete.ts"},"dist/commands/peers/delete.ts"))),(0,l.kt)("h2",{id:"rctl-peers-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl peers describe [REF]")),(0,l.kt)("p",null,"shows details for a Peer"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Peer\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/describe.ts"},"dist/commands/peers/describe.ts"))),(0,l.kt)("h2",{id:"rctl-peers-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl peers get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated Peers or a single Peer if ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Peers or a single Peer if ref is provided\n\nEXAMPLES\n $ rctl peers get\n Ref Name Username AOR Balancing Algorithm Session Affinity \n 6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/get.ts"},"dist/commands/peers/get.ts"))),(0,l.kt)("h2",{id:"rctl-peers-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl peers update REF")),(0,l.kt)("p",null,"Updates an existing Peer"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl peers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Peer\n\nEXAMPLES\n $ rctl peers update\n Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/update.ts"},"dist/commands/peers/update.ts"))),(0,l.kt)("h2",{id:"rctl-plugins"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins")),(0,l.kt)("p",null,"List installed plugins."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins [--core]\n\nFLAGS\n --core Show core plugins.\n\nDESCRIPTION\n List installed plugins.\n\nEXAMPLES\n $ rctl plugins\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/index.ts"},"@oclif/plugin-plugins"))),(0,l.kt)("h2",{id:"rctl-pluginsinstall-plugin"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:install PLUGIN...")),(0,l.kt)("p",null,"Installs a plugin into the CLI."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n")),(0,l.kt)("h2",{id:"rctl-pluginsinspect-plugin"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:inspect PLUGIN...")),(0,l.kt)("p",null,"Displays installation properties of a plugin."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:inspect PLUGIN...\n\nARGUMENTS\n PLUGIN [default: .] Plugin to inspect.\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nGLOBAL FLAGS\n --json Format output as json.\n\nDESCRIPTION\n Displays installation properties of a plugin.\n\nEXAMPLES\n $ rctl plugins:inspect myplugin\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/inspect.ts"},"@oclif/plugin-plugins"))),(0,l.kt)("h2",{id:"rctl-pluginsinstall-plugin-1"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:install PLUGIN...")),(0,l.kt)("p",null,"Installs a plugin into the CLI."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/install.ts"},"@oclif/plugin-plugins"))),(0,l.kt)("h2",{id:"rctl-pluginslink-plugin"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:link PLUGIN")),(0,l.kt)("p",null,"Links a plugin into the CLI for development."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:link PLUGIN\n\nARGUMENTS\n PATH [default: .] path to plugin\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Links a plugin into the CLI for development.\n Installation of a linked plugin will override a user-installed or core plugin.\n\n e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'\n command will override the user-installed or core plugin implementation. This is useful for development work.\n\n\nEXAMPLES\n $ rctl plugins:link myplugin\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/link.ts"},"@oclif/plugin-plugins"))),(0,l.kt)("h2",{id:"rctl-pluginsuninstall-plugin"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:uninstall PLUGIN...")),(0,l.kt)("p",null,"Removes a plugin from the CLI."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n")),(0,l.kt)("h2",{id:"rctl-pluginsuninstall-plugin-1"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:uninstall PLUGIN...")),(0,l.kt)("p",null,"Removes a plugin from the CLI."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/uninstall.ts"},"@oclif/plugin-plugins"))),(0,l.kt)("h2",{id:"rctl-pluginsuninstall-plugin-2"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins:uninstall PLUGIN...")),(0,l.kt)("p",null,"Removes a plugin from the CLI."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n")),(0,l.kt)("h2",{id:"rctl-plugins-update"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl plugins update")),(0,l.kt)("p",null,"Update installed plugins."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl plugins update [-h] [-v]\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Update installed plugins.\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/update.ts"},"@oclif/plugin-plugins"))),(0,l.kt)("h2",{id:"rctl-trunks-create"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl trunks create")),(0,l.kt)("p",null,"Creates a new Trunk"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl trunks create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Trunk\n\nEXAMPLES\n $ rctl trunks create\n Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/create.ts"},"dist/commands/trunks/create.ts"))),(0,l.kt)("h2",{id:"rctl-trunks-delete-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl trunks delete [REF]")),(0,l.kt)("p",null,"Deletes a Trunk"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Trunk\n\nEXAMPLES\n $ rctl trunks delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/delete.ts"},"dist/commands/trunks/delete.ts"))),(0,l.kt)("h2",{id:"rctl-trunks-describe-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl trunks describe [REF]")),(0,l.kt)("p",null,"shows details for a Trunk"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Trunk\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/describe.ts"},"dist/commands/trunks/describe.ts"))),(0,l.kt)("h2",{id:"rctl-trunks-get-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl trunks get [REF]")),(0,l.kt)("p",null,"Shows a list of paginated Trunks or a single Trunk if ref is provided"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Trunks or a single Trunk if ref is provided\n\nEXAMPLES\n $ rctl trunks get\n Ref Name Inbound SIP URI \n 8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/get.ts"},"dist/commands/trunks/get.ts"))),(0,l.kt)("h2",{id:"rctl-trunks-update-ref"},(0,l.kt)("inlineCode",{parentName:"h2"},"rctl trunks update REF")),(0,l.kt)("p",null,"Updates an existing Trunk"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"USAGE\n $ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Trunk\n\nEXAMPLES\n $ rctl trunks update\n Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555\n")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"See code: ",(0,l.kt)("a",{parentName:"em",href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/update.ts"},"dist/commands/trunks/update.ts"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ed519cbf.65e02f98.js b/assets/js/ed519cbf.65e02f98.js deleted file mode 100644 index abf4783e6..000000000 --- a/assets/js/ed519cbf.65e02f98.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1395],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(n),d=a,f=c["".concat(i,".").concat(d)]||c[d]||m[d]||o;return n?r.createElement(f,l(l({ref:t},u),{},{components:n})):r.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[c]="string"==typeof e?e:a,l[1]=p;for(var s=2;s<o;s++)l[s]=n[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},2304:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={},l="getNumber",p={unversionedId:"api/numbers/get",id:"version-1.x.x/api/numbers/get",title:"getNumber",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/numbers/get.md",sourceDirName:"api/numbers",slug:"/api/numbers/get",permalink:"/docs/1.x.x/api/numbers/get",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"},next:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"}},i={},s=[],u={toc:s},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getnumber"},"getNumber"),(0,a.kt)("p",null,"This method returns an Agent resource."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"URL")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"/numbers/{ref}")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Method")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"GET")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Parameters")),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter Name"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Value"),(0,a.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"ref"),(0,a.kt)("td",{parentName:"tr",align:"left"},"path"),(0,a.kt)("td",{parentName:"tr",align:"left"},"string"),(0,a.kt)("td",{parentName:"tr",align:"left"},"Resource reference")))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Request body")),(0,a.kt)("p",null,"Do not supply a request body with this method."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Response")),(0,a.kt)("p",null,"If successful this method returns a Number."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Sample Call")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},'GET /api/{apiversion}/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "ref": "dd50baa4",\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n }\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ed519cbf.c20eaab7.js b/assets/js/ed519cbf.c20eaab7.js new file mode 100644 index 000000000..6ec2b78f0 --- /dev/null +++ b/assets/js/ed519cbf.c20eaab7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7638],{3271:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var r=n(4848),s=n(8453);const i={},o="getNumber",d={id:"api/numbers/get",title:"getNumber",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/numbers/get.md",sourceDirName:"api/numbers",slug:"/api/numbers/get",permalink:"/docs/1.x.x/api/numbers/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"},next:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"}},l={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"getnumber",children:"getNumber"}),"\n",(0,r.jsx)(t.p,{children:"This method returns an Agent resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/numbers/{ref}"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"GET"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter Name"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ref"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method returns a Number."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Number",\n \t"metadata": {\n "ref": "dd50baa4",\n \t\t"gwRef": "gweef506",\n \t\t"geoInfo": {\n \t\t\t"city": "City, State",\n \t\t\t"country": "Country",\n \t\t\t"countryISOCode": "US"\n \t\t}\n \t},\n \t"spec": {\n \t\t"location": {\n \t\t\t"telUrl": "tel:0000000000",\n \t\t\t"aorLink": "sip:1001@sip.local"\n \t\t}\n \t}\n }\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.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(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee7973d9.d3592e4d.js b/assets/js/ee7973d9.d3592e4d.js new file mode 100644 index 000000000..604531673 --- /dev/null +++ b/assets/js/ee7973d9.d3592e4d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2514],{2305:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var n=r(4848),t=r(8453);const i={},d="Peers",c={id:"configuration/peers",title:"Peers",description:"Like Agents, Peers represent SIP endpoints such as Media Servers.",source:"@site/versioned_docs/version-1.x.x/configuration/peers.md",sourceDirName:"configuration",slug:"/configuration/peers",permalink:"/docs/1.x.x/configuration/peers",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/peers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"},next:{title:"Users",permalink:"/docs/1.x.x/configuration/users"}},o={},a=[{value:"Peer Resource",id:"peer-resource",level:2},{value:"Example",id:"example",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{id:"peers",children:"Peers"}),"\n",(0,n.jsx)(s.p,{children:"Like Agents, Peers represent SIP endpoints such as Media Servers."}),"\n",(0,n.jsx)(s.p,{children:"Unlike Agents, Peers aren't bound by a Domain."}),"\n",(0,n.jsxs)(s.p,{children:["The Peers configuration can be provided using the file ",(0,n.jsx)(s.code,{children:"config/peers.yml"})," located at the root of your Routr installation."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"peer-resource",children:"Peer Resource"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Property"}),(0,n.jsx)(s.th,{children:"Description"}),(0,n.jsx)(s.th,{children:"Required"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"apiVersion"}),(0,n.jsx)(s.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"kind"}),(0,n.jsx)(s.td,{children:"Defines the type of resource"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"metadata.name"}),(0,n.jsx)(s.td,{children:"Friendly name for the SIP device"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.credentials.username"}),(0,n.jsx)(s.td,{children:"Peer's credential username"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.credentials.secret"}),(0,n.jsx)(s.td,{children:"Peer's credential secret"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.device"}),(0,n.jsx)(s.td,{children:"When set it is used by the location service"}),(0,n.jsx)(s.td,{children:"No"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.contactAddr"}),(0,n.jsx)(s.td,{children:"When set advertises this as the contactURI"}),(0,n.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,n.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk (Media Server)\n spec:\n credentials:\n username: ast\n secret: 'astsecret'\n device: astserver # If is not define the IP address will be used\n contactAddr: '192.168.1.2:6060'\n"})}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["This peer can be reached using the AOR: ",(0,n.jsx)(s.code,{children:"ast@astserver"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>d,x:()=>c});var n=r(6540);const t={},i=n.createContext(t);function d(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee7973d9.ed8e71cf.js b/assets/js/ee7973d9.ed8e71cf.js deleted file mode 100644 index e18a60722..000000000 --- a/assets/js/ee7973d9.ed8e71cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2885],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=p(r),m=a,k=u["".concat(s,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(k,l(l({ref:t},c),{},{components:r})):n.createElement(k,l({ref:t},c))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var p=2;p<i;p++)l[p]=r[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},4120:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const i={},l="Peers",o={unversionedId:"configuration/peers",id:"version-1.x.x/configuration/peers",title:"Peers",description:"Like Agents, Peers represent SIP endpoints such as Media Servers.",source:"@site/versioned_docs/version-1.x.x/configuration/peers.md",sourceDirName:"configuration",slug:"/configuration/peers",permalink:"/docs/1.x.x/configuration/peers",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/peers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"},next:{title:"Users",permalink:"/docs/1.x.x/configuration/users"}},s={},p=[{value:"Peer Resource",id:"peer-resource",level:2},{value:"Example",id:"example",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"peers"},"Peers"),(0,a.kt)("p",null,"Like Agents, Peers represent SIP endpoints such as Media Servers."),(0,a.kt)("p",null,"Unlike Agents, Peers aren't bound by a Domain."),(0,a.kt)("p",null,"The Peers configuration can be provided using the file ",(0,a.kt)("inlineCode",{parentName:"p"},"config/peers.yml")," located at the root of your Routr installation."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"If using Redis this configuration gets stored in the database.")),(0,a.kt)("h2",{id:"peer-resource"},"Peer Resource"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Property"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"Required"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"apiVersion"),(0,a.kt)("td",{parentName:"tr",align:null},"Indicates the version of the resource (Not yet implemented)"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"kind"),(0,a.kt)("td",{parentName:"tr",align:null},"Defines the type of resource"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"metadata.name"),(0,a.kt)("td",{parentName:"tr",align:null},"Friendly name for the SIP device"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.credentials.username"),(0,a.kt)("td",{parentName:"tr",align:null},"Peer's credential username"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.credentials.secret"),(0,a.kt)("td",{parentName:"tr",align:null},"Peer's credential secret"),(0,a.kt)("td",{parentName:"tr",align:null},"Yes")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.device"),(0,a.kt)("td",{parentName:"tr",align:null},"When set it is used by the location service"),(0,a.kt)("td",{parentName:"tr",align:null},"No")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"spec.contactAddr"),(0,a.kt)("td",{parentName:"tr",align:null},"When set advertises this as the contactURI"),(0,a.kt)("td",{parentName:"tr",align:null},"No")))),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk (Media Server)\n spec:\n credentials:\n username: ast\n secret: 'astsecret'\n device: astserver # If is not define the IP address will be used\n contactAddr: '192.168.1.2:6060'\n")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"This peer can be reached using the AOR: ",(0,a.kt)("inlineCode",{parentName:"p"},"ast@astserver"),".")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f1b4aa58.d829509f.js b/assets/js/f1b4aa58.d829509f.js new file mode 100644 index 000000000..1caffcf11 --- /dev/null +++ b/assets/js/f1b4aa58.d829509f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8755],{5835:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>a});var r=n(4848),o=n(8453);const c={},s="Securing the Server",i={id:"connect/securing-the-server",title:"Securing the Server",description:"Coming soon.",source:"@site/docs/connect/securing-the-server.md",sourceDirName:"connect",slug:"/connect/securing-the-server",permalink:"/docs/2.0.0/connect/securing-the-server",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/securing-the-server.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"},next:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"}},u={},a=[];function d(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"securing-the-server",children:"Securing the Server"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(6540);const o={},c=r.createContext(o);function s(e){const t=r.useContext(c);return r.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(o):e.components||o:s(e.components),r.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1b4aa58.fbdcc037.js b/assets/js/f1b4aa58.fbdcc037.js deleted file mode 100644 index ed1b4bdb5..000000000 --- a/assets/js/f1b4aa58.fbdcc037.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6069],{3905:(e,r,t)=>{t.d(r,{Zo:()=>l,kt:()=>m});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?c(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):c(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function a(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=n.createContext({}),u=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},l=function(e){var r=u(e.components);return n.createElement(s.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,s=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),p=u(t),d=o,m=p["".concat(s,".").concat(d)]||p[d]||f[d]||c;return t?n.createElement(m,i(i({ref:r},l),{},{components:t})):n.createElement(m,i({ref:r},l))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,i=new Array(c);i[0]=d;var a={};for(var s in r)hasOwnProperty.call(r,s)&&(a[s]=r[s]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var u=2;u<c;u++)i[u]=t[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,t)}d.displayName="MDXCreateElement"},9061:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>c,metadata:()=>a,toc:()=>u});var n=t(7462),o=(t(7294),t(3905));const c={},i="Securing the Server",a={unversionedId:"connect/securing-the-server",id:"connect/securing-the-server",title:"Securing the Server",description:"Coming soon.",source:"@site/docs/connect/securing-the-server.md",sourceDirName:"connect",slug:"/connect/securing-the-server",permalink:"/docs/2.0.0/connect/securing-the-server",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/securing-the-server.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"},next:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"}},s={},u=[],l={toc:u},p="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(p,(0,n.Z)({},l,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"securing-the-server"},"Securing the Server"),(0,o.kt)("p",null,"Coming soon."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f3f39cc5.73d34d25.js b/assets/js/f3f39cc5.73d34d25.js deleted file mode 100644 index 4dec8dc26..000000000 --- a/assets/js/f3f39cc5.73d34d25.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4567],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),m=o,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||i;return r?n.createElement(f,a(a({ref:t},c),{},{components:r})):n.createElement(f,a({ref:t},c))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,a[1]=s;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},360:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(7462),o=(r(7294),r(3905));const i={},a="Media",s={unversionedId:"introduction/media",id:"version-1.x.x/introduction/media",title:"Media",description:"There is a subreddit collecting all Routr-related resources on the internet.",source:"@site/versioned_docs/version-1.x.x/introduction/media.md",sourceDirName:"introduction",slug:"/introduction/media",permalink:"/docs/1.x.x/introduction/media",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/media.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"},next:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"}},l={},u=[{value:"Blogs",id:"blogs",level:2},{value:"Tutorials",id:"tutorials",level:2}],c={toc:u},d="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"media"},"Media"),(0,o.kt)("p",null,"There is a ",(0,o.kt)("a",{parentName:"p",href:"https://www.reddit.com/r/Routr/"},"subreddit")," collecting all Routr-related resources on the internet."),(0,o.kt)("p",null,"The following selection of resources is particularly useful to get started with Routr."),(0,o.kt)("h2",{id:"blogs"},"Blogs"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://medium.com/@pedrosanders/tutorial-getting-started-with-routr-sip-server-f66c5216690a"},"Getting started with Routr SIP Server")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://medium.com/@pedrosanders/migrating-from-nashorn-to-graaljs-lessons-learn-2385aa62e35d"},"Migrating Routr from Nashorn to GraalJS: Lessons Learn"))),(0,o.kt)("h2",{id:"tutorials"},"Tutorials"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://routr.io/docs/guides/basic-setup/"},"Instructions and example a basic setup of Routr"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f3f39cc5.b8fb4284.js b/assets/js/f3f39cc5.b8fb4284.js new file mode 100644 index 000000000..38469f271 --- /dev/null +++ b/assets/js/f3f39cc5.b8fb4284.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7387],{1850:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(4848),o=r(8453);const s={},i="Media",a={id:"introduction/media",title:"Media",description:"There is a subreddit collecting all Routr-related resources on the internet.",source:"@site/versioned_docs/version-1.x.x/introduction/media.md",sourceDirName:"introduction",slug:"/introduction/media",permalink:"/docs/1.x.x/introduction/media",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/media.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"},next:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"}},d={},l=[{value:"Blogs",id:"blogs",level:2},{value:"Tutorials",id:"tutorials",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"media",children:"Media"}),"\n",(0,n.jsxs)(t.p,{children:["There is a ",(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/Routr/",children:"subreddit"})," collecting all Routr-related resources on the internet."]}),"\n",(0,n.jsx)(t.p,{children:"The following selection of resources is particularly useful to get started with Routr."}),"\n",(0,n.jsx)(t.h2,{id:"blogs",children:"Blogs"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@pedrosanders/tutorial-getting-started-with-routr-sip-server-f66c5216690a",children:"Getting started with Routr SIP Server"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@pedrosanders/migrating-from-nashorn-to-graaljs-lessons-learn-2385aa62e35d",children:"Migrating Routr from Nashorn to GraalJS: Lessons Learn"})}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"tutorials",children:"Tutorials"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://routr.io/docs/guides/basic-setup/",children:"Instructions and example a basic setup of Routr"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>a});var n=r(6540);const o={},s=n.createContext(o);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4357d2a.a6c56766.js b/assets/js/f4357d2a.a6c56766.js new file mode 100644 index 000000000..5d364b658 --- /dev/null +++ b/assets/js/f4357d2a.a6c56766.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6575],{696:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const s={sidebar_position:1},c="Docker installation",a={id:"connect/quick-start/docker",title:"Docker installation",description:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:',source:"@site/docs/connect/quick-start/docker.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/docker",permalink:"/docs/2.0.0/connect/quick-start/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/docker.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"},next:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"}},i={},l=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"docker-installation",children:"Docker installation"}),"\n",(0,o.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.em,{children:"compose.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n\nvolumes:\n shared:\n'})}),"\n",(0,o.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,o.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see a containers with its status. Your output should look like the one below:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,o.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,o.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,o.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:"And here is an example of creating a SIP Domain:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For additional examples, refer to the command line ",(0,o.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation."})]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>a});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 a(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/assets/js/f4357d2a.eeda20d9.js b/assets/js/f4357d2a.eeda20d9.js deleted file mode 100644 index 76efa0de9..000000000 --- a/assets/js/f4357d2a.eeda20d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8305],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(n),m=o,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(f,c(c({ref:t},u),{},{components:n})):r.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,c=new Array(a);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[p]="string"==typeof e?e:o,c[1]=l;for(var s=2;s<a;s++)c[s]=n[s];return r.createElement.apply(null,c)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},4281:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={sidebar_position:1},c="Docker installation",l={unversionedId:"connect/quick-start/docker",id:"connect/quick-start/docker",title:"Docker installation",description:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:',source:"@site/docs/connect/quick-start/docker.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/docker",permalink:"/docs/2.0.0/connect/quick-start/docker",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/docker.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"},next:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"}},i={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"docker-installation"},"Docker installation"),(0,o.kt)("p",null,'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'),(0,o.kt)("p",null,"Filename: ",(0,o.kt)("em",{parentName:"p"},"compose.yaml")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n\nvolumes:\n shared:\n')),(0,o.kt)("p",null,"Then, start the server with:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n")),(0,o.kt)("p",null,"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n")),(0,o.kt)("p",null,"You should see a containers with its status. Your output should look like the one below:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n")),(0,o.kt)("p",null,'If the status of your service is "Up," you are ready to go.'),(0,o.kt)("p",null,"Finally, install the command-line tool and start building your SIP Network."),(0,o.kt)("p",null,"You can install the tool with npm as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm install --location=global @routr/ctl\n")),(0,o.kt)("p",null,"And here is an example of creating a SIP Domain:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"rctl domains create --insecure\n")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"The --insecure flag is required as we did not set up the TLS settings.")),(0,o.kt)("p",null,"For additional examples, refer to the command line ",(0,o.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@routr/ctl"},"documentation.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5184ac4.15ae4dba.js b/assets/js/f5184ac4.15ae4dba.js new file mode 100644 index 000000000..ec7cbc2ca --- /dev/null +++ b/assets/js/f5184ac4.15ae4dba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6099],{7982:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=t(4848),r=t(8453);const s={},i="Location Service",c={id:"development/components/location",title:"Location Service",description:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.",source:"@site/docs/development/components/location.md",sourceDirName:"development/components",slug:"/development/components/location",permalink:"/docs/2.0.0/development/components/location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/location.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"},next:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Location Service with Docker",id:"launching-the-location-service-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"location-service",children:"Location Service"}),"\n",(0,o.jsx)(n.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,o.jsx)(n.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,o.jsx)(n.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,o.jsxs)(n.p,{children:["Two balancing algorithms are available. The first is ",(0,o.jsx)(n.code,{children:"round-robin"}),", and the second is ",(0,o.jsx)(n.code,{children:"least-sessions"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,o.jsx)(n.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that the load balancing section sets the ",(0,o.jsx)(n.code,{children:"withSessionAffinity"})," to ",(0,o.jsx)(n.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,o.jsxs)(n.p,{children:["Every Asterisk server that registers using the ",(0,o.jsx)(n.code,{children:"asterisk"})," username will join the same group under the ",(0,o.jsx)(n.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,o.jsx)(n.p,{children:"To configure the Location Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"region"})}),(0,o.jsx)(n.td,{children:"Reserved for future use"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"bindAddr"})}),(0,o.jsx)(n.td,{children:"IPv4 interface on which to accept requests"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache"})}),(0,o.jsx)(n.td,{children:"Cache configuration"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.provider"})}),(0,o.jsxs)(n.td,{children:["Cache provider (Accepts either ",(0,o.jsx)(n.code,{children:"memory"})," or ",(0,o.jsx)(n.code,{children:"redis"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.parameters"})}),(0,o.jsx)(n.td,{children:"Cache parameters (Comma-separated key-value pairs)"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,o.jsx)(n.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"username"})}),(0,o.jsx)(n.td,{children:"Username (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"password"})}),(0,o.jsx)(n.td,{children:"Password (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"host"})}),(0,o.jsxs)(n.td,{children:["Redis host (Defaults to ",(0,o.jsx)(n.code,{children:"localhost"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"port"})}),(0,o.jsxs)(n.td,{children:["Redis port (Defaults to ",(0,o.jsx)(n.code,{children:"6379"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"secure"})}),(0,o.jsx)(n.td,{children:"Use secure connection for Redis"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsx)(n.p,{children:"Here is an example of a configuration file:"}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.code,{children:"location.yaml"})," or ",(0,o.jsx)(n.code,{children:"location.json"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'kind: Location\napiVersion: v2beta1\nmetadata:\n region: default\nspec:\n bindAddr: 0.0.0.0:51902\n cache:\n provider: redis\n parameters: "host=localhost,port=6379"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that using the ",(0,o.jsx)(n.code,{children:"memory"})," provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the ",(0,o.jsx)(n.code,{children:"least-session"})," algorithm and run multiple instances of the Location Service. In such cases, you will need the ",(0,o.jsx)(n.code,{children:"redis"})," provider."]}),"\n",(0,o.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,o.jsx)(n.p,{children:"Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.location.v2beta1;\n\nimport "google/protobuf/empty.proto";\nimport "common.proto";\nimport "processor.proto";\n\nservice Location {\n rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}\n rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}\n rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}\n}\n\n// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)\nmessage Route {\n string user = 1;\n string host = 2;\n string port = 3;\n string advertised_host = 13;\n string advertised_port = 14;\n fonoster.routr.common.v2beta1.Transport transport = 4;\n int64 registered_on = 5;\n int32 expires = 6;\n int32 session_count = 7;\n string edge_port_ref = 8;\n repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;\n repeated string localnets = 10;\n repeated string external_addrs = 11;\n // During route creation, an endpoint can request to add labels that can later be\n // used as selectors. For example, a Softphone can add a label `priority=1` to indicate\n // that it is the preferred endpoint for the given AOR.\n map<string, string> labels = 12;\n}\n\nmessage AddRouteRequest {\n // Address of record for the endpoint or trunk\n string aor = 1;\n Route route = 2;\n}\n\nmessage FindRoutesRequest {\n message Backend {\n enum Algoritm {\n ROUND_ROBIN = 0;\n LEAST_SESSIONS = 1;\n }\n string ref = 1;\n bool with_session_affinity = 2;\n Algoritm algorithm = 3;\n }\n string call_id = 1;\n string aor = 2;\n string session_affinity_ref = 3;\n Backend backend = 4;\n map<string, string> labels = 5;\n}\n\nmessage FindRoutesResponse {\n repeated Route routes = 1;\n}\n\nmessage RemoveRoutesRequest {\n string aor = 1;\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Upon receiving a valid ",(0,o.jsx)(n.code,{children:"AddRoute"})," request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition."]}),"\n",(0,o.jsxs)(n.p,{children:["Link to the ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/location.proto",children:"protobuf definition."})]}),"\n",(0,o.jsx)(n.h2,{id:"launching-the-location-service-with-docker",children:"Launching the Location Service with Docker"}),"\n",(0,o.jsxs)(n.p,{children:["The Location Service is available as a Docker image from ",(0,o.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-location",children:"Docker Hub"}),". To launch the Location Service with Docker, you can use the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port ",(0,o.jsx)(n.code,{children:"51902"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,o.jsx)(n.code,{children:"51902"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,o.jsxs)(n.p,{children:["One easy way to interact with the Location Service for testing and development is to use ",(0,o.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Location Service using gRPCurl:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto location.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.location.v2beta1.Location/AddRouteRequest\n"})})]})}function h(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:()=>i,x:()=>c});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.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:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5184ac4.5d035928.js b/assets/js/f5184ac4.5d035928.js deleted file mode 100644 index f809fc7d7..000000000 --- a/assets/js/f5184ac4.5d035928.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6789],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(h,i(i({ref:t},c),{},{components:n})):r.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p<a;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},3762:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var r=n(7462),o=(n(7294),n(3905));const a={},i="Location Service",l={unversionedId:"development/components/location",id:"development/components/location",title:"Location Service",description:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.",source:"@site/docs/development/components/location.md",sourceDirName:"development/components",slug:"/development/components/location",permalink:"/docs/2.0.0/development/components/location",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/location.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"},next:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"}},s={},p=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Location Service with Docker",id:"launching-the-location-service-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"location-service"},"Location Service"),(0,o.kt)("p",null,"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."),(0,o.kt)("p",null,"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."),(0,o.kt)("p",null,"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."),(0,o.kt)("p",null,"Two balancing algorithms are available. The first is ",(0,o.kt)("inlineCode",{parentName:"p"},"round-robin"),", and the second is ",(0,o.kt)("inlineCode",{parentName:"p"},"least-sessions"),"."),(0,o.kt)("p",null,"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."),(0,o.kt)("p",null,"To do this, create a Peer configuration for your Asterisk server similar to the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n")),(0,o.kt)("p",null,"Notice that the load balancing section sets the ",(0,o.kt)("inlineCode",{parentName:"p"},"withSessionAffinity")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"true"),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server. "),(0,o.kt)("p",null,"Every Asterisk server that registers using the ",(0,o.kt)("inlineCode",{parentName:"p"},"asterisk")," username will join the same group under the ",(0,o.kt)("inlineCode",{parentName:"p"},"sip:conference@sip.local")," Address of Record (AOR)."),(0,o.kt)("h2",{id:"configuration-spec"},"Configuration Spec"),(0,o.kt)("p",null,"To configure the Location Service, you must provide a YAML or JSON configuration with the following structure."),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Property"),(0,o.kt)("th",{parentName:"tr",align:null},"Description"),(0,o.kt)("th",{parentName:"tr",align:null},"Required"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"region")),(0,o.kt)("td",{parentName:"tr",align:null},"Reserved for future use"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"bindAddr")),(0,o.kt)("td",{parentName:"tr",align:null},"IPv4 interface on which to accept requests"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"cache")),(0,o.kt)("td",{parentName:"tr",align:null},"Cache configuration"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"cache.provider")),(0,o.kt)("td",{parentName:"tr",align:null},"Cache provider (Accepts either ",(0,o.kt)("inlineCode",{parentName:"td"},"memory")," or ",(0,o.kt)("inlineCode",{parentName:"td"},"redis"),")"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"cache.parameters")),(0,o.kt)("td",{parentName:"tr",align:null},"Cache parameters (Comma-separated key-value pairs)"),(0,o.kt)("td",{parentName:"tr",align:null},"No")))),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"cache.parameters")," property is only needed if you are using the Redis provider. "),(0,o.kt)("p",null,"The following table shows the available parameters for the Redis provider."),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Property"),(0,o.kt)("th",{parentName:"tr",align:null},"Description"),(0,o.kt)("th",{parentName:"tr",align:null},"Required"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"username")),(0,o.kt)("td",{parentName:"tr",align:null},"Username (if required by Redis)"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"password")),(0,o.kt)("td",{parentName:"tr",align:null},"Password (if required by Redis)"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"host")),(0,o.kt)("td",{parentName:"tr",align:null},"Redis host (Defaults to ",(0,o.kt)("inlineCode",{parentName:"td"},"localhost"),")"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"port")),(0,o.kt)("td",{parentName:"tr",align:null},"Redis port (Defaults to ",(0,o.kt)("inlineCode",{parentName:"td"},"6379"),")"),(0,o.kt)("td",{parentName:"tr",align:null},"No")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"secure")),(0,o.kt)("td",{parentName:"tr",align:null},"Use secure connection for Redis"),(0,o.kt)("td",{parentName:"tr",align:null},"No")))),(0,o.kt)("p",null,"Here is an example of a configuration file:"),(0,o.kt)("p",null,"Filename: ",(0,o.kt)("inlineCode",{parentName:"p"},"location.yaml")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"location.json")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},'kind: Location\napiVersion: v2beta1\nmetadata:\n region: default\nspec:\n bindAddr: 0.0.0.0:51902\n cache:\n provider: redis\n parameters: "host=localhost,port=6379"\n')),(0,o.kt)("p",null,"Notice that using the ",(0,o.kt)("inlineCode",{parentName:"p"},"memory")," provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the ",(0,o.kt)("inlineCode",{parentName:"p"},"least-session")," algorithm and run multiple instances of the Location Service. In such cases, you will need the ",(0,o.kt)("inlineCode",{parentName:"p"},"redis")," provider."),(0,o.kt)("h2",{id:"communication-and-protobuf-spec"},"Communication and Protobuf Spec"),(0,o.kt)("p",null,"Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-protobuf"},'syntax = "proto3";\n\npackage fonoster.routr.location.v2beta1;\n\nimport "google/protobuf/empty.proto";\nimport "common.proto";\nimport "processor.proto";\n\nservice Location {\n rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}\n rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}\n rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}\n}\n\n// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)\nmessage Route {\n string user = 1;\n string host = 2;\n string port = 3;\n string advertised_host = 13;\n string advertised_port = 14;\n fonoster.routr.common.v2beta1.Transport transport = 4;\n int64 registered_on = 5;\n int32 expires = 6;\n int32 session_count = 7;\n string edge_port_ref = 8;\n repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;\n repeated string localnets = 10;\n repeated string external_addrs = 11;\n // During route creation, an endpoint can request to add labels that can later be\n // used as selectors. For example, a Softphone can add a label `priority=1` to indicate\n // that it is the preferred endpoint for the given AOR.\n map<string, string> labels = 12;\n}\n\nmessage AddRouteRequest {\n // Address of record for the endpoint or trunk\n string aor = 1;\n Route route = 2;\n}\n\nmessage FindRoutesRequest {\n message Backend {\n enum Algoritm {\n ROUND_ROBIN = 0;\n LEAST_SESSIONS = 1;\n }\n string ref = 1;\n bool with_session_affinity = 2;\n Algoritm algorithm = 3;\n }\n string call_id = 1;\n string aor = 2;\n string session_affinity_ref = 3;\n Backend backend = 4;\n map<string, string> labels = 5;\n}\n\nmessage FindRoutesResponse {\n repeated Route routes = 1;\n}\n\nmessage RemoveRoutesRequest {\n string aor = 1;\n}\n')),(0,o.kt)("p",null,"Upon receiving a valid ",(0,o.kt)("inlineCode",{parentName:"p"},"AddRoute")," request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition."),(0,o.kt)("p",null,"Link to the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/location.proto"},"protobuf definition.")),(0,o.kt)("h2",{id:"launching-the-location-service-with-docker"},"Launching the Location Service with Docker"),(0,o.kt)("p",null,"The Location Service is available as a Docker image from ",(0,o.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/fonoster/routr-location"},"Docker Hub"),". To launch the Location Service with Docker, you can use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location\n")),(0,o.kt)("p",null,"The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port ",(0,o.kt)("inlineCode",{parentName:"p"},"51902")," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,o.kt)("inlineCode",{parentName:"p"},"51902"),"."),(0,o.kt)("h2",{id:"quick-test-with-grpcurl"},"Quick Test with gRPCurl"),(0,o.kt)("p",null,"One easy way to interact with the Location Service for testing and development is to use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fullstorydev/grpcurl"},"gRPCurl"),". The following example shows how to send a request to the Location Service using gRPCurl:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto location.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.location.v2beta1.Location/AddRouteRequest\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ff3f7f2b.23168425.js b/assets/js/ff3f7f2b.23168425.js deleted file mode 100644 index 7c4baf9e3..000000000 --- a/assets/js/ff3f7f2b.23168425.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6349],{3905:(e,t,o)=>{o.d(t,{Zo:()=>c,kt:()=>f});var n=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?a(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):a(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function p(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var l=n.createContext({}),s=function(e){var t=n.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},c=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(o),m=r,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||a;return o?n.createElement(f,i(i({ref:t},c),{},{components:o})):n.createElement(f,i({ref:t},c))}));function f(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[u]="string"==typeof e?e:r,i[1]=p;for(var s=2;s<a;s++)i[s]=o[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,o)}m.displayName="MDXCreateElement"},9299:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var n=o(7462),r=(o(7294),o(3905));const a={},i="Development with Gitpod",p={unversionedId:"development/development-mode-with-gitpod",id:"development/development-mode-with-gitpod",title:"Development with Gitpod",description:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.",source:"@site/docs/development/development-mode-with-gitpod.md",sourceDirName:"development",slug:"/development/development-mode-with-gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod",draft:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/development-mode-with-gitpod.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"},next:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"}},l={},s=[],c={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"development-with-gitpod"},"Development with Gitpod"),(0,r.kt)("p",null,"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories."),(0,r.kt)("p",null,"To launch a Gitpod workspace, click the button below:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://gitpod.io/#https://github.com/fonoster/routr"},(0,r.kt)("img",{parentName:"a",src:"https://gitpod.io/button/open-in-gitpod.svg",alt:"Open in Gitpod"}))),(0,r.kt)("p",null,"This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode."),(0,r.kt)("p",null,"While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod."),(0,r.kt)("p",null,"First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://gitpod.io/user/keys"},"https://gitpod.io/user/keys")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Gitpod account keys",src:o(7686).Z,width:"1358",height:"527"})),(0,r.kt)("p",null,"On Linux or macOS, you can find your public key by running the following command in your terminal:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cat ~/.ssh/id_rsa.pub\n")),(0,r.kt)("p",null,"Or, if you are using Windows, you can find your public key using this command in your terminal:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cat %USERPROFILE%\\.ssh\\id_rsa.pub\n")),(0,r.kt)("p",null,"If you don't have a public key, you can generate one by running the following command in your terminal:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'ssh-keygen -t rsa -b 4096 -C "your_email@example.com"\n')),(0,r.kt)("p",null,'Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."'),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://gitpod.io/workspaces"},"https://gitpod.io/workspaces")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Gitpod workspace",src:o(8263).Z,width:"1360",height:"588"})),(0,r.kt)("p",null,"You want to be able to access port ",(0,r.kt)("inlineCode",{parentName:"p"},"5060")," from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that."),(0,r.kt)("p",null,"To create the port forward, take the SSH connection string and add ",(0,r.kt)("inlineCode",{parentName:"p"},"-L 5060:localhost:5060")," to the end of the line. For example, your command might look like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ssh <workspace-ssh-connection> -L 5060:localhost:5060\n")),(0,r.kt)("p",null,'Be sure to replace "workspace SSH connection" with your local connection.'),(0,r.kt)("p",null,"Here is an example of what the command might look like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 \n")),(0,r.kt)("p",null,"This command forwards traffic from your local port ",(0,r.kt)("inlineCode",{parentName:"p"},"5060")," to your Gitpod workspace's port ",(0,r.kt)("inlineCode",{parentName:"p"},"5060"),", allowing you to connect via SIP."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command.")),(0,r.kt)("p",null,'This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:'),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/fonoster/routr/blob/main/config/resources"},"https://github.com/fonoster/routr/blob/main/config/resources")),(0,r.kt)("p",null,"Feel free to explore these files and make changes as needed."))}d.isMDXComponent=!0},7686:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/gitpod-account-keys-0833e0da64fdd0fa6867611cb583a0fc.png"},8263:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/gitpod-workspace-9a23cadbc9b3dfdfa8eda64fe4da4475.png"}}]); \ No newline at end of file diff --git a/assets/js/ff3f7f2b.b883c263.js b/assets/js/ff3f7f2b.b883c263.js new file mode 100644 index 000000000..c1a12ffe1 --- /dev/null +++ b/assets/js/ff3f7f2b.b883c263.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6903],{3532:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(4848),i=t(8453);const r={},s="Development with Gitpod",a={id:"development/development-mode-with-gitpod",title:"Development with Gitpod",description:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.",source:"@site/docs/development/development-mode-with-gitpod.md",sourceDirName:"development",slug:"/development/development-mode-with-gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/development-mode-with-gitpod.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"},next:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"}},c={},d=[];function l(e){const o={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"development-with-gitpod",children:"Development with Gitpod"}),"\n",(0,n.jsx)(o.p,{children:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories."}),"\n",(0,n.jsx)(o.p,{children:"To launch a Gitpod workspace, click the button below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/#https://github.com/fonoster/routr",children:(0,n.jsx)(o.img,{src:"https://gitpod.io/button/open-in-gitpod.svg",alt:"Open in Gitpod"})})}),"\n",(0,n.jsx)(o.p,{children:"This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode."}),"\n",(0,n.jsx)(o.p,{children:"While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod."}),"\n",(0,n.jsx)(o.p,{children:"First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/user/keys",children:"https://gitpod.io/user/keys"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod account keys",src:t(6803).A+"",width:"1358",height:"527"})}),"\n",(0,n.jsx)(o.p,{children:"On Linux or macOS, you can find your public key by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat ~/.ssh/id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"Or, if you are using Windows, you can find your public key using this command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat %USERPROFILE%\\.ssh\\id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"If you don't have a public key, you can generate one by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:'ssh-keygen -t rsa -b 4096 -C "your_email@example.com"\n'})}),"\n",(0,n.jsx)(o.p,{children:'Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/workspaces",children:"https://gitpod.io/workspaces"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod workspace",src:t(5430).A+"",width:"1360",height:"588"})}),"\n",(0,n.jsxs)(o.p,{children:["You want to be able to access port ",(0,n.jsx)(o.code,{children:"5060"})," from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that."]}),"\n",(0,n.jsxs)(o.p,{children:["To create the port forward, take the SSH connection string and add ",(0,n.jsx)(o.code,{children:"-L 5060:localhost:5060"})," to the end of the line. For example, your command might look like this:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh <workspace-ssh-connection> -L 5060:localhost:5060\n"})}),"\n",(0,n.jsx)(o.p,{children:'Be sure to replace "workspace SSH connection" with your local connection.'}),"\n",(0,n.jsx)(o.p,{children:"Here is an example of what the command might look like:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 \n"})}),"\n",(0,n.jsxs)(o.p,{children:["This command forwards traffic from your local port ",(0,n.jsx)(o.code,{children:"5060"})," to your Gitpod workspace's port ",(0,n.jsx)(o.code,{children:"5060"}),", allowing you to connect via SIP."]}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command."}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:'This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/main/config/resources",children:"https://github.com/fonoster/routr/blob/main/config/resources"})}),"\n",(0,n.jsx)(o.p,{children:"Feel free to explore these files and make changes as needed."})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},6803:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-account-keys-0833e0da64fdd0fa6867611cb583a0fc.png"},5430:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-workspace-9a23cadbc9b3dfdfa8eda64fe4da4475.png"},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(6540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.d06dc193.js b/assets/js/main.d06dc193.js deleted file mode 100644 index 064b0d139..000000000 --- a/assets/js/main.d06dc193.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.d06dc193.js.LICENSE.txt */ -(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(7294);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(7462),a=n(8356),i=n.n(a),l=n(6887);const s={"017ddd06":[()=>n.e(7468).then(n.bind(n,6982)),"@site/versioned_docs/version-1.x.x/configuration/users.md",6982],"02617853":[()=>n.e(9949).then(n.bind(n,8747)),"@site/docs/development/components/dispatcher.md",8747],"06896101":[()=>n.e(3185).then(n.bind(n,4337)),"@site/docs/overview/deploy-with-docker.md",4337],"093b4e4f":[()=>n.e(9710).then(n.bind(n,2757)),"@site/versioned_docs/version-1.x.x/administration/webconsole.md",2757],"09b719bb":[()=>n.e(4295).then(n.bind(n,70)),"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",70],"0abf3980":[()=>n.e(7235).then(n.t.bind(n,5745,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"0f2bd920":[()=>n.e(2361).then(n.bind(n,9754)),"@site/versioned_docs/version-1.x.x/api/location/list.md",9754],"118e913f":[()=>n.e(7979).then(n.bind(n,4772)),"@site/docs/overview/concepts.md",4772],"129db88c":[()=>n.e(4058).then(n.bind(n,7340)),"@site/docs/connect/webrtc-support.md",7340],"144994e6":[()=>n.e(1668).then(n.bind(n,2604)),"@site/docs/development/components/rtprelay.md",2604],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,4700)),"@theme/DocItem",4700],"19dd4331":[()=>n.e(3516).then(n.bind(n,4169)),"@site/versioned_docs/version-1.x.x/api/agents/update.md",4169],"1a1a9e3d":[()=>n.e(1407).then(n.bind(n,8394)),"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",8394],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,6675)),"@theme/SearchPage",6675],"1ad9bfe0":[()=>n.e(3809).then(n.bind(n,5004)),"@site/docs/development/orchestration-with-docker.md",5004],"1b166456":[()=>n.e(8643).then(n.bind(n,2271)),"@site/versioned_docs/version-1.x.x/api/sys/info.md",2271],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1cd31f12":[()=>n.e(6127).then(n.bind(n,5616)),"@site/versioned_docs/version-1.x.x/api/agents/delete.md",5616],"1ea220c7":[()=>n.e(4807).then(n.bind(n,4239)),"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",4239],"1ffdd7de":[()=>n.e(3211).then(n.bind(n,1150)),"@site/docs/faqs.md",1150],"210b7c69":[()=>n.e(4569).then(n.bind(n,820)),"@site/docs/development/components/simpleauth.md",820],"21169ea0":[()=>n.e(4859).then(n.bind(n,6789)),"@site/docs/development/orchestration-with-kubernetes.md",6789],"23efd64d":[()=>n.e(4277).then(n.bind(n,4588)),"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",4588],"26da1a01":[()=>n.e(4011).then(n.bind(n,220)),"@site/docs/development/building-a-scaip-processor.md",220],"2a36568f":[()=>n.e(5490).then(n.bind(n,7740)),"@site/docs/connect/home-or-office-setup.md",7740],"321dfeeb":[()=>n.e(8827).then(n.bind(n,8995)),"@site/versioned_docs/version-1.x.x/api/overview.md",8995],"3325c53c":[()=>n.e(8654).then(n.bind(n,1543)),"@site/versioned_docs/version-1.x.x/introduction/installation.md",1543],"33664cb1":[()=>n.e(8445).then(n.bind(n,6578)),"@site/docs/development/components/edgeport.md",6578],"35bee977":[()=>n.e(1790).then(n.bind(n,7010)),"@site/versioned_docs/version-1.x.x/concepts.md",7010],"39d73575":[()=>n.e(3136).then(n.bind(n,3218)),"@site/docs/development/alterations/methods.md",3218],"3a673d53":[()=>n.e(8854).then(n.bind(n,9974)),"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",9974],"3c0cfdd0":[()=>n.e(2634).then(n.bind(n,2709)),"@site/docs/connect/quick-start/kubernetes.md",2709],"3e7ceef0":[()=>n.e(9027).then(n.bind(n,1284)),"@site/versioned_docs/version-1.x.x/configuration/general.md",1284],"3f9d54d1":[()=>n.e(8076).then(n.bind(n,7882)),"@site/docs/development/custom-data-with-the-apiserver.md",7882],"40f2a0b4":[()=>n.e(6581).then(n.bind(n,6849)),"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",6849],"40f2f3c6":[()=>n.e(9748).then(n.bind(n,1533)),"@site/versioned_docs/version-1.x.x/api/domains/delete.md",1533],"411db075":[()=>n.e(6074).then(n.bind(n,7478)),"@site/versioned_docs/version-1.x.x/api/peers/create.md",7478],"43d3d555":[()=>n.e(6224).then(n.bind(n,4305)),"@site/docs/connect/nodesdk/sdk.md",4305],"4d0c799d":[()=>n.e(7011).then(n.bind(n,217)),"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",217],"4d54d076":[()=>n.e(7080).then(n.bind(n,1933)),"@site/docs/contributing.md",1933],"4dcd5895":[()=>n.e(9587).then(n.bind(n,4386)),"@site/versioned_docs/version-1.x.x/api/numbers/update.md",4386],"4e27cd47":[()=>n.e(1697).then(n.bind(n,9091)),"@site/versioned_docs/version-1.x.x/api/location/create.md",9091],"4e3cbe94":[()=>n.e(6292).then(n.bind(n,7402)),"@site/docs/development/testing-with-seet.md",7402],"54969ead":[()=>n.e(119).then(n.bind(n,9275)),"@site/docs/development/metrics-events-logs-and-traces.md",9275],"5514a4b8":[()=>n.e(6547).then(n.bind(n,755)),"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",755],"5a1924d4":[()=>n.e(995).then(n.bind(n,6957)),"@site/docs/connect/concepts.md",6957],"5a510007":[()=>n.e(1948).then(n.bind(n,838)),"@site/docs/tutorials/deploying-to-civo-with-helm.md",838],"5e82a060":[()=>n.e(8464).then(n.bind(n,6626)),"@site/versioned_docs/version-1.x.x/api/gateways/list.md",6626],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ef0e9d6":[()=>n.e(9880).then(n.bind(n,5330)),"@site/docs/community.md",5330],"64332b0f":[()=>n.e(7655).then(n.bind(n,2590)),"@site/versioned_docs/version-1.x.x/welcome.md",2590],"646468fb":[()=>n.e(8275).then(n.bind(n,6350)),"@site/versioned_docs/version-1.x.x/api/location/delete.md",6350],"656951a7":[()=>n.e(3804).then(n.bind(n,6127)),"@site/versioned_docs/version-1.x.x/api/token.md",6127],"6a8a88b7":[()=>n.e(6083).then(n.bind(n,7753)),"@site/docs/development/introduction.md",7753],"6c14cd7d":[()=>n.e(2593).then(n.bind(n,8232)),"@site/versioned_docs/version-1.x.x/api/numbers/list.md",8232],"6c35bbce":[()=>n.e(7258).then(n.bind(n,4568)),"@site/versioned_docs/version-1.x.x/api/agents/list.md",4568],"6e2907e5":[()=>n.e(3320).then(n.bind(n,5412)),"@site/versioned_docs/version-1.x.x/api/sys/logs.md",5412],71153375:[()=>n.e(8989).then(n.bind(n,697)),"@site/versioned_docs/version-1.x.x/api/config/get.md",697],"72607e62":[()=>n.e(9494).then(n.bind(n,1843)),"@site/versioned_docs/version-1.x.x/api/registry.md",1843],"759bfbe1":[()=>n.e(1189).then(n.bind(n,5973)),"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",5973],"76273f75":[()=>n.e(7325).then(n.bind(n,6642)),"@site/docs/development/components/overview.md",6642],"7c32d245":[()=>n.e(7287).then(n.bind(n,1255)),"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",1255],"7cf72cd4":[()=>n.e(3173).then(n.bind(n,6702)),"@site/docs/development/components/apiserver.md",6702],"7df8ae3f":[()=>n.e(3410).then(n.bind(n,5305)),"@site/versioned_docs/version-1.x.x/api/status/update.md",5305],"7efb1a82":[()=>n.e(433).then(n.bind(n,9940)),"@site/versioned_docs/version-1.x.x/configuration/numbers.md",9940],"81e5f1d0":[()=>n.e(7279).then(n.bind(n,1239)),"@site/versioned_docs/version-1.x.x/configuration/domains.md",1239],"8613bfde":[()=>n.e(5464).then(n.bind(n,7549)),"@site/docs/connect/sending-call-events-to-nats.md",7549],"876e022a":[()=>n.e(5664).then(n.bind(n,6163)),"@site/versioned_docs/version-1.x.x/configuration/gateways.md",6163],"8a9effda":[()=>n.e(9092).then(n.bind(n,4064)),"@site/versioned_docs/version-1.x.x/api/domains/list.md",4064],"8ac6f1f4":[()=>n.e(6846).then(n.bind(n,6691)),"@site/docs/connect/nodesdk/overview.md",6691],"8d7e75fb":[()=>n.e(1839).then(n.bind(n,3507)),"@site/docs/overview/introduction.md",3507],"8f5f22a9":[()=>n.e(3731).then(n.t.bind(n,2315,19)),"~docs/default/version-1-x-x-metadata-prop-ec9.json",2315],"918bfdcb":[()=>n.e(6186).then(n.bind(n,890)),"@site/versioned_docs/version-1.x.x/introduction/glossary.md",890],"92a92b88":[()=>n.e(257).then(n.bind(n,3986)),"@site/docs/development/building-a-processor.md",3986],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"943e77c3":[()=>n.e(867).then(n.bind(n,8148)),"@site/versioned_docs/version-1.x.x/api/gateways/create.md",8148],"95069fb2":[()=>n.e(1408).then(n.bind(n,6499)),"@site/versioned_docs/version-1.x.x/api/peers/update.md",6499],"956a4ea6":[()=>n.e(1995).then(n.bind(n,4220)),"@site/docs/development/building-a-middleware.md",4220],"9799683e":[()=>n.e(12).then(n.bind(n,9256)),"@site/versioned_docs/version-1.x.x/api/status/get.md",9256],"9840208a":[()=>n.e(7851).then(n.bind(n,9747)),"@site/versioned_docs/version-1.x.x/api/agents/create.md",9747],"99f83bea":[()=>n.e(9917).then(n.bind(n,9943)),"@site/versioned_docs/version-1.x.x/api/numbers/create.md",9943],"9a4dfeaa":[()=>n.e(7580).then(n.bind(n,7350)),"@site/versioned_docs/version-1.x.x/api/peers/get.md",7350],"9a5a69d5":[()=>n.e(7025).then(n.bind(n,4677)),"@site/versioned_docs/version-1.x.x/api/gateways/update.md",4677],"9beb87c2":[()=>n.e(80).then(n.bind(n,1016)),"@site/docs/changelog.md",1016],"9d10a623":[()=>n.e(3794).then(n.bind(n,1014)),"@site/versioned_docs/version-1.x.x/api/domains/create.md",1014],"9fcefd11":[()=>n.e(8389).then(n.bind(n,2357)),"@site/docs/development/quick-start.md",2357],a0c5838c:[()=>n.e(1328).then(n.t.bind(n,7085,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],a30498ab:[()=>n.e(1186).then(n.bind(n,7941)),"@site/versioned_docs/version-1.x.x/configuration/agents.md",7941],a40a3312:[()=>n.e(7388).then(n.bind(n,6751)),"@site/versioned_docs/version-1.x.x/introduction/faq.md",6751],a4cb0559:[()=>n.e(3902).then(n.bind(n,5280)),"@site/versioned_docs/version-1.x.x/introduction/overview.md",5280],a552b93b:[()=>n.e(7409).then(n.bind(n,5591)),"@site/versioned_docs/version-1.x.x/api/peers/delete.md",5591],a7c6e145:[()=>n.e(4920).then(n.bind(n,4617)),"@site/docs/development/extending-the-ctl.md",4617],a9d63626:[()=>n.e(8845).then(n.bind(n,5033)),"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",5033],b1e2c3e5:[()=>n.e(5528).then(n.bind(n,8360)),"@site/versioned_docs/version-1.x.x/api/domains/update.md",8360],b396445b:[()=>n.e(7043).then(n.bind(n,2443)),"@site/docs/development/alterations/overview.md",2443],b3bbf2ca:[()=>n.e(3411).then(n.bind(n,3313)),"@site/docs/development/building-a-chat-application.md",3313],b4dd6982:[()=>n.e(1424).then(n.bind(n,5629)),"@site/versioned_docs/version-1.x.x/api/config/update.md",5629],b5de05fe:[()=>n.e(1965).then(n.bind(n,6648)),"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",6648],b8ab588d:[()=>n.e(4532).then(n.bind(n,3183)),"@site/versioned_docs/version-1.x.x/api/gateways/get.md",3183],bb373259:[()=>n.e(849).then(n.bind(n,3149)),"@site/versioned_docs/version-1.x.x/introduction/comparison.md",3149],bc1a89ad:[()=>n.e(4732).then(n.bind(n,8926)),"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",8926],bc2f9ced:[()=>n.e(7795).then(n.bind(n,4468)),"@site/versioned_docs/version-1.x.x/api/peers/list.md",4468],bc843d59:[()=>n.e(1996).then(n.bind(n,9655)),"@site/docs/development/components/registry.md",9655],c2ef5137:[()=>n.e(1968).then(n.bind(n,8380)),"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",8380],c4f5d8e4:[()=>n.e(4195).then(n.bind(n,2841)),"@site/src/pages/index.js",2841],c60c73ac:[()=>n.e(1583).then(n.bind(n,3732)),"@site/docs/development/components/requester.md",3732],d3c35fce:[()=>n.e(9108).then(n.bind(n,4744)),"@site/versioned_docs/version-1.x.x/api/domains/get.md",4744],d72ac48e:[()=>n.e(6513).then(n.bind(n,5577)),"@site/docs/overview/architecture.md",5577],d7a9d534:[()=>n.e(3375).then(n.bind(n,616)),"@site/docs/connect/introduction.md",616],da51cc8f:[()=>n.e(1535).then(n.bind(n,7238)),"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",7238],db70960d:[()=>n.e(4155).then(n.bind(n,801)),"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",801],deaab6a5:[()=>n.e(4987).then(n.t.bind(n,3769,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],e10372bb:[()=>n.e(9124).then(n.bind(n,2117)),"@site/versioned_docs/version-1.x.x/introduction/community.md",2117],ea5491a0:[()=>n.e(6807).then(n.bind(n,6650)),"@site/docs/connect/command-line/overview.md",6650],ec64d50d:[()=>n.e(8229).then(n.bind(n,9523)),"@site/versioned_docs/version-1.x.x/api/agents/get.md",9523],ed175a37:[()=>n.e(7237).then(n.bind(n,4880)),"@site/docs/connect/command-line/ctl.md",4880],ed519cbf:[()=>n.e(1395).then(n.bind(n,2304)),"@site/versioned_docs/version-1.x.x/api/numbers/get.md",2304],ee7973d9:[()=>n.e(2885).then(n.bind(n,4120)),"@site/versioned_docs/version-1.x.x/configuration/peers.md",4120],f1b4aa58:[()=>n.e(6069).then(n.bind(n,9061)),"@site/docs/connect/securing-the-server.md",9061],f3f39cc5:[()=>n.e(4567).then(n.bind(n,360)),"@site/versioned_docs/version-1.x.x/introduction/media.md",360],f4357d2a:[()=>n.e(8305).then(n.bind(n,4281)),"@site/docs/connect/quick-start/docker.md",4281],f5184ac4:[()=>n.e(6789).then(n.bind(n,3762)),"@site/docs/development/components/location.md",3762],ff3f7f2b:[()=>n.e(6349).then(n.bind(n,9299)),"@site/docs/development/development-mode-with-gitpod.md",9299]};function c(e){let{error:t,retry:n,pastDelay:o}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):o?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function p(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const a=l[`${e}-${t}`],p={},f=[],m=[],h=(0,u.Z)(a);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(p[t]=r[0],f.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:p,modules:f,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(a));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)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 o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let a=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{a=a[e]})),a[l[l.length-1]]=o}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,o.Z)({},i,n)))}})}const f=[{path:"/search",component:p("/search","9b7"),exact:!0},{path:"/docs/1.x.x",component:p("/docs/1.x.x","18b"),routes:[{path:"/docs/1.x.x/administration/cli/cheatsheet",component:p("/docs/1.x.x/administration/cli/cheatsheet","375"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/installation",component:p("/docs/1.x.x/administration/cli/installation","4dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/remote-access",component:p("/docs/1.x.x/administration/cli/remote-access","97c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/webconsole",component:p("/docs/1.x.x/administration/webconsole","62a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/create",component:p("/docs/1.x.x/api/agents/create","b97"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/delete",component:p("/docs/1.x.x/api/agents/delete","b72"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/get",component:p("/docs/1.x.x/api/agents/get","f9a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/list",component:p("/docs/1.x.x/api/agents/list","4c3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/update",component:p("/docs/1.x.x/api/agents/update","b29"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/get",component:p("/docs/1.x.x/api/config/get","4bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/update",component:p("/docs/1.x.x/api/config/update","983"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/create",component:p("/docs/1.x.x/api/domains/create","815"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/delete",component:p("/docs/1.x.x/api/domains/delete","542"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/get",component:p("/docs/1.x.x/api/domains/get","c5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/list",component:p("/docs/1.x.x/api/domains/list","3bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/update",component:p("/docs/1.x.x/api/domains/update","633"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/create",component:p("/docs/1.x.x/api/gateways/create","404"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/delete",component:p("/docs/1.x.x/api/gateways/delete","de6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/get",component:p("/docs/1.x.x/api/gateways/get","d16"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/list",component:p("/docs/1.x.x/api/gateways/list","5bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/update",component:p("/docs/1.x.x/api/gateways/update","8a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/create",component:p("/docs/1.x.x/api/location/create","ee5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/delete",component:p("/docs/1.x.x/api/location/delete","682"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/list",component:p("/docs/1.x.x/api/location/list","f64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/create",component:p("/docs/1.x.x/api/numbers/create","6ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/delete",component:p("/docs/1.x.x/api/numbers/delete","6a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/get",component:p("/docs/1.x.x/api/numbers/get","b9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/list",component:p("/docs/1.x.x/api/numbers/list","c63"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/update",component:p("/docs/1.x.x/api/numbers/update","a01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/overview",component:p("/docs/1.x.x/api/overview","d3c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/create",component:p("/docs/1.x.x/api/peers/create","f5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/delete",component:p("/docs/1.x.x/api/peers/delete","349"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/get",component:p("/docs/1.x.x/api/peers/get","395"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/list",component:p("/docs/1.x.x/api/peers/list","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/update",component:p("/docs/1.x.x/api/peers/update","d81"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/registry",component:p("/docs/1.x.x/api/registry","46f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/get",component:p("/docs/1.x.x/api/status/get","0e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/update",component:p("/docs/1.x.x/api/status/update","95d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/info",component:p("/docs/1.x.x/api/sys/info","bf8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/logs",component:p("/docs/1.x.x/api/sys/logs","847"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/token",component:p("/docs/1.x.x/api/token","069"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/concepts",component:p("/docs/1.x.x/concepts","b93"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/agents",component:p("/docs/1.x.x/configuration/agents","4d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/domains",component:p("/docs/1.x.x/configuration/domains","4b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/gateways",component:p("/docs/1.x.x/configuration/gateways","cbd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/general",component:p("/docs/1.x.x/configuration/general","52e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/numbers",component:p("/docs/1.x.x/configuration/numbers","f3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/peers",component:p("/docs/1.x.x/configuration/peers","113"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/users",component:p("/docs/1.x.x/configuration/users","459"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/basic-setup",component:p("/docs/1.x.x/guides/basic-setup","890"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/routr-as-asterisk-frontend",component:p("/docs/1.x.x/guides/routr-as-asterisk-frontend","2a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-on-kubernetes",component:p("/docs/1.x.x/guides/running-on-kubernetes","7dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-with-docker-or-compose",component:p("/docs/1.x.x/guides/running-with-docker-or-compose","5c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/securing-the-signaling-path",component:p("/docs/1.x.x/guides/securing-the-signaling-path","99f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/community",component:p("/docs/1.x.x/introduction/community","060"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/comparison",component:p("/docs/1.x.x/introduction/comparison","595"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/faq",component:p("/docs/1.x.x/introduction/faq","e8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/glossary",component:p("/docs/1.x.x/introduction/glossary","85c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/installation",component:p("/docs/1.x.x/introduction/installation","1c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/media",component:p("/docs/1.x.x/introduction/media","f84"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/overview",component:p("/docs/1.x.x/introduction/overview","973"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/performance-tests/user-location",component:p("/docs/1.x.x/introduction/performance-tests/user-location","93b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/roadmap",component:p("/docs/1.x.x/introduction/roadmap","c45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/test-plan",component:p("/docs/1.x.x/introduction/test-plan","859"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/welcome",component:p("/docs/1.x.x/welcome","055"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/docs/2.0.0",component:p("/docs/2.0.0","a5c"),routes:[{path:"/docs/2.0.0/changelog",component:p("/docs/2.0.0/changelog","abc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/community",component:p("/docs/2.0.0/community","943"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/ctl",component:p("/docs/2.0.0/connect/command-line/ctl","817"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/overview",component:p("/docs/2.0.0/connect/command-line/overview","928"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/concepts",component:p("/docs/2.0.0/connect/concepts","93c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/home-or-office-setup",component:p("/docs/2.0.0/connect/home-or-office-setup","28c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/introduction",component:p("/docs/2.0.0/connect/introduction","b89"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/overview",component:p("/docs/2.0.0/connect/nodesdk/overview","909"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/sdk",component:p("/docs/2.0.0/connect/nodesdk/sdk","d65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/docker",component:p("/docs/2.0.0/connect/quick-start/docker","8f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/kubernetes",component:p("/docs/2.0.0/connect/quick-start/kubernetes","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/securing-the-server",component:p("/docs/2.0.0/connect/securing-the-server","d31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/sending-call-events-to-nats",component:p("/docs/2.0.0/connect/sending-call-events-to-nats","f0a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/webrtc-support",component:p("/docs/2.0.0/connect/webrtc-support","dcc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/contributing",component:p("/docs/2.0.0/contributing","373"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/methods",component:p("/docs/2.0.0/development/alterations/methods","990"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/overview",component:p("/docs/2.0.0/development/alterations/overview","7a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-chat-application",component:p("/docs/2.0.0/development/building-a-chat-application","f4b"),exact:!0},{path:"/docs/2.0.0/development/building-a-middleware",component:p("/docs/2.0.0/development/building-a-middleware","ad6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-processor",component:p("/docs/2.0.0/development/building-a-processor","3aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-scaip-processor",component:p("/docs/2.0.0/development/building-a-scaip-processor","c5f"),exact:!0},{path:"/docs/2.0.0/development/components/apiserver",component:p("/docs/2.0.0/development/components/apiserver","3ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/dispatcher",component:p("/docs/2.0.0/development/components/dispatcher","49c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/edgeport",component:p("/docs/2.0.0/development/components/edgeport","a3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/location",component:p("/docs/2.0.0/development/components/location","ea7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/overview",component:p("/docs/2.0.0/development/components/overview","80e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/registry",component:p("/docs/2.0.0/development/components/registry","416"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/requester",component:p("/docs/2.0.0/development/components/requester","b17"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/rtprelay",component:p("/docs/2.0.0/development/components/rtprelay","816"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/simpleauth",component:p("/docs/2.0.0/development/components/simpleauth","141"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/custom-data-with-the-apiserver",component:p("/docs/2.0.0/development/custom-data-with-the-apiserver","9aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/development-mode-with-gitpod",component:p("/docs/2.0.0/development/development-mode-with-gitpod","503"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/extending-the-ctl",component:p("/docs/2.0.0/development/extending-the-ctl","aa9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/introduction",component:p("/docs/2.0.0/development/introduction","aca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/metrics-events-logs-and-traces",component:p("/docs/2.0.0/development/metrics-events-logs-and-traces","523"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-docker",component:p("/docs/2.0.0/development/orchestration-with-docker","05f"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-kubernetes",component:p("/docs/2.0.0/development/orchestration-with-kubernetes","694"),exact:!0},{path:"/docs/2.0.0/development/quick-start",component:p("/docs/2.0.0/development/quick-start","2f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/testing-with-seet",component:p("/docs/2.0.0/development/testing-with-seet","771"),exact:!0},{path:"/docs/2.0.0/faqs",component:p("/docs/2.0.0/faqs","72b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/architecture",component:p("/docs/2.0.0/overview/architecture","455"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/concepts",component:p("/docs/2.0.0/overview/concepts","482"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/deploy-with-docker",component:p("/docs/2.0.0/overview/deploy-with-docker","3ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/introduction",component:p("/docs/2.0.0/overview/introduction","8f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",component:p("/docs/2.0.0/tutorials/deploying-to-civo-with-helm","4df"),exact:!0},{path:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",component:p("/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser","502"),exact:!0},{path:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",component:p("/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes","450"),exact:!0},{path:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",component:p("/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr","b1f"),exact:!0}]},{path:"/",component:p("/","fcb"),exact:!0},{path:"*",component:p("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>a});var r=n(7294);const o=r.createContext(!1);function a(e){let{children:t}=e;const[n,a]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{a(!0)}),[]),r.createElement(o.Provider,{value:n},t)}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(3935),a=n(3727),i=n(405),l=n(412);const s=[n(6657),n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),x=n(3320),k=n(8780),S=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:o}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:o})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),o=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,k.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:o;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(_,null),r.createElement(E,null),r.createElement(S.Z,{tag:x.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,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}}var L=n(8934),R=n(8940);function P(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=s.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:o}=e;return(0,r.useLayoutEffect)((()=>{o!==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:o}),P("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("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=P("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 r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const D=I,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${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="${B}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${B}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function U(){const{siteConfig:{baseUrl:e}}=(0,h.Z)();return(0,r.useLayoutEffect)((()=>{window[j]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:M}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(U,null):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:a}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=a[o];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var H=n(4763),G=n(2389);function Z(){const e=(0,G.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function V(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(H.Z,null,r.createElement(R.M,null,r.createElement(L.t,null,r.createElement(p,null,r.createElement(q,null),r.createElement(C,null),r.createElement($,null),r.createElement(D,{location:A(t)},e)),r.createElement(Z,null))))}var W=n(6887);const K=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 Y=n(9670);const Q=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Q.has(e))(e))return!1;Q.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee);if(l.Z.canUseDOM){window.docusaurus=te;const e=o.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(a.VK,null,r.createElement(V,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-JX93S6PKN4"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"2.0.0","isLast":true,"path":"/docs/2.0.0","mainDocId":"overview/introduction","docs":[{"id":"changelog","path":"/docs/2.0.0/changelog","sidebar":"tutorialSidebar"},{"id":"community","path":"/docs/2.0.0/community","sidebar":"tutorialSidebar"},{"id":"connect/command-line/ctl","path":"/docs/2.0.0/connect/command-line/ctl","sidebar":"tutorialSidebar"},{"id":"connect/command-line/overview","path":"/docs/2.0.0/connect/command-line/overview","sidebar":"tutorialSidebar"},{"id":"connect/concepts","path":"/docs/2.0.0/connect/concepts","sidebar":"tutorialSidebar"},{"id":"connect/home-or-office-setup","path":"/docs/2.0.0/connect/home-or-office-setup","sidebar":"tutorialSidebar"},{"id":"connect/introduction","path":"/docs/2.0.0/connect/introduction","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/overview","path":"/docs/2.0.0/connect/nodesdk/overview","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/sdk","path":"/docs/2.0.0/connect/nodesdk/sdk","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/docker","path":"/docs/2.0.0/connect/quick-start/docker","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/kubernetes","path":"/docs/2.0.0/connect/quick-start/kubernetes","sidebar":"tutorialSidebar"},{"id":"connect/securing-the-server","path":"/docs/2.0.0/connect/securing-the-server","sidebar":"tutorialSidebar"},{"id":"connect/sending-call-events-to-nats","path":"/docs/2.0.0/connect/sending-call-events-to-nats","sidebar":"tutorialSidebar"},{"id":"connect/webrtc-support","path":"/docs/2.0.0/connect/webrtc-support","sidebar":"tutorialSidebar"},{"id":"contributing","path":"/docs/2.0.0/contributing","sidebar":"tutorialSidebar"},{"id":"development/alterations/methods","path":"/docs/2.0.0/development/alterations/methods","sidebar":"tutorialSidebar"},{"id":"development/alterations/overview","path":"/docs/2.0.0/development/alterations/overview","sidebar":"tutorialSidebar"},{"id":"development/building-a-chat-application","path":"/docs/2.0.0/development/building-a-chat-application"},{"id":"development/building-a-middleware","path":"/docs/2.0.0/development/building-a-middleware","sidebar":"tutorialSidebar"},{"id":"development/building-a-processor","path":"/docs/2.0.0/development/building-a-processor","sidebar":"tutorialSidebar"},{"id":"development/building-a-scaip-processor","path":"/docs/2.0.0/development/building-a-scaip-processor"},{"id":"development/components/apiserver","path":"/docs/2.0.0/development/components/apiserver","sidebar":"tutorialSidebar"},{"id":"development/components/dispatcher","path":"/docs/2.0.0/development/components/dispatcher","sidebar":"tutorialSidebar"},{"id":"development/components/edgeport","path":"/docs/2.0.0/development/components/edgeport","sidebar":"tutorialSidebar"},{"id":"development/components/location","path":"/docs/2.0.0/development/components/location","sidebar":"tutorialSidebar"},{"id":"development/components/overview","path":"/docs/2.0.0/development/components/overview","sidebar":"tutorialSidebar"},{"id":"development/components/registry","path":"/docs/2.0.0/development/components/registry","sidebar":"tutorialSidebar"},{"id":"development/components/requester","path":"/docs/2.0.0/development/components/requester","sidebar":"tutorialSidebar"},{"id":"development/components/rtprelay","path":"/docs/2.0.0/development/components/rtprelay","sidebar":"tutorialSidebar"},{"id":"development/components/simpleauth","path":"/docs/2.0.0/development/components/simpleauth","sidebar":"tutorialSidebar"},{"id":"development/custom-data-with-the-apiserver","path":"/docs/2.0.0/development/custom-data-with-the-apiserver","sidebar":"tutorialSidebar"},{"id":"development/development-mode-with-gitpod","path":"/docs/2.0.0/development/development-mode-with-gitpod","sidebar":"tutorialSidebar"},{"id":"development/extending-the-ctl","path":"/docs/2.0.0/development/extending-the-ctl","sidebar":"tutorialSidebar"},{"id":"development/introduction","path":"/docs/2.0.0/development/introduction","sidebar":"tutorialSidebar"},{"id":"development/metrics-events-logs-and-traces","path":"/docs/2.0.0/development/metrics-events-logs-and-traces"},{"id":"development/orchestration-with-docker","path":"/docs/2.0.0/development/orchestration-with-docker"},{"id":"development/orchestration-with-kubernetes","path":"/docs/2.0.0/development/orchestration-with-kubernetes"},{"id":"development/quick-start","path":"/docs/2.0.0/development/quick-start","sidebar":"tutorialSidebar"},{"id":"development/testing-with-seet","path":"/docs/2.0.0/development/testing-with-seet"},{"id":"faqs","path":"/docs/2.0.0/faqs","sidebar":"tutorialSidebar"},{"id":"overview/architecture","path":"/docs/2.0.0/overview/architecture","sidebar":"tutorialSidebar"},{"id":"overview/concepts","path":"/docs/2.0.0/overview/concepts","sidebar":"tutorialSidebar"},{"id":"overview/deploy-with-docker","path":"/docs/2.0.0/overview/deploy-with-docker","sidebar":"tutorialSidebar"},{"id":"overview/introduction","path":"/docs/2.0.0/overview/introduction","sidebar":"tutorialSidebar"},{"id":"tutorials/deploying-to-civo-with-helm","path":"/docs/2.0.0/tutorials/deploying-to-civo-with-helm"},{"id":"tutorials/ephemeral-agents-in-the-browser","path":"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser"},{"id":"tutorials/intercom-system-with-routr-and-kubernetes","path":"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes"},{"id":"tutorials/load-balancing-asterisk-with-routr","path":"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/2.0.0/overview/introduction","label":"overview/introduction"}}}},{"name":"1.x.x","label":"1.x.x","isLast":false,"path":"/docs/1.x.x","mainDocId":"welcome","docs":[{"id":"administration/cli/cheatsheet","path":"/docs/1.x.x/administration/cli/cheatsheet","sidebar":"tutorialSidebar"},{"id":"administration/cli/installation","path":"/docs/1.x.x/administration/cli/installation","sidebar":"tutorialSidebar"},{"id":"administration/cli/remote-access","path":"/docs/1.x.x/administration/cli/remote-access","sidebar":"tutorialSidebar"},{"id":"administration/webconsole","path":"/docs/1.x.x/administration/webconsole","sidebar":"tutorialSidebar"},{"id":"api/agents/create","path":"/docs/1.x.x/api/agents/create","sidebar":"tutorialSidebar"},{"id":"api/agents/delete","path":"/docs/1.x.x/api/agents/delete","sidebar":"tutorialSidebar"},{"id":"api/agents/get","path":"/docs/1.x.x/api/agents/get","sidebar":"tutorialSidebar"},{"id":"api/agents/list","path":"/docs/1.x.x/api/agents/list","sidebar":"tutorialSidebar"},{"id":"api/agents/update","path":"/docs/1.x.x/api/agents/update","sidebar":"tutorialSidebar"},{"id":"api/config/get","path":"/docs/1.x.x/api/config/get","sidebar":"tutorialSidebar"},{"id":"api/config/update","path":"/docs/1.x.x/api/config/update","sidebar":"tutorialSidebar"},{"id":"api/domains/create","path":"/docs/1.x.x/api/domains/create","sidebar":"tutorialSidebar"},{"id":"api/domains/delete","path":"/docs/1.x.x/api/domains/delete","sidebar":"tutorialSidebar"},{"id":"api/domains/get","path":"/docs/1.x.x/api/domains/get","sidebar":"tutorialSidebar"},{"id":"api/domains/list","path":"/docs/1.x.x/api/domains/list","sidebar":"tutorialSidebar"},{"id":"api/domains/update","path":"/docs/1.x.x/api/domains/update","sidebar":"tutorialSidebar"},{"id":"api/gateways/create","path":"/docs/1.x.x/api/gateways/create","sidebar":"tutorialSidebar"},{"id":"api/gateways/delete","path":"/docs/1.x.x/api/gateways/delete","sidebar":"tutorialSidebar"},{"id":"api/gateways/get","path":"/docs/1.x.x/api/gateways/get","sidebar":"tutorialSidebar"},{"id":"api/gateways/list","path":"/docs/1.x.x/api/gateways/list","sidebar":"tutorialSidebar"},{"id":"api/gateways/update","path":"/docs/1.x.x/api/gateways/update","sidebar":"tutorialSidebar"},{"id":"api/location/create","path":"/docs/1.x.x/api/location/create","sidebar":"tutorialSidebar"},{"id":"api/location/delete","path":"/docs/1.x.x/api/location/delete","sidebar":"tutorialSidebar"},{"id":"api/location/list","path":"/docs/1.x.x/api/location/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/create","path":"/docs/1.x.x/api/numbers/create","sidebar":"tutorialSidebar"},{"id":"api/numbers/delete","path":"/docs/1.x.x/api/numbers/delete","sidebar":"tutorialSidebar"},{"id":"api/numbers/get","path":"/docs/1.x.x/api/numbers/get","sidebar":"tutorialSidebar"},{"id":"api/numbers/list","path":"/docs/1.x.x/api/numbers/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/update","path":"/docs/1.x.x/api/numbers/update","sidebar":"tutorialSidebar"},{"id":"api/overview","path":"/docs/1.x.x/api/overview","sidebar":"tutorialSidebar"},{"id":"api/peers/create","path":"/docs/1.x.x/api/peers/create","sidebar":"tutorialSidebar"},{"id":"api/peers/delete","path":"/docs/1.x.x/api/peers/delete","sidebar":"tutorialSidebar"},{"id":"api/peers/get","path":"/docs/1.x.x/api/peers/get","sidebar":"tutorialSidebar"},{"id":"api/peers/list","path":"/docs/1.x.x/api/peers/list","sidebar":"tutorialSidebar"},{"id":"api/peers/update","path":"/docs/1.x.x/api/peers/update","sidebar":"tutorialSidebar"},{"id":"api/registry","path":"/docs/1.x.x/api/registry","sidebar":"tutorialSidebar"},{"id":"api/status/get","path":"/docs/1.x.x/api/status/get","sidebar":"tutorialSidebar"},{"id":"api/status/update","path":"/docs/1.x.x/api/status/update","sidebar":"tutorialSidebar"},{"id":"api/sys/info","path":"/docs/1.x.x/api/sys/info","sidebar":"tutorialSidebar"},{"id":"api/sys/logs","path":"/docs/1.x.x/api/sys/logs","sidebar":"tutorialSidebar"},{"id":"api/token","path":"/docs/1.x.x/api/token","sidebar":"tutorialSidebar"},{"id":"concepts","path":"/docs/1.x.x/concepts","sidebar":"tutorialSidebar"},{"id":"configuration/agents","path":"/docs/1.x.x/configuration/agents","sidebar":"tutorialSidebar"},{"id":"configuration/domains","path":"/docs/1.x.x/configuration/domains","sidebar":"tutorialSidebar"},{"id":"configuration/gateways","path":"/docs/1.x.x/configuration/gateways","sidebar":"tutorialSidebar"},{"id":"configuration/general","path":"/docs/1.x.x/configuration/general","sidebar":"tutorialSidebar"},{"id":"configuration/numbers","path":"/docs/1.x.x/configuration/numbers","sidebar":"tutorialSidebar"},{"id":"configuration/peers","path":"/docs/1.x.x/configuration/peers","sidebar":"tutorialSidebar"},{"id":"configuration/users","path":"/docs/1.x.x/configuration/users","sidebar":"tutorialSidebar"},{"id":"guides/basic-setup","path":"/docs/1.x.x/guides/basic-setup","sidebar":"tutorialSidebar"},{"id":"guides/routr-as-asterisk-frontend","path":"/docs/1.x.x/guides/routr-as-asterisk-frontend","sidebar":"tutorialSidebar"},{"id":"guides/running-on-kubernetes","path":"/docs/1.x.x/guides/running-on-kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/running-with-docker-or-compose","path":"/docs/1.x.x/guides/running-with-docker-or-compose","sidebar":"tutorialSidebar"},{"id":"guides/securing-the-signaling-path","path":"/docs/1.x.x/guides/securing-the-signaling-path","sidebar":"tutorialSidebar"},{"id":"introduction/community","path":"/docs/1.x.x/introduction/community","sidebar":"tutorialSidebar"},{"id":"introduction/comparison","path":"/docs/1.x.x/introduction/comparison","sidebar":"tutorialSidebar"},{"id":"introduction/faq","path":"/docs/1.x.x/introduction/faq","sidebar":"tutorialSidebar"},{"id":"introduction/glossary","path":"/docs/1.x.x/introduction/glossary","sidebar":"tutorialSidebar"},{"id":"introduction/installation","path":"/docs/1.x.x/introduction/installation","sidebar":"tutorialSidebar"},{"id":"introduction/media","path":"/docs/1.x.x/introduction/media","sidebar":"tutorialSidebar"},{"id":"introduction/overview","path":"/docs/1.x.x/introduction/overview","sidebar":"tutorialSidebar"},{"id":"introduction/performance-tests/user-location","path":"/docs/1.x.x/introduction/performance-tests/user-location","sidebar":"tutorialSidebar"},{"id":"introduction/roadmap","path":"/docs/1.x.x/introduction/roadmap","sidebar":"tutorialSidebar"},{"id":"introduction/test-plan","path":"/docs/1.x.x/introduction/test-plan","sidebar":"tutorialSidebar"},{"id":"welcome","path":"/docs/1.x.x/welcome","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/1.x.x/welcome","label":"welcome"}}}}],"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(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.3"}}}'),c={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(412),a=n(5742),i=n(8780),l=n(7452);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(u,e);class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.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??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>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}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(405);function a(e){return r.createElement(o.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),o=n(7294),a=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=o.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:x}=(0,d.C)(),k=(0,o.useContext)(u),S=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>S.current));const E=p||f;const _=(0,s.Z)(E),C=E?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?x(A):A):void 0;var A;T&&_&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const L=(0,o.useRef)(!1),R=n?a.OL:a.rU,P=c.Z.canUseIntersectionObserver,N=(0,o.useRef)(),O=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,o.useEffect)((()=>(!P&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&N.current&&N.current.disconnect()})),[N,T,P,_]);const I=T?.startsWith("#")??!1,D=!T||!_||I;return D||g||k.collectLink(T),D?o.createElement("a",(0,r.Z)({ref:S,href:T},E&&!_&&{target:"_blank",rel:"noopener noreferrer"},v)):o.createElement(R,(0,r.Z)({},v,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,P&&e&&_&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T},n&&{isActive:h,activeClassName:m}))}const f=o.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function o(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 a=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return a[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:a}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,o(l,a))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),o=n(2263),a=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>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}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>a});var r=n(7294);const o=r.createContext(null);function a(e){let{children:t,value:n}=e;const a=r.useContext(o),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:a,value:n})),[a,n]);return r.createElement(o.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>f,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>p,yW:()=>g,gB:()=>h});var r=n(6550),o=n(2263),a=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();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=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),o=n?.docs.find((e=>!!(0,r.LX)(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 u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>function(e,t,n){void 0===t&&(t=a.m),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});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();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.LX)(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 m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return l(t)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),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()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const o={iconExternalLink:"iconExternalLink_nPIU"};function a(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:o.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},7452:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Rt});var r=n(7294),o=n(6010),a=n(4763),i=n(833),l=n(7462),s=n(6550),c=n(5999),u=n(5936);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,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({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 h(e){const t=e.children??m,{containerRef:n,onClick:o}=f();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:o}),t))}var g=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:v.skipToContent})}var w=n(6668),x=n(9689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function E(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,o.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,o.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,x.nT)();if(!t)return null;const{backgroundColor:o,textColor:a,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:o,color:a},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(E,{onClick:n,className:T.announcementBarClose}))}var L=n(3163),R=n(2466);var P=n(902),N=n(3102);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,N.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,P.D9)(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 r.createElement(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var B=n(2949),j=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:a,onChange:i}=e;const l=(0,j.Z)(),s=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===a?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,o.Z)($.toggle,t)},r.createElement("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!l&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===a?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,o=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:i}=(0,B.I)();return o?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:a,onChange:i})}var V=n(1327);function W(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({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()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(K,null))}var Q=n(9960),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const p=(0,X.Z)(o),f=(0,X.Z)(t),m=(0,X.Z)(a,{forcePrependBaseUrl:!0}),h=i&&a&&!(0,J.Z)(a),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,c&&{width:12,height:12}))};return a?r.createElement(Q.Z,(0,l.Z)({href:u?m:a},d,g)):r.createElement(Q.Z,(0,l.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(f)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},a));return n?r.createElement("li",null,i):i}function oe(e){let{className:t,isDropdownItem:n,...a}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,o.Z)("menu__link",t)},a)))}function ae(e){let{mobile:t=!1,position:n,...o}=e;const a=t?oe:re;return r.createElement(a,(0,l.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.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)}}),[c]),r.createElement("div",{ref:c,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",a)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(qe,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:a,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),f()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(qe,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const o=t?de:ue;return r.createElement(o,n)}var fe=n(4711);function me(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},o),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const he="iconLanguage_nlXk";function ge(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var be=n(830),ve=["translations"];function ye(){return ye=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},ye.apply(this,arguments)}function we(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,a=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(s){l=!0,o=s}finally{try{i||null==n.return||n.return()}finally{if(l)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return xe(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return xe(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function xe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function ke(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Se="Ctrl";var Ee=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=ke(e,ve),i=o.buttonText,l=void 0===i?"Search":i,s=o.buttonAriaLabel,c=void 0===s?"Search":s,u=we((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Se))}),[]),r.createElement("button",ye({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(ge,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),_e=n(5742),Ce=n(6177),Te=n(239),Ae=n(3320);var Le=n(3935);const Re={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Pe=null;function Ne(e){let{hit:t,children:n}=e;return r.createElement(Q.Z,{to:t.url},n)}function Oe(e){let{state:t,onClose:n}=e;const o=(0,Ce.M)();return r.createElement(Q.Z,{to:o(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ie(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,se.Z)(),c=(0,Te.l)(),u=function(){const{locale:e,tags:t}=(0,Ae._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,f={...a.searchParameters,facetFilters:p},m=(0,s.k6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),x=(0,r.useCallback)((()=>Pe?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Pe=t}))),[]),k=(0,r.useCallback)((()=>{x().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),v(!0)}))}),[x,v]),S=(0,r.useCallback)((()=>{v(!1),h.current?.remove()}),[v]),E=(0,r.useCallback)((e=>{x().then((()=>{v(!0),w(e.key)}))}),[x,v,w]),_=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(o,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>r.createElement(Oe,(0,l.Z)({},e,{onClose:S}))),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:b,onOpen:k,onClose:S,onInput:E,searchButtonRef:g}),r.createElement(r.Fragment,null,r.createElement(_e.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(Ee,{onTouchStart:x,onFocus:x,onMouseOver:x,onClick:k,ref:g,translations:Re.button}),b&&Pe&&h.current&&(0,Le.createPortal)(r.createElement(Pe,(0,l.Z)({onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:_,transformItems:C,hitComponent:Ne,transformSearchClient:A},a.searchPagePath&&{resultsFooterComponent:T},a,{searchParameters:f,placeholder:Re.placeholder,translations:Re.modal})),h.current))}function De(){const{siteConfig:e}=(0,se.Z)();return r.createElement(Ie,e.themeConfig.algolia)}const Me={searchBox:"searchBox_ZlJk"};function Fe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,Me.searchBox)},t)}var Be=n(143),je=n(2802);var ze=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,...a}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,s.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}`;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":""}})),...o],g=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(pe,(0,l.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Fe,{className:n},r.createElement(De,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,o.Z)({navbar__item:!a&&!i,"menu__list-item":a},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:i}=(0,Be.Iw)(o),s=(0,je.vY)(t,o);return null===s?null:r.createElement(ae,(0,l.Z)({exact:!0},a,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:i}=(0,Be.Iw)(o),s=(0,je.oz)(t,o).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,l.Z)({exact:!0},a,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const i=(0,je.lO)(o)[0],s=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(ae,(0,l.Z)({},a,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:i,...u}=e;const{search:d,hash:p}=(0,s.TH)(),f=(0,Be.Iw)(n),m=(0,Be.gB)(n),{savePreferredVersionName:h}=(0,ze.J)(n),g=[...a,...m.map((e=>{const t=f.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,je.lO)(n)[0],v=t&&g.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&g.length>1?void 0:Ue(b).path;return g.length<=1?r.createElement(ae,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:o?()=>!1:void 0})):r.createElement(pe,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:g,isActive:o?()=>!1:void 0}))}};function qe(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=$e[o];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(a,n)}function He(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(qe,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ze(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function Ve(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(Y,null),primaryMenu:r.createElement(He,null),secondaryMenu:r.createElement(Ze,null)}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Ye(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:l,isNavbarVisible:s}=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,R.RF)(((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,u.S)((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 r.createElement("nav",{ref:l,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!s&&We.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown})},t,r.createElement(Ke,{onClick:i.toggle}),r.createElement(Ve,null))}var Qe=n(8780);const Xe={errorBoundaryError:"errorBoundaryError_a6uf"};function Je(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function et(e){let{error:t}=e;const n=(0,Qe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Xe.errorBoundaryError},n)}class tt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const nt="right";function rt(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,l.Z)({className:o,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},a),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function ot(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({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"},r.createElement(rt,null))}const at={colorModeToggle:"colorModeToggle_DEke"};function it(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(tt,{key:t,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})},r.createElement(qe,e)))))}function lt(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function st(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??nt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement(lt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(ot,null),r.createElement(W,null),r.createElement(it,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(it,{items:o}),r.createElement(Z,{className:at.colorModeToggle}),!a&&r.createElement(Fe,null,r.createElement(De,null)))})}function ct(){return r.createElement(Ye,null,r.createElement(st,null))}function ut(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:i,...s}=t,c=(0,X.Z)(n),u=(0,X.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(Q.Z,(0,l.Z)({className:"footer__link-item"},o?{href:i?u:o}:{to:c},s),a,o&&!(0,J.Z)(o)&&r.createElement(te.Z,null))}function dt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ut,{item:t}))}function pt(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(dt,{key:t,item:e})))))}function ft(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(pt,{key:t,column:e}))))}function mt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function ht(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ut,{item:t})}function gt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(ht,{item:e}),t.length!==n+1&&r.createElement(mt,null))))))}function bt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(ft,{columns:t}):r.createElement(gt,{links:t})}var vt=n(941);const yt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(vt.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function xt(e){let{logo:t}=e;return t.href?r.createElement(Q.Z,{href:t.href,className:yt.footerLogoLink,target:t.target},r.createElement(wt,{logo:t})):r.createElement(wt,{logo:t})}function kt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function St(e){let{style:t,links:n,logo:a,copyright:i}=e;return r.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(a||i)&&r.createElement("div",{className:"footer__bottom text--center"},a&&r.createElement("div",{className:"margin-bottom--sm"},a),i)))}function Et(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(St,{style:a,links:n&&n.length>0&&r.createElement(bt,{links:n}),logo:o&&r.createElement(xt,{logo:o}),copyright:t&&r.createElement(kt,{copyright:t})})}const _t=r.memo(Et),Ct=(0,P.Qc)([B.S,x.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(L.M,null,r.createElement(I,null,t)))}]);function Tt(e){let{children:t}=e;return r.createElement(Ct,null,t)}function At(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Je,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(et,{error:t})))))}const Lt={mainWrapper:"mainWrapper_z2l0"};function Rt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),r.createElement(Tt,null,r.createElement(i.d,{title:s,description:c}),r.createElement(y,null),r.createElement(A,null),r.createElement(ct,null),r.createElement("div",{id:d,className:(0,o.Z)(g.k.wrapper.main,Lt.mainWrapper,l)},r.createElement(a.Z,{fallback:e=>r.createElement(At,e)},t)),!n&&r.createElement(_t,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),o=n(7294),a=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=o.createElement(c.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:c}}=(0,s.L)(),{imageClassName:d,titleClassName:p,...f}=e,m=(0,i.Z)(c?.href||"/"),h=n?"":t,g=c?.alt??h;return o.createElement(a.Z,(0,r.Z)({to:m},f,c?.target&&{target:c.target}),c&&o.createElement(u,{logo:c,alt:g,imageClassName:d}),null!=n&&o.createElement("b",{className:p},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(5742);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return r.createElement(o.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),a&&r.createElement("meta",{name:"docusaurus_tag",content:a}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),a&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:a}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),o=n(7294),a=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return o.createElement(o.Fragment,null,f.map((e=>o.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,a.Z)(s.themedImage,s[`themedImage--${e}`],u)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>g});var r=n(7462),o=n(7294),a=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,o.useState)(t??!1),a=(0,o.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:a}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const a=(0,o.useRef)(!1);(0,o.useEffect)((()=>{const e=t.current;function o(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return d(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!a.Z.canUseDOM)return e?c:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const c=(0,o.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:a}),o.createElement(t,{ref:c,style:s?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:l},r)}function h(e){let{collapsed:t,...n}=e;const[a,i]=(0,o.useState)(!t),[l,s]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&s(t)}),[a,t]),a?o.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(7294),o=n(2389),a=n(12),i=n(902),l=n(6668);const s=(0,a.WA)("docusaurus.announcement.dismiss"),c=(0,a.WA)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{a(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),o=n(412),a=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d={light:"light",dark:"dark"},p=e=>e===d.dark?d.dark:d.light,f=e=>o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{u.set(p(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,a]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&u.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?d.dark:d.light:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&i(p(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===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[o,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>g,Oh:()=>y});var r=n(7294),o=n(143),a=n(9935),i=n(6668),l=n(2802),s=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function m(){const e=(0,o._r)(),t=(0,i.L)().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 h(e){let{children:t}=e;const n=m();return r.createElement(f.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(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])}}function y(){const e=(0,o._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),i=r.createContext(a);function l(e){let{children:t,name:n,items:o}=e;const a=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return r.createElement(i.Provider,{value:a},t)}function s(){const e=(0,r.useContext)(i);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>p});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),l=n(6668),s=n(902);const c=r.createContext(void 0);function u(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function d(e){let{children:t}=e;const n=u();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),o=n(902);const a=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(a);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,o.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);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)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>l,M:()=>s});var r=n(7294),o=n(2263),a=n(1980);const i="q";function l(){return(0,a.Nc)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return o.Z.canUseDOM?window.innerWidth>i?a.desktop:a.mobile:a.ssr}const s=!1;function c(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>p,_F:()=>h,cE:()=>d,hI:()=>x,lO:()=>v,vY:()=>w,oz:()=>y,s1:()=>b});var r=n(7294),o=n(6550),a=n(8790),i=n(143),l=n(373),s=n(1116);function c(e){return Array.from(new Set(e))}var u=n(8596);const d=!!i._r;function p(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=p(t);if(e)return e}}}const f=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||m(e.items,t))}function g(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,u.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,u.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function b(){const e=(0,s.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function v(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,o].filter(Boolean))),[t,n,o])}function y(e,t){const n=v(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 w(e,t){const n=v(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- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),i=t.routes,l=i.find((e=>(0,o.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,a.H)(i),sidebarName:s,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(2263);function o(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>c,Rb:()=>l});var r=n(7294),o=n(6550),a=n(1688),i=n(902);function l(e){!function(e){const t=(0,o.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,o.k6)();return(0,a.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=s(e)??"",n=function(){const e=(0,o.k6)();return(0,r.useCallback)(((t,n,r)=>{const o=new URLSearchParams(e.location.search);n?o.set(t,n):o.delete(t),(r?.push?e.push:e.replace)({search:o.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(7294),o=n(6010),a=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:o,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),p=i?d(i,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),o&&r.createElement("meta",{name:"keywords",content:Array.isArray(o)?o.join(","):o}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),l)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,o.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(a.Z,null,r.createElement("html",{className:l})),n)}function f(e){let{children:t}=e;const n=l(),a=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,o.Z)(a,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>a});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function a(e){const t=(0,r.useRef)(e);return o((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return o((()=>{t.current=e})),t.current}class l 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 s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),o=n(723),a=n(2263);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.Z)().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.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>s,RF:()=>d});var r=n(7294),o=n(412),a=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),o=(0,r.useRef)(u()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();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 p(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"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?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),o=n(2263),a=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,o.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,a.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=s[e],a=t[e].versions.find((e=>e.isLast));return l(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function o(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 a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(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),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),o=n(6550),a=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,o.TH)(),c=(0,a.applyTrailingSlash)(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}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(7294),o=n(8022),a=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,a.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.F)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},6010:(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))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n);else for(t in e)e[t]&&(o&&(o+=" "),o+=t);return o}n.d(t,{Z:()=>o});const o=function(){for(var e,t,n=0,o="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>A,Ep:()=>p});var r=n(7462);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 m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);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.Z)({},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 m(){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 h=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),h||(0,l.Z)(!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,x=i.getUserConfirmation,k=void 0===x?g:x,S=i.keyLength,E=void 0===S?6:S,_=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 _&&(a=u(a,_)),f(a,r,n)}function T(){return Math.random().toString(36).substr(2,E)}var A=m();function L(e){(0,r.Z)(U,e),U.length=n.length,A.notifyListeners(U.location,U.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||O(C(e.state))}function P(){O(C(y()))}var N=!1;function O(e){if(N)N=!1,L();else{A.confirmTransitionTo(e,"POP",k,(function(t){t?L({action:"POP",location:e}):function(e){var t=U.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(N=!0,F(o))}(e)}))}}var I=C(y()),D=[I.key];function M(e){return _+p(e)}function F(e){n.go(e)}var B=0;function j(e){1===(B+=e)&&1===e?(window.addEventListener(b,R),a&&window.addEventListener(v,P)):0===B&&(window.removeEventListener(b,R),a&&window.removeEventListener(v,P))}var z=!1;var U={length:n.length,action:"POP",location:I,createHref:M,push:function(e,t){var r="PUSH",a=f(e,t,T(),U.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=M(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(U.location.key),c=D.slice(0,s+1);c.push(a.key),D=c,L({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,T(),U.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=M(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(U.location.key);-1!==s&&(D[s]=a.key),L({action:r,location:a})}else window.location.replace(t)}}))},go:F,goBack:function(){F(-1)},goForward:function(){F(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return z||(j(1),z=!0),function(){return z&&(z=!1,j(-1)),t()}},listen:function(e){var t=A.appendListener(e);return j(1),function(){j(-1),t()}}};return U}var x="hashchange",k={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 E(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function _(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?g:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(s(e.basename)):"",v=k[c],y=v.encodePath,w=v.decodePath;function C(){var e=w(E());return b&&(e=u(e,b)),f(e)}var T=m();function A(e){(0,r.Z)(z,e),z.length=t.length,T.notifyListeners(z.location,z.action)}var L=!1,R=null;function P(){var e,t,n=E(),r=y(n);if(n!==r)_(r);else{var o=C(),i=z.location;if(!L&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(R===p(o))return;R=null,function(e){if(L)L=!1,A();else{var t="POP";T.confirmTransitionTo(e,t,a,(function(n){n?A({action:t,location:e}):function(e){var t=z.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&&(L=!0,M(o))}(e)}))}}(o)}}var N=E(),O=y(N);N!==O&&_(O);var I=C(),D=[p(I)];function M(e){t.go(e)}var F=0;function B(e){1===(F+=e)&&1===e?window.addEventListener(x,P):0===F&&window.removeEventListener(x,P)}var j=!1;var z={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,z.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);if(E()!==o){R=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(p(z.location)),i=D.slice(0,a+1);i.push(t),D=i,A({action:n,location:r})}else A()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,z.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);E()!==o&&(R=t,_(o));var a=D.indexOf(p(z.location));-1!==a&&(D[a]=t),A({action:n,location:r})}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return j||(B(1),j=!0),function(){return j&&(j=!1,B(-1)),t()}},listen:function(e){var t=T.appendListener(e);return B(1),function(){B(-1),t()}}};return z}function T(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,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=m();function d(e){(0,r.Z)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function h(){return Math.random().toString(36).substr(2,c)}var g=T(l,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?h():e.key||h())})),v=p;function y(e){var t=T(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[g],index:g,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,h(),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,h(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},8679:(e,t,n)=>{"use strict";var r=n(9864),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,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g<i.length;++g){var b=i[g];if(!(a[b]||r&&r[b]||h&&h[b]||l&&l[b])){var v=p(n,b);try{c(t,b,v)}catch(y){}}}}return t}},1143: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}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865: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)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,o){for(var a,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var c in a=Object(arguments[s]))n.call(a,c)&&(l[c]=a[c]);if(t){i=t(a);for(var u=0;u<i.length;u++)r.call(a,i[u])&&(l[i[u]]=a[i[u]])}}return l}},4779:(e,t,n)=>{var r=n(5826);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 m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var x=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,E=n[2]||u,_=b||v;r.push({name:g||a++,prefix:h||"",delimiter:E,optional:S,repeat:k,partial:x,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+s(E)+"]+?"})}}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 m=s(n.delimiter||"/"),h=i.slice(-m.length)===m;return o||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=a?"$":o&&h?"":"(?="+m+"|$)",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)}},7410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=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};return r.hooks.run("before-tokenize",a),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){var t=[],n=e.head.next;for(;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 m=0;m<f.length;++m){if(d&&d.cause==p+","+m)return;var h=f[m],g=h.inside,b=!!h.lookbehind,v=!!h.greedy,y=h.alias;if(v&&!h.pattern.global){var w=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,w+"g")}for(var x=h.pattern||h,k=l.next,S=u;k!==t.tail&&!(d&&S>=d.reach);S+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var _,C=1;if(v){if(!(_=a(x,S,e,b))||_.index>=e.length)break;var T=_.index,A=_.index+_[0].length,L=S;for(L+=k.value.length;T>=L;)L+=(k=k.next).value.length;if(S=L-=k.value.length,k.value instanceof o)continue;for(var R=k;R!==t.tail&&(L<A||"string"==typeof R.value);R=R.next)C++,L+=R.value.length;C--,E=e.slice(S,L),_.index-=S}else if(!(_=a(x,0,E,b)))continue;T=_.index;var P=_[0],N=E.slice(0,T),O=E.slice(T+P.length),I=S+E.length;d&&I>d.reach&&(d.reach=I);var D=k.prev;if(N&&(D=s(t,D,N),S+=N.length),c(t,D,C),k=s(t,D,new o(p,g?r.tokenize(P,g):P,y,P)),O&&s(t,k,O),C>1){var M={cause:p+","+m,reach:I};i(e,t,n,k.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function 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}(),o=r;r.default=r,o.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},o.languages.markup.tag.inside["attr-value"].inside.entity=o.languages.markup.entity,o.languages.markup.doctype.inside["internal-subset"].inside=o.languages.markup,o.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(o.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:o.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var r={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:o.languages[t]};var a={};a[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},o.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(o.languages.markup.tag,"addAttribute",{value:function(e,t){o.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:o.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),o.languages.html=o.languages.markup,o.languages.mathml=o.languages.markup,o.languages.svg=o.languages.markup,o.languages.xml=o.languages.extend("markup",{}),o.languages.ssml=o.languages.xml,o.languages.atom=o.languages.xml,o.languages.rss=o.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i<o.length;i++)a[o[i]]=e.languages.bash[o[i]];e.languages.shell=e.languages.bash}(o),o.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:/[{}[\];(),.:]/},o.languages.c=o.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|[?:~]|[-+*/%&|^!=<>]=?/}),o.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),o.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},o.languages.c.string],char:o.languages.c.char,comment:o.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:o.languages.c}}}}),o.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 o.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(o),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(o),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},o={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:o,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:o})}(o),o.languages.javascript=o.languages.extend("clike",{"class-name":[o.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}|\?\?=?|\?\.?|[~:]/}),o.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,o.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:o.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:o.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:o.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:o.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:o.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),o.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:o.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"}}),o.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),o.languages.markup&&(o.languages.markup.tag.addInlined("script","javascript"),o.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")),o.languages.js=o.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(o),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}(o),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;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=t[n];if("code"===o.type){var a=o.content[1],i=o.content[3];if(a&&i&&"code-language"===a.type&&"code-block"===i.type&&"string"==typeof a.content){var l=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,s]:i.alias.push(s):i.alias=[s]}}else e(o.content)}}(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],c=/language-(.+)/.exec(a);if(c){n=c[1];break}}var u,d=e.languages[n];if(d)t.content=e.highlight((u=t.content,u.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n);var r=l[t];return r||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var p="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=p,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(p);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(o),o.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:o.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+/},o.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"),o.length>0)){var l=p(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&o.indexOf(c.content)>=0&&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!1}return!0}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)}})),o.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(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var o={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(o.code,o.grammar),e.hooks.run("after-tokenize",o),o.tokens}function c(t){var n={};n["interpolation-punctuation"]=o;var a=e.tokenize(t,n);if(3===a.length){var i=[1,1];i.push.apply(i,s(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,i)}return new e.Token("interpolation",a,r.alias,t)}function u(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),i=0,u={},d=s(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=o,n})).join(""),n,r),p=Object.keys(u);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var o=p[i],a="string"==typeof r?r:r.content,l=a.indexOf(o);if(-1!==l){++i;var s=a.substring(0,l),d=c(u[o]),f=a.substring(l+o.length),m=[];if(s&&m.push(s),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,o=n.length;r<o;r++){var a=n[r];if("string"!=typeof a){var i=a.content;if(Array.isArray(i))if("template-string"===a.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var s=p(l),c=l.alias,d=Array.isArray(c)?c[0]:c,f=e.languages[d];if(!f)continue;i[1]=u(s,f,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(o),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}(o),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];"RegExp"===e.util.type(a)&&(a=e.languages.javascript[o]={pattern:a});var i=a.inside||{};a.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(o),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)}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 i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;if("string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(o.content[0].content[1])&&n.pop():"/>"===o.content[o.content.length-1].content||n.push({tagName:i(o.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(o);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(s+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}o.content&&"string"!=typeof o.content&&l(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(o),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(o),o.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},o.languages.go=o.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/}),o.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete o.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,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),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(o),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(o),o.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},o.languages.webmanifest=o.languages.json,o.languages.less=o.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),o.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),o.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},o.languages.objectivec=o.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 o.languages.objectivec["class-name"],o.languages.objc=o.languages.objectivec,o.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},o.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:/[{}[\];(),.:]/},o.languages.python["string-interpolation"].inside.interpolation.inside.rest=o.languages.python,o.languages.py=o.languages.python,o.languages.reason=o.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/}),o.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 o.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(o),o.languages.scss=o.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),o.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),o.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),o.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),o.languages.scss.atrule.inside.rest=o.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(o),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(o),o.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const a=o},9901: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"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),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(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};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=6726},6500:(e,t,n)=>{var r={"./":2885};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=6500},9642: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),m=u;o(m);){for(var h in p={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,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},2703:(e,t,n)=>{"use strict";var r=n(414);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}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(7418),a=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(i(227));var l=new Set,s={};function c(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(s[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),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=Object.prototype.hasOwnProperty,m={},h={};function g(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 b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new g(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new g(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new g(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new g(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new g(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new g(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new g(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new g(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new g(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function w(e,t,n,r){var o=b.hasOwnProperty(t)?b[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!!f.call(h,e)||!f.call(m,e)&&(p.test(e)?h[e]=!0:(m[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(v,y);b[t]=new g(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new g(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new g(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new g(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new g("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new g(e,1,!1,e.toLowerCase(),null,!0,!0)}));var x=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,S=60106,E=60107,_=60108,C=60114,T=60109,A=60110,L=60112,R=60113,P=60120,N=60115,O=60116,I=60121,D=60128,M=60129,F=60130,B=60131;if("function"==typeof Symbol&&Symbol.for){var j=Symbol.for;k=j("react.element"),S=j("react.portal"),E=j("react.fragment"),_=j("react.strict_mode"),C=j("react.profiler"),T=j("react.provider"),A=j("react.context"),L=j("react.forward_ref"),R=j("react.suspense"),P=j("react.suspense_list"),N=j("react.memo"),O=j("react.lazy"),I=j("react.block"),j("react.scope"),D=j("react.opaque.id"),M=j("react.debug_trace_mode"),F=j("react.offscreen"),B=j("react.legacy_hidden")}var z,U="function"==typeof Symbol&&Symbol.iterator;function $(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function q(e){if(void 0===z)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);z=t&&t[1]||""}return"\n"+z+e}var H=!1;function G(e,t){if(!e||H)return"";H=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(s){var r=s}Reflect.construct(e,[],t)}else{try{t.call()}catch(s){r=s}e.call(t.prototype)}else{try{throw Error()}catch(s){r=s}e()}}catch(s){if(s&&r&&"string"==typeof s.stack){for(var o=s.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])return"\n"+o[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?q(e):""}function Z(e){switch(e.tag){case 5:return q(e.type);case 16:return q("Lazy");case 13:return q("Suspense");case 19:return q("SuspenseList");case 0:case 2:case 15:return e=G(e.type,!1);case 11:return e=G(e.type.render,!1);case 22:return e=G(e.type._render,!1);case 1:return e=G(e.type,!0);default:return""}}function V(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case E:return"Fragment";case S:return"Portal";case C:return"Profiler";case _:return"StrictMode";case R:return"Suspense";case P:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case T:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case N:return V(e.type);case I:return V(e._render);case O:t=e._payload,e=e._init;try{return V(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function K(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=K(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var 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 Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=K(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function X(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return o({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=W(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=W(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?oe(e,t.type,n):t.hasOwnProperty("defaultValue")&&oe(e,t.type,W(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function oe(e,t,n){"number"===t&&X(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function ae(e,t){return e=o({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,r){if(e=e.options,t){t={};for(var 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=""+W(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 le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return o({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function se(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function ce(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ue(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function pe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function fe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?pe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,he,ge=(he=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return he(e,t)}))}:he);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ve={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ye=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ve.hasOwnProperty(e)&&ve[e]?(""+t).trim():t+"px"}function xe(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=we(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(ve).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ve[t]=ve[e]}))}));var ke=o({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Se(e,t){if(t){if(ke[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function Ee(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function _e(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Te=null,Ae=null;function Le(e){if(e=no(e)){if("function"!=typeof Ce)throw Error(i(280));var t=e.stateNode;t&&(t=oo(t),Ce(e.stateNode,e.type,t))}}function Re(e){Te?Ae?Ae.push(e):Ae=[e]:Te=e}function Pe(){if(Te){var e=Te,t=Ae;if(Ae=Te=null,Le(e),t)for(e=0;e<t.length;e++)Le(t[e])}}function Ne(e,t){return e(t)}function Oe(e,t,n,r,o){return e(t,n,r,o)}function Ie(){}var De=Ne,Me=!1,Fe=!1;function Be(){null===Te&&null===Ae||(Ie(),Pe())}function je(e,t){var n=e.stateNode;if(null===n)return null;var r=oo(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var ze=!1;if(d)try{var Ue={};Object.defineProperty(Ue,"passive",{get:function(){ze=!0}}),window.addEventListener("test",Ue,Ue),window.removeEventListener("test",Ue,Ue)}catch(he){ze=!1}function $e(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 qe=!1,He=null,Ge=!1,Ze=null,Ve={onError:function(e){qe=!0,He=e}};function We(e,t,n,r,o,a,i,l,s){qe=!1,He=null,$e.apply(Ve,arguments)}function Ke(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Ye(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Qe(e){if(Ke(e)!==e)throw Error(i(188))}function Xe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ke(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var a=o.alternate;if(null===a){if(null!==(r=o.return)){n=r;continue}break}if(o.child===a.child){for(a=o.child;a;){if(a===n)return Qe(o),e;if(a===r)return Qe(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var l=!1,s=o.child;s;){if(s===n){l=!0,n=o,r=a;break}if(s===r){l=!0,r=o,n=a;break}s=s.sibling}if(!l){for(s=a.child;s;){if(s===n){l=!0,n=a,r=o;break}if(s===r){l=!0,r=a,n=o;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,rt,ot=!1,at=[],it=null,lt=null,st=null,ct=new Map,ut=new Map,dt=[],pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ft(e,t,n,r,o){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:o,targetContainers:[r]}}function mt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":lt=null;break;case"mouseover":case"mouseout":st=null;break;case"pointerover":case"pointerout":ct.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ut.delete(t.pointerId)}}function ht(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e=ft(t,n,r,o,a),null!==t&&(null!==(t=no(t))&&tt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function gt(e){var t=to(e.target);if(null!==t){var n=Ke(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ye(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){a.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Xt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=no(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function vt(e,t,n){bt(e)&&n.delete(t)}function yt(){for(ot=!1;0<at.length;){var e=at[0];if(null!==e.blockedOn){null!==(e=no(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Xt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&at.shift()}null!==it&&bt(it)&&(it=null),null!==lt&&bt(lt)&&(lt=null),null!==st&&bt(st)&&(st=null),ct.forEach(vt),ut.forEach(vt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,yt)))}function xt(e){function t(t){return wt(t,e)}if(0<at.length){wt(at[0],e);for(var n=1;n<at.length;n++){var r=at[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&wt(it,e),null!==lt&&wt(lt,e),null!==st&&wt(st,e),ct.forEach(t),ut.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)gt(n),null===n.blockedOn&&dt.shift()}function kt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var St={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},Et={},_t={};function Ct(e){if(Et[e])return Et[e];if(!St[e])return e;var t,n=St[e];for(t in n)if(n.hasOwnProperty(t)&&t in _t)return Et[e]=n[t];return e}d&&(_t=document.createElement("div").style,"AnimationEvent"in window||(delete St.animationend.animation,delete St.animationiteration.animation,delete St.animationstart.animation),"TransitionEvent"in window||delete St.transitionend.transition);var Tt=Ct("animationend"),At=Ct("animationiteration"),Lt=Ct("animationstart"),Rt=Ct("transitionend"),Pt=new Map,Nt=new Map,Ot=["abort","abort",Tt,"animationEnd",At,"animationIteration",Lt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Rt,"transitionEnd","waiting","waiting"];function It(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],o=e[n+1];o="on"+(o[0].toUpperCase()+o.slice(1)),Nt.set(r,t),Pt.set(r,o),c(o,[r])}}(0,a.unstable_now)();var Dt=8;function Mt(e){if(0!=(1&e))return Dt=15,1;if(0!=(2&e))return Dt=14,2;if(0!=(4&e))return Dt=13,4;var t=24&e;return 0!==t?(Dt=12,t):0!=(32&e)?(Dt=11,32):0!==(t=192&e)?(Dt=10,t):0!=(256&e)?(Dt=9,256):0!==(t=3584&e)?(Dt=8,t):0!=(4096&e)?(Dt=7,4096):0!==(t=4186112&e)?(Dt=6,t):0!==(t=62914560&e)?(Dt=5,t):67108864&e?(Dt=4,67108864):0!=(134217728&e)?(Dt=3,134217728):0!==(t=805306368&e)?(Dt=2,t):0!=(1073741824&e)?(Dt=1,1073741824):(Dt=8,e)}function Ft(e,t){var n=e.pendingLanes;if(0===n)return Dt=0;var r=0,o=0,a=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==a)r=a,o=Dt=15;else if(0!==(a=134217727&n)){var s=a&~i;0!==s?(r=Mt(s),o=Dt):0!==(l&=a)&&(r=Mt(l),o=Dt)}else 0!==(a=n&~i)?(r=Mt(a),o=Dt):0!==l&&(r=Mt(l),o=Dt);if(0===r)return 0;if(r=n&((0>(r=31-qt(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&i)){if(Mt(t),o<=Dt)return t;Dt=o}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-qt(t)),r|=e[n],t&=~o;return r}function Bt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function jt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=zt(24&~t))?jt(10,t):e;case 10:return 0===(e=zt(192&~t))?jt(8,t):e;case 8:return 0===(e=zt(3584&~t))&&(0===(e=zt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=zt(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function zt(e){return e&-e}function Ut(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $t(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-qt(t)]=n}var qt=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ht(e)/Gt|0)|0},Ht=Math.log,Gt=Math.LN2;var Zt=a.unstable_UserBlockingPriority,Vt=a.unstable_runWithPriority,Wt=!0;function Kt(e,t,n,r){Me||Ie();var o=Qt,a=Me;Me=!0;try{Oe(o,e,t,n,r)}finally{(Me=a)||Be()}}function Yt(e,t,n,r){Vt(Zt,Qt.bind(null,e,t,n,r))}function Qt(e,t,n,r){var o;if(Wt)if((o=0==(4&t))&&0<at.length&&-1<pt.indexOf(e))e=ft(null,e,t,n,r),at.push(e);else{var a=Xt(e,t,n,r);if(null===a)o&&mt(e,r);else{if(o){if(-1<pt.indexOf(e))return e=ft(a,e,t,n,r),void at.push(e);if(function(e,t,n,r,o){switch(t){case"focusin":return it=ht(it,e,t,n,r,o),!0;case"dragenter":return lt=ht(lt,e,t,n,r,o),!0;case"mouseover":return st=ht(st,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return ct.set(a,ht(ct.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,ut.set(a,ht(ut.get(a)||null,e,t,n,r,o)),!0}return!1}(a,e,t,n,r))return;mt(e,r)}Ir(e,t,r,null,n)}}}function Xt(e,t,n,r){var o=_e(r);if(null!==(o=to(o))){var a=Ke(o);if(null===a)o=null;else{var i=a.tag;if(13===i){if(null!==(o=Ye(a)))return o;o=null}else if(3===i){if(a.stateNode.hydrate)return 3===a.tag?a.stateNode.containerInfo:null;o=null}else a!==o&&(o=null)}}return Ir(e,t,r,o,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,r=n.length,o="value"in Jt?Jt.value:Jt.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 tn=o.slice(e,1<t?1-t:void 0)}function rn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function on(){return!0}function an(){return!1}function ln(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)?on:an,this.isPropagationStopped=an,this}return o(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=on)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=on)},persist:function(){},isPersistent:on}),t}var sn,cn,un,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=ln(dn),fn=o({},dn,{view:0,detail:0}),mn=ln(fn),hn=o({},fn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Tn,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!==un&&(un&&"mousemove"===e.type?(sn=e.screenX-un.screenX,cn=e.screenY-un.screenY):cn=sn=0,un=e),sn)},movementY:function(e){return"movementY"in e?e.movementY:cn}}),gn=ln(hn),bn=ln(o({},hn,{dataTransfer:0})),vn=ln(o({},fn,{relatedTarget:0})),yn=ln(o({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=o({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),xn=ln(wn),kn=ln(o({},dn,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},En={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},_n={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=_n[e])&&!!t[e]}function Tn(){return Cn}var An=o({},fn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?En[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Tn,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Ln=ln(An),Rn=ln(o({},hn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Pn=ln(o({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),Nn=ln(o({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),On=o({},hn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),In=ln(On),Dn=[9,13,27,32],Mn=d&&"CompositionEvent"in window,Fn=null;d&&"documentMode"in document&&(Fn=document.documentMode);var Bn=d&&"TextEvent"in window&&!Fn,jn=d&&(!Mn||Fn&&8<Fn&&11>=Fn),zn=String.fromCharCode(32),Un=!1;function $n(e,t){switch(e){case"keyup":return-1!==Dn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function qn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Hn=!1;var Gn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Zn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function Vn(e,t,n,r){Re(r),0<(t=Mr(t,"onChange")).length&&(n=new pn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,Kn=null;function Yn(e){Ar(e,0)}function Qn(e){if(Q(ro(e)))return e}function Xn(e,t){if("change"===e)return t}var Jn=!1;if(d){var er;if(d){var tr="oninput"in document;if(!tr){var nr=document.createElement("div");nr.setAttribute("oninput","return;"),tr="function"==typeof nr.oninput}er=tr}else er=!1;Jn=er&&(!document.documentMode||9<document.documentMode)}function rr(){Wn&&(Wn.detachEvent("onpropertychange",or),Kn=Wn=null)}function or(e){if("value"===e.propertyName&&Qn(Kn)){var t=[];if(Vn(t,Kn,e,_e(e)),e=Yn,Me)e(t);else{Me=!0;try{Ne(e,t)}finally{Me=!1,Be()}}}}function ar(e,t,n){"focusin"===e?(rr(),Kn=n,(Wn=t).attachEvent("onpropertychange",or)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Kn)}function lr(e,t){if("click"===e)return Qn(t)}function sr(e,t){if("input"===e||"change"===e)return Qn(t)}var cr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},ur=Object.prototype.hasOwnProperty;function dr(e,t){if(cr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!ur.call(t,n[r])||!cr(e[n[r]],t[n[r]]))return!1;return!0}function pr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function fr(e,t){var n,r=pr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=pr(r)}}function mr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?mr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function hr(){for(var e=window,t=X();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=X((e=t.contentWindow).document)}return t}function gr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=d&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,wr=null,xr=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;xr||null==vr||vr!==X(r)||("selectionStart"in(r=vr)&&gr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},wr&&dr(wr,r)||(wr=r,0<(r=Mr(yr,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}It("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),It("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),It(Ot,2);for(var Sr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Er=0;Er<Sr.length;Er++)Nt.set(Sr[Er],0);u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),c("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),c("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),c("onBeforeInput",["compositionend","keypress","textInput","paste"]),c("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var _r="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Cr=new Set("cancel close invalid load scroll toggle".split(" ").concat(_r));function Tr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,l,s,c){if(We.apply(this,arguments),qe){if(!qe)throw Error(i(198));var u=He;qe=!1,He=null,Ge||(Ge=!0,Ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Ar(e,t){t=0!=(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;Tr(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;Tr(o,l,c),a=s}}}if(Ge)throw e=Ze,Ge=!1,Ze=null,e}function Lr(e,t){var n=ao(t),r=e+"__bubble";n.has(r)||(Or(t,e,2,!1),n.add(r))}var Rr="_reactListening"+Math.random().toString(36).slice(2);function Pr(e){e[Rr]||(e[Rr]=!0,l.forEach((function(t){Cr.has(t)||Nr(t,!1,e,null),Nr(t,!0,e,null)})))}function Nr(e,t,n,r){var o=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,a=n;if("selectionchange"===e&&9!==n.nodeType&&(a=n.ownerDocument),null!==r&&!t&&Cr.has(e)){if("scroll"!==e)return;o|=2,a=r}var i=ao(a),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(o|=4),Or(a,e,o,t),i.add(l))}function Or(e,t,n,r){var o=Nt.get(t);switch(void 0===o?2:o){case 0:o=Kt;break;case 1:o=Yt;break;default:o=Qt}n=o.bind(null,t,n,e),o=void 0,!ze||"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 Ir(e,t,n,r,o){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===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=to(l)))return;if(5===(s=i.tag)||6===s){r=a=i;continue e}l=l.parentNode}}r=r.return}!function(e,t,n){if(Fe)return e(t,n);Fe=!0;try{return De(e,t,n)}finally{Fe=!1,Be()}}((function(){var r=a,o=_e(n),i=[];e:{var l=Pt.get(e);if(void 0!==l){var s=pn,c=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":s=Ln;break;case"focusin":c="focus",s=vn;break;case"focusout":c="blur",s=vn;break;case"beforeblur":case"afterblur":s=vn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=gn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Pn;break;case Tt:case At:case Lt:s=yn;break;case Rt:s=Nn;break;case"scroll":s=mn;break;case"wheel":s=In;break;case"copy":case"cut":case"paste":s=xn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Rn}var u=0!=(4&t),d=!u&&"scroll"===e,p=u?null!==l?l+"Capture":null:l;u=[];for(var f,m=r;null!==m;){var h=(f=m).stateNode;if(5===f.tag&&null!==h&&(f=h,null!==p&&(null!=(h=je(m,p))&&u.push(Dr(m,h,f)))),d)break;m=m.return}0<u.length&&(l=new s(l,c,null,n,o),i.push({event:l,listeners:u}))}}if(0==(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(c=n.relatedTarget||n.fromElement)||!to(c)&&!c[Jr])&&(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)?to(c):null)&&(c!==(d=Ke(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=gn,h="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=Rn,h="onPointerLeave",p="onPointerEnter",m="pointer"),d=null==s?l:ro(s),f=null==c?l:ro(c),(l=new u(h,m+"leave",s,n,o)).target=d,l.relatedTarget=f,h=null,to(o)===r&&((u=new u(p,m+"enter",c,n,o)).target=f,u.relatedTarget=d,h=u),d=h,s&&c)e:{for(p=c,m=0,f=u=s;f;f=Fr(f))m++;for(f=0,h=p;h;h=Fr(h))f++;for(;0<m-f;)u=Fr(u),m--;for(;0<f-m;)p=Fr(p),f--;for(;m--;){if(u===p||null!==p&&u===p.alternate)break e;u=Fr(u),p=Fr(p)}u=null}else u=null;null!==s&&Br(i,l,s,u,!1),null!==c&&null!==d&&Br(i,d,c,u,!0)}if("select"===(s=(l=r?ro(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var g=Xn;else if(Zn(l))if(Jn)g=sr;else{g=ir;var b=ar}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(g=lr);switch(g&&(g=g(e,r))?Vn(i,g,n,o):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&oe(l,"number",l.value)),b=r?ro(r):window,e){case"focusin":(Zn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,wr=null);break;case"focusout":wr=yr=vr=null;break;case"mousedown":xr=!0;break;case"contextmenu":case"mouseup":case"dragend":xr=!1,kr(i,n,o);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(i,n,o)}var v;if(Mn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Hn?$n(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(jn&&"ko"!==n.locale&&(Hn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Hn&&(v=nn()):(en="value"in(Jt=o)?Jt.value:Jt.textContent,Hn=!0)),0<(b=Mr(r,y)).length&&(y=new kn(y,e,null,n,o),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=qn(n))&&(y.data=v))),(v=Bn?function(e,t){switch(e){case"compositionend":return qn(t);case"keypress":return 32!==t.which?null:(Un=!0,zn);case"textInput":return(e=t.data)===zn&&Un?null:e;default:return null}}(e,n):function(e,t){if(Hn)return"compositionend"===e||!Mn&&$n(e,t)?(e=nn(),tn=en=Jt=null,Hn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return jn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Mr(r,"onBeforeInput")).length&&(o=new kn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=v))}Ar(i,t)}))}function Dr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Mr(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=je(e,n))&&r.unshift(Dr(e,a,o)),null!=(a=je(e,t))&&r.push(Dr(e,a,o))),e=e.return}return r}function Fr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Br(e,t,n,r,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=je(n,a))&&i.unshift(Dr(n,s,l)):o||null!=(s=je(n,a))&&i.push(Dr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function jr(){}var zr=null,Ur=null;function $r(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function qr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Hr="function"==typeof setTimeout?setTimeout:void 0,Gr="function"==typeof clearTimeout?clearTimeout:void 0;function Zr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function Vr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Wr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Kr=0;var Yr=Math.random().toString(36).slice(2),Qr="__reactFiber$"+Yr,Xr="__reactProps$"+Yr,Jr="__reactContainer$"+Yr,eo="__reactEvents$"+Yr;function to(e){var t=e[Qr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Qr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wr(e);null!==e;){if(n=e[Qr])return n;e=Wr(e)}return t}n=(e=n).parentNode}return null}function no(e){return!(e=e[Qr]||e[Jr])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ro(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function oo(e){return e[Xr]||null}function ao(e){var t=e[eo];return void 0===t&&(t=e[eo]=new Set),t}var io=[],lo=-1;function so(e){return{current:e}}function co(e){0>lo||(e.current=io[lo],io[lo]=null,lo--)}function uo(e,t){lo++,io[lo]=e.current,e.current=t}var po={},fo=so(po),mo=so(!1),ho=po;function go(e,t){var n=e.type.contextTypes;if(!n)return po;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 bo(e){return null!=(e=e.childContextTypes)}function vo(){co(mo),co(fo)}function yo(e,t,n){if(fo.current!==po)throw Error(i(168));uo(fo,t),uo(mo,n)}function wo(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var a in r=r.getChildContext())if(!(a in e))throw Error(i(108,V(t)||"Unknown",a));return o({},n,r)}function xo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||po,ho=fo.current,uo(fo,e),uo(mo,mo.current),!0}function ko(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=wo(e,t,ho),r.__reactInternalMemoizedMergedChildContext=e,co(mo),co(fo),uo(fo,e)):co(mo),uo(mo,n)}var So=null,Eo=null,_o=a.unstable_runWithPriority,Co=a.unstable_scheduleCallback,To=a.unstable_cancelCallback,Ao=a.unstable_shouldYield,Lo=a.unstable_requestPaint,Ro=a.unstable_now,Po=a.unstable_getCurrentPriorityLevel,No=a.unstable_ImmediatePriority,Oo=a.unstable_UserBlockingPriority,Io=a.unstable_NormalPriority,Do=a.unstable_LowPriority,Mo=a.unstable_IdlePriority,Fo={},Bo=void 0!==Lo?Lo:function(){},jo=null,zo=null,Uo=!1,$o=Ro(),qo=1e4>$o?Ro:function(){return Ro()-$o};function Ho(){switch(Po()){case No:return 99;case Oo:return 98;case Io:return 97;case Do:return 96;case Mo:return 95;default:throw Error(i(332))}}function Go(e){switch(e){case 99:return No;case 98:return Oo;case 97:return Io;case 96:return Do;case 95:return Mo;default:throw Error(i(332))}}function Zo(e,t){return e=Go(e),_o(e,t)}function Vo(e,t,n){return e=Go(e),Co(e,t,n)}function Wo(){if(null!==zo){var e=zo;zo=null,To(e)}Ko()}function Ko(){if(!Uo&&null!==jo){Uo=!0;var e=0;try{var t=jo;Zo(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),jo=null}catch(n){throw null!==jo&&(jo=jo.slice(e+1)),Co(No,Wo),n}finally{Uo=!1}}}var Yo=x.ReactCurrentBatchConfig;function Qo(e,t){if(e&&e.defaultProps){for(var n in t=o({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Xo=so(null),Jo=null,ea=null,ta=null;function na(){ta=ea=Jo=null}function ra(e){var t=Xo.current;co(Xo),e.type._context._currentValue=t}function oa(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function aa(e,t){Jo=e,ta=ea=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Mi=!0),e.firstContext=null)}function ia(e,t){if(ta!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(ta=e,t=1073741823),t={context:e,observedBits:t,next:null},null===ea){if(null===Jo)throw Error(i(308));ea=t,Jo.dependencies={lanes:0,firstContext:t,responders:null}}else ea=ea.next=t;return e._currentValue}var la=!1;function sa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function ca(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 ua(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function da(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function pa(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 fa(e,t,n,r){var a=e.updateQueue;la=!1;var i=a.firstBaseUpdate,l=a.lastBaseUpdate,s=a.shared.pending;if(null!==s){a.shared.pending=null;var c=s,u=c.next;c.next=null,null===l?i=u:l.next=u,l=c;var d=e.alternate;if(null!==d){var p=(d=d.updateQueue).lastBaseUpdate;p!==l&&(null===p?d.firstBaseUpdate=u:p.next=u,d.lastBaseUpdate=c)}}if(null!==i){for(p=a.baseState,l=0,d=u=c=null;;){s=i.lane;var f=i.eventTime;if((r&s)===s){null!==d&&(d=d.next={eventTime:f,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var m=e,h=i;switch(s=t,f=n,h.tag){case 1:if("function"==typeof(m=h.payload)){p=m.call(f,p,s);break e}p=m;break e;case 3:m.flags=-4097&m.flags|64;case 0:if(null==(s="function"==typeof(m=h.payload)?m.call(f,p,s):m))break e;p=o({},p,s);break e;case 2:la=!0}}null!==i.callback&&(e.flags|=32,null===(s=a.effects)?a.effects=[i]:s.push(i))}else f={eventTime:f,lane:s,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(u=d=f,c=p):d=d.next=f,l|=s;if(null===(i=i.next)){if(null===(s=a.shared.pending))break;i=s.next,s.next=null,a.lastBaseUpdate=s,a.shared.pending=null}}null===d&&(c=p),a.baseState=c,a.firstBaseUpdate=u,a.lastBaseUpdate=d,Ul|=l,e.lanes=l,e.memoizedState=p}}function ma(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(i(191,o));o.call(r)}}}var ha=(new r.Component).refs;function ga(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:o({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var ba={isMounted:function(e){return!!(e=e._reactInternals)&&Ke(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ps(),o=fs(e),a=ua(r,o);a.payload=t,null!=n&&(a.callback=n),da(e,a),ms(e,o,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ps(),o=fs(e),a=ua(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),da(e,a),ms(e,o,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ps(),r=fs(e),o=ua(n,r);o.tag=2,null!=t&&(o.callback=t),da(e,o),ms(e,r,n)}};function va(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!dr(n,r)||!dr(o,a))}function ya(e,t,n){var r=!1,o=po,a=t.contextType;return"object"==typeof a&&null!==a?a=ia(a):(o=bo(t)?ho:fo.current,a=(r=null!=(r=t.contextTypes))?go(e,o):po),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=ba,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function wa(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&&ba.enqueueReplaceState(t,t.state,null)}function xa(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=ha,sa(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=ia(a):(a=bo(t)?ho:fo.current,o.context=go(e,a)),fa(e,n,o,r),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(ga(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&&ba.enqueueReplaceState(o,o.state,null),fa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4)}var ka=Array.isArray;function Sa(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var o=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===o?t.ref:(t=function(e){var t=r.refs;t===ha&&(t=r.refs={}),null===e?delete t[o]:t[o]=e},t._stringRef=o,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function Ea(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function _a(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Zs(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags=2,n):r:(t.flags=2,n):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Ys(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){return null!==t&&t.elementType===n.type?((r=o(t,n.props)).ref=Sa(e,t,n),r.return=e,r):((r=Vs(n.type,n.key,n.props,null,e.mode,r)).ref=Sa(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=Qs(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=Ws(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Ys(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Vs(t.type,t.key,t.props,null,e.mode,n)).ref=Sa(e,null,t),n.return=e,n;case S:return(t=Qs(t,e.mode,n)).return=e,t}if(ka(t)||$(t))return(t=Ws(t,e.mode,n,null)).return=e,t;Ea(e,t)}return null}function f(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof 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?n.type===E?d(e,t,n.props.children,r,o):c(e,t,n,r):null;case S:return n.key===o?u(e,t,n,r):null}if(ka(n)||$(n))return null!==o?null:d(e,t,n,r,null);Ea(e,n)}return null}function m(e,t,n,r,o){if("string"==typeof 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 e=e.get(null===r.key?n:r.key)||null,r.type===E?d(t,e,r.props.children,o,r.key):c(t,e,r,o);case S:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o)}if(ka(r)||$(r))return d(t,e=e.get(n)||null,r,o,null);Ea(t,r)}return null}function h(o,i,l,s){for(var c=null,u=null,d=i,h=i=0,g=null;null!==d&&h<l.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var b=f(o,d,l[h],s);if(null===b){null===d&&(d=g);break}e&&d&&null===b.alternate&&t(o,d),i=a(b,i,h),null===u?c=b:u.sibling=b,u=b,d=g}if(h===l.length)return n(o,d),c;if(null===d){for(;h<l.length;h++)null!==(d=p(o,l[h],s))&&(i=a(d,i,h),null===u?c=d:u.sibling=d,u=d);return c}for(d=r(o,d);h<l.length;h++)null!==(g=m(d,o,h,l[h],s))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),i=a(g,i,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(o,e)})),c}function g(o,l,s,c){var u=$(s);if("function"!=typeof u)throw Error(i(150));if(null==(s=u.call(s)))throw Error(i(151));for(var d=u=null,h=l,g=l=0,b=null,v=s.next();null!==h&&!v.done;g++,v=s.next()){h.index>g?(b=h,h=null):b=h.sibling;var y=f(o,h,v.value,c);if(null===y){null===h&&(h=b);break}e&&h&&null===y.alternate&&t(o,h),l=a(y,l,g),null===d?u=y:d.sibling=y,d=y,h=b}if(v.done)return n(o,h),u;if(null===h){for(;!v.done;g++,v=s.next())null!==(v=p(o,v.value,c))&&(l=a(v,l,g),null===d?u=v:d.sibling=v,d=v);return u}for(h=r(o,h);!v.done;g++,v=s.next())null!==(v=m(h,o,g,v.value,c))&&(e&&null!==v.alternate&&h.delete(null===v.key?g:v.key),l=a(v,l,g),null===d?u=v:d.sibling=v,d=v);return e&&h.forEach((function(e){return t(o,e)})),u}return function(e,r,a,s){var c="object"==typeof a&&null!==a&&a.type===E&&null===a.key;c&&(a=a.props.children);var u="object"==typeof a&&null!==a;if(u)switch(a.$$typeof){case k:e:{for(u=a.key,c=r;null!==c;){if(c.key===u){if(7===c.tag){if(a.type===E){n(e,c.sibling),(r=o(c,a.props.children)).return=e,e=r;break e}}else if(c.elementType===a.type){n(e,c.sibling),(r=o(c,a.props)).ref=Sa(e,c,a),r.return=e,e=r;break e}n(e,c);break}t(e,c),c=c.sibling}a.type===E?((r=Ws(a.props.children,e.mode,s,a.key)).return=e,e=r):((s=Vs(a.type,a.key,a.props,null,e.mode,s)).ref=Sa(e,r,a),s.return=e,e=s)}return l(e);case S:e:{for(c=a.key;null!==r;){if(r.key===c){if(4===r.tag&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),(r=o(r,a.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Qs(a,e.mode,s)).return=e,e=r}return l(e)}if("string"==typeof a||"number"==typeof a)return a=""+a,null!==r&&6===r.tag?(n(e,r.sibling),(r=o(r,a)).return=e,e=r):(n(e,r),(r=Ys(a,e.mode,s)).return=e,e=r),l(e);if(ka(a))return h(e,r,a,s);if($(a))return g(e,r,a,s);if(u&&Ea(e,a),void 0===a&&!c)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,V(e.type)||"Component"))}return n(e,r)}}var Ca=_a(!0),Ta=_a(!1),Aa={},La=so(Aa),Ra=so(Aa),Pa=so(Aa);function Na(e){if(e===Aa)throw Error(i(174));return e}function Oa(e,t){switch(uo(Pa,t),uo(Ra,e),uo(La,Aa),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:fe(null,"");break;default:t=fe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}co(La),uo(La,t)}function Ia(){co(La),co(Ra),co(Pa)}function Da(e){Na(Pa.current);var t=Na(La.current),n=fe(t,e.type);t!==n&&(uo(Ra,e),uo(La,n))}function Ma(e){Ra.current===e&&(co(La),co(Ra))}var Fa=so(0);function Ba(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ja=null,za=null,Ua=!1;function $a(e,t){var n=Hs(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function qa(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Ha(e){if(Ua){var t=za;if(t){var n=t;if(!qa(e,t)){if(!(t=Vr(n.nextSibling))||!qa(e,t))return e.flags=-1025&e.flags|2,Ua=!1,void(ja=e);$a(ja,n)}ja=e,za=Vr(t.firstChild)}else e.flags=-1025&e.flags|2,Ua=!1,ja=e}}function Ga(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ja=e}function Za(e){if(e!==ja)return!1;if(!Ua)return Ga(e),Ua=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!qr(t,e.memoizedProps))for(t=za;t;)$a(e,t),t=Vr(t.nextSibling);if(Ga(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){za=Vr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}za=null}}else za=ja?Vr(e.stateNode.nextSibling):null;return!0}function Va(){za=ja=null,Ua=!1}var Wa=[];function Ka(){for(var e=0;e<Wa.length;e++)Wa[e]._workInProgressVersionPrimary=null;Wa.length=0}var Ya=x.ReactCurrentDispatcher,Qa=x.ReactCurrentBatchConfig,Xa=0,Ja=null,ei=null,ti=null,ni=!1,ri=!1;function oi(){throw Error(i(321))}function ai(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!cr(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,o,a){if(Xa=a,Ja=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Ya.current=null===e||null===e.memoizedState?Ni:Oi,e=n(r,o),ri){a=0;do{if(ri=!1,!(25>a))throw Error(i(301));a+=1,ti=ei=null,t.updateQueue=null,Ya.current=Ii,e=n(r,o)}while(ri)}if(Ya.current=Pi,t=null!==ei&&null!==ei.next,Xa=0,ti=ei=Ja=null,ni=!1,t)throw Error(i(300));return e}function li(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ti?Ja.memoizedState=ti=e:ti=ti.next=e,ti}function si(){if(null===ei){var e=Ja.alternate;e=null!==e?e.memoizedState:null}else e=ei.next;var t=null===ti?Ja.memoizedState:ti.next;if(null!==t)ti=t,ei=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ei=e).memoizedState,baseState:ei.baseState,baseQueue:ei.baseQueue,queue:ei.queue,next:null},null===ti?Ja.memoizedState=ti=e:ti=ti.next=e}return ti}function ci(e,t){return"function"==typeof t?t(e):t}function ui(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ei,o=r.baseQueue,a=n.pending;if(null!==a){if(null!==o){var l=o.next;o.next=a.next,a.next=l}r.baseQueue=o=a,n.pending=null}if(null!==o){o=o.next,r=r.baseState;var s=l=a=null,c=o;do{var u=c.lane;if((Xa&u)===u)null!==s&&(s=s.next={lane:0,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),r=c.eagerReducer===e?c.eagerState:e(r,c.action);else{var d={lane:u,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===s?(l=s=d,a=r):s=s.next=d,Ja.lanes|=u,Ul|=u}c=c.next}while(null!==c&&c!==o);null===s?a=r:s.next=l,cr(r,t.memoizedState)||(Mi=!0),t.memoizedState=r,t.baseState=a,t.baseQueue=s,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function di(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var l=o=o.next;do{a=e(a,l.action),l=l.next}while(l!==o);cr(a,t.memoizedState)||(Mi=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function pi(e,t,n){var r=t._getVersion;r=r(t._source);var o=t._workInProgressVersionPrimary;if(null!==o?e=o===r:(e=e.mutableReadLanes,(e=(Xa&e)===e)&&(t._workInProgressVersionPrimary=r,Wa.push(t))),e)return n(t._source);throw Wa.push(t),Error(i(350))}function fi(e,t,n,r){var o=Ol;if(null===o)throw Error(i(349));var a=t._getVersion,l=a(t._source),s=Ya.current,c=s.useState((function(){return pi(o,t,n)})),u=c[1],d=c[0];c=ti;var p=e.memoizedState,f=p.refs,m=f.getSnapshot,h=p.source;p=p.subscribe;var g=Ja;return e.memoizedState={refs:f,source:t,subscribe:r},s.useEffect((function(){f.getSnapshot=n,f.setSnapshot=u;var e=a(t._source);if(!cr(l,e)){e=n(t._source),cr(d,e)||(u(e),e=fs(g),o.mutableReadLanes|=e&o.pendingLanes),e=o.mutableReadLanes,o.entangledLanes|=e;for(var r=o.entanglements,i=e;0<i;){var s=31-qt(i),c=1<<s;r[s]|=e,i&=~c}}}),[n,t,r]),s.useEffect((function(){return r(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var r=fs(g);o.mutableReadLanes|=r&o.pendingLanes}catch(a){n((function(){throw a}))}}))}),[t,r]),cr(m,n)&&cr(h,t)&&cr(p,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:d}).dispatch=u=Ri.bind(null,Ja,e),c.queue=e,c.baseQueue=null,d=pi(o,t,n),c.memoizedState=c.baseState=d),d}function mi(e,t,n){return fi(si(),e,t,n)}function hi(e){var t=li();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:e}).dispatch=Ri.bind(null,Ja,e),[t.memoizedState,e]}function gi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=Ja.updateQueue)?(t={lastEffect:null},Ja.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function bi(e){return e={current:e},li().memoizedState=e}function vi(){return si().memoizedState}function yi(e,t,n,r){var o=li();Ja.flags|=e,o.memoizedState=gi(1|t,n,void 0,void 0===r?null:r)}function wi(e,t,n,r){var o=si();r=void 0===r?null:r;var a=void 0;if(null!==ei){var i=ei.memoizedState;if(a=i.destroy,null!==r&&ai(r,i.deps))return void gi(t,n,a,r)}Ja.flags|=e,o.memoizedState=gi(1|t,n,a,r)}function xi(e,t){return yi(516,4,e,t)}function ki(e,t){return wi(516,4,e,t)}function Si(e,t){return wi(4,2,e,t)}function Ei(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function _i(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,Ei.bind(null,t,e),n)}function Ci(){}function Ti(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&ai(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ai(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&ai(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Li(e,t){var n=Ho();Zo(98>n?98:n,(function(){e(!0)})),Zo(97<n?97:n,(function(){var n=Qa.transition;Qa.transition=1;try{e(!1),t()}finally{Qa.transition=n}}))}function Ri(e,t,n){var r=ps(),o=fs(e),a={lane:o,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?a.next=a:(a.next=i.next,i.next=a),t.pending=a,i=e.alternate,e===Ja||null!==i&&i===Ja)ri=ni=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,s=i(l,n);if(a.eagerReducer=i,a.eagerState=s,cr(s,l))return}catch(c){}ms(e,o,r)}}var Pi={readContext:ia,useCallback:oi,useContext:oi,useEffect:oi,useImperativeHandle:oi,useLayoutEffect:oi,useMemo:oi,useReducer:oi,useRef:oi,useState:oi,useDebugValue:oi,useDeferredValue:oi,useTransition:oi,useMutableSource:oi,useOpaqueIdentifier:oi,unstable_isNewReconciler:!1},Ni={readContext:ia,useCallback:function(e,t){return li().memoizedState=[e,void 0===t?null:t],e},useContext:ia,useEffect:xi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,yi(4,2,Ei.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4,2,e,t)},useMemo:function(e,t){var n=li();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=li();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Ri.bind(null,Ja,e),[r.memoizedState,e]},useRef:bi,useState:hi,useDebugValue:Ci,useDeferredValue:function(e){var t=hi(e),n=t[0],r=t[1];return xi((function(){var t=Qa.transition;Qa.transition=1;try{r(e)}finally{Qa.transition=t}}),[e]),n},useTransition:function(){var e=hi(!1),t=e[0];return bi(e=Li.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=li();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fi(r,e,t,n)},useOpaqueIdentifier:function(){if(Ua){var e=!1,t=function(e){return{$$typeof:D,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Kr++).toString(36))),Error(i(355))})),n=hi(t)[1];return 0==(2&Ja.mode)&&(Ja.flags|=516,gi(5,(function(){n("r:"+(Kr++).toString(36))}),void 0,null)),t}return hi(t="r:"+(Kr++).toString(36)),t},unstable_isNewReconciler:!1},Oi={readContext:ia,useCallback:Ti,useContext:ia,useEffect:ki,useImperativeHandle:_i,useLayoutEffect:Si,useMemo:Ai,useReducer:ui,useRef:vi,useState:function(){return ui(ci)},useDebugValue:Ci,useDeferredValue:function(e){var t=ui(ci),n=t[0],r=t[1];return ki((function(){var t=Qa.transition;Qa.transition=1;try{r(e)}finally{Qa.transition=t}}),[e]),n},useTransition:function(){var e=ui(ci)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return ui(ci)[0]},unstable_isNewReconciler:!1},Ii={readContext:ia,useCallback:Ti,useContext:ia,useEffect:ki,useImperativeHandle:_i,useLayoutEffect:Si,useMemo:Ai,useReducer:di,useRef:vi,useState:function(){return di(ci)},useDebugValue:Ci,useDeferredValue:function(e){var t=di(ci),n=t[0],r=t[1];return ki((function(){var t=Qa.transition;Qa.transition=1;try{r(e)}finally{Qa.transition=t}}),[e]),n},useTransition:function(){var e=di(ci)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return di(ci)[0]},unstable_isNewReconciler:!1},Di=x.ReactCurrentOwner,Mi=!1;function Fi(e,t,n,r){t.child=null===e?Ta(t,null,n,r):Ca(t,e.child,n,r)}function Bi(e,t,n,r,o){n=n.render;var a=t.ref;return aa(t,o),r=ii(e,t,n,r,a,o),null===e||Mi?(t.flags|=1,Fi(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,al(e,t,o))}function ji(e,t,n,r,o,a){if(null===e){var i=n.type;return"function"!=typeof i||Gs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Vs(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,zi(e,t,i,r,o,a))}return i=e.child,0==(o&a)&&(o=i.memoizedProps,(n=null!==(n=n.compare)?n:dr)(o,r)&&e.ref===t.ref)?al(e,t,a):(t.flags|=1,(e=Zs(i,r)).ref=t.ref,e.return=t,t.child=e)}function zi(e,t,n,r,o,a){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Mi=!1,0==(a&o))return t.lanes=e.lanes,al(e,t,a);0!=(16384&e.flags)&&(Mi=!0)}return qi(e,t,n,r,a)}function Ui(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},ks(t,n);else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},ks(t,e),null;t.memoizedState={baseLanes:0},ks(t,null!==a?a.baseLanes:n)}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,ks(t,r);return Fi(e,t,o,n),t.child}function $i(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function qi(e,t,n,r,o){var a=bo(n)?ho:fo.current;return a=go(t,a),aa(t,o),n=ii(e,t,n,r,a,o),null===e||Mi?(t.flags|=1,Fi(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,al(e,t,o))}function Hi(e,t,n,r,o){if(bo(n)){var a=!0;xo(t)}else a=!1;if(aa(t,o),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),ya(t,n,r),xa(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=ia(c):c=go(t,c=bo(n)?ho:fo.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)&&wa(t,i,r,c),la=!1;var p=t.memoizedState;i.state=p,fa(t,r,i,o),s=t.memoizedState,l!==r||p!==s||mo.current||la?("function"==typeof u&&(ga(t,n,u,r),s=t.memoizedState),(l=la||va(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|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=c,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,ca(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:Qo(t.type,l),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=ia(s):s=go(t,s=bo(n)?ho:fo.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)&&wa(t,i,r,s),la=!1,p=t.memoizedState,i.state=p,fa(t,r,i,o);var m=t.memoizedState;l!==d||p!==m||mo.current||la?("function"==typeof f&&(ga(t,n,f,r),m=t.memoizedState),(c=la||va(t,n,c,r,p,m,s))?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,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|=256),r=!1)}return Gi(e,t,n,r,a,o)}function Gi(e,t,n,r,o,a){$i(e,t);var i=0!=(64&t.flags);if(!r&&!i)return o&&ko(t,n,!1),al(e,t,a);r=t.stateNode,Di.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Ca(t,e.child,null,a),t.child=Ca(t,null,l,a)):Fi(e,t,l,a),t.memoizedState=r.state,o&&ko(t,n,!0),t.child}function Zi(e){var t=e.stateNode;t.pendingContext?yo(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yo(0,t.context,!1),Oa(e,t.containerInfo)}var Vi,Wi,Ki,Yi,Qi={dehydrated:null,retryLane:0};function Xi(e,t,n){var r,o=t.pendingProps,a=Fa.current,i=!1;return(r=0!=(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!=(2&a)),r?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===o.fallback||!0===o.unstable_avoidThisFallback||(a|=1),uo(Fa,1&a),null===e?(void 0!==o.fallback&&Ha(t),e=o.children,a=o.fallback,i?(e=Ji(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,e):"number"==typeof o.unstable_expectedLoadTime?(e=Ji(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,t.lanes=33554432,e):((n=Ks({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(o=tl(e,t,o.children,o.fallback,n),i=t.child,a=e.child.memoizedState,i.memoizedState=null===a?{baseLanes:n}:{baseLanes:a.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Qi,o):(n=el(e,t,o.children,n),t.memoizedState=null,n))}function Ji(e,t,n,r){var o=e.mode,a=e.child;return t={mode:"hidden",children:t},0==(2&o)&&null!==a?(a.childLanes=0,a.pendingProps=t):a=Ks(t,o,0,null),n=Ws(n,o,r,null),a.return=e,n.return=e,a.sibling=n,e.child=a,n}function el(e,t,n,r){var o=e.child;return e=o.sibling,n=Zs(o,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,r,o){var a=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 0==(2&a)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Zs(i,l),null!==e?r=Zs(e,r):(r=Ws(r,a,o,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),oa(e.return,t)}function rl(e,t,n,r,o,a){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o,lastEffect:a}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=o,i.lastEffect=a)}function ol(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Fi(e,t,r.children,n),0!=(2&(r=Fa.current)))r=1&r|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(uo(Fa,r),0==(2&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===Ba(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),rl(t,!1,o,n,a,t.lastEffect);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===Ba(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}rl(t,!0,n,null,a,t.lastEffect);break;case"together":rl(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function al(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ul|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Zs(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Zs(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!Ua)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ll(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return bo(t.type)&&vo(),null;case 3:return Ia(),co(mo),co(fo),Ka(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Za(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Wi(t),null;case 5:Ma(t);var a=Na(Pa.current);if(n=t.type,null!==e&&null!=t.stateNode)Ki(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(i(166));return null}if(e=Na(La.current),Za(t)){r=t.stateNode,n=t.type;var l=t.memoizedProps;switch(r[Qr]=t,r[Xr]=l,n){case"dialog":Lr("cancel",r),Lr("close",r);break;case"iframe":case"object":case"embed":Lr("load",r);break;case"video":case"audio":for(e=0;e<_r.length;e++)Lr(_r[e],r);break;case"source":Lr("error",r);break;case"img":case"image":case"link":Lr("error",r),Lr("load",r);break;case"details":Lr("toggle",r);break;case"input":ee(r,l),Lr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!l.multiple},Lr("invalid",r);break;case"textarea":se(r,l),Lr("invalid",r)}for(var c in Se(n,l),e=null,l)l.hasOwnProperty(c)&&(a=l[c],"children"===c?"string"==typeof a?r.textContent!==a&&(e=["children",a]):"number"==typeof a&&r.textContent!==""+a&&(e=["children",""+a]):s.hasOwnProperty(c)&&null!=a&&"onScroll"===c&&Lr("scroll",r));switch(n){case"input":Y(r),re(r,l,!0);break;case"textarea":Y(r),ue(r);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(r.onclick=jr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(c=9===a.nodeType?a:a.ownerDocument,e===de.html&&(e=pe(n)),e===de.html?"script"===n?((e=c.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=c.createElement(n,{is:r.is}):(e=c.createElement(n),"select"===n&&(c=e,r.multiple?c.multiple=!0:r.size&&(c.size=r.size))):e=c.createElementNS(e,n),e[Qr]=t,e[Xr]=r,Vi(e,t,!1,!1),t.stateNode=e,c=Ee(n,r),n){case"dialog":Lr("cancel",e),Lr("close",e),a=r;break;case"iframe":case"object":case"embed":Lr("load",e),a=r;break;case"video":case"audio":for(a=0;a<_r.length;a++)Lr(_r[a],e);a=r;break;case"source":Lr("error",e),a=r;break;case"img":case"image":case"link":Lr("error",e),Lr("load",e),a=r;break;case"details":Lr("toggle",e),a=r;break;case"input":ee(e,r),a=J(e,r),Lr("invalid",e);break;case"option":a=ae(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=o({},r,{value:void 0}),Lr("invalid",e);break;case"textarea":se(e,r),a=le(e,r),Lr("invalid",e);break;default:a=r}Se(n,a);var u=a;for(l in u)if(u.hasOwnProperty(l)){var d=u[l];"style"===l?xe(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&ge(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(s.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Lr("scroll",e):null!=d&&w(e,l,d,c))}switch(n){case"input":Y(e),re(e,r,!1);break;case"textarea":Y(e),ue(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(l=r.value)?ie(e,!!r.multiple,l,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=jr)}$r(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Yi(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Na(Pa.current),Na(La.current),Za(t)?(r=t.stateNode,n=t.memoizedProps,r[Qr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Qr]=t,t.stateNode=r)}return null;case 13:return co(Fa),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Za(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Fa.current)?0===Bl&&(Bl=3):(0!==Bl&&3!==Bl||(Bl=4),null===Ol||0==(134217727&Ul)&&0==(134217727&$l)||vs(Ol,Dl))),(r||n)&&(t.flags|=4),null);case 4:return Ia(),Wi(t),null===e&&Pr(t.stateNode.containerInfo),null;case 10:return ra(t),null;case 19:if(co(Fa),null===(r=t.memoizedState))return null;if(l=0!=(64&t.flags),null===(c=r.rendering))if(l)il(r,!1);else{if(0!==Bl||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(c=Ba(e))){for(t.flags|=64,il(r,!1),null!==(l=c.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(c=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return uo(Fa,1&Fa.current|2),t.child}e=e.sibling}null!==r.tail&&qo()>Zl&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Ba(c))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(r,!0),null===r.tail&&"hidden"===r.tailMode&&!c.alternate&&!Ua)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*qo()-r.renderingStartTime>Zl&&1073741824!==n&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432);r.isBackwards?(c.sibling=t.child,t.child=c):(null!==(n=r.last)?n.sibling=c:t.child=c,r.last=c)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=qo(),n.sibling=null,t=Fa.current,uo(Fa,l?1&t|2:1&t),n):null;case 23:case 24:return Ss(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function sl(e){switch(e.tag){case 1:bo(e.type)&&vo();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Ia(),co(mo),co(fo),Ka(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Ma(e),null;case 13:return co(Fa),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return co(Fa),null;case 4:return Ia(),null;case 10:return ra(e),null;case 23:case 24:return Ss(),null;default:return null}}function cl(e,t){try{var n="",r=t;do{n+=Z(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}}function ul(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}Vi=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}},Wi=function(){},Ki=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Na(La.current);var i,l=null;switch(n){case"input":a=J(e,a),r=J(e,r),l=[];break;case"option":a=ae(e,a),r=ae(e,r),l=[];break;case"select":a=o({},a,{value:void 0}),r=o({},r,{value:void 0}),l=[];break;case"textarea":a=le(e,a),r=le(e,r),l=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=jr)}for(d in Se(n,r),n=null,a)if(!r.hasOwnProperty(d)&&a.hasOwnProperty(d)&&null!=a[d])if("style"===d){var c=a[d];for(i in c)c.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(s.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in r){var u=r[d];if(c=null!=a?a[d]:void 0,r.hasOwnProperty(d)&&u!==c&&(null!=u||null!=c))if("style"===d)if(c){for(i in c)!c.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&c[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(l||(l=[]),l.push(d,n)),n=u;else"dangerouslySetInnerHTML"===d?(u=u?u.__html:void 0,c=c?c.__html:void 0,null!=u&&c!==u&&(l=l||[]).push(d,u)):"children"===d?"string"!=typeof u&&"number"!=typeof u||(l=l||[]).push(d,""+u):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(s.hasOwnProperty(d)?(null!=u&&"onScroll"===d&&Lr("scroll",e),l||c===u||(l=[])):"object"==typeof u&&null!==u&&u.$$typeof===D?u.toString():(l=l||[]).push(d,u))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Yi=function(e,t,n,r){n!==r&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function pl(e,t,n){(n=ua(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Yl||(Yl=!0,Ql=r),ul(0,t)},n}function fl(e,t,n){(n=ua(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return ul(0,t),r(o)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Xl?Xl=new Set([this]):Xl.add(this),ul(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var ml="function"==typeof WeakSet?WeakSet:Set;function hl(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){zs(e,n)}else t.current=null}function gl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Qo(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Zr(t.stateNode.containerInfo))}throw Error(i(163))}function bl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var o=e;r=o.next,0!=(4&(o=o.tag))&&0!=(1&o)&&(Fs(n,e),Ms(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Qo(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&ma(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}ma(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&$r(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&xt(n)))))}throw Error(i(163))}function vl(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var o=n.memoizedProps.style;o=null!=o&&o.hasOwnProperty("display")?o.display:null,r.style.display=we("display",o)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(Eo&&"function"==typeof Eo.onCommitFiberUnmount)try{Eo.onCommitFiberUnmount(So,t)}catch(a){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,o=r.destroy;if(r=r.tag,void 0!==o)if(0!=(4&r))Fs(t,n);else{r=t;try{o()}catch(a){zs(r,a)}}n=n.next}while(n!==e)}break;case 1:if(hl(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(a){zs(t,a)}break;case 5:hl(t);break;case 4:_l(e,t)}}function wl(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function xl(e){return 5===e.tag||3===e.tag||4===e.tag}function kl(e){e:{for(var t=e.return;null!==t;){if(xl(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(i(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||xl(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?Sl(e,n,t):El(e,n,t)}function Sl(e,t,n){var r=e.tag,o=5===r||6===r;if(o)e=o?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=jr));else if(4!==r&&null!==(e=e.child))for(Sl(e,t,n),e=e.sibling;null!==e;)Sl(e,t,n),e=e.sibling}function El(e,t,n){var r=e.tag,o=5===r||6===r;if(o)e=o?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(El(e,t,n),e=e.sibling;null!==e;)El(e,t,n),e=e.sibling}function _l(e,t){for(var n,r,o=t,a=!1;;){if(!a){a=o.return;e:for(;;){if(null===a)throw Error(i(160));switch(n=a.stateNode,a.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}a=a.return}a=!0}if(5===o.tag||6===o.tag){e:for(var l=e,s=o,c=s;;)if(yl(l,c),null!==c.child&&4!==c.tag)c.child.return=c,c=c.child;else{if(c===s)break e;for(;null===c.sibling;){if(null===c.return||c.return===s)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}r?(l=n,s=o.stateNode,8===l.nodeType?l.parentNode.removeChild(s):l.removeChild(s)):n.removeChild(o.stateNode)}else if(4===o.tag){if(null!==o.child){n=o.stateNode.containerInfo,r=!0,o.child.return=o,o=o.child;continue}}else if(yl(e,o),null!==o.child){o.child.return=o,o=o.child;continue}if(o===t)break;for(;null===o.sibling;){if(null===o.return||o.return===t)return;4===(o=o.return).tag&&(a=!1)}o.sibling.return=o.return,o=o.sibling}}function Cl(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{3==(3&r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var o=null!==e?e.memoizedProps:r;e=t.type;var a=t.updateQueue;if(t.updateQueue=null,null!==a){for(n[Xr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),Ee(e,o),t=Ee(e,r),o=0;o<a.length;o+=2){var l=a[o],s=a[o+1];"style"===l?xe(n,s):"dangerouslySetInnerHTML"===l?ge(n,s):"children"===l?be(n,s):w(n,l,s,t)}switch(e){case"input":ne(n,r);break;case"textarea":ce(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(a=r.value)?ie(n,!!r.multiple,a,!1):e!==!!r.multiple&&(null!=r.defaultValue?ie(n,!!r.multiple,r.defaultValue,!0):ie(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,xt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Gl=qo(),vl(t.child,!0)),void Tl(t);case 19:return void Tl(t);case 23:case 24:return void vl(t,null!==t.memoizedState)}throw Error(i(163))}function Tl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new ml),t.forEach((function(t){var r=$s.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Al(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ll=Math.ceil,Rl=x.ReactCurrentDispatcher,Pl=x.ReactCurrentOwner,Nl=0,Ol=null,Il=null,Dl=0,Ml=0,Fl=so(0),Bl=0,jl=null,zl=0,Ul=0,$l=0,ql=0,Hl=null,Gl=0,Zl=1/0;function Vl(){Zl=qo()+500}var Wl,Kl=null,Yl=!1,Ql=null,Xl=null,Jl=!1,es=null,ts=90,ns=[],rs=[],os=null,as=0,is=null,ls=-1,ss=0,cs=0,us=null,ds=!1;function ps(){return 0!=(48&Nl)?qo():-1!==ls?ls:ls=qo()}function fs(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Ho()?1:2;if(0===ss&&(ss=zl),0!==Yo.transition){0!==cs&&(cs=null!==Hl?Hl.pendingLanes:0),e=ss;var t=4186112&~cs;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Ho(),0!=(4&Nl)&&98===e?e=jt(12,ss):e=jt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ss),e}function ms(e,t,n){if(50<as)throw as=0,is=null,Error(i(185));if(null===(e=hs(e,t)))return null;$t(e,t,n),e===Ol&&($l|=t,4===Bl&&vs(e,Dl));var r=Ho();1===t?0!=(8&Nl)&&0==(48&Nl)?ys(e):(gs(e,n),0===Nl&&(Vl(),Wo())):(0==(4&Nl)||98!==r&&99!==r||(null===os?os=new Set([e]):os.add(e)),gs(e,n)),Hl=e}function hs(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function gs(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,o=e.pingedLanes,a=e.expirationTimes,l=e.pendingLanes;0<l;){var s=31-qt(l),c=1<<s,u=a[s];if(-1===u){if(0==(c&r)||0!=(c&o)){u=t,Mt(c);var d=Dt;a[s]=10<=d?u+250:6<=d?u+5e3:-1}}else u<=t&&(e.expiredLanes|=c);l&=~c}if(r=Ft(e,e===Ol?Dl:0),t=Dt,0===r)null!==n&&(n!==Fo&&To(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Fo&&To(n)}15===t?(n=ys.bind(null,e),null===jo?(jo=[n],zo=Co(No,Ko)):jo.push(n),n=Fo):14===t?n=Vo(99,ys.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Vo(n,bs.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bs(e){if(ls=-1,cs=ss=0,0!=(48&Nl))throw Error(i(327));var t=e.callbackNode;if(Ds()&&e.callbackNode!==t)return null;var n=Ft(e,e===Ol?Dl:0);if(0===n)return null;var r=n,o=Nl;Nl|=16;var a=Cs();for(Ol===e&&Dl===r||(Vl(),Es(e,r));;)try{Ls();break}catch(s){_s(e,s)}if(na(),Rl.current=a,Nl=o,null!==Il?r=0:(Ol=null,Dl=0,r=Bl),0!=(zl&$l))Es(e,0);else if(0!==r){if(2===r&&(Nl|=64,e.hydrate&&(e.hydrate=!1,Zr(e.containerInfo)),0!==(n=Bt(e))&&(r=Ts(e,n))),1===r)throw t=jl,Es(e,0),vs(e,n),gs(e,qo()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Ns(e);break;case 3:if(vs(e,n),(62914560&n)===n&&10<(r=Gl+500-qo())){if(0!==Ft(e,0))break;if(((o=e.suspendedLanes)&n)!==n){ps(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=Hr(Ns.bind(null,e),r);break}Ns(e);break;case 4:if(vs(e,n),(4186112&n)===n)break;for(r=e.eventTimes,o=-1;0<n;){var l=31-qt(n);a=1<<l,(l=r[l])>o&&(o=l),n&=~a}if(n=o,10<(n=(120>(n=qo()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ll(n/1960))-n)){e.timeoutHandle=Hr(Ns.bind(null,e),n);break}Ns(e);break;default:throw Error(i(329))}}return gs(e,qo()),e.callbackNode===t?bs.bind(null,e):null}function vs(e,t){for(t&=~ql,t&=~$l,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-qt(t),r=1<<n;e[n]=-1,t&=~r}}function ys(e){if(0!=(48&Nl))throw Error(i(327));if(Ds(),e===Ol&&0!=(e.expiredLanes&Dl)){var t=Dl,n=Ts(e,t);0!=(zl&$l)&&(n=Ts(e,t=Ft(e,t)))}else n=Ts(e,t=Ft(e,0));if(0!==e.tag&&2===n&&(Nl|=64,e.hydrate&&(e.hydrate=!1,Zr(e.containerInfo)),0!==(t=Bt(e))&&(n=Ts(e,t))),1===n)throw n=jl,Es(e,0),vs(e,t),gs(e,qo()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ns(e),gs(e,qo()),null}function ws(e,t){var n=Nl;Nl|=1;try{return e(t)}finally{0===(Nl=n)&&(Vl(),Wo())}}function xs(e,t){var n=Nl;Nl&=-2,Nl|=8;try{return e(t)}finally{0===(Nl=n)&&(Vl(),Wo())}}function ks(e,t){uo(Fl,Ml),Ml|=t,zl|=t}function Ss(){Ml=Fl.current,co(Fl)}function Es(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Gr(n)),null!==Il)for(n=Il.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&vo();break;case 3:Ia(),co(mo),co(fo),Ka();break;case 5:Ma(r);break;case 4:Ia();break;case 13:case 19:co(Fa);break;case 10:ra(r);break;case 23:case 24:Ss()}n=n.return}Ol=e,Il=Zs(e.current,null),Dl=Ml=zl=t,Bl=0,jl=null,ql=$l=Ul=0}function _s(e,t){for(;;){var n=Il;try{if(na(),Ya.current=Pi,ni){for(var r=Ja.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ni=!1}if(Xa=0,ti=ei=Ja=null,ri=!1,Pl.current=null,null===n||null===n.return){Bl=1,jl=t,Il=null;break}e:{var a=e,i=n.return,l=n,s=t;if(t=Dl,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==s&&"object"==typeof s&&"function"==typeof s.then){var c=s;if(0==(2&l.mode)){var u=l.alternate;u?(l.updateQueue=u.updateQueue,l.memoizedState=u.memoizedState,l.lanes=u.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=0!=(1&Fa.current),p=i;do{var f;if(f=13===p.tag){var m=p.memoizedState;if(null!==m)f=null!==m.dehydrated;else{var h=p.memoizedProps;f=void 0!==h.fallback&&(!0!==h.unstable_avoidThisFallback||!d)}}if(f){var g=p.updateQueue;if(null===g){var b=new Set;b.add(c),p.updateQueue=b}else g.add(c);if(0==(2&p.mode)){if(p.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var v=ua(-1,1);v.tag=2,da(l,v)}l.lanes|=1;break e}s=void 0,l=t;var y=a.pingCache;if(null===y?(y=a.pingCache=new dl,s=new Set,y.set(c,s)):void 0===(s=y.get(c))&&(s=new Set,y.set(c,s)),!s.has(l)){s.add(l);var w=Us.bind(null,a,c,l);c.then(w,w)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);s=Error((V(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Bl&&(Bl=2),s=cl(s,l),p=i;do{switch(p.tag){case 3:a=s,p.flags|=4096,t&=-t,p.lanes|=t,pa(p,pl(0,a,t));break e;case 1:a=s;var x=p.type,k=p.stateNode;if(0==(64&p.flags)&&("function"==typeof x.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Xl||!Xl.has(k)))){p.flags|=4096,t&=-t,p.lanes|=t,pa(p,fl(p,a,t));break e}}p=p.return}while(null!==p)}Ps(n)}catch(S){t=S,Il===n&&null!==n&&(Il=n=n.return);continue}break}}function Cs(){var e=Rl.current;return Rl.current=Pi,null===e?Pi:e}function Ts(e,t){var n=Nl;Nl|=16;var r=Cs();for(Ol===e&&Dl===t||Es(e,t);;)try{As();break}catch(o){_s(e,o)}if(na(),Nl=n,Rl.current=r,null!==Il)throw Error(i(261));return Ol=null,Dl=0,Bl}function As(){for(;null!==Il;)Rs(Il)}function Ls(){for(;null!==Il&&!Ao();)Rs(Il)}function Rs(e){var t=Wl(e.alternate,e,Ml);e.memoizedProps=e.pendingProps,null===t?Ps(e):Il=t,Pl.current=null}function Ps(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ll(n,t,Ml)))return void(Il=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ml)||0==(4&n.mode)){for(var r=0,o=n.child;null!==o;)r|=o.lanes|o.childLanes,o=o.sibling;n.childLanes=r}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=sl(t)))return n.flags&=2047,void(Il=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Il=t);Il=t=e}while(null!==t);0===Bl&&(Bl=5)}function Ns(e){var t=Ho();return Zo(99,Os.bind(null,e,t)),null}function Os(e,t){do{Ds()}while(null!==es);if(0!=(48&Nl))throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var r=n.lanes|n.childLanes,o=r,a=e.pendingLanes&~o;e.pendingLanes=o,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=o,e.mutableReadLanes&=o,e.entangledLanes&=o,o=e.entanglements;for(var l=e.eventTimes,s=e.expirationTimes;0<a;){var c=31-qt(a),u=1<<c;o[c]=0,l[c]=-1,s[c]=-1,a&=~u}if(null!==os&&0==(24&r)&&os.has(e)&&os.delete(e),e===Ol&&(Il=Ol=null,Dl=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(o=Nl,Nl|=32,Pl.current=null,zr=Wt,gr(l=hr())){if("selectionStart"in l)s={start:l.selectionStart,end:l.selectionEnd};else e:if(s=(s=l.ownerDocument)&&s.defaultView||window,(u=s.getSelection&&s.getSelection())&&0!==u.rangeCount){s=u.anchorNode,a=u.anchorOffset,c=u.focusNode,u=u.focusOffset;try{s.nodeType,c.nodeType}catch(C){s=null;break e}var d=0,p=-1,f=-1,m=0,h=0,g=l,b=null;t:for(;;){for(var v;g!==s||0!==a&&3!==g.nodeType||(p=d+a),g!==c||0!==u&&3!==g.nodeType||(f=d+u),3===g.nodeType&&(d+=g.nodeValue.length),null!==(v=g.firstChild);)b=g,g=v;for(;;){if(g===l)break t;if(b===s&&++m===a&&(p=d),b===c&&++h===u&&(f=d),null!==(v=g.nextSibling))break;b=(g=b).parentNode}g=v}s=-1===p||-1===f?null:{start:p,end:f}}else s=null;s=s||{start:0,end:0}}else s=null;Ur={focusedElem:l,selectionRange:s},Wt=!1,us=null,ds=!1,Kl=r;do{try{Is()}catch(C){if(null===Kl)throw Error(i(330));zs(Kl,C),Kl=Kl.nextEffect}}while(null!==Kl);us=null,Kl=r;do{try{for(l=e;null!==Kl;){var y=Kl.flags;if(16&y&&be(Kl.stateNode,""),128&y){var w=Kl.alternate;if(null!==w){var x=w.ref;null!==x&&("function"==typeof x?x(null):x.current=null)}}switch(1038&y){case 2:kl(Kl),Kl.flags&=-3;break;case 6:kl(Kl),Kl.flags&=-3,Cl(Kl.alternate,Kl);break;case 1024:Kl.flags&=-1025;break;case 1028:Kl.flags&=-1025,Cl(Kl.alternate,Kl);break;case 4:Cl(Kl.alternate,Kl);break;case 8:_l(l,s=Kl);var k=s.alternate;wl(s),null!==k&&wl(k)}Kl=Kl.nextEffect}}catch(C){if(null===Kl)throw Error(i(330));zs(Kl,C),Kl=Kl.nextEffect}}while(null!==Kl);if(x=Ur,w=hr(),y=x.focusedElem,l=x.selectionRange,w!==y&&y&&y.ownerDocument&&mr(y.ownerDocument.documentElement,y)){null!==l&&gr(y)&&(w=l.start,void 0===(x=l.end)&&(x=w),"selectionStart"in y?(y.selectionStart=w,y.selectionEnd=Math.min(x,y.value.length)):(x=(w=y.ownerDocument||document)&&w.defaultView||window).getSelection&&(x=x.getSelection(),s=y.textContent.length,k=Math.min(l.start,s),l=void 0===l.end?k:Math.min(l.end,s),!x.extend&&k>l&&(s=l,l=k,k=s),s=fr(y,k),a=fr(y,l),s&&a&&(1!==x.rangeCount||x.anchorNode!==s.node||x.anchorOffset!==s.offset||x.focusNode!==a.node||x.focusOffset!==a.offset)&&((w=w.createRange()).setStart(s.node,s.offset),x.removeAllRanges(),k>l?(x.addRange(w),x.extend(a.node,a.offset)):(w.setEnd(a.node,a.offset),x.addRange(w))))),w=[];for(x=y;x=x.parentNode;)1===x.nodeType&&w.push({element:x,left:x.scrollLeft,top:x.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<w.length;y++)(x=w[y]).element.scrollLeft=x.left,x.element.scrollTop=x.top}Wt=!!zr,Ur=zr=null,e.current=n,Kl=r;do{try{for(y=e;null!==Kl;){var S=Kl.flags;if(36&S&&bl(y,Kl.alternate,Kl),128&S){w=void 0;var E=Kl.ref;if(null!==E){var _=Kl.stateNode;Kl.tag,w=_,"function"==typeof E?E(w):E.current=w}}Kl=Kl.nextEffect}}catch(C){if(null===Kl)throw Error(i(330));zs(Kl,C),Kl=Kl.nextEffect}}while(null!==Kl);Kl=null,Bo(),Nl=o}else e.current=n;if(Jl)Jl=!1,es=e,ts=t;else for(Kl=r;null!==Kl;)t=Kl.nextEffect,Kl.nextEffect=null,8&Kl.flags&&((S=Kl).sibling=null,S.stateNode=null),Kl=t;if(0===(r=e.pendingLanes)&&(Xl=null),1===r?e===is?as++:(as=0,is=e):as=0,n=n.stateNode,Eo&&"function"==typeof Eo.onCommitFiberRoot)try{Eo.onCommitFiberRoot(So,n,void 0,64==(64&n.current.flags))}catch(C){}if(gs(e,qo()),Yl)throw Yl=!1,e=Ql,Ql=null,e;return 0!=(8&Nl)||Wo(),null}function Is(){for(;null!==Kl;){var e=Kl.alternate;ds||null===us||(0!=(8&Kl.flags)?Je(Kl,us)&&(ds=!0):13===Kl.tag&&Al(e,Kl)&&Je(Kl,us)&&(ds=!0));var t=Kl.flags;0!=(256&t)&&gl(e,Kl),0==(512&t)||Jl||(Jl=!0,Vo(97,(function(){return Ds(),null}))),Kl=Kl.nextEffect}}function Ds(){if(90!==ts){var e=97<ts?97:ts;return ts=90,Zo(e,Bs)}return!1}function Ms(e,t){ns.push(t,e),Jl||(Jl=!0,Vo(97,(function(){return Ds(),null})))}function Fs(e,t){rs.push(t,e),Jl||(Jl=!0,Vo(97,(function(){return Ds(),null})))}function Bs(){if(null===es)return!1;var e=es;if(es=null,0!=(48&Nl))throw Error(i(331));var t=Nl;Nl|=32;var n=rs;rs=[];for(var r=0;r<n.length;r+=2){var o=n[r],a=n[r+1],l=o.destroy;if(o.destroy=void 0,"function"==typeof l)try{l()}catch(c){if(null===a)throw Error(i(330));zs(a,c)}}for(n=ns,ns=[],r=0;r<n.length;r+=2){o=n[r],a=n[r+1];try{var s=o.create;o.destroy=s()}catch(c){if(null===a)throw Error(i(330));zs(a,c)}}for(s=e.current.firstEffect;null!==s;)e=s.nextEffect,s.nextEffect=null,8&s.flags&&(s.sibling=null,s.stateNode=null),s=e;return Nl=t,Wo(),!0}function js(e,t,n){da(e,t=pl(0,t=cl(n,t),1)),t=ps(),null!==(e=hs(e,1))&&($t(e,1,t),gs(e,t))}function zs(e,t){if(3===e.tag)js(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){js(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Xl||!Xl.has(r))){var o=fl(n,e=cl(t,e),1);if(da(n,o),o=ps(),null!==(n=hs(n,1)))$t(n,1,o),gs(n,o);else if("function"==typeof r.componentDidCatch&&(null===Xl||!Xl.has(r)))try{r.componentDidCatch(t,e)}catch(a){}break}}n=n.return}}function Us(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ps(),e.pingedLanes|=e.suspendedLanes&n,Ol===e&&(Dl&n)===n&&(4===Bl||3===Bl&&(62914560&Dl)===Dl&&500>qo()-Gl?Es(e,0):ql|=n),gs(e,t)}function $s(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Ho()?1:2:(0===ss&&(ss=zl),0===(t=zt(62914560&~ss))&&(t=4194304))),n=ps(),null!==(e=hs(e,t))&&($t(e,t,n),gs(e,n))}function qs(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Hs(e,t,n,r){return new qs(e,t,n,r)}function Gs(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Zs(e,t){var n=e.alternate;return null===n?((n=Hs(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Vs(e,t,n,r,o,a){var l=2;if(r=e,"function"==typeof e)Gs(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case E:return Ws(n.children,o,a,t);case M:l=8,o|=16;break;case _:l=8,o|=1;break;case C:return(e=Hs(12,n,t,8|o)).elementType=C,e.type=C,e.lanes=a,e;case R:return(e=Hs(13,n,t,o)).type=R,e.elementType=R,e.lanes=a,e;case P:return(e=Hs(19,n,t,o)).elementType=P,e.lanes=a,e;case F:return Ks(n,o,a,t);case B:return(e=Hs(24,n,t,o)).elementType=B,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:l=10;break e;case A:l=9;break e;case L:l=11;break e;case N:l=14;break e;case O:l=16,r=null;break e;case I:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Hs(l,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Ws(e,t,n,r){return(e=Hs(7,e,r,t)).lanes=n,e}function Ks(e,t,n,r){return(e=Hs(23,e,r,t)).elementType=F,e.lanes=n,e}function Ys(e,t,n){return(e=Hs(6,e,null,t)).lanes=n,e}function Qs(e,t,n){return(t=Hs(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Xs(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=Ut(0),this.expirationTimes=Ut(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ut(0),this.mutableSourceEagerHydrationData=null}function Js(e,t,n,r){var o=t.current,a=ps(),l=fs(o);e:if(n){t:{if(Ke(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(bo(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);throw Error(i(171))}if(1===n.tag){var c=n.type;if(bo(c)){n=wo(n,c,s);break e}}n=s}else n=po;return null===t.context?t.context=n:t.pendingContext=n,(t=ua(a,l)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),da(o,t),ms(o,l,a),l}function ec(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nc(e,t){tc(e,t),(e=e.alternate)&&tc(e,t)}function rc(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Xs(e,t,null!=n&&!0===n.hydrate),t=Hs(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,sa(t),e[Jr]=n.current,Pr(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var o=(t=r[e])._getVersion;o=o(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,o]:n.mutableSourceEagerHydrationData.push(t,o)}this._internalRoot=n}function oc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ac(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a._internalRoot;if("function"==typeof o){var l=o;o=function(){var e=ec(i);l.call(e)}}Js(t,i,e,o)}else{if(a=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new rc(e,0,t?{hydrate:!0}:void 0)}(n,r),i=a._internalRoot,"function"==typeof o){var s=o;o=function(){var e=ec(i);s.call(e)}}xs((function(){Js(t,i,e,o)}))}return ec(i)}function ic(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!oc(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Wl=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||mo.current)Mi=!0;else{if(0==(n&r)){switch(Mi=!1,t.tag){case 3:Zi(t),Va();break;case 5:Da(t);break;case 1:bo(t.type)&&xo(t);break;case 4:Oa(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var o=t.type._context;uo(Xo,o._currentValue),o._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Xi(e,t,n):(uo(Fa,1&Fa.current),null!==(t=al(e,t,n))?t.sibling:null);uo(Fa,1&Fa.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return ol(e,t,n);t.flags|=64}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),uo(Fa,Fa.current),r)break;return null;case 23:case 24:return t.lanes=0,Ui(e,t,n)}return al(e,t,n)}Mi=0!=(16384&e.flags)}else Mi=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,o=go(t,fo.current),aa(t,n),o=ii(null,t,r,e,o,n),t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,bo(r)){var a=!0;xo(t)}else a=!1;t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,sa(t);var l=r.getDerivedStateFromProps;"function"==typeof l&&ga(t,r,l,e),o.updater=ba,t.stateNode=o,o._reactInternals=t,xa(t,r,e,n),t=Gi(null,t,r,!0,a,n)}else t.tag=0,Fi(null,t,o,n),t=t.child;return t;case 16:o=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,o=(a=o._init)(o._payload),t.type=o,a=t.tag=function(e){if("function"==typeof e)return Gs(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===N)return 14}return 2}(o),e=Qo(o,e),a){case 0:t=qi(null,t,o,e,n);break e;case 1:t=Hi(null,t,o,e,n);break e;case 11:t=Bi(null,t,o,e,n);break e;case 14:t=ji(null,t,o,Qo(o.type,e),r,n);break e}throw Error(i(306,o,""))}return t;case 0:return r=t.type,o=t.pendingProps,qi(e,t,r,o=t.elementType===r?o:Qo(r,o),n);case 1:return r=t.type,o=t.pendingProps,Hi(e,t,r,o=t.elementType===r?o:Qo(r,o),n);case 3:if(Zi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,o=null!==(o=t.memoizedState)?o.element:null,ca(e,t),fa(t,r,null,n),(r=t.memoizedState.element)===o)Va(),t=al(e,t,n);else{if((a=(o=t.stateNode).hydrate)&&(za=Vr(t.stateNode.containerInfo.firstChild),ja=t,a=Ua=!0),a){if(null!=(e=o.mutableSourceEagerHydrationData))for(o=0;o<e.length;o+=2)(a=e[o])._workInProgressVersionPrimary=e[o+1],Wa.push(a);for(n=Ta(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Fi(e,t,r,n),Va();t=t.child}return t;case 5:return Da(t),null===e&&Ha(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,l=o.children,qr(r,o)?l=null:null!==a&&qr(r,a)&&(t.flags|=16),$i(e,t),Fi(e,t,l,n),t.child;case 6:return null===e&&Ha(t),null;case 13:return Xi(e,t,n);case 4:return Oa(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ca(t,null,r,n):Fi(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Bi(e,t,r,o=t.elementType===r?o:Qo(r,o),n);case 7:return Fi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Fi(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,o=t.pendingProps,l=t.memoizedProps,a=o.value;var s=t.type._context;if(uo(Xo,s._currentValue),s._currentValue=a,null!==l)if(s=l.value,0===(a=cr(s,a)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(s,a):1073741823))){if(l.children===o.children&&!mo.current){t=al(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var c=s.dependencies;if(null!==c){l=s.child;for(var u=c.firstContext;null!==u;){if(u.context===r&&0!=(u.observedBits&a)){1===s.tag&&((u=ua(-1,n&-n)).tag=2,da(s,u)),s.lanes|=n,null!==(u=s.alternate)&&(u.lanes|=n),oa(s.return,n),c.lanes|=n;break}u=u.next}}else l=10===s.tag&&s.type===t.type?null:s.child;if(null!==l)l.return=s;else for(l=s;null!==l;){if(l===t){l=null;break}if(null!==(s=l.sibling)){s.return=l.return,l=s;break}l=l.return}s=l}Fi(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=(a=t.pendingProps).children,aa(t,n),r=r(o=ia(o,a.unstable_observedBits)),t.flags|=1,Fi(e,t,r,n),t.child;case 14:return a=Qo(o=t.type,t.pendingProps),ji(e,t,o,a=Qo(o.type,a),r,n);case 15:return zi(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:Qo(r,o),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,bo(r)?(e=!0,xo(t)):e=!1,aa(t,n),ya(t,r,o),xa(t,r,o,n),Gi(null,t,r,!0,e,n);case 19:return ol(e,t,n);case 23:case 24:return Ui(e,t,n)}throw Error(i(156,t.tag))},rc.prototype.render=function(e){Js(e,this._internalRoot,null,null)},rc.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Js(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(ms(e,4,ps()),nc(e,4))},tt=function(e){13===e.tag&&(ms(e,67108864,ps()),nc(e,67108864))},nt=function(e){if(13===e.tag){var t=ps(),n=fs(e);ms(e,n,t),nc(e,n)}},rt=function(e,t){return t()},Ce=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=oo(r);if(!o)throw Error(i(90));Q(r),ne(r,o)}}}break;case"textarea":ce(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Ne=ws,Oe=function(e,t,n,r,o){var a=Nl;Nl|=4;try{return Zo(98,e.bind(null,t,n,r,o))}finally{0===(Nl=a)&&(Vl(),Wo())}},Ie=function(){0==(49&Nl)&&(function(){if(null!==os){var e=os;os=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,gs(e,qo())}))}Wo()}(),Ds())},De=function(e,t){var n=Nl;Nl|=2;try{return e(t)}finally{0===(Nl=n)&&(Vl(),Wo())}};var lc={Events:[no,ro,oo,Re,Pe,Ds,{current:!1}]},sc={findFiberByHostInstance:to,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},cc={bundleType:sc.bundleType,version:sc.version,rendererPackageName:sc.rendererPackageName,rendererConfig:sc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:x.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Xe(e))?null:e.stateNode},findFiberByHostInstance:sc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var uc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!uc.isDisabled&&uc.supportsFiber)try{So=uc.inject(cc),Eo=uc}catch(he){}}t.createPortal=ic,t.hydrate=function(e,t,n){if(!oc(t))throw Error(i(200));return ac(null,e,t,!0,n)}},3935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(4448)},9590: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}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>G,ql:()=>J});var r=n(7294),o=n(5697),a=n.n(o),i=n(9590),l=n.n(i),s=n(1143),c=n.n(s),u=n(6774),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,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,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 g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),x={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(x).reduce((function(e,t){return e[x[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},E=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},_=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)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),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}),[])},A=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var 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()},L=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},R=function(e){return Array.isArray(e)?e.join(""):e},P=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},O=[g.NOSCRIPT,g.SCRIPT,g.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},M=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[x[n]||n]=e[n],t}),t)},F=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=x[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},B=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=M(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=R(t);return o?"<"+e+' data-rh="true" '+o+">"+I(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+I(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return M(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+I(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===O.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},j=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 m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=P(e.metaTags,y),a=P(t,b),i=P(n,v);return{priorityMethods:{toComponent:function(){return[].concat(F(g.META,o.priority),F(g.LINK,a.priority),F(g.SCRIPT,i.priority))},toString:function(){return B(g.META,o.priority,r)+" "+B(g.LINK,a.priority,r)+" "+B(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=m.priorityMethods,u=m.linkTags,d=m.metaTags,p=m.scriptTags}return{priority:f,base:B(g.BASE,t,r),bodyAttributes:B("bodyAttributes",n,r),htmlAttributes:B("htmlAttributes",o,r),link:B(g.LINK,u,r),meta:B(g.META,d,r),noscript:B(g.NOSCRIPT,a,r),script:B(g.SCRIPT,p,r),style:B(g.STYLE,i,r),title:B(g.TITLE,{title:s,titleAttributes:c},r)}},z=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=j({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=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 U(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement($.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 Z=function(e,t){var n,r=document.head||document.querySelector(g.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}},V=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(","))}},W=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;V(g.BODY,e.bodyAttributes),V(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),V(g.TITLE,t)}(u,d);var p={baseTag:Z(g.BASE,n),linkTags:Z(g.LINK,o),metaTags:Z(g.META,a),noscriptTags:Z(g.NOSCRIPT,i),scriptTags:Z(g.SCRIPT,s),styleTags:Z(g.STYLE,c)},f={},m={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(m[e]=p[e].oldTags)})),t&&t(),l(e,f,m)},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:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(g.LINK,["rel","href"],e),metaTags:A(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:A(g.SCRIPT,["src","innerHTML"],e),styleTags:A(g.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});G.canUseDOM?(t=a,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){W(t,(function(){K=null}))})):(W(t),K=null)):j&&(o=j(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 Q=["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()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return 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 g.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case g.BODY:return p({},o,{bodyAttributes:p({},a)});case g.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=h(r,Q),l=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,a),s){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.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=h(e,X),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof U||(a=new U(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement($.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"},9921:(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,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function x(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 g:case h:case s:return e;default:return t}}case o:return t}}}function k(e){return x(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=g,t.Memo=h,t.Portal=o,t.Profiler=l,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||x(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return x(e)===c},t.isContextProvider=function(e){return x(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return x(e)===p},t.isFragment=function(e){return x(e)===a},t.isLazy=function(e){return x(e)===g},t.isMemo=function(e){return x(e)===h},t.isPortal=function(e){return x(e)===o},t.isProfiler=function(e){return x(e)===l},t.isStrictMode=function(e){return x(e)===i},t.isSuspense=function(e){return x(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===l||e===i||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===s||e.$$typeof===c||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===w||e.$$typeof===b)},t.typeOf=x},9864:(e,t,n)=>{"use strict";e.exports=n(9921)},8356:(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(7294),s=n(5697),c=[],u=[];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 m(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return c.push(g),"function"==typeof m.webpack&&u.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),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}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),a(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),p}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(p,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function 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)}))}a(g,"propTypes",{report:s.func.isRequired}),a(g,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=h},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>l,f:()=>i});var r=n(6550),o=n(7462),a=n(7294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.LX)(t,e):n.length?n[n.length-1].match:r.F0.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.rs,n,e.map((function(e,n){return a.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.Z)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.Z)({},n,t,{route:e}))}})}))):null}},3727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>y,VK:()=>u,rU:()=>g});var r=n(6550),o=n(5068),a=n(7294),i=n(9318),l=n(7462),s=n(3366),c=n(8776),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.lX)(t.props),t}return(0,o.Z)(t,e),t.prototype.render=function(){return a.createElement(r.F0,{history:this.history,children:this.props.children})},t}(a.Component);a.Component;var d=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},f=function(e){return e},m=a.forwardRef;void 0===m&&(m=f);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,s.Z)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.Z)({},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=f!==m&&t||n,a.createElement("a",u)}));var g=m((function(e,t){var n=e.component,o=void 0===n?h:n,u=e.replace,g=e.to,b=e.innerRef,v=(0,s.Z)(e,["component","replace","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=e.history,r=p(d(g,e.location),e.location),s=r?n.createHref(r):"",h=(0,l.Z)({},v,{href:s,navigate:function(){var t=d(g,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(p(t));(u||r?n.replace:n.push)(t)}});return f!==m?h.ref=t||b:h.innerRef=b,a.createElement(o,h)}))})),b=function(e){return e},v=a.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,f=e.activeStyle,m=e.className,h=e.exact,y=e.isActive,w=e.location,x=e.sensitive,k=e.strict,S=e.style,E=e.to,_=e.innerRef,C=(0,s.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=w||e.location,i=p(d(E,n),n),s=i.pathname,T=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.LX)(n.pathname,{path:T,exact:h,sensitive:x,strict:k}):null,L=!!(y?y(A,n):A),R="function"==typeof m?m(L):m,P="function"==typeof S?S(L):S;L&&(R=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(R,u),P=(0,l.Z)({},P,f));var N=(0,l.Z)({"aria-current":L&&o||null,className:R,style:P,to:i},C);return b!==v?N.ref=t||_:N.innerRef=_,a.createElement(g,N)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>E,F0:()=>y,LX:()=>S,TH:()=>O,k6:()=>N,rs:()=>R,s6:()=>v});var r=n(5068),o=n(7294),a=n(5697),i=n.n(a),l=n(9318),s=n(8776),c=n(7462),u=n(4779),d=n.n(u),p=(n(9864),n(3366)),f=(n(8679),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=o.createContext||function(e,t){var n,a,l="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[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.Z)(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!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.Z)(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}},g=function(e){var t=h();return t.displayName=e,t},b=g("Router-History"),v=g("Router"),y=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(v.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={},x=1e4,k=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 k<x&&(r[e]=a,k++),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 E=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,s.Z)(!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.Z)({},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(v.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){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=_(e);return 0!==t.pathname.indexOf(n)?t:(0,c.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,l.Ep)(e)}function A(e){return function(){(0,s.Z)(!1)}}function L(){}o.Component;var R=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,s.Z)(!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.Z)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var P=o.useContext;function N(){return P(b)}function O(){return P(v).location}},2408:(e,t,n)=>{"use strict";var r=n(7418),o=60103,a=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,s=60112;t.Suspense=60113;var c=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;o=d("react.element"),a=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),s=d("react.forward_ref"),t.Suspense=d("react.suspense"),c=d("react.memo"),u=d("react.lazy")}var p="function"==typeof Symbol&&Symbol.iterator;function f(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h={};function g(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}g.prototype.isReactComponent={},g.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(f(85));this.updater.enqueueSetState(this,e,t,"setState")},g.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=g.prototype;var y=v.prototype=new b;y.constructor=v,r(y,g.prototype),y.isPureReactComponent=!0;var w={current:null},x=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,n){var r,a={},i=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,r)&&!k.hasOwnProperty(r)&&(a[r]=t[r]);var s=arguments.length-2;if(1===s)a.children=n;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(r in s=e.defaultProps)void 0===a[r]&&(a[r]=s[r]);return{$$typeof:o,type:e,key:i,ref:l,props:a,_owner:w.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var _=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function T(e,t,n,r,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case o:case a:s=!0}}if(s)return i=i(s=e),e=""===r?"."+C(s,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(_,"$&/")+"/"),T(i,t,n,"",(function(e){return e}))):null!=i&&(E(i)&&(i=function(e,t){return{$$typeof:o,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(_,"$&/")+"/")+e)),t.push(i)),1;if(s=0,r=""===r?".":r+":",Array.isArray(e))for(var c=0;c<e.length;c++){var u=r+C(l=e[c],c);s+=T(l,t,n,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=T(l=l.value,t,n,u=r+C(l,c++),i);else if("object"===l)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return s}function A(e,t,n){if(null==e)return e;var r=[],o=0;return T(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function L(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var R={current:null};function P(){var e=R.current;if(null===e)throw Error(f(321));return e}var N={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!E(e))throw Error(f(143));return e}},t.Component=g,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.cloneElement=function(e,t,n){if(null==e)throw Error(f(267,e));var a=r({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,s=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)x.call(t,u)&&!k.hasOwnProperty(u)&&(a[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)a.children=n;else if(1<u){c=Array(u);for(var d=0;d<u;d++)c[d]=arguments[d+2];a.children=c}return{$$typeof:o,type:e.type,key:i,ref:l,props:a,_owner:s}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=S,t.createFactory=function(e){var t=S.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:s,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:c,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return P().useCallback(e,t)},t.useContext=function(e,t){return P().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return P().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return P().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return P().useLayoutEffect(e,t)},t.useMemo=function(e,t){return P().useMemo(e,t)},t.useReducer=function(e,t,n){return P().useReducer(e,t,n)},t.useRef=function(e){return P().useRef(e)},t.useState=function(e){return P().useState(e)},t.version="17.0.2"},7294:(e,t,n)=>{"use strict";e.exports=n(2408)},53:(e,t)=>{"use strict";var n,r,o,a;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,u=null,d=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(d,0))},r=function(e,t){u=setTimeout(e,t)},o=function(){clearTimeout(u)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var h=!1,g=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},a=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var w=new MessageChannel,x=w.port2;w.port1.onmessage=function(){if(null!==g){var e=t.unstable_now();y=e+v;try{g(!0,e)?x.postMessage(null):(h=!1,g=null)}catch(n){throw x.postMessage(null),n}}else h=!1},n=function(e){g=e,h||(h=!0,x.postMessage(null))},r=function(e,n){b=p((function(){e(t.unstable_now())}),n)},o=function(){f(b),b=-1}}function k(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,o=e[r];if(!(void 0!==o&&0<_(o,t)))break e;e[r]=t,e[n]=o,n=r}}function S(e){return void 0===(e=e[0])?null:e}function E(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length;r<o;){var a=2*(r+1)-1,i=e[a],l=a+1,s=e[l];if(void 0!==i&&0>_(i,n))void 0!==s&&0>_(s,i)?(e[r]=s,e[l]=n,r=l):(e[r]=i,e[a]=n,r=a);else{if(!(void 0!==s&&0>_(s,n)))break e;e[r]=s,e[l]=n,r=l}}}return t}return null}function _(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],T=[],A=1,L=null,R=3,P=!1,N=!1,O=!1;function I(e){for(var t=S(T);null!==t;){if(null===t.callback)E(T);else{if(!(t.startTime<=e))break;E(T),t.sortIndex=t.expirationTime,k(C,t)}t=S(T)}}function D(e){if(O=!1,I(e),!N)if(null!==S(C))N=!0,n(M);else{var t=S(T);null!==t&&r(D,t.startTime-e)}}function M(e,n){N=!1,O&&(O=!1,o()),P=!0;var a=R;try{for(I(n),L=S(C);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,R=L.priorityLevel;var l=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?L.callback=l:L===S(C)&&E(C),I(n)}else E(C);L=S(C)}if(null!==L)var s=!0;else{var c=S(T);null!==c&&r(D,c.startTime-n),s=!1}return s}finally{L=null,R=a,P=!1}}var F=a;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){N||P||(N=!0,n(M))},t.unstable_getCurrentPriorityLevel=function(){return R},t.unstable_getFirstCallbackNode=function(){return S(C)},t.unstable_next=function(e){switch(R){case 1:case 2:case 3:var t=3;break;default:t=R}var n=R;R=t;try{return e()}finally{R=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=F,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=R;R=e;try{return t()}finally{R=n}},t.unstable_scheduleCallback=function(e,a,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:A++,callback:a,priorityLevel:e,startTime:i,expirationTime:s=i+s,sortIndex:-1},i>l?(e.sortIndex=i,k(T,e),null===S(C)&&e===S(T)&&(O?o():O=!0,r(D,i-l))):(e.sortIndex=s,k(C,e),N||P||(N=!0,n(M))),e},t.unstable_wrapCallback=function(e){var t=R;return function(){var n=R;R=t;try{return e.apply(this,arguments)}finally{R=n}}}},3840:(e,t,n)=>{"use strict";e.exports=n(53)},6774: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}},3250:(e,t,n)=>{"use strict";var r=n(7294);var o="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},a=r.useState,i=r.useEffect,l=r.useLayoutEffect,s=r.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),o=r[0].inst,u=r[1];return l((function(){o.value=n,o.getSnapshot=t,c(o)&&u({inst:o})}),[e,n,t]),i((function(){return c(o)&&u({inst:o}),e((function(){c(o)&&u({inst:o})}))}),[e]),s(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:u},1688:(e,t,n)=>{"use strict";e.exports=n(3250)},6809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Routr Docs",tagline:"The future of programmable SIP servers",favicon:"img/favicon.ico",url:"https://routr.io",baseUrl:"/",organizationName:"fonoster",projectName:"routr",onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{lastVersion:"current",versions:{current:{label:"2.0.0",path:"2.0.0"}},sidebarPath:"/home/runner/work/routr/routr/docs/sidebars.js",editUrl:"https://github.com/fonoster/routr-website/edit/main"},theme:{customCss:"/home/runner/work/routr/routr/docs/src/css/custom.css"},gtag:{trackingID:"G-JX93S6PKN4",anonymizeIP:!0}}]],themeConfig:{algolia:{appId:"VLT67PBOP0",apiKey:"ac3a064eec614a9ade617bafd5de55de",indexName:"routr",contextualSearch:!1,searchParameters:{},searchPagePath:"search"},image:"img/docusaurus-social-card.jpg",navbar:{logo:{alt:"Routr Logo",src:"img/logo.svg"},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers",label:"Training",position:"left"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://github.com/fonoster/routr",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Quick Links",items:[{label:"Docs",to:"/docs/2.0.0/overview/introduction"},{label:"Training",href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers"}]},{title:"Community",items:[{label:"GitHub Discussions",href:"https://github.com/fonoster/routr/discussions"},{label:"Discord",href:"https://discord.gg/4QWgSz4hTC"},{label:"Twitter",href:"https://twitter.com/fonoster"}]},{title:"More",items:[{label:"Blog",to:"https://learn.fonoster.com/blog"},{label:"GitHub",href:"https://github.com/fonoster/routr"}]}],copyright:"Copyright \xa9 2024 Fonoster, Inc. 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:!0,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{mermaid:!1}}},7462:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{Z:()=>r})},5068:(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,{Z:()=>o})},3366:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}n.d(t,{Z:()=>r})},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>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)}}},7529:e=>{"use strict";e.exports={}},6887:e=>{"use strict";e.exports=JSON.parse('{"/search-9b7":{"__comp":"1a4e3797","__context":{"plugin":"a0c5838c"}},"/docs/1.x.x-18b":{"__comp":"1be78505","__context":{"plugin":"deaab6a5"},"versionMetadata":"8f5f22a9"},"/docs/1.x.x/administration/cli/cheatsheet-375":{"__comp":"17896441","content":"b5de05fe"},"/docs/1.x.x/administration/cli/installation-4dc":{"__comp":"17896441","content":"5514a4b8"},"/docs/1.x.x/administration/cli/remote-access-97c":{"__comp":"17896441","content":"bc1a89ad"},"/docs/1.x.x/administration/webconsole-62a":{"__comp":"17896441","content":"093b4e4f"},"/docs/1.x.x/api/agents/create-b97":{"__comp":"17896441","content":"9840208a"},"/docs/1.x.x/api/agents/delete-b72":{"__comp":"17896441","content":"1cd31f12"},"/docs/1.x.x/api/agents/get-f9a":{"__comp":"17896441","content":"ec64d50d"},"/docs/1.x.x/api/agents/list-4c3":{"__comp":"17896441","content":"6c35bbce"},"/docs/1.x.x/api/agents/update-b29":{"__comp":"17896441","content":"19dd4331"},"/docs/1.x.x/api/config/get-4bc":{"__comp":"17896441","content":"71153375"},"/docs/1.x.x/api/config/update-983":{"__comp":"17896441","content":"b4dd6982"},"/docs/1.x.x/api/domains/create-815":{"__comp":"17896441","content":"9d10a623"},"/docs/1.x.x/api/domains/delete-542":{"__comp":"17896441","content":"40f2f3c6"},"/docs/1.x.x/api/domains/get-c5a":{"__comp":"17896441","content":"d3c35fce"},"/docs/1.x.x/api/domains/list-3bc":{"__comp":"17896441","content":"8a9effda"},"/docs/1.x.x/api/domains/update-633":{"__comp":"17896441","content":"b1e2c3e5"},"/docs/1.x.x/api/gateways/create-404":{"__comp":"17896441","content":"943e77c3"},"/docs/1.x.x/api/gateways/delete-de6":{"__comp":"17896441","content":"40f2a0b4"},"/docs/1.x.x/api/gateways/get-d16":{"__comp":"17896441","content":"b8ab588d"},"/docs/1.x.x/api/gateways/list-5bf":{"__comp":"17896441","content":"5e82a060"},"/docs/1.x.x/api/gateways/update-8a3":{"__comp":"17896441","content":"9a5a69d5"},"/docs/1.x.x/api/location/create-ee5":{"__comp":"17896441","content":"4e27cd47"},"/docs/1.x.x/api/location/delete-682":{"__comp":"17896441","content":"646468fb"},"/docs/1.x.x/api/location/list-f64":{"__comp":"17896441","content":"0f2bd920"},"/docs/1.x.x/api/numbers/create-6ef":{"__comp":"17896441","content":"99f83bea"},"/docs/1.x.x/api/numbers/delete-6a0":{"__comp":"17896441","content":"4d0c799d"},"/docs/1.x.x/api/numbers/get-b9d":{"__comp":"17896441","content":"ed519cbf"},"/docs/1.x.x/api/numbers/list-c63":{"__comp":"17896441","content":"6c14cd7d"},"/docs/1.x.x/api/numbers/update-a01":{"__comp":"17896441","content":"4dcd5895"},"/docs/1.x.x/api/overview-d3c":{"__comp":"17896441","content":"321dfeeb"},"/docs/1.x.x/api/peers/create-f5b":{"__comp":"17896441","content":"411db075"},"/docs/1.x.x/api/peers/delete-349":{"__comp":"17896441","content":"a552b93b"},"/docs/1.x.x/api/peers/get-395":{"__comp":"17896441","content":"9a4dfeaa"},"/docs/1.x.x/api/peers/list-70b":{"__comp":"17896441","content":"bc2f9ced"},"/docs/1.x.x/api/peers/update-d81":{"__comp":"17896441","content":"95069fb2"},"/docs/1.x.x/api/registry-46f":{"__comp":"17896441","content":"72607e62"},"/docs/1.x.x/api/status/get-0e4":{"__comp":"17896441","content":"9799683e"},"/docs/1.x.x/api/status/update-95d":{"__comp":"17896441","content":"7df8ae3f"},"/docs/1.x.x/api/sys/info-bf8":{"__comp":"17896441","content":"1b166456"},"/docs/1.x.x/api/sys/logs-847":{"__comp":"17896441","content":"6e2907e5"},"/docs/1.x.x/api/token-069":{"__comp":"17896441","content":"656951a7"},"/docs/1.x.x/concepts-b93":{"__comp":"17896441","content":"35bee977"},"/docs/1.x.x/configuration/agents-4d7":{"__comp":"17896441","content":"a30498ab"},"/docs/1.x.x/configuration/domains-4b7":{"__comp":"17896441","content":"81e5f1d0"},"/docs/1.x.x/configuration/gateways-cbd":{"__comp":"17896441","content":"876e022a"},"/docs/1.x.x/configuration/general-52e":{"__comp":"17896441","content":"3e7ceef0"},"/docs/1.x.x/configuration/numbers-f3e":{"__comp":"17896441","content":"7efb1a82"},"/docs/1.x.x/configuration/peers-113":{"__comp":"17896441","content":"ee7973d9"},"/docs/1.x.x/configuration/users-459":{"__comp":"17896441","content":"017ddd06"},"/docs/1.x.x/guides/basic-setup-890":{"__comp":"17896441","content":"da51cc8f"},"/docs/1.x.x/guides/routr-as-asterisk-frontend-2a0":{"__comp":"17896441","content":"09b719bb"},"/docs/1.x.x/guides/running-on-kubernetes-7dc":{"__comp":"17896441","content":"1ea220c7"},"/docs/1.x.x/guides/running-with-docker-or-compose-5c2":{"__comp":"17896441","content":"23efd64d"},"/docs/1.x.x/guides/securing-the-signaling-path-99f":{"__comp":"17896441","content":"a9d63626"},"/docs/1.x.x/introduction/community-060":{"__comp":"17896441","content":"e10372bb"},"/docs/1.x.x/introduction/comparison-595":{"__comp":"17896441","content":"bb373259"},"/docs/1.x.x/introduction/faq-e8b":{"__comp":"17896441","content":"a40a3312"},"/docs/1.x.x/introduction/glossary-85c":{"__comp":"17896441","content":"918bfdcb"},"/docs/1.x.x/introduction/installation-1c1":{"__comp":"17896441","content":"3325c53c"},"/docs/1.x.x/introduction/media-f84":{"__comp":"17896441","content":"f3f39cc5"},"/docs/1.x.x/introduction/overview-973":{"__comp":"17896441","content":"a4cb0559"},"/docs/1.x.x/introduction/performance-tests/user-location-93b":{"__comp":"17896441","content":"7c32d245"},"/docs/1.x.x/introduction/roadmap-c45":{"__comp":"17896441","content":"3a673d53"},"/docs/1.x.x/introduction/test-plan-859":{"__comp":"17896441","content":"759bfbe1"},"/docs/1.x.x/welcome-055":{"__comp":"17896441","content":"64332b0f"},"/docs/2.0.0-a5c":{"__comp":"1be78505","__context":{"plugin":"deaab6a5"},"versionMetadata":"935f2afb"},"/docs/2.0.0/changelog-abc":{"__comp":"17896441","content":"9beb87c2"},"/docs/2.0.0/community-943":{"__comp":"17896441","content":"5ef0e9d6"},"/docs/2.0.0/connect/command-line/ctl-817":{"__comp":"17896441","content":"ed175a37"},"/docs/2.0.0/connect/command-line/overview-928":{"__comp":"17896441","content":"ea5491a0"},"/docs/2.0.0/connect/concepts-93c":{"__comp":"17896441","content":"5a1924d4"},"/docs/2.0.0/connect/home-or-office-setup-28c":{"__comp":"17896441","content":"2a36568f"},"/docs/2.0.0/connect/introduction-b89":{"__comp":"17896441","content":"d7a9d534"},"/docs/2.0.0/connect/nodesdk/overview-909":{"__comp":"17896441","content":"8ac6f1f4"},"/docs/2.0.0/connect/nodesdk/sdk-d65":{"__comp":"17896441","content":"43d3d555"},"/docs/2.0.0/connect/quick-start/docker-8f4":{"__comp":"17896441","content":"f4357d2a"},"/docs/2.0.0/connect/quick-start/kubernetes-ca7":{"__comp":"17896441","content":"3c0cfdd0"},"/docs/2.0.0/connect/securing-the-server-d31":{"__comp":"17896441","content":"f1b4aa58"},"/docs/2.0.0/connect/sending-call-events-to-nats-f0a":{"__comp":"17896441","content":"8613bfde"},"/docs/2.0.0/connect/webrtc-support-dcc":{"__comp":"17896441","content":"129db88c"},"/docs/2.0.0/contributing-373":{"__comp":"17896441","content":"4d54d076"},"/docs/2.0.0/development/alterations/methods-990":{"__comp":"17896441","content":"39d73575"},"/docs/2.0.0/development/alterations/overview-7a2":{"__comp":"17896441","content":"b396445b"},"/docs/2.0.0/development/building-a-chat-application-f4b":{"__comp":"17896441","content":"b3bbf2ca"},"/docs/2.0.0/development/building-a-middleware-ad6":{"__comp":"17896441","content":"956a4ea6"},"/docs/2.0.0/development/building-a-processor-3aa":{"__comp":"17896441","content":"92a92b88"},"/docs/2.0.0/development/building-a-scaip-processor-c5f":{"__comp":"17896441","content":"26da1a01"},"/docs/2.0.0/development/components/apiserver-3ea":{"__comp":"17896441","content":"7cf72cd4"},"/docs/2.0.0/development/components/dispatcher-49c":{"__comp":"17896441","content":"02617853"},"/docs/2.0.0/development/components/edgeport-a3e":{"__comp":"17896441","content":"33664cb1"},"/docs/2.0.0/development/components/location-ea7":{"__comp":"17896441","content":"f5184ac4"},"/docs/2.0.0/development/components/overview-80e":{"__comp":"17896441","content":"76273f75"},"/docs/2.0.0/development/components/registry-416":{"__comp":"17896441","content":"bc843d59"},"/docs/2.0.0/development/components/requester-b17":{"__comp":"17896441","content":"c60c73ac"},"/docs/2.0.0/development/components/rtprelay-816":{"__comp":"17896441","content":"144994e6"},"/docs/2.0.0/development/components/simpleauth-141":{"__comp":"17896441","content":"210b7c69"},"/docs/2.0.0/development/custom-data-with-the-apiserver-9aa":{"__comp":"17896441","content":"3f9d54d1"},"/docs/2.0.0/development/development-mode-with-gitpod-503":{"__comp":"17896441","content":"ff3f7f2b"},"/docs/2.0.0/development/extending-the-ctl-aa9":{"__comp":"17896441","content":"a7c6e145"},"/docs/2.0.0/development/introduction-aca":{"__comp":"17896441","content":"6a8a88b7"},"/docs/2.0.0/development/metrics-events-logs-and-traces-523":{"__comp":"17896441","content":"54969ead"},"/docs/2.0.0/development/orchestration-with-docker-05f":{"__comp":"17896441","content":"1ad9bfe0"},"/docs/2.0.0/development/orchestration-with-kubernetes-694":{"__comp":"17896441","content":"21169ea0"},"/docs/2.0.0/development/quick-start-2f8":{"__comp":"17896441","content":"9fcefd11"},"/docs/2.0.0/development/testing-with-seet-771":{"__comp":"17896441","content":"4e3cbe94"},"/docs/2.0.0/faqs-72b":{"__comp":"17896441","content":"1ffdd7de"},"/docs/2.0.0/overview/architecture-455":{"__comp":"17896441","content":"d72ac48e"},"/docs/2.0.0/overview/concepts-482":{"__comp":"17896441","content":"118e913f"},"/docs/2.0.0/overview/deploy-with-docker-3ac":{"__comp":"17896441","content":"06896101"},"/docs/2.0.0/overview/introduction-8f9":{"__comp":"17896441","content":"8d7e75fb"},"/docs/2.0.0/tutorials/deploying-to-civo-with-helm-4df":{"__comp":"17896441","content":"5a510007"},"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser-502":{"__comp":"17896441","content":"c2ef5137"},"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes-450":{"__comp":"17896441","content":"1a1a9e3d"},"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr-b1f":{"__comp":"17896441","content":"db70960d"},"/-fcb":{"__comp":"c4f5d8e4","__context":{"plugin":"0abf3980"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=7221,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.f2bc7f64.js b/assets/js/main.f2bc7f64.js new file mode 100644 index 000000000..bea60174c --- /dev/null +++ b/assets/js/main.f2bc7f64.js @@ -0,0 +1,2 @@ +/*! For license information please see main.f2bc7f64.js.LICENSE.txt */ +(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8792],{9188:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(6540);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},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={"017ddd06":[()=>n.e(9845).then(n.bind(n,6740)),"@site/versioned_docs/version-1.x.x/configuration/users.md",6740],"02617853":[()=>n.e(3191).then(n.bind(n,2744)),"@site/docs/development/components/dispatcher.md",2744],"06896101":[()=>n.e(3738).then(n.bind(n,2007)),"@site/docs/overview/deploy-with-docker.md",2007],"093b4e4f":[()=>n.e(4714).then(n.bind(n,2357)),"@site/versioned_docs/version-1.x.x/administration/webconsole.md",2357],"09b719bb":[()=>n.e(6541).then(n.bind(n,5722)),"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",5722],"0abf3980":[()=>n.e(3690).then(n.t.bind(n,4061,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],"0f2bd920":[()=>n.e(2506).then(n.bind(n,1270)),"@site/versioned_docs/version-1.x.x/api/location/list.md",1270],"118e913f":[()=>n.e(1).then(n.bind(n,9279)),"@site/docs/overview/concepts.md",9279],"129db88c":[()=>n.e(2692).then(n.bind(n,7480)),"@site/docs/connect/webrtc-support.md",7480],"144994e6":[()=>n.e(1171).then(n.bind(n,8162)),"@site/docs/development/components/rtprelay.md",8162],17896441:[()=>Promise.all([n.e(1869),n.e(8401)]).then(n.bind(n,6766)),"@theme/DocItem",6766],"19dd4331":[()=>n.e(4126).then(n.bind(n,5624)),"@site/versioned_docs/version-1.x.x/api/agents/update.md",5624],"1a1a9e3d":[()=>n.e(8512).then(n.bind(n,332)),"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",332],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,2672)),"@theme/SearchPage",2672],"1ad9bfe0":[()=>n.e(3383).then(n.bind(n,6807)),"@site/docs/development/orchestration-with-docker.md",6807],"1b166456":[()=>n.e(208).then(n.bind(n,9778)),"@site/versioned_docs/version-1.x.x/api/sys/info.md",9778],"1cd31f12":[()=>n.e(5056).then(n.bind(n,5622)),"@site/versioned_docs/version-1.x.x/api/agents/delete.md",5622],"1ea220c7":[()=>n.e(6792).then(n.bind(n,1009)),"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",1009],"1ffdd7de":[()=>n.e(7782).then(n.bind(n,3437)),"@site/docs/faqs.md",3437],"210b7c69":[()=>n.e(1703).then(n.bind(n,9633)),"@site/docs/development/components/simpleauth.md",9633],"21169ea0":[()=>n.e(9504).then(n.bind(n,7235)),"@site/docs/development/orchestration-with-kubernetes.md",7235],"23efd64d":[()=>n.e(7225).then(n.bind(n,2575)),"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",2575],"26da1a01":[()=>n.e(2401).then(n.bind(n,1080)),"@site/docs/development/building-a-scaip-processor.md",1080],"2a36568f":[()=>n.e(2964).then(n.bind(n,7173)),"@site/docs/connect/home-or-office-setup.md",7173],"321dfeeb":[()=>n.e(537).then(n.bind(n,9683)),"@site/versioned_docs/version-1.x.x/api/overview.md",9683],"3325c53c":[()=>n.e(6944).then(n.bind(n,7496)),"@site/versioned_docs/version-1.x.x/introduction/installation.md",7496],"33664cb1":[()=>n.e(9953).then(n.bind(n,4987)),"@site/docs/development/components/edgeport.md",4987],"35bee977":[()=>n.e(1304).then(n.bind(n,5644)),"@site/versioned_docs/version-1.x.x/concepts.md",5644],"39d73575":[()=>n.e(1780).then(n.bind(n,2655)),"@site/docs/development/alterations/methods.md",2655],"3a673d53":[()=>n.e(831).then(n.bind(n,3202)),"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",3202],"3c0cfdd0":[()=>n.e(4480).then(n.bind(n,6456)),"@site/docs/connect/quick-start/kubernetes.md",6456],"3e7ceef0":[()=>n.e(5613).then(n.bind(n,7156)),"@site/versioned_docs/version-1.x.x/configuration/general.md",7156],"3f9d54d1":[()=>n.e(2333).then(n.bind(n,3451)),"@site/docs/development/custom-data-with-the-apiserver.md",3451],"40f2a0b4":[()=>n.e(6926).then(n.bind(n,125)),"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",125],"40f2f3c6":[()=>n.e(8353).then(n.bind(n,4765)),"@site/versioned_docs/version-1.x.x/api/domains/delete.md",4765],"411db075":[()=>n.e(8535).then(n.bind(n,7134)),"@site/versioned_docs/version-1.x.x/api/peers/create.md",7134],"43d3d555":[()=>n.e(3624).then(n.bind(n,4236)),"@site/docs/connect/nodesdk/sdk.md",4236],"4d0c799d":[()=>n.e(823).then(n.bind(n,2260)),"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",2260],"4d54d076":[()=>n.e(1459).then(n.bind(n,6564)),"@site/docs/contributing.md",6564],"4dcd5895":[()=>n.e(6615).then(n.bind(n,3022)),"@site/versioned_docs/version-1.x.x/api/numbers/update.md",3022],"4e27cd47":[()=>n.e(8253).then(n.bind(n,5846)),"@site/versioned_docs/version-1.x.x/api/location/create.md",5846],"4e3cbe94":[()=>n.e(6692).then(n.bind(n,7403)),"@site/docs/development/testing-with-seet.md",7403],"54969ead":[()=>n.e(364).then(n.bind(n,2994)),"@site/docs/development/metrics-events-logs-and-traces.md",2994],"5514a4b8":[()=>n.e(583).then(n.bind(n,405)),"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",405],"5a1924d4":[()=>n.e(2433).then(n.bind(n,4670)),"@site/docs/connect/concepts.md",4670],"5a510007":[()=>n.e(9012).then(n.bind(n,8671)),"@site/docs/tutorials/deploying-to-civo-with-helm.md",8671],"5e82a060":[()=>n.e(6038).then(n.bind(n,6118)),"@site/versioned_docs/version-1.x.x/api/gateways/list.md",6118],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ef0e9d6":[()=>n.e(911).then(n.bind(n,8999)),"@site/docs/community.md",8999],"64332b0f":[()=>n.e(8329).then(n.bind(n,4801)),"@site/versioned_docs/version-1.x.x/welcome.md",4801],"646468fb":[()=>n.e(821).then(n.bind(n,2013)),"@site/versioned_docs/version-1.x.x/api/location/delete.md",2013],"656951a7":[()=>n.e(5009).then(n.bind(n,5523)),"@site/versioned_docs/version-1.x.x/api/token.md",5523],"6a8a88b7":[()=>n.e(3244).then(n.bind(n,4846)),"@site/docs/development/introduction.md",4846],"6c14cd7d":[()=>n.e(6341).then(n.bind(n,5655)),"@site/versioned_docs/version-1.x.x/api/numbers/list.md",5655],"6c35bbce":[()=>n.e(4862).then(n.bind(n,3653)),"@site/versioned_docs/version-1.x.x/api/agents/list.md",3653],"6e2907e5":[()=>n.e(4366).then(n.bind(n,8213)),"@site/versioned_docs/version-1.x.x/api/sys/logs.md",8213],71153375:[()=>n.e(8911).then(n.bind(n,3017)),"@site/versioned_docs/version-1.x.x/api/config/get.md",3017],"72607e62":[()=>n.e(9042).then(n.bind(n,5831)),"@site/versioned_docs/version-1.x.x/api/registry.md",5831],"759bfbe1":[()=>n.e(1080).then(n.bind(n,1538)),"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",1538],"76273f75":[()=>n.e(3578).then(n.bind(n,9346)),"@site/docs/development/components/overview.md",9346],"7c32d245":[()=>n.e(529).then(n.bind(n,8786)),"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",8786],"7cf72cd4":[()=>n.e(8937).then(n.bind(n,1370)),"@site/docs/development/components/apiserver.md",1370],"7df8ae3f":[()=>n.e(2405).then(n.bind(n,5312)),"@site/versioned_docs/version-1.x.x/api/status/update.md",5312],"7efb1a82":[()=>n.e(767).then(n.bind(n,9586)),"@site/versioned_docs/version-1.x.x/configuration/numbers.md",9586],"81e5f1d0":[()=>n.e(9583).then(n.bind(n,4053)),"@site/versioned_docs/version-1.x.x/configuration/domains.md",4053],"8613bfde":[()=>n.e(3296).then(n.bind(n,7499)),"@site/docs/connect/sending-call-events-to-nats.md",7499],"876e022a":[()=>n.e(1214).then(n.bind(n,2481)),"@site/versioned_docs/version-1.x.x/configuration/gateways.md",2481],"8a9effda":[()=>n.e(3741).then(n.bind(n,8662)),"@site/versioned_docs/version-1.x.x/api/domains/list.md",8662],"8ac6f1f4":[()=>n.e(620).then(n.bind(n,7001)),"@site/docs/connect/nodesdk/overview.md",7001],"8d7e75fb":[()=>n.e(4719).then(n.bind(n,6102)),"@site/docs/overview/introduction.md",6102],"8f5f22a9":[()=>n.e(5362).then(n.t.bind(n,2556,19)),"~docs/default/version-1-x-x-metadata-prop-ec9.json",2556],"918bfdcb":[()=>n.e(1870).then(n.bind(n,1264)),"@site/versioned_docs/version-1.x.x/introduction/glossary.md",1264],"92a92b88":[()=>n.e(7940).then(n.bind(n,7149)),"@site/docs/development/building-a-processor.md",7149],"935f2afb":[()=>n.e(8581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],"943e77c3":[()=>n.e(1224).then(n.bind(n,9334)),"@site/versioned_docs/version-1.x.x/api/gateways/create.md",9334],"95069fb2":[()=>n.e(2358).then(n.bind(n,5203)),"@site/versioned_docs/version-1.x.x/api/peers/update.md",5203],"956a4ea6":[()=>n.e(4050).then(n.bind(n,6009)),"@site/docs/development/building-a-middleware.md",6009],"9799683e":[()=>n.e(6695).then(n.bind(n,1721)),"@site/versioned_docs/version-1.x.x/api/status/get.md",1721],"9840208a":[()=>n.e(8167).then(n.bind(n,4321)),"@site/versioned_docs/version-1.x.x/api/agents/create.md",4321],"99f83bea":[()=>n.e(4682).then(n.bind(n,1079)),"@site/versioned_docs/version-1.x.x/api/numbers/create.md",1079],"9a4dfeaa":[()=>n.e(7408).then(n.bind(n,8084)),"@site/versioned_docs/version-1.x.x/api/peers/get.md",8084],"9a5a69d5":[()=>n.e(7337).then(n.bind(n,1979)),"@site/versioned_docs/version-1.x.x/api/gateways/update.md",1979],"9beb87c2":[()=>n.e(3539).then(n.bind(n,4520)),"@site/docs/changelog.md",4520],"9d10a623":[()=>n.e(9955).then(n.bind(n,4374)),"@site/versioned_docs/version-1.x.x/api/domains/create.md",4374],"9fcefd11":[()=>n.e(3102).then(n.bind(n,4730)),"@site/docs/development/quick-start.md",4730],a0c5838c:[()=>n.e(3688).then(n.t.bind(n,7757,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7757],a30498ab:[()=>n.e(3857).then(n.bind(n,4036)),"@site/versioned_docs/version-1.x.x/configuration/agents.md",4036],a40a3312:[()=>n.e(9922).then(n.bind(n,2738)),"@site/versioned_docs/version-1.x.x/introduction/faq.md",2738],a4cb0559:[()=>n.e(9188).then(n.bind(n,8255)),"@site/versioned_docs/version-1.x.x/introduction/overview.md",8255],a552b93b:[()=>n.e(5872).then(n.bind(n,1013)),"@site/versioned_docs/version-1.x.x/api/peers/delete.md",1013],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a7c6e145:[()=>n.e(1079).then(n.bind(n,5138)),"@site/docs/development/extending-the-ctl.md",5138],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],a9d63626:[()=>n.e(7372).then(n.bind(n,1068)),"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",1068],b1e2c3e5:[()=>n.e(1953).then(n.bind(n,6891)),"@site/versioned_docs/version-1.x.x/api/domains/update.md",6891],b396445b:[()=>n.e(4082).then(n.bind(n,5286)),"@site/docs/development/alterations/overview.md",5286],b3bbf2ca:[()=>n.e(8190).then(n.bind(n,3036)),"@site/docs/development/building-a-chat-application.md",3036],b4dd6982:[()=>n.e(8732).then(n.bind(n,1744)),"@site/versioned_docs/version-1.x.x/api/config/update.md",1744],b5de05fe:[()=>n.e(803).then(n.bind(n,547)),"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",547],b8ab588d:[()=>n.e(5659).then(n.bind(n,5212)),"@site/versioned_docs/version-1.x.x/api/gateways/get.md",5212],bb373259:[()=>n.e(5804).then(n.bind(n,6501)),"@site/versioned_docs/version-1.x.x/introduction/comparison.md",6501],bc1a89ad:[()=>n.e(6346).then(n.bind(n,9866)),"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",9866],bc2f9ced:[()=>n.e(5365).then(n.bind(n,4734)),"@site/versioned_docs/version-1.x.x/api/peers/list.md",4734],bc843d59:[()=>n.e(3797).then(n.bind(n,142)),"@site/docs/development/components/registry.md",142],c2ef5137:[()=>n.e(9465).then(n.bind(n,6237)),"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",6237],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,192)),"@site/src/pages/index.js",192],c60c73ac:[()=>n.e(9537).then(n.bind(n,9175)),"@site/docs/development/components/requester.md",9175],d3c35fce:[()=>n.e(2607).then(n.bind(n,6652)),"@site/versioned_docs/version-1.x.x/api/domains/get.md",6652],d72ac48e:[()=>n.e(7063).then(n.bind(n,577)),"@site/docs/overview/architecture.md",577],d7a9d534:[()=>n.e(286).then(n.bind(n,5151)),"@site/docs/connect/introduction.md",5151],da51cc8f:[()=>n.e(9692).then(n.bind(n,3997)),"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",3997],db70960d:[()=>n.e(6549).then(n.bind(n,5214)),"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",5214],deaab6a5:[()=>n.e(6782).then(n.t.bind(n,1966,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],e10372bb:[()=>n.e(49).then(n.bind(n,123)),"@site/versioned_docs/version-1.x.x/introduction/community.md",123],ea5491a0:[()=>n.e(4011).then(n.bind(n,7163)),"@site/docs/connect/command-line/overview.md",7163],ec64d50d:[()=>n.e(9900).then(n.bind(n,3297)),"@site/versioned_docs/version-1.x.x/api/agents/get.md",3297],ed175a37:[()=>n.e(4236).then(n.bind(n,4995)),"@site/docs/connect/command-line/ctl.md",4995],ed519cbf:[()=>n.e(7638).then(n.bind(n,3271)),"@site/versioned_docs/version-1.x.x/api/numbers/get.md",3271],ee7973d9:[()=>n.e(2514).then(n.bind(n,2305)),"@site/versioned_docs/version-1.x.x/configuration/peers.md",2305],f1b4aa58:[()=>n.e(8755).then(n.bind(n,5835)),"@site/docs/connect/securing-the-server.md",5835],f3f39cc5:[()=>n.e(7387).then(n.bind(n,1850)),"@site/versioned_docs/version-1.x.x/introduction/media.md",1850],f4357d2a:[()=>n.e(6575).then(n.bind(n,696)),"@site/docs/connect/quick-start/docker.md",696],f5184ac4:[()=>n.e(6099).then(n.bind(n,7982)),"@site/docs/development/components/location.md",7982],ff3f7f2b:[()=>n.e(6903).then(n.bind(n,3532)),"@site/docs/development/development-mode-with-gitpod.md",3532]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.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,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.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,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.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:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,c.A)(r);return Object.entries(m).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:l,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 s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/search",component:d("/search","9b7"),exact:!0},{path:"/docs",component:d("/docs","125"),routes:[{path:"/docs/1.x.x",component:d("/docs/1.x.x","370"),routes:[{path:"/docs/1.x.x",component:d("/docs/1.x.x","e79"),routes:[{path:"/docs/1.x.x/administration/cli/cheatsheet",component:d("/docs/1.x.x/administration/cli/cheatsheet","375"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/installation",component:d("/docs/1.x.x/administration/cli/installation","4dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/remote-access",component:d("/docs/1.x.x/administration/cli/remote-access","97c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/webconsole",component:d("/docs/1.x.x/administration/webconsole","62a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/create",component:d("/docs/1.x.x/api/agents/create","b97"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/delete",component:d("/docs/1.x.x/api/agents/delete","b72"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/get",component:d("/docs/1.x.x/api/agents/get","f9a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/list",component:d("/docs/1.x.x/api/agents/list","4c3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/update",component:d("/docs/1.x.x/api/agents/update","b29"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/get",component:d("/docs/1.x.x/api/config/get","4bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/update",component:d("/docs/1.x.x/api/config/update","983"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/create",component:d("/docs/1.x.x/api/domains/create","815"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/delete",component:d("/docs/1.x.x/api/domains/delete","542"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/get",component:d("/docs/1.x.x/api/domains/get","c5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/list",component:d("/docs/1.x.x/api/domains/list","3bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/update",component:d("/docs/1.x.x/api/domains/update","633"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/create",component:d("/docs/1.x.x/api/gateways/create","404"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/delete",component:d("/docs/1.x.x/api/gateways/delete","de6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/get",component:d("/docs/1.x.x/api/gateways/get","d16"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/list",component:d("/docs/1.x.x/api/gateways/list","5bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/update",component:d("/docs/1.x.x/api/gateways/update","8a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/create",component:d("/docs/1.x.x/api/location/create","ee5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/delete",component:d("/docs/1.x.x/api/location/delete","682"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/list",component:d("/docs/1.x.x/api/location/list","f64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/create",component:d("/docs/1.x.x/api/numbers/create","6ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/delete",component:d("/docs/1.x.x/api/numbers/delete","6a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/get",component:d("/docs/1.x.x/api/numbers/get","b9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/list",component:d("/docs/1.x.x/api/numbers/list","c63"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/update",component:d("/docs/1.x.x/api/numbers/update","a01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/overview",component:d("/docs/1.x.x/api/overview","d3c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/create",component:d("/docs/1.x.x/api/peers/create","f5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/delete",component:d("/docs/1.x.x/api/peers/delete","349"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/get",component:d("/docs/1.x.x/api/peers/get","395"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/list",component:d("/docs/1.x.x/api/peers/list","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/update",component:d("/docs/1.x.x/api/peers/update","d81"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/registry",component:d("/docs/1.x.x/api/registry","46f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/get",component:d("/docs/1.x.x/api/status/get","0e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/update",component:d("/docs/1.x.x/api/status/update","95d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/info",component:d("/docs/1.x.x/api/sys/info","bf8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/logs",component:d("/docs/1.x.x/api/sys/logs","847"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/token",component:d("/docs/1.x.x/api/token","069"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/concepts",component:d("/docs/1.x.x/concepts","b93"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/agents",component:d("/docs/1.x.x/configuration/agents","4d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/domains",component:d("/docs/1.x.x/configuration/domains","4b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/gateways",component:d("/docs/1.x.x/configuration/gateways","cbd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/general",component:d("/docs/1.x.x/configuration/general","52e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/numbers",component:d("/docs/1.x.x/configuration/numbers","f3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/peers",component:d("/docs/1.x.x/configuration/peers","113"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/users",component:d("/docs/1.x.x/configuration/users","459"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/basic-setup",component:d("/docs/1.x.x/guides/basic-setup","890"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/routr-as-asterisk-frontend",component:d("/docs/1.x.x/guides/routr-as-asterisk-frontend","2a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-on-kubernetes",component:d("/docs/1.x.x/guides/running-on-kubernetes","7dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-with-docker-or-compose",component:d("/docs/1.x.x/guides/running-with-docker-or-compose","5c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/securing-the-signaling-path",component:d("/docs/1.x.x/guides/securing-the-signaling-path","99f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/community",component:d("/docs/1.x.x/introduction/community","060"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/comparison",component:d("/docs/1.x.x/introduction/comparison","595"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/faq",component:d("/docs/1.x.x/introduction/faq","e8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/glossary",component:d("/docs/1.x.x/introduction/glossary","85c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/installation",component:d("/docs/1.x.x/introduction/installation","1c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/media",component:d("/docs/1.x.x/introduction/media","f84"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/overview",component:d("/docs/1.x.x/introduction/overview","973"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/performance-tests/user-location",component:d("/docs/1.x.x/introduction/performance-tests/user-location","93b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/roadmap",component:d("/docs/1.x.x/introduction/roadmap","c45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/test-plan",component:d("/docs/1.x.x/introduction/test-plan","859"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/welcome",component:d("/docs/1.x.x/welcome","055"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/2.0.0",component:d("/docs/2.0.0","1e6"),routes:[{path:"/docs/2.0.0",component:d("/docs/2.0.0","45e"),routes:[{path:"/docs/2.0.0/changelog",component:d("/docs/2.0.0/changelog","abc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/community",component:d("/docs/2.0.0/community","943"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/ctl",component:d("/docs/2.0.0/connect/command-line/ctl","817"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/overview",component:d("/docs/2.0.0/connect/command-line/overview","928"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/concepts",component:d("/docs/2.0.0/connect/concepts","93c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/home-or-office-setup",component:d("/docs/2.0.0/connect/home-or-office-setup","28c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/introduction",component:d("/docs/2.0.0/connect/introduction","b89"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/overview",component:d("/docs/2.0.0/connect/nodesdk/overview","909"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/sdk",component:d("/docs/2.0.0/connect/nodesdk/sdk","d65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/docker",component:d("/docs/2.0.0/connect/quick-start/docker","8f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/kubernetes",component:d("/docs/2.0.0/connect/quick-start/kubernetes","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/securing-the-server",component:d("/docs/2.0.0/connect/securing-the-server","d31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/sending-call-events-to-nats",component:d("/docs/2.0.0/connect/sending-call-events-to-nats","f0a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/webrtc-support",component:d("/docs/2.0.0/connect/webrtc-support","dcc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/contributing",component:d("/docs/2.0.0/contributing","373"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/methods",component:d("/docs/2.0.0/development/alterations/methods","990"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/overview",component:d("/docs/2.0.0/development/alterations/overview","7a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-chat-application",component:d("/docs/2.0.0/development/building-a-chat-application","f4b"),exact:!0},{path:"/docs/2.0.0/development/building-a-middleware",component:d("/docs/2.0.0/development/building-a-middleware","ad6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-processor",component:d("/docs/2.0.0/development/building-a-processor","3aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-scaip-processor",component:d("/docs/2.0.0/development/building-a-scaip-processor","c5f"),exact:!0},{path:"/docs/2.0.0/development/components/apiserver",component:d("/docs/2.0.0/development/components/apiserver","3ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/dispatcher",component:d("/docs/2.0.0/development/components/dispatcher","49c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/edgeport",component:d("/docs/2.0.0/development/components/edgeport","a3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/location",component:d("/docs/2.0.0/development/components/location","ea7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/overview",component:d("/docs/2.0.0/development/components/overview","80e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/registry",component:d("/docs/2.0.0/development/components/registry","416"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/requester",component:d("/docs/2.0.0/development/components/requester","b17"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/rtprelay",component:d("/docs/2.0.0/development/components/rtprelay","816"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/simpleauth",component:d("/docs/2.0.0/development/components/simpleauth","141"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/custom-data-with-the-apiserver",component:d("/docs/2.0.0/development/custom-data-with-the-apiserver","9aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/development-mode-with-gitpod",component:d("/docs/2.0.0/development/development-mode-with-gitpod","503"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/extending-the-ctl",component:d("/docs/2.0.0/development/extending-the-ctl","aa9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/introduction",component:d("/docs/2.0.0/development/introduction","aca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/metrics-events-logs-and-traces",component:d("/docs/2.0.0/development/metrics-events-logs-and-traces","523"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-docker",component:d("/docs/2.0.0/development/orchestration-with-docker","05f"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-kubernetes",component:d("/docs/2.0.0/development/orchestration-with-kubernetes","694"),exact:!0},{path:"/docs/2.0.0/development/quick-start",component:d("/docs/2.0.0/development/quick-start","2f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/testing-with-seet",component:d("/docs/2.0.0/development/testing-with-seet","771"),exact:!0},{path:"/docs/2.0.0/faqs",component:d("/docs/2.0.0/faqs","72b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/architecture",component:d("/docs/2.0.0/overview/architecture","455"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/concepts",component:d("/docs/2.0.0/overview/concepts","482"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/deploy-with-docker",component:d("/docs/2.0.0/overview/deploy-with-docker","3ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/introduction",component:d("/docs/2.0.0/overview/introduction","8f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",component:d("/docs/2.0.0/tutorials/deploying-to-civo-with-helm","4df"),exact:!0},{path:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",component:d("/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser","502"),exact:!0},{path:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",component:d("/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes","450"),exact:!0},{path:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",component:d("/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr","b1f"),exact:!0}]}]}]},{path:"/",component:d("/","fcb"),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})}},8536:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(4625),i=n(545),s=n(8193);const l=[n(1911),n(119),n(6134),n(6294),n(1043)];var c=n(8328),u=n(6347),d=n(2831),p=n(4848);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5260),h=n(4586),g=n(6025),b=n(6342),v=n(9024),y=n(2131),x=n(4090),w=n(2967),k=n(440),S=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,y.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(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,u.zy)();return e+(0,k.applyTrailingSlash)((0,g.A)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.A,{tag:w.Cy,locale:e}),(0,p.jsx)(m.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.u)(c.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}}var j=n(6125),R=n(6988),L=n(205);function N(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=l.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.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}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(c.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?N("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=N("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,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.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,p.jsx)(p.Fragment,{children:!s.A.canUseDOM&&(0,p.jsx)(m.A,{children:(0,p.jsx)("script",{children:B(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.A)(),{pathname:n}=(0,u.zy)();return t&&n===e?(0,p.jsx)($,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,h.A)(),a=(0,g.A)(e),{htmlLang:i,direction:s}=o[r];return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("html",{lang:i,dir:s}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:a})]})}var H=n(7489),G=n(2303);function V(){const e=(0,G.A)();return(0,p.jsx)(m.A,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}function W(){const e=(0,d.v)(c.A),t=(0,u.zy)();return(0,p.jsx)(H.A,{children:(0,p.jsx)(R.l,{children:(0,p.jsxs)(j.x,{children:[(0,p.jsxs)(f,{children:[(0,p.jsx)(q,{}),(0,p.jsx)(C,{}),(0,p.jsx)(U,{}),(0,p.jsx)(I,{location:A(t),children:e})]}),(0,p.jsx)(V,{})]})})})}var K=n(4054);const Q=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 Y=n(6921);const Z=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.vd,{children:(0,p.jsx)(a.Kd,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};O(window.location.pathname).then(s)}},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-google-gtag":{"default":{"trackingID":["G-JX93S6PKN4"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"2.0.0","isLast":true,"path":"/docs/2.0.0","mainDocId":"overview/introduction","docs":[{"id":"changelog","path":"/docs/2.0.0/changelog","sidebar":"tutorialSidebar"},{"id":"community","path":"/docs/2.0.0/community","sidebar":"tutorialSidebar"},{"id":"connect/command-line/ctl","path":"/docs/2.0.0/connect/command-line/ctl","sidebar":"tutorialSidebar"},{"id":"connect/command-line/overview","path":"/docs/2.0.0/connect/command-line/overview","sidebar":"tutorialSidebar"},{"id":"connect/concepts","path":"/docs/2.0.0/connect/concepts","sidebar":"tutorialSidebar"},{"id":"connect/home-or-office-setup","path":"/docs/2.0.0/connect/home-or-office-setup","sidebar":"tutorialSidebar"},{"id":"connect/introduction","path":"/docs/2.0.0/connect/introduction","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/overview","path":"/docs/2.0.0/connect/nodesdk/overview","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/sdk","path":"/docs/2.0.0/connect/nodesdk/sdk","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/docker","path":"/docs/2.0.0/connect/quick-start/docker","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/kubernetes","path":"/docs/2.0.0/connect/quick-start/kubernetes","sidebar":"tutorialSidebar"},{"id":"connect/securing-the-server","path":"/docs/2.0.0/connect/securing-the-server","sidebar":"tutorialSidebar"},{"id":"connect/sending-call-events-to-nats","path":"/docs/2.0.0/connect/sending-call-events-to-nats","sidebar":"tutorialSidebar"},{"id":"connect/webrtc-support","path":"/docs/2.0.0/connect/webrtc-support","sidebar":"tutorialSidebar"},{"id":"contributing","path":"/docs/2.0.0/contributing","sidebar":"tutorialSidebar"},{"id":"development/alterations/methods","path":"/docs/2.0.0/development/alterations/methods","sidebar":"tutorialSidebar"},{"id":"development/alterations/overview","path":"/docs/2.0.0/development/alterations/overview","sidebar":"tutorialSidebar"},{"id":"development/building-a-chat-application","path":"/docs/2.0.0/development/building-a-chat-application"},{"id":"development/building-a-middleware","path":"/docs/2.0.0/development/building-a-middleware","sidebar":"tutorialSidebar"},{"id":"development/building-a-processor","path":"/docs/2.0.0/development/building-a-processor","sidebar":"tutorialSidebar"},{"id":"development/building-a-scaip-processor","path":"/docs/2.0.0/development/building-a-scaip-processor"},{"id":"development/components/apiserver","path":"/docs/2.0.0/development/components/apiserver","sidebar":"tutorialSidebar"},{"id":"development/components/dispatcher","path":"/docs/2.0.0/development/components/dispatcher","sidebar":"tutorialSidebar"},{"id":"development/components/edgeport","path":"/docs/2.0.0/development/components/edgeport","sidebar":"tutorialSidebar"},{"id":"development/components/location","path":"/docs/2.0.0/development/components/location","sidebar":"tutorialSidebar"},{"id":"development/components/overview","path":"/docs/2.0.0/development/components/overview","sidebar":"tutorialSidebar"},{"id":"development/components/registry","path":"/docs/2.0.0/development/components/registry","sidebar":"tutorialSidebar"},{"id":"development/components/requester","path":"/docs/2.0.0/development/components/requester","sidebar":"tutorialSidebar"},{"id":"development/components/rtprelay","path":"/docs/2.0.0/development/components/rtprelay","sidebar":"tutorialSidebar"},{"id":"development/components/simpleauth","path":"/docs/2.0.0/development/components/simpleauth","sidebar":"tutorialSidebar"},{"id":"development/custom-data-with-the-apiserver","path":"/docs/2.0.0/development/custom-data-with-the-apiserver","sidebar":"tutorialSidebar"},{"id":"development/development-mode-with-gitpod","path":"/docs/2.0.0/development/development-mode-with-gitpod","sidebar":"tutorialSidebar"},{"id":"development/extending-the-ctl","path":"/docs/2.0.0/development/extending-the-ctl","sidebar":"tutorialSidebar"},{"id":"development/introduction","path":"/docs/2.0.0/development/introduction","sidebar":"tutorialSidebar"},{"id":"development/metrics-events-logs-and-traces","path":"/docs/2.0.0/development/metrics-events-logs-and-traces"},{"id":"development/orchestration-with-docker","path":"/docs/2.0.0/development/orchestration-with-docker"},{"id":"development/orchestration-with-kubernetes","path":"/docs/2.0.0/development/orchestration-with-kubernetes"},{"id":"development/quick-start","path":"/docs/2.0.0/development/quick-start","sidebar":"tutorialSidebar"},{"id":"development/testing-with-seet","path":"/docs/2.0.0/development/testing-with-seet"},{"id":"faqs","path":"/docs/2.0.0/faqs","sidebar":"tutorialSidebar"},{"id":"overview/architecture","path":"/docs/2.0.0/overview/architecture","sidebar":"tutorialSidebar"},{"id":"overview/concepts","path":"/docs/2.0.0/overview/concepts","sidebar":"tutorialSidebar"},{"id":"overview/deploy-with-docker","path":"/docs/2.0.0/overview/deploy-with-docker","sidebar":"tutorialSidebar"},{"id":"overview/introduction","path":"/docs/2.0.0/overview/introduction","sidebar":"tutorialSidebar"},{"id":"tutorials/deploying-to-civo-with-helm","path":"/docs/2.0.0/tutorials/deploying-to-civo-with-helm"},{"id":"tutorials/ephemeral-agents-in-the-browser","path":"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser"},{"id":"tutorials/intercom-system-with-routr-and-kubernetes","path":"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes"},{"id":"tutorials/load-balancing-asterisk-with-routr","path":"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/2.0.0/overview/introduction","label":"overview/introduction"}}}},{"name":"1.x.x","label":"1.x.x","isLast":false,"path":"/docs/1.x.x","mainDocId":"welcome","docs":[{"id":"administration/cli/cheatsheet","path":"/docs/1.x.x/administration/cli/cheatsheet","sidebar":"tutorialSidebar"},{"id":"administration/cli/installation","path":"/docs/1.x.x/administration/cli/installation","sidebar":"tutorialSidebar"},{"id":"administration/cli/remote-access","path":"/docs/1.x.x/administration/cli/remote-access","sidebar":"tutorialSidebar"},{"id":"administration/webconsole","path":"/docs/1.x.x/administration/webconsole","sidebar":"tutorialSidebar"},{"id":"api/agents/create","path":"/docs/1.x.x/api/agents/create","sidebar":"tutorialSidebar"},{"id":"api/agents/delete","path":"/docs/1.x.x/api/agents/delete","sidebar":"tutorialSidebar"},{"id":"api/agents/get","path":"/docs/1.x.x/api/agents/get","sidebar":"tutorialSidebar"},{"id":"api/agents/list","path":"/docs/1.x.x/api/agents/list","sidebar":"tutorialSidebar"},{"id":"api/agents/update","path":"/docs/1.x.x/api/agents/update","sidebar":"tutorialSidebar"},{"id":"api/config/get","path":"/docs/1.x.x/api/config/get","sidebar":"tutorialSidebar"},{"id":"api/config/update","path":"/docs/1.x.x/api/config/update","sidebar":"tutorialSidebar"},{"id":"api/domains/create","path":"/docs/1.x.x/api/domains/create","sidebar":"tutorialSidebar"},{"id":"api/domains/delete","path":"/docs/1.x.x/api/domains/delete","sidebar":"tutorialSidebar"},{"id":"api/domains/get","path":"/docs/1.x.x/api/domains/get","sidebar":"tutorialSidebar"},{"id":"api/domains/list","path":"/docs/1.x.x/api/domains/list","sidebar":"tutorialSidebar"},{"id":"api/domains/update","path":"/docs/1.x.x/api/domains/update","sidebar":"tutorialSidebar"},{"id":"api/gateways/create","path":"/docs/1.x.x/api/gateways/create","sidebar":"tutorialSidebar"},{"id":"api/gateways/delete","path":"/docs/1.x.x/api/gateways/delete","sidebar":"tutorialSidebar"},{"id":"api/gateways/get","path":"/docs/1.x.x/api/gateways/get","sidebar":"tutorialSidebar"},{"id":"api/gateways/list","path":"/docs/1.x.x/api/gateways/list","sidebar":"tutorialSidebar"},{"id":"api/gateways/update","path":"/docs/1.x.x/api/gateways/update","sidebar":"tutorialSidebar"},{"id":"api/location/create","path":"/docs/1.x.x/api/location/create","sidebar":"tutorialSidebar"},{"id":"api/location/delete","path":"/docs/1.x.x/api/location/delete","sidebar":"tutorialSidebar"},{"id":"api/location/list","path":"/docs/1.x.x/api/location/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/create","path":"/docs/1.x.x/api/numbers/create","sidebar":"tutorialSidebar"},{"id":"api/numbers/delete","path":"/docs/1.x.x/api/numbers/delete","sidebar":"tutorialSidebar"},{"id":"api/numbers/get","path":"/docs/1.x.x/api/numbers/get","sidebar":"tutorialSidebar"},{"id":"api/numbers/list","path":"/docs/1.x.x/api/numbers/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/update","path":"/docs/1.x.x/api/numbers/update","sidebar":"tutorialSidebar"},{"id":"api/overview","path":"/docs/1.x.x/api/overview","sidebar":"tutorialSidebar"},{"id":"api/peers/create","path":"/docs/1.x.x/api/peers/create","sidebar":"tutorialSidebar"},{"id":"api/peers/delete","path":"/docs/1.x.x/api/peers/delete","sidebar":"tutorialSidebar"},{"id":"api/peers/get","path":"/docs/1.x.x/api/peers/get","sidebar":"tutorialSidebar"},{"id":"api/peers/list","path":"/docs/1.x.x/api/peers/list","sidebar":"tutorialSidebar"},{"id":"api/peers/update","path":"/docs/1.x.x/api/peers/update","sidebar":"tutorialSidebar"},{"id":"api/registry","path":"/docs/1.x.x/api/registry","sidebar":"tutorialSidebar"},{"id":"api/status/get","path":"/docs/1.x.x/api/status/get","sidebar":"tutorialSidebar"},{"id":"api/status/update","path":"/docs/1.x.x/api/status/update","sidebar":"tutorialSidebar"},{"id":"api/sys/info","path":"/docs/1.x.x/api/sys/info","sidebar":"tutorialSidebar"},{"id":"api/sys/logs","path":"/docs/1.x.x/api/sys/logs","sidebar":"tutorialSidebar"},{"id":"api/token","path":"/docs/1.x.x/api/token","sidebar":"tutorialSidebar"},{"id":"concepts","path":"/docs/1.x.x/concepts","sidebar":"tutorialSidebar"},{"id":"configuration/agents","path":"/docs/1.x.x/configuration/agents","sidebar":"tutorialSidebar"},{"id":"configuration/domains","path":"/docs/1.x.x/configuration/domains","sidebar":"tutorialSidebar"},{"id":"configuration/gateways","path":"/docs/1.x.x/configuration/gateways","sidebar":"tutorialSidebar"},{"id":"configuration/general","path":"/docs/1.x.x/configuration/general","sidebar":"tutorialSidebar"},{"id":"configuration/numbers","path":"/docs/1.x.x/configuration/numbers","sidebar":"tutorialSidebar"},{"id":"configuration/peers","path":"/docs/1.x.x/configuration/peers","sidebar":"tutorialSidebar"},{"id":"configuration/users","path":"/docs/1.x.x/configuration/users","sidebar":"tutorialSidebar"},{"id":"guides/basic-setup","path":"/docs/1.x.x/guides/basic-setup","sidebar":"tutorialSidebar"},{"id":"guides/routr-as-asterisk-frontend","path":"/docs/1.x.x/guides/routr-as-asterisk-frontend","sidebar":"tutorialSidebar"},{"id":"guides/running-on-kubernetes","path":"/docs/1.x.x/guides/running-on-kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/running-with-docker-or-compose","path":"/docs/1.x.x/guides/running-with-docker-or-compose","sidebar":"tutorialSidebar"},{"id":"guides/securing-the-signaling-path","path":"/docs/1.x.x/guides/securing-the-signaling-path","sidebar":"tutorialSidebar"},{"id":"introduction/community","path":"/docs/1.x.x/introduction/community","sidebar":"tutorialSidebar"},{"id":"introduction/comparison","path":"/docs/1.x.x/introduction/comparison","sidebar":"tutorialSidebar"},{"id":"introduction/faq","path":"/docs/1.x.x/introduction/faq","sidebar":"tutorialSidebar"},{"id":"introduction/glossary","path":"/docs/1.x.x/introduction/glossary","sidebar":"tutorialSidebar"},{"id":"introduction/installation","path":"/docs/1.x.x/introduction/installation","sidebar":"tutorialSidebar"},{"id":"introduction/media","path":"/docs/1.x.x/introduction/media","sidebar":"tutorialSidebar"},{"id":"introduction/overview","path":"/docs/1.x.x/introduction/overview","sidebar":"tutorialSidebar"},{"id":"introduction/performance-tests/user-location","path":"/docs/1.x.x/introduction/performance-tests/user-location","sidebar":"tutorialSidebar"},{"id":"introduction/roadmap","path":"/docs/1.x.x/introduction/roadmap","sidebar":"tutorialSidebar"},{"id":"introduction/test-plan","path":"/docs/1.x.x/introduction/test-plan","sidebar":"tutorialSidebar"},{"id":"welcome","path":"/docs/1.x.x/welcome","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/1.x.x/welcome","label":"welcome"}}}}],"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 s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.1.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.1.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.1.1"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},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:()=>f});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(9201),l=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,l.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,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(c,{error:t,tryAgain:n}),children:[(0,l.jsx)(a.A,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.A,{children:(0,l.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f 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??p)(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),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,i.A)(),{withBaseUrl:w}=(0,u.h)(),k=(0,c.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.A)(_),C=_?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;T&&E&&(T=(0,a.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:x}));const j=(0,r.useRef)(!1),R=n?o.k2:o.N_,L=l.A.canUseIntersectionObserver,N=(0,r.useRef)(),P=()=>{j.current||null==T||(window.docusaurus.preload(T),j.current=!0)};(0,r.useEffect)((()=>(!L&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{L&&N.current&&N.current.disconnect()})),[N,T,L,E]);const O=T?.startsWith("#")??!1,D=!v.target||"_self"===v.target,I=!T||!E||!D||O;return g||!O&&I||k.collectLink(T),v.id&&k.collectAnchor(v.id),I?(0,d.jsx)("a",{ref:S,href:T,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...v}):(0,d.jsx)(R,{...v,onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,L&&e&&E&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});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 s(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 l(e,t){let{message:n,id:r}=e;return a(s({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=s({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,{A:()=>s,h:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.z)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(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},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 s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=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),s=(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:s,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>f,gk:()=>m,Gy:()=>d,HW:()=>v,ht:()=>p,r7:()=>g,jh:()=>h});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 s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(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 u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>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});function f(e){void 0===e&&(e={});const t=d(),{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 m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return s(t)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},1911:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},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";n.r(t);var r=n(8181),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(8215),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.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?l.anchorWithHideOnScrollNavbar:l.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"})})}},9201:(e,t,n)=>{"use strict";n.d(t,{A:()=>Nt});var r=n(6540),o=n(8215),a=n(7489),i=n(9024),s=n(6347),l=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,s.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 m=(0,l.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 h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const v={skipToContent:"skipToContent_fXgn"};function y(){return(0,u.jsx)(h,{className:v.skipToContent})}var x=n(6342),w=n(5041);function k(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,l.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)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.Mj)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var j=n(2069),R=n(3104);var L=n(9532),N=n(5600);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,N.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,L.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)(P.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)(P);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.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)(),s=(0,l.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,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.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:s,"aria-label":s,"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,x.p)().navbar.style,r=(0,x.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 K(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,j.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.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)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(K,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(Q,{})]})}var Z=n(8774),X=n(6025),J=n(6654),ee=n(1252),te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.A)(r),p=(0,X.A)(t),f=(0,X.A)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}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),se=n(9169),le=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.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)}}),[l]),(0,u.jsxs)("div",{ref:l,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:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(He,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(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),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(He,{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 me=n(2131);function he(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 ge="iconLanguage_nlXk";var be=n(961);function ve(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(9188),xe=["translations"];function we(){return we=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},we.apply(this,arguments)}function ke(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,a=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(l){s=!0,o=l}finally{try{i||null==n.return||n.return()}finally{if(s)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Se(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Se(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _e(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ee="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=_e(e,xe),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=ke((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Ee))}),[]),r.createElement("button",we({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ye.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Ee?r.createElement(ve,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Te=n(5260),Ae=n(4255),je=n(1062),Re=n(2967);const Le={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Pe(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Oe(e){let{state:t,onClose:n}=e;const r=(0,Ae.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function De(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.A)(),l=(0,je.C)(),c=function(){const{locale:e,tags:t}=(0,Re.af)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...a.searchParameters,facetFilters:p},m=(0,s.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,x]=(0,r.useState)(void 0),w=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(9462).then(n.bind(n,9462)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,416))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),k=(0,r.useCallback)((()=>{w().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),v(!0)}))}),[w,v]),S=(0,r.useCallback)((()=>{v(!1),h.current?.remove()}),[v]),_=(0,r.useCallback)((e=>{w().then((()=>{v(!0),x(e.key)}))}),[w,v,x]),E=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(o,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Oe,{...e,onClose:S})),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:b,onOpen:k,onClose:S,onInput:_,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Te.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Ce,{onTouchStart:w,onFocus:w,onMouseOver:w,onClick:k,ref:g,translations:Le.button}),b&&Ne&&h.current&&(0,be.createPortal)((0,u.jsx)(Ne,{onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:E,transformItems:C,hitComponent:Pe,transformSearchClient:A,...a.searchPagePath&&{resultsFooterComponent:T},...a,searchParameters:f,placeholder:Le.placeholder,translations:Le.modal}),h.current)]})}function Ie(){const{siteConfig:e}=(0,le.A)();return(0,u.jsx)(De,{...e.themeConfig.algolia})}const Me={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Fe(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Me.navbarSearchContainer),children:t})}var ze=n(4070),Be=n(1754);var $e=n(5597);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const qe={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,le.A)(),p=(0,me.o)(),{search:f,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${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],g=t?(0,l.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)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Fe,{className:n,children:(0,u.jsx)(Ie,{})})},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,ze.zK)(r),i=(0,Be.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!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,ze.zK)(r),i=(0,Be.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,Be.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,ze.zK)(n),f=(0,ze.jh)(n),{savePreferredVersionName:m}=(0,$e.g1)(n),h=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,Be.Vd)(n)[0],b=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,v=t&&h.length>1?void 0:Ue(g).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:v,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:v,items:h,isActive:r?()=>!1:void 0})}};function He(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=qe[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Ge(){const e=(0,j.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(He,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ve(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.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 We(){const e=0===(0,x.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ve,{onClick:()=>t.hide()}),t.content]})}function Ke(){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)(Ge,{}),secondaryMenu:(0,u.jsx)(We,{})}):null}const Qe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Ze(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,j.M)(),{navbarRef:s,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,R.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 s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&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:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[Qe.navbarHideable,!d&&Qe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ye,{onClick:i.toggle}),(0,u.jsx)(Ke,{})]})}var Xe=n(440);const Je={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function et(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.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 tt(e){let{error:t}=e;const n=(0,Xe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Je.errorBoundaryError,children:n})}class nt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const rt="right";function ot(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 at(){const{toggle:e,shown:t}=(0,j.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.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)(ot,{})})}const it={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(nt,{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)(He,{...e})},t)))})}function lt(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 ct(){const e=(0,j.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(lt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(at,{}),(0,u.jsx)(K,{}),(0,u.jsx)(st,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(st,{items:r}),(0,u.jsx)(V,{className:it.colorModeToggle}),!o&&(0,u.jsx)(Fe,{children:(0,u.jsx)(Ie,{})})]})})}function ut(){return(0,u.jsx)(Ze,{children:(0,u.jsx)(ct,{})})}function dt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.A)(n),l=(0,X.A)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function pt(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)(dt,{item:t})},t.href??t.to)}function ft(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)(pt,{item:e},t)))})]})}function mt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(ft,{column:e},t)))})}function ht(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function gt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(dt,{item:t})}function bt(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)(gt,{item:e}),t.length!==n+1&&(0,u.jsx)(ht,{})]},n)))})})}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(mt,{columns:t}):(0,u.jsx)(bt,{links:t})}var yt=n(1122);const xt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(yt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:xt.footerLogoLink,target:t.target,children:(0,u.jsx)(wt,{logo:t})}):(0,u.jsx)(wt,{logo:t})}function St(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(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 Et(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(_t,{style:o,links:n&&n.length>0&&(0,u.jsx)(vt,{links:n}),logo:r&&(0,u.jsx)(kt,{logo:r}),copyright:t&&(0,u.jsx)(St,{copyright:t})})}const Ct=r.memo(Et),Tt=(0,L.fM)([F.a,w.oq,R.Tv,$e.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(N.y_,{children:(0,u.jsx)(j.e,{children:(0,u.jsx)(O,{children:t})})})}]);function At(e){let{children:t}=e;return(0,u.jsx)(Tt,{children:t})}var jt=n(1107);function Rt(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)(jt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.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)(et,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(tt,{error:t})})]})})})}const Lt={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(At,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(y,{}),(0,u.jsx)(A,{}),(0,u.jsx)(ut,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,Lt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Rt,{...e}),children:t})}),!n&&(0,u.jsx)(Ct,{})]})}},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),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.A)(t.src),dark:(0,o.A)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.A)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.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(5066),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.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),s=n(4848);const l="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??l}`,height:`${t}px`}}function s(){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?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>h,oq:()=>m});var r=n(6540),o=n(2303),a=n(9466),i=n(9532),s=n(6342),l=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 m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.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,l.jsx)(f.Provider,{value:n,children:t})}function h(){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:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(9466),s=n(6342),l=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,m=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(m(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&&h(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 l=(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||l.current?l.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,l.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}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,XK:()=>x,g1:()=>y});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),s=n(1754),l=n(9532),c=n(9466),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.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){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function v(){const e=(0,r.useContext)(m);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=v(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function x(){const e=(0,o.Gy)(),[t]=v();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(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)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(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 l(){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[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),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)}}),[])}},4255:(e,t,n)=>{"use strict";n.d(t,{b:()=>s,w:()=>l});var r=n(6540),o=n(4586),a=n(7485);const i="q";function s(){return(0,a.l)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(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",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",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:{}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>f,w8:()=>g,C5:()=>p,B5:()=>_,Vd:()=>w,QB:()=>S,fW:()=>k,OF:()=>x,Y:()=>v});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),s=n(5597),l=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var d=n(9169);const p=!!i.Gy;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}const m=(e,t)=>void 0!==e&&(0,d.ys)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function y(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,d.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,c.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,s.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(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 S(e,t){const n=w(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- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,l.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.v)(i),sidebarName:c,sidebarItems:u}}},481:(e,t,n)=>{"use strict";n.d(t,{s:()=>o});var r=n(4586);function o(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,l:()=>l});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function l(e){const t=s(e)??"",n=function(){const e=(0,o.W6)();return(0,r.useCallback)(((t,n,r)=>{const o=new URLSearchParams(e.location.search);n?o.set(t,n):o.delete(t),(r?.push?e.push:e.replace)({search:o.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},9024:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>m});var r=n(6540),o=n(5066),a=n(5260),i=n(3102);function s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(6025),c=n(481),u=n(4848);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.s)(t),{withBaseUrl:d}=(0,l.h)(),p=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.A,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,o.A)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,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 s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l 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)})}}},1252:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,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 s(){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)),s=n(4848);const l=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,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);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?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>i,af:()=>l,tU:()=>s});var r=n(4070),o=n(4586),a=n(5597);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,o.A)(),t=(0,r.Gy)(),n=(0,r.gk)(),l=(0,a.XK)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=l[e],a=t[e].versions.find((e=>e.isLast));return s(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},9466:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>l});n(6540);const r="localStorage";function o(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 a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(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),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},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:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),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}},8126:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(4586);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},1062:(e,t,n)=>{"use strict";n.d(t,{C:()=>s});var r=n(6540),o=n(1252),a=n(6025),i=n(8126);function s(){const{withBaseUrl:e}=(0,a.h)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2983:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>A,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("/")||[],s=e&&o(e),l=t&&o(t),c=s||l;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 m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(1561);function l(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(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}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 m(){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 h=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),h||(0,s.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,x=void 0!==c&&c,w=i.getUserConfirmation,k=void 0===w?g:w,S=i.keyLength,_=void 0===S?6:S,E=e.basename?d(l(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 T(){return Math.random().toString(36).substr(2,_)}var A=m();function j(e){(0,r.A)($,e),$.length=n.length,A.notifyListeners($.location,$.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(C(e.state))}function L(){P(C(y()))}var N=!1;function P(e){if(N)N=!1,j();else{A.confirmTransitionTo(e,"POP",k,(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&&(N=!0,M(o))}(e)}))}}var O=C(y()),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,R),a&&window.addEventListener(v,L)):0===F&&(window.removeEventListener(b,R),a&&window.removeEventListener(v,L))}var B=!1;var $={length:n.length,action:"POP",location:O,createHref:I,push:function(e,t){var r="PUSH",a=f(e,t,T(),$.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=I(a),i=a.key,s=a.state;if(o)if(n.pushState({key:i,state:s},null,t),x)window.location.href=t;else{var l=D.indexOf($.location.key),c=D.slice(0,l+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,T(),$.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=I(a),i=a.key,s=a.state;if(o)if(n.replaceState({key:i,state:s},null,t),x)window.location.replace(t);else{var l=D.indexOf($.location.key);-1!==l&&(D[l]=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=A.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=A.appendListener(e);return z(1),function(){z(-1),t()}}};return $}var w="hashchange",k={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:l},slash:{encodePath:l,decodePath:l}};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={}),h||(0,s.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?g:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(l(e.basename)):"",v=k[c],y=v.encodePath,x=v.decodePath;function C(){var e=x(_());return b&&(e=u(e,b)),f(e)}var T=m();function A(e){(0,r.A)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var j=!1,R=null;function L(){var e,t,n=_(),r=y(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(R===p(o))return;R=null,function(e){if(j)j=!1,A();else{var t="POP";T.confirmTransitionTo(e,t,a,(function(n){n?A({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 N=_(),P=y(N);N!==P&&E(P);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(w,L):0===M&&window.removeEventListener(w,L)}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+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);if(_()!==o){R=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,A({action:n,location:r})}else A()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);_()!==o&&(R=t,E(o));var a=D.indexOf(p(B.location));-1!==a&&(D[a]=t),A({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=m();function d(e){(0,r.A)(x,e),x.length=x.entries.length,u.notifyListeners(x.location,x.action)}function h(){return Math.random().toString(36).substr(2,c)}var g=T(s,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?h():e.key||h())})),v=p;function y(e){var t=T(x.index+e,0,x.entries.length-1),r=x.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var x={length:b.length,action:"POP",location:b[g],index:g,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,h(),x.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=x.index+1,n=x.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,h(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=x.index+e;return t>=0&&t<x.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return x}},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},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g<i.length;++g){var b=i[g];if(!(a[b]||r&&r[b]||h&&h[b]||s&&s[b])){var v=p(n,b);try{c(t,b,v)}catch(y){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=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,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},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,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(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),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,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 s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=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 s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],x=n[7];s&&(r.push(s),s="");var w=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,_=n[2]||u,E=b||v;r.push({name:g||a++,prefix:h||"",delimiter:_,optional:S,repeat:k,partial:w,asterisk:!!x,pattern:E?c(E):x?".*":"[^"+l(_)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(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="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,p=s[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=l(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()})):l(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 l(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="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var p=l(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 m=l(n.delimiter||"/"),h=i.slice(-m.length)===m;return o||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=a?"$":o&&h?"":"(?="+m+"|$)",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,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=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(s){for(var l=0;l<s.length&&!(o>=a.length);l++){var c=s[l];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),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return s}(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 s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,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,s){var l=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}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),m=u;o(m);){for(var h in p={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var x={getIds:function(){var e=[];return x.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,s={},l={};function c(e){if(e in s)return s[e];l[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 l[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,u,t,n)}};return x}}();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 s=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 s.name="Invariant Violation",s}}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,s={};function l(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[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={},m={};function h(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 g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function v(e){return e[1].toUpperCase()}function y(e,t,n,r){var o=g.hasOwnProperty(t)?g[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(m,e)||!d.call(f,e)&&(p.test(e)?m[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,v);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var x=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),k=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),T=Symbol.for("react.context"),A=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),R=Symbol.for("react.suspense_list"),L=Symbol.for("react.memo"),N=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var P=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,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=i&&0<=s);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 k:return"Portal";case E:return"Profiler";case _:return"StrictMode";case j:return"Suspense";case R:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case A:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case L:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case N: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 K(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 Q(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)&&y(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&&K(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 se(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 le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?se(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},me=["Webkit","ms","Moz","O"];function he(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 ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=he(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(fe).forEach((function(e){me.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 ve(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 ye(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 xe=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,Se=null,_e=null;function Ee(e){if(e=xo(e)){if("function"!=typeof ke)throw Error(a(280));var t=e.stateNode;t&&(t=ko(t),ke(e.stateNode,e.type,t))}}function Ce(e){Se?_e?_e.push(e):_e=[e]:Se=e}function Te(){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 Ae(e,t){return e(t)}function je(){}var Re=!1;function Le(e,t,n){if(Re)return e(t,n);Re=!0;try{return Ae(e,t,n)}finally{Re=!1,(null!==Se||null!==_e)&&(je(),Te())}}function Ne(e,t){var n=e.stateNode;if(null===n)return null;var r=ko(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 Pe=!1;if(u)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Pe=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ue){Pe=!1}function De(e,t,n,r,o,a,i,s,l){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,s,l){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{0!=(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 s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=i;break}if(l===r){s=!0,r=o,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=o;break}if(l===r){s=!0,r=i,n=o;break}l=l.sibling}if(!s)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,Ke=o.unstable_cancelCallback,Qe=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-(st(e)/lt|0)|0},st=Math.log,lt=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 s=i&~o;0!==s?r=dt(s):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&&0==(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&0!=(4194240&a)))return t;if(0!=(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 mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return 0==(4194240&(ct<<=1))&&(ct=64),e}function gt(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 vt(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 yt=0;function xt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}var wt,kt,St,_t,Et,Ct=!1,Tt=[],At=null,jt=null,Rt=null,Lt=new Map,Nt=new Map,Pt=[],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":At=null;break;case"dragenter":case"dragleave":jt=null;break;case"mouseover":case"mouseout":Rt=null;break;case"pointerover":case"pointerout":Lt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Nt.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=xo(t))&&kt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=yo(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=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=xo(n))&&kt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);xe=r,n.target.dispatchEvent(r),xe=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Ct=!1,null!==At&&Ft(At)&&(At=null),null!==jt&&Ft(jt)&&(jt=null),null!==Rt&&Ft(Rt)&&(Rt=null),Lt.forEach(zt),Nt.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<Tt.length){$t(Tt[0],e);for(var n=1;n<Tt.length;n++){var r=Tt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==At&&$t(At,e),null!==jt&&$t(jt,e),null!==Rt&&$t(Rt,e),Lt.forEach(t),Nt.forEach(t),n=0;n<Pt.length;n++)(r=Pt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Pt.length&&null===(n=Pt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Pt.shift()}var qt=x.ReactCurrentBatchConfig,Ht=!0;function Gt(e,t,n,r){var o=yt,a=qt.transition;qt.transition=null;try{yt=1,Wt(e,t,n,r)}finally{yt=o,qt.transition=a}}function Vt(e,t,n,r){var o=yt,a=qt.transition;qt.transition=null;try{yt=4,Wt(e,t,n,r)}finally{yt=o,qt.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Qt(e,t,n,r);if(null===o)Hr(e,t,r,Kt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return At=It(At,e,t,n,r,o),!0;case"dragenter":return jt=It(jt,e,t,n,r,o),!0;case"mouseover":return Rt=It(Rt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Lt.set(a,It(Lt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,Nt.set(a,It(Nt.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=xo(o);if(null!==a&&wt(a),null===(a=Qt(e,t,n,r))&&Hr(e,t,r,Kt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Kt=null;function Qt(e,t,n,r){if(Kt=null,null!==(e=yo(e=we(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 Kt=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,sn,ln,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!==ln&&(ln&&"mousemove"===e.type?(an=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=an=0,ln=e),an)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),mn=on(fn),hn=on(M({},fn,{dataTransfer:0})),gn=on(M({},dn,{relatedTarget:0})),bn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),vn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),yn=on(vn),xn=on(M({},cn,{data:0})),wn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},kn={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=wn[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?kn[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}}),Tn=on(Cn),An=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})),Rn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Ln=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}),Nn=on(Ln),Pn=[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!==Pn.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 Kn(e){Fr(e,0)}function Qn(e){if(W(wo(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&&Qn(Wn)){var t=[];Gn(t,Wn,e,we(e)),Le(Kn,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 Qn(Wn)}function ar(e,t){if("click"===e)return Qn(t)}function ir(e,t){if("input"===e||"change"===e)return Qn(t)}var sr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lr(e,t){if(sr(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)||!sr(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=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=K((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 mr(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 hr=u&&"documentMode"in document&&11>=document.documentMode,gr=null,br=null,vr=null,yr=!1;function xr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;yr||null==gr||gr!==K(r)||("selectionStart"in(r=gr)&&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},vr&&lr(vr,r)||(vr=r,0<(r=Vr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function wr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kr={animationend:wr("Animation","AnimationEnd"),animationiteration:wr("Animation","AnimationIteration"),animationstart:wr("Animation","AnimationStart"),transitionend:wr("Transition","TransitionEnd")},Sr={},_r={};function Er(e){if(Sr[e])return Sr[e];if(!kr[e])return e;var t,n=kr[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 kr.animationend.animation,delete kr.animationiteration.animation,delete kr.animationstart.animation),"TransitionEvent"in window||delete kr.transitionend.transition);var Cr=Er("animationend"),Tr=Er("animationiteration"),Ar=Er("animationstart"),jr=Er("transitionend"),Rr=new Map,Lr="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 Nr(e,t){Rr.set(e,t),l(t,[e])}for(var Pr=0;Pr<Lr.length;Pr++){var Or=Lr[Pr];Nr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Nr(Cr,"onAnimationEnd"),Nr(Tr,"onAnimationIteration"),Nr(Ar,"onAnimationStart"),Nr("dblclick","onDoubleClick"),Nr("focusin","onFocus"),Nr("focusout","onBlur"),Nr(jr,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("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,s,l,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=0!=(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 s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[go];void 0===n&&(n=t[go]=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,!Pe||"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(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o||8===s.nodeType&&s.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;i=i.return}for(;null!==s;){if(null===(i=yo(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}Le((function(){var r=a,o=we(n),i=[];e:{var s=Rr.get(e);if(void 0!==s){var l=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=Tn;break;case"focusin":c="focus",l=gn;break;case"focusout":c="blur",l=gn;break;case"beforeblur":case"afterblur":l=gn;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":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=jn;break;case Cr:case Tr:case Ar:l=bn;break;case jr:l=Rn;break;case"scroll":l=pn;break;case"wheel":l=Nn;break;case"copy":case"cut":case"paste":l=yn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=An}var u=0!=(4&t),d=!u&&"scroll"===e,p=u?null!==s?s+"Capture":null:s;u=[];for(var f,m=r;null!==m;){var h=(f=m).stateNode;if(5===f.tag&&null!==h&&(f=h,null!==p&&(null!=(h=Ne(m,p))&&u.push(Gr(m,h,f)))),d)break;m=m.return}0<u.length&&(s=new l(s,c,null,n,o),i.push({event:s,listeners:u}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===xe||!(c=n.relatedTarget||n.fromElement)||!yo(c)&&!c[ho])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?yo(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=mn,h="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=An,h="onPointerLeave",p="onPointerEnter",m="pointer"),d=null==l?s:wo(l),f=null==c?s:wo(c),(s=new u(h,m+"leave",l,n,o)).target=d,s.relatedTarget=f,h=null,yo(o)===r&&((u=new u(p,m+"enter",c,n,o)).target=f,u.relatedTarget=d,h=u),d=h,l&&c)e:{for(p=c,m=0,f=u=l;f;f=Wr(f))m++;for(f=0,h=p;h;h=Wr(h))f++;for(;0<m-f;)u=Wr(u),m--;for(;0<f-m;)p=Wr(p),f--;for(;m--;){if(u===p||null!==p&&u===p.alternate)break e;u=Wr(u),p=Wr(p)}u=null}else u=null;null!==l&&Kr(i,s,l,u,!1),null!==c&&null!==d&&Kr(i,d,c,u,!0)}if("select"===(l=(s=r?wo(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var g=Yn;else if(Hn(s))if(Zn)g=ir;else{g=or;var b=rr}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(g=ar);switch(g&&(g=g(e,r))?Gn(i,g,n,o):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&ee(s,"number",s.value)),b=r?wo(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(gr=b,br=r,vr=null);break;case"focusout":vr=br=gr=null;break;case"mousedown":yr=!0;break;case"contextmenu":case"mouseup":case"dragend":yr=!1,xr(i,n,o);break;case"selectionchange":if(hr)break;case"keydown":case"keyup":xr(i,n,o)}var v;if(On)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Un?Bn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Mn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=en()):(Xt="value"in(Zt=o)?Zt.value:Zt.textContent,Un=!0)),0<(b=Vr(r,y)).length&&(y=new xn(y,e,null,n,o),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=$n(n))&&(y.data=v))),(v=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 xn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=v))}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=Ne(e,n))&&r.unshift(Gr(e,a,o)),null!=(a=Ne(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 Kr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,o?null!=(l=Ne(n,a))&&i.unshift(Gr(n,l,s)):o||null!=(l=Ne(n,a))&&i.push(Gr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Qr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Qr,"\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(so)}:ro;function so(e){setTimeout((function(){throw e}))}function lo(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,mo="__reactProps$"+po,ho="__reactContainer$"+po,go="__reactEvents$"+po,bo="__reactListeners$"+po,vo="__reactHandles$"+po;function yo(e){var t=e[fo];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ho]||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 xo(e){return!(e=e[fo]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wo(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function ko(e){return e[mo]||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 To(e,t){_o++,So[_o]=e.current,e.current=t}var Ao={},jo=Eo(Ao),Ro=Eo(!1),Lo=Ao;function No(e,t){var n=e.type.contextTypes;if(!n)return Ao;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 Po(e){return null!=(e=e.childContextTypes)}function Oo(){Co(Ro),Co(jo)}function Do(e,t,n){if(jo.current!==Ao)throw Error(a(168));To(jo,t),To(Ro,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||Ao,Lo=jo.current,To(jo,e),To(Ro,Ro.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Io(e,t,Lo),r.__reactInternalMemoizedMergedChildContext=e,Co(Ro),Co(jo),To(jo,e)):Co(Ro),To(Ro,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=yt;try{var n=zo;for(yt=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{yt=t,$o=!1}}return null}var Ho=[],Go=0,Vo=null,Wo=0,Ko=[],Qo=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){Ko[Qo++]=Zo,Ko[Qo++]=Xo,Ko[Qo++]=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=Ko[--Qo],Ko[Qo]=null,Xo=Ko[--Qo],Ko[Qo]=null,Zo=Ko[--Qo],Ko[Qo]=null}var ra=null,oa=null,aa=!1,ia=null;function sa(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 la(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 0!=(1&e.mode)&&0==(128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!la(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&la(e,t)?sa(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;)sa(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 ma(){oa=ra=null,aa=!1}function ha(e){null===ia?ia=[e]:ia.push(e)}var ga=x.ReactCurrentBatchConfig;function ba(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}var va=Eo(null),ya=null,xa=null,wa=null;function ka(){wa=xa=ya=null}function Sa(e){var t=va.current;Co(va),e._currentValue=t}function _a(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 Ea(e,t){ya=e,wa=xa=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(xs=!0),e.firstContext=null)}function Ca(e){var t=e._currentValue;if(wa!==e)if(e={context:e,memoizedValue:t,next:null},null===xa){if(null===ya)throw Error(a(308));xa=e,ya.dependencies={lanes:0,firstContext:e}}else xa=xa.next=e;return t}var Ta=null;function Aa(e){null===Ta?Ta=[e]:Ta.push(e)}function ja(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Aa(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ra(e,r)}function Ra(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 La=!1;function Na(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Pa(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 Oa(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Da(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&jl)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ra(e,n)}return null===(o=r.interleaved)?(t.next=t,Aa(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ra(e,n)}function Ia(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194240&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}function Ma(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 Fa(e,t,n,r){var o=e.updateQueue;La=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var p=s.lane,f=s.eventTime;if((r&p)===p){null!==u&&(u=u.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var m=e,h=s;switch(p=t,f=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(f,d,p);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(p="function"==typeof(m=h.payload)?m.call(f,d,p):m))break e;d=M({},d,p);break e;case 2:La=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(p=o.effects)?o.effects=[s]:p.push(s))}else f={eventTime:f,lane:p,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=f,l=d):u=u.next=f,i|=p;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(p=s).next,p.next=null,o.lastBaseUpdate=p,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,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);Ml|=i,e.lanes=i,e.memoizedState=d}}function za(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 Ba=(new r.Component).refs;function $a(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 Ua={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Oa(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Da(e,a,o))&&(rc(t,e,o,r),Ia(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Oa(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Da(e,a,o))&&(rc(t,e,o,r),Ia(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tc(),r=nc(e),o=Oa(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Da(e,o,r))&&(rc(t,e,r,n),Ia(t,e,r))}};function qa(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function Ha(e,t,n){var r=!1,o=Ao,a=t.contextType;return"object"==typeof a&&null!==a?a=Ca(a):(o=Po(t)?Lo:jo.current,a=(r=null!=(r=t.contextTypes))?No(e,o):Ao),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=Ua,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function Ga(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&&Ua.enqueueReplaceState(t,t.state,null)}function Va(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Ba,Na(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Ca(a):(a=Po(t)?Lo:jo.current,o.context=No(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&($a(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&&Ua.enqueueReplaceState(o,o.state,null),Fa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function Wa(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;t===Ba&&(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 Ka(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Qa(e){return(0,e._init)(e._payload)}function Ya(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=Oc(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 s(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Fc(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===N&&Qa(a)===t.type)?((r=o(t,n.props)).ref=Wa(e,t,n),r.return=e,r):((r=Dc(n.type,n.key,n.props,null,e.mode,r)).ref=Wa(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=zc(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=Ic(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=Fc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case w:return(n=Dc(t.type,t.key,t.props,null,e.mode,n)).ref=Wa(e,null,t),n.return=e,n;case k:return(t=zc(t,e.mode,n)).return=e,t;case N:return p(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Ic(t,e.mode,n,null)).return=e,t;Ka(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:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===o?c(e,t,n,r):null;case k:return n.key===o?u(e,t,n,r):null;case N: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);Ka(e,n)}return null}function m(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case w:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case k:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case N:return m(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);Ka(t,r)}return null}function h(o,a,s,l){for(var c=null,u=null,d=a,h=a=0,g=null;null!==d&&h<s.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var b=f(o,d,s[h],l);if(null===b){null===d&&(d=g);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,h),null===u?c=b:u.sibling=b,u=b,d=g}if(h===s.length)return n(o,d),aa&&Jo(o,h),c;if(null===d){for(;h<s.length;h++)null!==(d=p(o,s[h],l))&&(a=i(d,a,h),null===u?c=d:u.sibling=d,u=d);return aa&&Jo(o,h),c}for(d=r(o,d);h<s.length;h++)null!==(g=m(d,o,h,s[h],l))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),a=i(g,a,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),c}function g(o,s,l,c){var u=D(l);if("function"!=typeof u)throw Error(a(150));if(null==(l=u.call(l)))throw Error(a(151));for(var d=u=null,h=s,g=s=0,b=null,v=l.next();null!==h&&!v.done;g++,v=l.next()){h.index>g?(b=h,h=null):b=h.sibling;var y=f(o,h,v.value,c);if(null===y){null===h&&(h=b);break}e&&h&&null===y.alternate&&t(o,h),s=i(y,s,g),null===d?u=y:d.sibling=y,d=y,h=b}if(v.done)return n(o,h),aa&&Jo(o,g),u;if(null===h){for(;!v.done;g++,v=l.next())null!==(v=p(o,v.value,c))&&(s=i(v,s,g),null===d?u=v:d.sibling=v,d=v);return aa&&Jo(o,g),u}for(h=r(o,h);!v.done;g++,v=l.next())null!==(v=m(h,o,g,v.value,c))&&(e&&null!==v.alternate&&h.delete(null===v.key?g:v.key),s=i(v,s,g),null===d?u=v:d.sibling=v,d=v);return e&&h.forEach((function(e){return t(o,e)})),aa&&Jo(o,g),u}return function e(r,a,i,l){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 w: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===N&&Qa(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=Wa(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((a=Ic(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Dc(i.type,i.key,i.props,null,r.mode,l)).ref=Wa(r,a,i),l.return=r,r=l)}return s(r);case k: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=zc(i,r.mode,l)).return=r,r=a}return s(r);case N:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return h(r,a,i,l);if(D(i))return g(r,a,i,l);Ka(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=Fc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var Za=Ya(!0),Xa=Ya(!1),Ja={},ei=Eo(Ja),ti=Eo(Ja),ni=Eo(Ja);function ri(e){if(e===Ja)throw Error(a(174));return e}function oi(e,t){switch(To(ni,t),To(ti,e),To(ei,Ja),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Co(ei),To(ei,t)}function ai(){Co(ei),Co(ti),Co(ni)}function ii(e){ri(ni.current);var t=ri(ei.current),n=le(t,e.type);t!==n&&(To(ti,e),To(ei,n))}function si(e){ti.current===e&&(Co(ei),Co(ti))}var li=Eo(0);function ci(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(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 ui=[];function di(){for(var e=0;e<ui.length;e++)ui[e]._workInProgressVersionPrimary=null;ui.length=0}var pi=x.ReactCurrentDispatcher,fi=x.ReactCurrentBatchConfig,mi=0,hi=null,gi=null,bi=null,vi=!1,yi=!1,xi=0,wi=0;function ki(){throw Error(a(321))}function Si(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sr(e[n],t[n]))return!1;return!0}function _i(e,t,n,r,o,i){if(mi=i,hi=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,pi.current=null===e||null===e.memoizedState?ss:ls,e=n(r,o),yi){i=0;do{if(yi=!1,xi=0,25<=i)throw Error(a(301));i+=1,bi=gi=null,t.updateQueue=null,pi.current=cs,e=n(r,o)}while(yi)}if(pi.current=is,t=null!==gi&&null!==gi.next,mi=0,bi=gi=hi=null,vi=!1,t)throw Error(a(300));return e}function Ei(){var e=0!==xi;return xi=0,e}function Ci(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===bi?hi.memoizedState=bi=e:bi=bi.next=e,bi}function Ti(){if(null===gi){var e=hi.alternate;e=null!==e?e.memoizedState:null}else e=gi.next;var t=null===bi?hi.memoizedState:bi.next;if(null!==t)bi=t,gi=e;else{if(null===e)throw Error(a(310));e={memoizedState:(gi=e).memoizedState,baseState:gi.baseState,baseQueue:gi.baseQueue,queue:gi.queue,next:null},null===bi?hi.memoizedState=bi=e:bi=bi.next=e}return bi}function Ai(e,t){return"function"==typeof t?t(e):t}function ji(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=gi,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var s=o.next;o.next=i.next,i.next=s}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var l=s=null,c=null,u=i;do{var d=u.lane;if((mi&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?(l=c=p,s=r):c=c.next=p,hi.lanes|=d,Ml|=d}u=u.next}while(null!==u&&u!==i);null===c?s=r:c.next=l,sr(r,t.memoizedState)||(xs=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,hi.lanes|=i,Ml|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ri(e){var t=Ti(),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 s=o=o.next;do{i=e(i,s.action),s=s.next}while(s!==o);sr(i,t.memoizedState)||(xs=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Li(){}function Ni(e,t){var n=hi,r=Ti(),o=t(),i=!sr(r.memoizedState,o);if(i&&(r.memoizedState=o,xs=!0),r=r.queue,Hi(Di.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==bi&&1&bi.memoizedState.tag){if(n.flags|=2048,zi(9,Oi.bind(null,n,r,o,t),void 0,null),null===Rl)throw Error(a(349));0!=(30&mi)||Pi(n,t,o)}return o}function Pi(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=hi.updateQueue)?(t={lastEffect:null,stores:null},hi.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Oi(e,t,n,r){t.value=n,t.getSnapshot=r,Ii(t)&&Mi(e)}function Di(e,t,n){return n((function(){Ii(t)&&Mi(e)}))}function Ii(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!sr(e,n)}catch(r){return!0}}function Mi(e){var t=Ra(e,1);null!==t&&rc(t,e,1,-1)}function Fi(e){var t=Ci();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Ai,lastRenderedState:e},t.queue=e,e=e.dispatch=ns.bind(null,hi,e),[t.memoizedState,e]}function zi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=hi.updateQueue)?(t={lastEffect:null,stores:null},hi.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Bi(){return Ti().memoizedState}function $i(e,t,n,r){var o=Ci();hi.flags|=e,o.memoizedState=zi(1|t,n,void 0,void 0===r?null:r)}function Ui(e,t,n,r){var o=Ti();r=void 0===r?null:r;var a=void 0;if(null!==gi){var i=gi.memoizedState;if(a=i.destroy,null!==r&&Si(r,i.deps))return void(o.memoizedState=zi(t,n,a,r))}hi.flags|=e,o.memoizedState=zi(1|t,n,a,r)}function qi(e,t){return $i(8390656,8,e,t)}function Hi(e,t){return Ui(2048,8,e,t)}function Gi(e,t){return Ui(4,2,e,t)}function Vi(e,t){return Ui(4,4,e,t)}function Wi(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 Ki(e,t,n){return n=null!=n?n.concat([e]):null,Ui(4,4,Wi.bind(null,t,e),n)}function Qi(){}function Yi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Zi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Xi(e,t,n){return 0==(21&mi)?(e.baseState&&(e.baseState=!1,xs=!0),e.memoizedState=n):(sr(n,t)||(n=ht(),hi.lanes|=n,Ml|=n,e.baseState=!0),t)}function Ji(e,t){var n=yt;yt=0!==n&&4>n?n:4,e(!0);var r=fi.transition;fi.transition={};try{e(!1),t()}finally{yt=n,fi.transition=r}}function es(){return Ti().memoizedState}function ts(e,t,n){var r=nc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rs(e))os(t,n);else if(null!==(n=ja(e,t,n,r))){rc(n,e,r,tc()),as(n,t,r)}}function ns(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rs(e))os(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,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,Aa(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=ja(e,t,o,r))&&(rc(n,e,r,o=tc()),as(n,t,r))}}function rs(e){var t=e.alternate;return e===hi||null!==t&&t===hi}function os(e,t){yi=vi=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function as(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}var is={readContext:Ca,useCallback:ki,useContext:ki,useEffect:ki,useImperativeHandle:ki,useInsertionEffect:ki,useLayoutEffect:ki,useMemo:ki,useReducer:ki,useRef:ki,useState:ki,useDebugValue:ki,useDeferredValue:ki,useTransition:ki,useMutableSource:ki,useSyncExternalStore:ki,useId:ki,unstable_isNewReconciler:!1},ss={readContext:Ca,useCallback:function(e,t){return Ci().memoizedState=[e,void 0===t?null:t],e},useContext:Ca,useEffect:qi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,$i(4194308,4,Wi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return $i(4194308,4,e,t)},useInsertionEffect:function(e,t){return $i(4,2,e,t)},useMemo:function(e,t){var n=Ci();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ci();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=ts.bind(null,hi,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ci().memoizedState=e},useState:Fi,useDebugValue:Qi,useDeferredValue:function(e){return Ci().memoizedState=e},useTransition:function(){var e=Fi(!1),t=e[0];return e=Ji.bind(null,e[1]),Ci().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=hi,o=Ci();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Rl)throw Error(a(349));0!=(30&mi)||Pi(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,qi(Di.bind(null,r,i,e),[e]),r.flags|=2048,zi(9,Oi.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Ci(),t=Rl.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=xi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=wi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ls={readContext:Ca,useCallback:Yi,useContext:Ca,useEffect:Hi,useImperativeHandle:Ki,useInsertionEffect:Gi,useLayoutEffect:Vi,useMemo:Zi,useReducer:ji,useRef:Bi,useState:function(){return ji(Ai)},useDebugValue:Qi,useDeferredValue:function(e){return Xi(Ti(),gi.memoizedState,e)},useTransition:function(){return[ji(Ai)[0],Ti().memoizedState]},useMutableSource:Li,useSyncExternalStore:Ni,useId:es,unstable_isNewReconciler:!1},cs={readContext:Ca,useCallback:Yi,useContext:Ca,useEffect:Hi,useImperativeHandle:Ki,useInsertionEffect:Gi,useLayoutEffect:Vi,useMemo:Zi,useReducer:Ri,useRef:Bi,useState:function(){return Ri(Ai)},useDebugValue:Qi,useDeferredValue:function(e){var t=Ti();return null===gi?t.memoizedState=e:Xi(t,gi.memoizedState,e)},useTransition:function(){return[Ri(Ai)[0],Ti().memoizedState]},useMutableSource:Li,useSyncExternalStore:Ni,useId:es,unstable_isNewReconciler:!1};function us(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 ds(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ps(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fs="function"==typeof WeakMap?WeakMap:Map;function ms(e,t,n){(n=Oa(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Gl||(Gl=!0,Vl=r),ps(0,t)},n}function hs(e,t,n){(n=Oa(-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(){ps(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ps(0,t),"function"!=typeof r&&(null===Wl?Wl=new Set([this]):Wl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function gs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;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=Cc.bind(null,e,t,n),t.then(e,e))}function bs(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 vs(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Oa(-1,1)).tag=2,Da(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var ys=x.ReactCurrentOwner,xs=!1;function ws(e,t,n,r){t.child=null===e?Xa(t,null,n,r):Za(t,e.child,n,r)}function ks(e,t,n,r,o){n=n.render;var a=t.ref;return Ea(t,o),r=_i(e,t,n,r,a,o),n=Ei(),null===e||xs?(aa&&n&&ta(t),t.flags|=1,ws(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gs(e,t,o))}function Ss(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Pc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Dc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,_s(e,t,a,r,o))}if(a=e.child,0==(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Gs(e,t,o)}return t.flags|=1,(e=Oc(a,r)).ref=t.ref,e.return=t,t.child=e}function _s(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(xs=!1,t.pendingProps=r=a,0==(e.lanes&o))return t.lanes=e.lanes,Gs(e,t,o);0!=(131072&e.flags)&&(xs=!0)}}return Ts(e,t,n,r,o)}function Es(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},To(Ol,Pl),Pl|=n;else{if(0==(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,To(Ol,Pl),Pl|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,To(Ol,Pl),Pl|=r}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,To(Ol,Pl),Pl|=r;return ws(e,t,o,n),t.child}function Cs(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ts(e,t,n,r,o){var a=Po(n)?Lo:jo.current;return a=No(t,a),Ea(t,o),n=_i(e,t,n,r,a,o),r=Ei(),null===e||xs?(aa&&r&&ta(t),t.flags|=1,ws(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gs(e,t,o))}function As(e,t,n,r,o){if(Po(n)){var a=!0;Mo(t)}else a=!1;if(Ea(t,o),null===t.stateNode)Hs(e,t),Ha(t,n,r),Va(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Ca(c):c=No(t,c=Po(n)?Lo:jo.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&Ga(t,i,r,c),La=!1;var p=t.memoizedState;i.state=p,Fa(t,r,i,o),l=t.memoizedState,s!==r||p!==l||Ro.current||La?("function"==typeof u&&($a(t,n,u,r),l=t.memoizedState),(s=La||qa(t,n,s,r,p,l,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=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Pa(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ba(t.type,s),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Ca(l):l=No(t,l=Po(n)?Lo:jo.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||p!==l)&&Ga(t,i,r,l),La=!1,p=t.memoizedState,i.state=p,Fa(t,r,i,o);var m=t.memoizedState;s!==d||p!==m||Ro.current||La?("function"==typeof f&&($a(t,n,f,r),m=t.memoizedState),(c=La||qa(t,n,c,r,p,m,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return js(e,t,n,r,a,o)}function js(e,t,n,r,o,a){Cs(e,t);var i=0!=(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Gs(e,t,a);r=t.stateNode,ys.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Za(t,e.child,null,a),t.child=Za(t,null,s,a)):ws(e,t,s,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function Rs(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),oi(e,t.containerInfo)}function Ls(e,t,n,r,o){return ma(),ha(o),t.flags|=256,ws(e,t,n,r),t.child}var Ns,Ps,Os,Ds,Is={dehydrated:null,treeContext:null,retryLane:0};function Ms(e){return{baseLanes:e,cachePool:null,transitions:null}}function Fs(e,t,n){var r,o=t.pendingProps,i=li.current,s=!1,l=0!=(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&0!=(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),To(li,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0==(1&t.mode)?t.lanes=1:"$!"===e.data?t.lanes=8:t.lanes=1073741824,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},0==(1&o)&&null!==s?(s.childLanes=0,s.pendingProps=l):s=Mc(l,o,0,null),e=Ic(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ms(n),t.memoizedState=Is,e):zs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,Bs(e,t,s,r=ds(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Mc({mode:"visible",children:r.children},o,0,null),(i=Ic(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&Za(t,e.child,null,s),t.child.memoizedState=Ms(s),t.memoizedState=Is,i);if(0==(1&t.mode))return Bs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,Bs(e,t,s,r=ds(i=Error(a(419)),r,void 0))}if(l=0!=(s&e.childLanes),xs||l){if(null!==(r=Rl)){switch(s&-s){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=0!=(o&(r.suspendedLanes|s))?0:o)&&o!==i.retryLane&&(i.retryLane=o,Ra(e,o),rc(r,e,o,-1))}return gc(),Bs(e,t,s,r=ds(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&&(Ko[Qo++]=Zo,Ko[Qo++]=Xo,Ko[Qo++]=Yo,Zo=e.id,Xo=e.overflow,Yo=t),t=zs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 0==(1&l)&&t.child!==i?((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null):(o=Oc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?s=Oc(r,s):(s=Ic(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Ms(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Is,o}return e=(s=e.child).sibling,o=Oc(s,{mode:"visible",children:o.children}),0==(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 zs(e,t){return(t=Mc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Bs(e,t,n,r){return null!==r&&ha(r),Za(t,e.child,null,n),(e=zs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function $s(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),_a(e.return,t,n)}function Us(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 qs(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ws(e,t,r.children,n),0!=(2&(r=li.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&$s(e,n,t);else if(19===e.tag)$s(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(To(li,r),0==(1&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ci(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Us(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===ci(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Us(t,!0,n,null,a);break;case"together":Us(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Hs(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Gs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ml|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Oc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Oc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Vs(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 Ws(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 Ks(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 Ws(t),null;case 1:case 17:return Po(t.type)&&Oo(),Ws(t),null;case 3:return r=t.stateNode,ai(),Co(Ro),Co(jo),di(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==ia&&(sc(ia),ia=null))),Ps(e,t),Ws(t),null;case 5:si(t);var o=ri(ni.current);if(n=t.type,null!==e&&null!=t.stateNode)Os(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 Ws(t),null}if(e=ri(ei.current),pa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fo]=t,r[mo]=i,e=0!=(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 l in ve(n,i),o=null,i)if(i.hasOwnProperty(l)){var c=i[l];"children"===l?"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]):s.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&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{l=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=se(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[fo]=t,e[mo]=r,Ns(e,t,!1,!1),t.stateNode=e;e:{switch(l=ye(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=Q(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 ve(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?ge(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&&(s.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&y(e,i,u,l))}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 Ws(t),null;case 6:if(e&&null!=t.stateNode)Ds(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=ri(ni.current),ri(ei.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,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,0!=(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fo]=t,t.stateNode=r}return Ws(t),null;case 13:if(Co(li),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&0!=(1&t.mode)&&0==(128&t.flags))fa(),ma(),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 ma(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Ws(t),i=!1}else null!==ia&&(sc(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 0!=(128&t.flags)?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,0!=(1&t.mode)&&(null===e||0!=(1&li.current)?0===Dl&&(Dl=3):gc())),null!==t.updateQueue&&(t.flags|=4),Ws(t),null);case 4:return ai(),Ps(e,t),null===e&&Ur(t.stateNode.containerInfo),Ws(t),null;case 10:return Sa(t.type._context),Ws(t),null;case 19:if(Co(li),null===(i=t.memoizedState))return Ws(t),null;if(r=0!=(128&t.flags),null===(l=i.rendering))if(r)Vs(i,!1);else{if(0!==Dl||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(l=ci(e))){for(t.flags|=128,Vs(i,!1),null!==(r=l.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(l=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=l.childLanes,i.lanes=l.lanes,i.child=l.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=l.memoizedProps,i.memoizedState=l.memoizedState,i.updateQueue=l.updateQueue,i.type=l.type,e=l.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return To(li,1&li.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>ql&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ci(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Vs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Ws(t),null}else 2*Ze()-i.renderingStartTime>ql&&1073741824!==n&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=li.current,To(li,r?1&n|2:1&n),t):(Ws(t),null);case 22:case 23:return pc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Pl)&&(Ws(t),6&t.subtreeFlags&&(t.flags|=8192)):Ws(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Qs(e,t){switch(na(t),t.tag){case 1:return Po(t.type)&&Oo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ai(),Co(Ro),Co(jo),di(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return si(t),null;case 13:if(Co(li),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ma()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Co(li),null;case 4:return ai(),null;case 10:return Sa(t.type._context),null;case 22:case 23:return pc(),null;default:return null}}Ns=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}},Ps=function(){},Os=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ri(ei.current);var a,i=null;switch(n){case"input":o=Q(e,o),r=Q(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 ve(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[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,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ds=function(e,t,n,r){n!==r&&(t.flags|=4)};var Ys=!1,Zs=!1,Xs="function"==typeof WeakSet?WeakSet:Set,Js=null;function el(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function tl(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var nl=!1;function rl(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&&tl(t,n,a)}o=o.next}while(o!==r)}}function ol(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 al(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 il(e){var t=e.alternate;null!==t&&(e.alternate=null,il(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fo],delete t[mo],delete t[go],delete t[bo],delete t[vo])),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 sl(e){return 5===e.tag||3===e.tag||4===e.tag}function ll(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||sl(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 cl(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(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}function ul(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(ul(e,t,n),e=e.sibling;null!==e;)ul(e,t,n),e=e.sibling}var dl=null,pl=!1;function fl(e,t,n){for(n=n.child;null!==n;)ml(e,t,n),n=n.sibling}function ml(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Zs||el(n,t);case 6:var r=dl,o=pl;dl=null,fl(e,t,n),pl=o,null!==(dl=r)&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):dl.removeChild(n.stateNode));break;case 18:null!==dl&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),Ut(e)):lo(dl,n.stateNode));break;case 4:r=dl,o=pl,dl=n.stateNode.containerInfo,pl=!0,fl(e,t,n),dl=r,pl=o;break;case 0:case 11:case 14:case 15:if(!Zs&&(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&&(0!=(2&a)||0!=(4&a))&&tl(n,t,i),o=o.next}while(o!==r)}fl(e,t,n);break;case 1:if(!Zs&&(el(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Ec(n,t,s)}fl(e,t,n);break;case 21:fl(e,t,n);break;case 22:1&n.mode?(Zs=(r=Zs)||null!==n.memoizedState,fl(e,t,n),Zs=r):fl(e,t,n);break;default:fl(e,t,n)}}function hl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Xs),t.forEach((function(t){var r=jc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function gl(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,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 5:dl=l.stateNode,pl=!1;break e;case 3:case 4:dl=l.stateNode.containerInfo,pl=!0;break e}l=l.return}if(null===dl)throw Error(a(160));ml(i,s,o),dl=null,pl=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){Ec(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)bl(t,e),t=t.sibling}function bl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gl(t,e),vl(e),4&r){try{rl(3,e,e.return),ol(3,e)}catch(g){Ec(e,e.return,g)}try{rl(5,e,e.return)}catch(g){Ec(e,e.return,g)}}break;case 1:gl(t,e),vl(e),512&r&&null!==n&&el(n,n.return);break;case 5:if(gl(t,e),vl(e),512&r&&null!==n&&el(n,n.return),32&e.flags){var o=e.stateNode;try{pe(o,"")}catch(g){Ec(e,e.return,g)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,s=null!==n?n.memoizedProps:i,l=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===l&&"radio"===i.type&&null!=i.name&&Z(o,i),ye(l,s);var u=ye(l,i);for(s=0;s<c.length;s+=2){var d=c[s],p=c[s+1];"style"===d?ge(o,p):"dangerouslySetInnerHTML"===d?de(o,p):"children"===d?pe(o,p):y(o,d,p,u)}switch(l){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 m=i.value;null!=m?ne(o,!!i.multiple,m,!1):f!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[mo]=i}catch(g){Ec(e,e.return,g)}}break;case 6:if(gl(t,e),vl(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(g){Ec(e,e.return,g)}}break;case 3:if(gl(t,e),vl(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(g){Ec(e,e.return,g)}break;case 4:default:gl(t,e),vl(e);break;case 13:gl(t,e),vl(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||(Ul=Ze())),4&r&&hl(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Zs=(u=Zs)||d,gl(t,e),Zs=u):gl(t,e),vl(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&0!=(1&e.mode))for(Js=e,d=e.child;null!==d;){for(p=Js=d;null!==Js;){switch(m=(f=Js).child,f.tag){case 0:case 11:case 14:case 15:rl(4,f,f.return);break;case 1:el(f,f.return);var h=f.stateNode;if("function"==typeof h.componentWillUnmount){r=f,n=f.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(g){Ec(r,n,g)}}break;case 5:el(f,f.return);break;case 22:if(null!==f.memoizedState){kl(p);continue}}null!==m?(m.return=f,Js=m):kl(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":(l=p.stateNode,s=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,l.style.display=he("display",s))}catch(g){Ec(e,e.return,g)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=u?"":p.memoizedProps}catch(g){Ec(e,e.return,g)}}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:gl(t,e),vl(e),4&r&&hl(e);case 21:}}function vl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(sl(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),ul(e,ll(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;cl(e,ll(e),i);break;default:throw Error(a(161))}}catch(s){Ec(e,e.return,s)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function yl(e,t,n){Js=e,xl(e,t,n)}function xl(e,t,n){for(var r=0!=(1&e.mode);null!==Js;){var o=Js,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Ys;if(!i){var s=o.alternate,l=null!==s&&null!==s.memoizedState||Zs;s=Ys;var c=Zs;if(Ys=i,(Zs=l)&&!c)for(Js=o;null!==Js;)l=(i=Js).child,22===i.tag&&null!==i.memoizedState?Sl(o):null!==l?(l.return=i,Js=l):Sl(o);for(;null!==a;)Js=a,xl(a,t,n),a=a.sibling;Js=o,Ys=s,Zs=c}wl(e)}else 0!=(8772&o.subtreeFlags)&&null!==a?(a.return=o,Js=a):wl(e)}}function wl(e){for(;null!==Js;){var t=Js;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Zs||ol(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Zs)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ba(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&za(t,i,r);break;case 3:var s=t.updateQueue;if(null!==s){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}za(t,s,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;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))}Zs||512&t.flags&&al(t)}catch(f){Ec(t,t.return,f)}}if(t===e){Js=null;break}if(null!==(n=t.sibling)){n.return=t.return,Js=n;break}Js=t.return}}function kl(e){for(;null!==Js;){var t=Js;if(t===e){Js=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Js=n;break}Js=t.return}}function Sl(e){for(;null!==Js;){var t=Js;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{ol(4,t)}catch(l){Ec(t,n,l)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(l){Ec(t,o,l)}}var a=t.return;try{al(t)}catch(l){Ec(t,a,l)}break;case 5:var i=t.return;try{al(t)}catch(l){Ec(t,i,l)}}}catch(l){Ec(t,t.return,l)}if(t===e){Js=null;break}var s=t.sibling;if(null!==s){s.return=t.return,Js=s;break}Js=t.return}}var _l,El=Math.ceil,Cl=x.ReactCurrentDispatcher,Tl=x.ReactCurrentOwner,Al=x.ReactCurrentBatchConfig,jl=0,Rl=null,Ll=null,Nl=0,Pl=0,Ol=Eo(0),Dl=0,Il=null,Ml=0,Fl=0,zl=0,Bl=null,$l=null,Ul=0,ql=1/0,Hl=null,Gl=!1,Vl=null,Wl=null,Kl=!1,Ql=null,Yl=0,Zl=0,Xl=null,Jl=-1,ec=0;function tc(){return 0!=(6&jl)?Ze():-1!==Jl?Jl:Jl=Ze()}function nc(e){return 0==(1&e.mode)?1:0!=(2&jl)&&0!==Nl?Nl&-Nl:null!==ga.transition?(0===ec&&(ec=ht()),ec):0!==(e=yt)?e:e=void 0===(e=window.event)?16:Yt(e.type)}function rc(e,t,n,r){if(50<Zl)throw Zl=0,Xl=null,Error(a(185));bt(e,n,r),0!=(2&jl)&&e===Rl||(e===Rl&&(0==(2&jl)&&(Fl|=n),4===Dl&&lc(e,Nl)),oc(e,r),1===n&&0===jl&&0==(1&t.mode)&&(ql=Ze()+500,Bo&&qo()))}function oc(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),s=1<<i,l=o[i];-1===l?0!=(s&n)&&0==(s&r)||(o[i]=ft(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}}(e,t);var r=pt(e,e===Rl?Nl:0);if(0===r)null!==n&&Ke(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ke(n),1===t)0===e.tag?function(e){Bo=!0,Uo(e)}(cc.bind(null,e)):Uo(cc.bind(null,e)),io((function(){0==(6&jl)&&qo()})),n=null;else{switch(xt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Rc(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Jl=-1,ec=0,0!=(6&jl))throw Error(a(327));var n=e.callbackNode;if(Sc()&&e.callbackNode!==n)return null;var r=pt(e,e===Rl?Nl:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=bc(e,r);else{t=r;var o=jl;jl|=2;var i=hc();for(Rl===e&&Nl===t||(Hl=null,ql=Ze()+500,fc(e,t));;)try{yc();break}catch(l){mc(e,l)}ka(),Cl.current=i,jl=o,null!==Ll?t=0:(Rl=null,Nl=0,t=Dl)}if(0!==t){if(2===t&&(0!==(o=mt(e))&&(r=o,t=ic(e,o))),1===t)throw n=Il,fc(e,0),lc(e,r),oc(e,Ze()),n;if(6===t)lc(e,r);else{if(o=e.current.alternate,0==(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(!sr(a(),o))return!1}catch(s){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)&&(2===(t=bc(e,r))&&(0!==(i=mt(e))&&(r=i,t=ic(e,i))),1===t))throw n=Il,fc(e,0),lc(e,r),oc(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,$l,Hl);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=Ul+500-Ze())){if(0!==pt(e,0))break;if(((o=e.suspendedLanes)&r)!==r){tc(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(kc.bind(null,e,$l,Hl),t);break}kc(e,$l,Hl);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var s=31-it(r);i=1<<s,(s=t[s])>o&&(o=s),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*El(r/1960))-r)){e.timeoutHandle=ro(kc.bind(null,e,$l,Hl),r);break}kc(e,$l,Hl);break;default:throw Error(a(329))}}}return oc(e,Ze()),e.callbackNode===n?ac.bind(null,e):null}function ic(e,t){var n=Bl;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=bc(e,t))&&(t=$l,$l=n,null!==t&&sc(t)),e}function sc(e){null===$l?$l=e:$l.push.apply($l,e)}function lc(e,t){for(t&=~zl,t&=~Fl,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 cc(e){if(0!=(6&jl))throw Error(a(327));Sc();var t=pt(e,0);if(0==(1&t))return oc(e,Ze()),null;var n=bc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=ic(e,r))}if(1===n)throw n=Il,fc(e,0),lc(e,t),oc(e,Ze()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,kc(e,$l,Hl),oc(e,Ze()),null}function uc(e,t){var n=jl;jl|=1;try{return e(t)}finally{0===(jl=n)&&(ql=Ze()+500,Bo&&qo())}}function dc(e){null!==Ql&&0===Ql.tag&&0==(6&jl)&&Sc();var t=jl;jl|=1;var n=Al.transition,r=yt;try{if(Al.transition=null,yt=1,e)return e()}finally{yt=r,Al.transition=n,0==(6&(jl=t))&&qo()}}function pc(){Pl=Ol.current,Co(Ol)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Ll)for(n=Ll.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oo();break;case 3:ai(),Co(Ro),Co(jo),di();break;case 5:si(r);break;case 4:ai();break;case 13:case 19:Co(li);break;case 10:Sa(r.type._context);break;case 22:case 23:pc()}n=n.return}if(Rl=e,Ll=e=Oc(e.current,null),Nl=Pl=t,Dl=0,Il=null,zl=Fl=Ml=0,$l=Bl=null,null!==Ta){for(t=0;t<Ta.length;t++)if(null!==(r=(n=Ta[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}Ta=null}return e}function mc(e,t){for(;;){var n=Ll;try{if(ka(),pi.current=is,vi){for(var r=hi.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}vi=!1}if(mi=0,bi=gi=hi=null,yi=!1,xi=0,Tl.current=null,null===n||null===n.return){Dl=1,Il=t,Ll=null;break}e:{var i=e,s=n.return,l=n,c=t;if(t=Nl,l.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=l,p=d.tag;if(0==(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 m=bs(s);if(null!==m){m.flags&=-257,vs(m,s,l,0,t),1&m.mode&&gs(i,u,t),c=u;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(c),t.updateQueue=g}else h.add(c);break e}if(0==(1&t)){gs(i,u,t),gc();break e}c=Error(a(426))}else if(aa&&1&l.mode){var b=bs(s);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),vs(b,s,l,0,t),ha(us(c,l));break e}}i=c=us(c,l),4!==Dl&&(Dl=2),null===Bl?Bl=[i]:Bl.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,ms(0,c,t));break e;case 1:l=c;var v=i.type,y=i.stateNode;if(0==(128&i.flags)&&("function"==typeof v.getDerivedStateFromError||null!==y&&"function"==typeof y.componentDidCatch&&(null===Wl||!Wl.has(y)))){i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,hs(i,l,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(x){t=x,Ll===n&&null!==n&&(Ll=n=n.return);continue}break}}function hc(){var e=Cl.current;return Cl.current=is,null===e?is:e}function gc(){0!==Dl&&3!==Dl&&2!==Dl||(Dl=4),null===Rl||0==(268435455&Ml)&&0==(268435455&Fl)||lc(Rl,Nl)}function bc(e,t){var n=jl;jl|=2;var r=hc();for(Rl===e&&Nl===t||(Hl=null,fc(e,t));;)try{vc();break}catch(o){mc(e,o)}if(ka(),jl=n,Cl.current=r,null!==Ll)throw Error(a(261));return Rl=null,Nl=0,Dl}function vc(){for(;null!==Ll;)xc(Ll)}function yc(){for(;null!==Ll&&!Qe();)xc(Ll)}function xc(e){var t=_l(e.alternate,e,Pl);e.memoizedProps=e.pendingProps,null===t?wc(e):Ll=t,Tl.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.flags)){if(null!==(n=Ks(n,t,Pl)))return void(Ll=n)}else{if(null!==(n=Qs(n,t)))return n.flags&=32767,void(Ll=n);if(null===e)return Dl=6,void(Ll=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Ll=t);Ll=t=e}while(null!==t);0===Dl&&(Dl=5)}function kc(e,t,n){var r=yt,o=Al.transition;try{Al.transition=null,yt=1,function(e,t,n,r){do{Sc()}while(null!==Ql);if(0!=(6&jl))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===Rl&&(Ll=Rl=null,Nl=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||Kl||(Kl=!0,Rc(tt,(function(){return Sc(),null}))),i=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||i){i=Al.transition,Al.transition=null;var s=yt;yt=1;var l=jl;jl|=4,Tl.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(w){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var m;p!==n||0!==o&&3!==p.nodeType||(l=s+o),p!==i||0!==r&&3!==p.nodeType||(c=s+r),3===p.nodeType&&(s+=p.nodeValue.length),null!==(m=p.firstChild);)f=p,p=m;for(;;){if(p===e)break t;if(f===n&&++u===o&&(l=s),f===i&&++d===r&&(c=s),null!==(m=p.nextSibling))break;f=(p=f).parentNode}p=m}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Js=t;null!==Js;)if(e=(t=Js).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,Js=e;else for(;null!==Js;){t=Js;try{var h=t.alternate;if(0!=(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!==h){var g=h.memoizedProps,b=h.memoizedState,v=t.stateNode,y=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:ba(t.type,g),b);v.__reactInternalSnapshotBeforeUpdate=y}break;case 3:var x=t.stateNode.containerInfo;1===x.nodeType?x.textContent="":9===x.nodeType&&x.documentElement&&x.removeChild(x.documentElement);break;default:throw Error(a(163))}}catch(w){Ec(t,t.return,w)}if(null!==(e=t.sibling)){e.return=t.return,Js=e;break}Js=t.return}h=nl,nl=!1}(e,n),bl(n,e),mr(to),Ht=!!eo,to=eo=null,e.current=n,yl(n,e,o),Ye(),jl=l,yt=s,Al.transition=i}else e.current=n;if(Kl&&(Kl=!1,Ql=e,Yl=o),i=e.pendingLanes,0===i&&(Wl=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,128==(128&e.current.flags))}catch(t){}}(n.stateNode),oc(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(Gl)throw Gl=!1,e=Vl,Vl=null,e;0!=(1&Yl)&&0!==e.tag&&Sc(),i=e.pendingLanes,0!=(1&i)?e===Xl?Zl++:(Zl=0,Xl=e):Zl=0,qo()}(e,t,n,r)}finally{Al.transition=o,yt=r}return null}function Sc(){if(null!==Ql){var e=xt(Yl),t=Al.transition,n=yt;try{if(Al.transition=null,yt=16>e?16:e,null===Ql)var r=!1;else{if(e=Ql,Ql=null,Yl=0,0!=(6&jl))throw Error(a(331));var o=jl;for(jl|=4,Js=e.current;null!==Js;){var i=Js,s=i.child;if(0!=(16&Js.flags)){var l=i.deletions;if(null!==l){for(var c=0;c<l.length;c++){var u=l[c];for(Js=u;null!==Js;){var d=Js;switch(d.tag){case 0:case 11:case 15:rl(8,d,i)}var p=d.child;if(null!==p)p.return=d,Js=p;else for(;null!==Js;){var f=(d=Js).sibling,m=d.return;if(il(d),d===u){Js=null;break}if(null!==f){f.return=m,Js=f;break}Js=m}}}var h=i.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var b=g.sibling;g.sibling=null,g=b}while(null!==g)}}Js=i}}if(0!=(2064&i.subtreeFlags)&&null!==s)s.return=i,Js=s;else e:for(;null!==Js;){if(0!=(2048&(i=Js).flags))switch(i.tag){case 0:case 11:case 15:rl(9,i,i.return)}var v=i.sibling;if(null!==v){v.return=i.return,Js=v;break e}Js=i.return}}var y=e.current;for(Js=y;null!==Js;){var x=(s=Js).child;if(0!=(2064&s.subtreeFlags)&&null!==x)x.return=s,Js=x;else e:for(s=y;null!==Js;){if(0!=(2048&(l=Js).flags))try{switch(l.tag){case 0:case 11:case 15:ol(9,l)}}catch(k){Ec(l,l.return,k)}if(l===s){Js=null;break e}var w=l.sibling;if(null!==w){w.return=l.return,Js=w;break e}Js=l.return}}if(jl=o,qo(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(k){}r=!0}return r}finally{yt=n,Al.transition=t}}return!1}function _c(e,t,n){e=Da(e,t=ms(0,t=us(n,t),1),1),t=tc(),null!==e&&(bt(e,1,t),oc(e,t))}function Ec(e,t,n){if(3===e.tag)_c(e,e,n);else for(;null!==t;){if(3===t.tag){_c(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Wl||!Wl.has(r))){t=Da(t,e=hs(t,e=us(n,e),1),1),e=tc(),null!==t&&(bt(t,1,e),oc(t,e));break}}t=t.return}}function Cc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tc(),e.pingedLanes|=e.suspendedLanes&n,Rl===e&&(Nl&n)===n&&(4===Dl||3===Dl&&(130023424&Nl)===Nl&&500>Ze()-Ul?fc(e,0):zl|=n),oc(e,t)}function Tc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=tc();null!==(e=Ra(e,t))&&(bt(e,t,n),oc(e,n))}function Ac(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Tc(e,n)}function jc(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),Tc(e,n)}function Rc(e,t){return We(e,t)}function Lc(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 Lc(e,t,n,r)}function Pc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Oc(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 Dc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Pc(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case S:return Ic(n.children,o,i,t);case _:s=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 R:return(e=Nc(19,n,t,o)).elementType=R,e.lanes=i,e;case P:return Mc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:s=10;break e;case T:s=9;break e;case A:s=11;break e;case L:s=14;break e;case N:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Nc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Ic(e,t,n,r){return(e=Nc(7,e,r,t)).lanes=n,e}function Mc(e,t,n,r){return(e=Nc(22,e,r,t)).elementType=P,e.lanes=n,e.stateNode={isHidden:!1},e}function Fc(e,t,n){return(e=Nc(6,e,null,t)).lanes=n,e}function zc(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 Bc(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=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function $c(e,t,n,r,o,a,i,s,l){return e=new Bc(e,t,n,s,l),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},Na(a),e}function Uc(e){if(!e)return Ao;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(Po(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(Po(n))return Io(e,n,t)}return t}function qc(e,t,n,r,o,a,i,s,l){return(e=$c(n,r,!0,e,0,a,0,s,l)).context=Uc(null),n=e.current,(a=Oa(r=tc(),o=nc(n))).callback=null!=t?t:null,Da(n,a,o),e.current.lanes=o,bt(e,o,r),oc(e,r),e}function Hc(e,t,n,r){var o=t.current,a=tc(),i=nc(o);return n=Uc(n),null===t.context?t.context=n:t.pendingContext=n,(t=Oa(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Da(o,t,i))&&(rc(e,o,i,a),Ia(e,o,i)),i}function Gc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Vc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Wc(e,t){Vc(e,t),(e=e.alternate)&&Vc(e,t)}_l=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Ro.current)xs=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return xs=!1,function(e,t,n){switch(t.tag){case 3:Rs(t),ma();break;case 5:ii(t);break;case 1:Po(t.type)&&Mo(t);break;case 4:oi(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;To(va,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(To(li,1&li.current),t.flags|=128,null):0!=(n&t.child.childLanes)?Fs(e,t,n):(To(li,1&li.current),null!==(e=Gs(e,t,n))?e.sibling:null);To(li,1&li.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return qs(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),To(li,li.current),r)break;return null;case 22:case 23:return t.lanes=0,Es(e,t,n)}return Gs(e,t,n)}(e,t,n);xs=0!=(131072&e.flags)}else xs=!1,aa&&0!=(1048576&t.flags)&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Hs(e,t),e=t.pendingProps;var o=No(t,jo.current);Ea(t,n),o=_i(null,t,r,e,o,n);var i=Ei();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,Po(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Na(t),o.updater=Ua,t.stateNode=o,o._reactInternals=t,Va(t,r,e,n),t=js(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),ws(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Hs(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Pc(e)?1:0;if(null!=e){if((e=e.$$typeof)===A)return 11;if(e===L)return 14}return 2}(r),e=ba(r,e),o){case 0:t=Ts(null,t,r,e,n);break e;case 1:t=As(null,t,r,e,n);break e;case 11:t=ks(null,t,r,e,n);break e;case 14:t=Ss(null,t,r,ba(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Ts(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 1:return r=t.type,o=t.pendingProps,As(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 3:e:{if(Rs(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Pa(e,t),Fa(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Ls(e,t,r,n,o=us(Error(a(423)),t));break e}if(r!==o){t=Ls(e,t,r,n,o=us(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(ma(),r===o){t=Gs(e,t,n);break e}ws(e,t,r,n)}t=t.child}return t;case 5:return ii(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,s=o.children,no(r,o)?s=null:null!==i&&no(r,i)&&(t.flags|=32),Cs(e,t),ws(e,t,s,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Fs(e,t,n);case 4:return oi(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Za(t,null,r,n):ws(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,ks(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 7:return ws(e,t,t.pendingProps,n),t.child;case 8:case 12:return ws(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,To(va,r._currentValue),r._currentValue=s,null!==i)if(sr(i.value,s)){if(i.children===o.children&&!Ro.current){t=Gs(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var l=i.dependencies;if(null!==l){s=i.child;for(var c=l.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=Oa(-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),_a(i.return,n,t),l.lanes|=n;break}c=c.next}}else if(10===i.tag)s=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(s=i.return))throw Error(a(341));s.lanes|=n,null!==(l=s.alternate)&&(l.lanes|=n),_a(s,n,t),s=i.sibling}else s=i.child;if(null!==s)s.return=i;else for(s=i;null!==s;){if(s===t){s=null;break}if(null!==(i=s.sibling)){i.return=s.return,s=i;break}s=s.return}i=s}ws(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ea(t,n),r=r(o=Ca(o)),t.flags|=1,ws(e,t,r,n),t.child;case 14:return o=ba(r=t.type,t.pendingProps),Ss(e,t,r,o=ba(r.type,o),n);case 15:return _s(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ba(r,o),Hs(e,t),t.tag=1,Po(r)?(e=!0,Mo(t)):e=!1,Ea(t,n),Ha(t,r,o),Va(t,r,o,n),js(null,t,r,!0,e,n);case 19:return qs(e,t,n);case 22:return Es(e,t,n)}throw Error(a(156,t.tag))};var Kc="function"==typeof reportError?reportError:function(e){console.error(e)};function Qc(e){this._internalRoot=e}function Yc(e){this._internalRoot=e}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Xc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Jc(){}function eu(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var s=o;o=function(){var e=Gc(i);s.call(e)}}Hc(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=Gc(i);a.call(e)}}var i=qc(t,r,e,0,null,!1,0,"",Jc);return e._reactRootContainer=i,e[ho]=i.current,Ur(8===e.nodeType?e.parentNode:e),dc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var s=r;r=function(){var e=Gc(l);s.call(e)}}var l=$c(e,0,!1,null,0,!1,0,"",Jc);return e._reactRootContainer=l,e[ho]=l.current,Ur(8===e.nodeType?e.parentNode:e),dc((function(){Hc(t,l,n,r)})),l}(n,t,e,o,r);return Gc(i)}Yc.prototype.render=Qc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));Hc(e,t,null,null)},Yc.prototype.unmount=Qc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;dc((function(){Hc(null,e,null,null)})),t[ho]=null}},Yc.prototype.unstable_scheduleHydration=function(e){if(e){var t=_t();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Pt.length&&0!==t&&t<Pt[n].priority;n++);Pt.splice(n,0,e),0===n&&Mt(e)}},wt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(vt(t,1|n),oc(t,Ze()),0==(6&jl)&&(ql=Ze()+500,qo()))}break;case 13:dc((function(){var t=Ra(e,1);if(null!==t){var n=tc();rc(t,e,1,n)}})),Wc(e,1)}},kt=function(e){if(13===e.tag){var t=Ra(e,134217728);if(null!==t)rc(t,e,134217728,tc());Wc(e,134217728)}},St=function(e){if(13===e.tag){var t=nc(e),n=Ra(e,t);if(null!==n)rc(n,e,t,tc());Wc(e,t)}},_t=function(){return yt},Et=function(e,t){var n=yt;try{return yt=e,t()}finally{yt=n}},ke=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=ko(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)}},Ae=uc,je=dc;var tu={usingClientEntryPoint:!1,Events:[xo,wo,ko,Ce,Te,uc]},nu={findFiberByHostInstance:yo,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},ru={bundleType:nu.bundleType,version:nu.version,rendererPackageName:nu.rendererPackageName,rendererConfig:nu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:x.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:nu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ou=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ou.isDisabled&&ou.supportsFiber)try{ot=ou.inject(ru),at=ou}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Zc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Zc(e))throw Error(a(299));var n=!1,r="",o=Kc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=$c(e,1,!1,null,0,n,0,r,o),e[ho]=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 dc(e)},t.hydrate=function(e,t,n){if(!Xc(t))throw Error(a(200));return eu(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Zc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",s=Kc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(s=n.onRecoverableError)),t=qc(t,null,e,1,null!=n?n:null,o,0,i,s),e[ho]=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 Yc(t)},t.render=function(e,t,n){if(!Xc(t))throw Error(a(200));return eu(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Xc(e))throw Error(a(40));return!!e._reactRootContainer&&(dc((function(){eu(null,null,e,!1,(function(){e._reactRootContainer=null,e[ho]=null}))})),!0)},t.unstable_batchedUpdates=uc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Xc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return eu(e,t,n,!1,r)},t.version="18.2.0-next-9e3b772b8-20220608"},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 s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.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();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])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((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))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),s=n.n(i),l=n(311),c=n.n(l),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,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,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 g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},x=Object.keys(g).map((function(e){return g[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(w).reduce((function(e,t){return e[w[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,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},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)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),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}),[])},A=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var s=a[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}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 s=a[i],l=p({},r[s],o[s]);r[s]=l}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},R=function(e){return Array.isArray(e)?e.join(""):e},L=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},P=[g.NOSCRIPT,g.SCRIPT,g.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[w[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=w[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 g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=I(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=R(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===P.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,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=L(e.metaTags,y),a=L(t,b),i=L(n,v);return{priorityMethods:{toComponent:function(){return[].concat(M(g.META,o.priority),M(g.LINK,a.priority),M(g.SCRIPT,i.priority))},toString:function(){return F(g.META,o.priority,r)+" "+F(g.LINK,a.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=m.priorityMethods,u=m.linkTags,d=m.metaTags,p=m.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,a,r),script:F(g.SCRIPT,p,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:l,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(g.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),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===o.indexOf(l)&&o.push(l);var u=a.indexOf(l);-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(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(g.BODY,e.bodyAttributes),W(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),W(g.TITLE,t)}(u,d);var p={baseTag:V(g.BASE,n),linkTags:V(g.LINK,o),metaTags:V(g.META,a),noscriptTags:V(g.NOSCRIPT,i),scriptTags:V(g.SCRIPT,l),styleTags:V(g.STYLE,c)},f={},m={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(m[e]=p[e].oldTags)})),t&&t(),s(e,f,m)},Q=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:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(g.LINK,["rel","href"],e),metaTags:A(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:E(e),scriptTags:A(g.SCRIPT,["src","innerHTML"],e),styleTags:A(g.STYLE,["cssText"],e),title:_(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:j(e,"prioritizeSeoTags")});G.canUseDOM?(t=a,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame((function(){K(t,(function(){Q=null}))})):(K(t),Q=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!s()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return 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 g.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case g.BODY:return p({},o,{bodyAttributes:p({},a)});case g.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()(x.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 "+x.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=h(r,Z),s=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=h(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,s=n?Symbol.for("react.profiler"):60114,l=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,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,x=n?Symbol.for("react.scope"):60119;function w(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 s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case g:case h:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=g,t.Memo=h,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===c},t.isContextProvider=function(e){return w(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return w(e)===p},t.isFragment=function(e){return w(e)===a},t.isLazy=function(e){return w(e)===g},t.isMemo=function(e){return w(e)===h},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===s},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},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 s=n(6540),l=n(5556),c=[],u=[];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 s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return c.push(g),"function"==typeof m.webpack&&u.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),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}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(s.Component),a(d,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),p}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(p,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return s.Children.only(this.props.children)},t}(s.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)}))}a(g,"propTypes",{report:l.func.isRequired}),a(g,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>s});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 s(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,{Kd:()=>u,N_:()=>g,k2:()=>y});var r=n(6347),o=n(2892),a=n(6540),i=n(1513),s=n(8168),l=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);a.Component;var d=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},f=function(e){return e},m=a.forwardRef;void 0===m&&(m=f);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.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=f!==m&&t||n,a.createElement("a",u)}));var g=m((function(e,t){var n=e.component,o=void 0===n?h:n,u=e.replace,g=e.to,b=e.innerRef,v=(0,l.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=p(d(g,e.location),e.location),l=r?n.createHref(r):"",h=(0,s.A)({},v,{href:l,navigate:function(){var t=d(g,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(p(t));(u||r?n.replace:n.push)(t)}});return f!==m?h.ref=t||b:h.innerRef=b,a.createElement(o,h)}))})),b=function(e){return e},v=a.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,f=e.activeStyle,m=e.className,h=e.exact,y=e.isActive,x=e.location,w=e.sensitive,k=e.strict,S=e.style,_=e.to,E=e.innerRef,C=(0,l.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=x||e.location,i=p(d(_,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.B6)(n.pathname,{path:T,exact:h,sensitive:w,strict:k}):null,j=!!(y?y(A,n):A),R="function"==typeof m?m(j):m,L="function"==typeof S?S(j):S;j&&(R=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(R,u),L=(0,s.A)({},L,f));var N=(0,s.A)({"aria-current":j&&o||null,className:R,style:L,to:i},C);return b!==v?N.ref=t||E:N.innerRef=E,a.createElement(g,N)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>y,W6:()=>N,XZ:()=>v,dO:()=>R,qh:()=>_,zy:()=>P});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),s=n(1513),l=n(1561),c=n(8168),u=n(5302),d=n.n(u),p=(n(4363),n(8587)),f=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",l=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={})[s]=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);l.childContextTypes=((n={})[s]=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!=((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[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},o.getValue=function(){return this.context[s]?this.context[s].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={})[s]=i().object,a),{Provider:l,Consumer:c}},g=function(e){var t=h();return t.displayName=e,t},b=g("Router-History"),v=g("Router"),y=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(v.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 x={},w=1e4,k=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,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;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=x[n]||(x[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return k<w&&(r[e]=a,k++),a}(n,{end:a,strict:s,sensitive:c}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var u=l[0],p=l.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(v.Consumer,null,(function(t){t||(0,l.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,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===o.Children.count(e)}(s)&&(s=null),o.createElement(v.Provider,{value:a},a.match?s?"function"==typeof s?s(a):s:u?o.createElement(u,a):d?d(a):null:"function"==typeof s?s(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 T(e){return"string"==typeof e?e:(0,s.AO)(e)}function A(e){return function(){(0,l.A)(!1)}}function j(){}o.Component;var R=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(v.Consumer,null,(function(t){t||(0,l.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 L=o.useContext;function N(){return L(b)}function P(){return L(v).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,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={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)&&!l.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:s.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"),s=Symbol.for("react.provider"),l=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 m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function v(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}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")},v.prototype=b.prototype;var x=y.prototype=new v;x.constructor=y,h(x,b.prototype),x.isPureReactComponent=!0;var w=Array.isArray,k=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,o)&&!_.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function A(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function j(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return i=i(l=e),e=""===a?"."+A(l,0):a,w(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),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||l&&l.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(l=0,a=""===a?".":a+":",w(e))for(var c=0;c<e.length;c++){var u=a+A(s=e[c],c);l+=j(s,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;!(s=e.next()).done;)l+=j(s=s.value,t,o,u=a+A(s,c++),i);else if("object"===s)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 l}function R(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 L(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 N={current:null},P={transition:null},O={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:P,ReactCurrentOwner:S};t.Children={map:R,forEach:function(e,t,n){R(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return R(e,(function(){t++})),t},toArray:function(e){return R(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=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,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=h({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=S.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)k.call(t,c)&&!_.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_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:L}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return N.current.useCallback(e,t)},t.useContext=function(e){return N.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return N.current.useDeferredValue(e)},t.useEffect=function(e,t){return N.current.useEffect(e,t)},t.useId=function(){return N.current.useId()},t.useImperativeHandle=function(e,t,n){return N.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return N.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return N.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return N.current.useMemo(e,t)},t.useReducer=function(e,t,n){return N.current.useReducer(e,t,n)},t.useRef=function(e){return N.current.useRef(e)},t.useState=function(e){return N.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return N.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return N.current.useTransition()},t.version="18.2.0"},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 s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);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 s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,p=null,f=3,m=!1,h=!1,g=!1,b="function"==typeof setTimeout?setTimeout:null,v="function"==typeof clearTimeout?clearTimeout:null,y="undefined"!=typeof setImmediate?setImmediate:null;function x(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 w(e){if(g=!1,x(e),!h)if(null!==r(c))h=!0,P(k);else{var t=r(u);null!==t&&O(w,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,v(C),C=-1),m=!0;var a=f;try{for(x(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 s=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?p.callback=s:p===r(c)&&o(c),x(n)}else o(c);p=r(c)}if(null!==p)var l=!0;else{var d=r(u);null!==d&&O(w,d.startTime-n),l=!1}return l}finally{p=null,f=a,m=!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,T=5,A=-1;function j(){return!(t.unstable_now()-A<T)}function R(){if(null!==E){var e=t.unstable_now();A=e;var n=!0;try{n=E(!0,e)}finally{n?S():(_=!1,E=null)}}else _=!1}if("function"==typeof y)S=function(){y(R)};else if("undefined"!=typeof MessageChannel){var L=new MessageChannel,N=L.port2;L.port1.onmessage=R,S=function(){N.postMessage(null)}}else S=function(){b(R,0)};function P(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(){h||m||(h=!0,P(k))},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"):T=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 s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(g?(v(C),C=-1):g=!0,O(w,a-i))):(e.sortIndex=s,n(c,e),h||m||(h=!0,P(k))),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 s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var c=a[l];if(!s(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:"Routr Docs",tagline:"The future of programmable SIP servers",favicon:"img/favicon.ico",url:"https://routr.io",baseUrl:"/",organizationName:"fonoster",projectName:"routr",onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",onBrokenAnchors:"ignore",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{lastVersion:"current",versions:{current:{label:"2.0.0",path:"2.0.0"}},sidebarPath:"/home/runner/work/routr/routr/docs/sidebars.js",editUrl:"https://github.com/fonoster/routr-website/edit/main"},theme:{customCss:"/home/runner/work/routr/routr/docs/src/css/custom.css"},gtag:{trackingID:"G-JX93S6PKN4",anonymizeIP:!0}}]],themeConfig:{algolia:{appId:"VLT67PBOP0",apiKey:"ac3a064eec614a9ade617bafd5de55de",indexName:"routr",contextualSearch:!1,searchParameters:{},searchPagePath:"search"},image:"img/docusaurus-social-card.jpg",navbar:{logo:{alt:"Routr Logo",src:"img/logo.svg"},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers",label:"Training",position:"left"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://github.com/fonoster/routr",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Quick Links",items:[{label:"Docs",to:"/docs/2.0.0/overview/introduction"},{label:"Training",href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers"}]},{title:"Community",items:[{label:"GitHub Discussions",href:"https://github.com/fonoster/routr/discussions"},{label:"Discord",href:"https://discord.gg/4QWgSz4hTC"},{label:"Twitter",href:"https://twitter.com/fonoster"}]},{title:"More",items:[{label:"Blog",to:"https://learn.fonoster.com/blog"},{label:"GitHub",href:"https://github.com/fonoster/routr"}]}],copyright:"Copyright \xa9 2024 Fonoster, Inc. 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:!0,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,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}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function 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,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}n.d(t,{A:()=>r})},8215:(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}},5066:(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}},8181:(e,t,n)=>{"use strict";n.d(t,{f4:()=>J,My:()=>C});var r=n(6540);function o(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=o(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}const a=function(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=o(e))&&(r&&(r+=" "),r+=t);return r};var i,s,l,c,u,d=Object.create,p=Object.defineProperty,f=Object.defineProperties,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyDescriptors,g=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable,w=(e,t,n)=>t in e?p(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,k=(e,t)=>{for(var n in t||(t={}))y.call(t,n)&&w(e,n,t[n]);if(b)for(var n of b(t))x.call(t,n)&&w(e,n,t[n]);return e},S=(e,t)=>f(e,h(t)),_=(e,t)=>{var n={};for(var r in e)y.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&b)for(var r of b(e))t.indexOf(r)<0&&x.call(e,r)&&(n[r]=e[r]);return n},E=(i={"../../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 s in a)if(a.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=a[s])}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 s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],o||s);var l=t[s],c=r.util.type(l);"Object"!==c||a[i(l)]?"Array"!==c||a[i(l)]||(a[i(l)]=!0,e(l,n,s,a)):(a[i(l)]=!0,e(l,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 s;return l(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,s,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 m=0;m<f.length;++m){if(d&&d.cause==p+","+m)return;var h=f[m],g=h.inside,b=!!h.lookbehind,v=!!h.greedy,y=h.alias;if(v&&!h.pattern.global){var x=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,x+"g")}for(var w=h.pattern||h,k=s.next,S=u;k!==t.tail&&!(d&&S>=d.reach);S+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,C=1;if(v){if(!(E=a(w,S,e,b))||E.index>=e.length)break;var T=E.index,A=E.index+E[0].length,j=S;for(j+=k.value.length;T>=j;)j+=(k=k.next).value.length;if(S=j-=k.value.length,k.value instanceof o)continue;for(var R=k;R!==t.tail&&(j<A||"string"==typeof R.value);R=R.next)C++,j+=R.value.length;C--,_=e.slice(S,j),E.index-=S}else if(!(E=a(w,0,_,b)))continue;T=E.index;var L=E[0],N=_.slice(0,T),P=_.slice(T+L.length),O=S+_.length;d&&O>d.reach&&(d.reach=O);var D=k.prev;if(N&&(D=l(t,D,N),S+=N.length),c(t,D,C),k=l(t,D,new o(p,g?r.tokenize(L,g):L,y,L)),P&&l(t,k,P),C>1){var I={cause:p+","+m,reach:O};i(e,t,n,k.prev,S,I),d&&I.reach>d.reach&&(d.reach=I.reach)}}}}}}function s(){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 l(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 s="";for(var l in a.attributes)s+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+s+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return s||(0,i[g(i)[0]])((s={exports:{}}).exports,s),s.exports}),C=((e,t,n)=>(n=null!=e?d(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of g(t))y.call(e,o)||o===n||p(e,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(E());C.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]},C.languages.markup.tag.inside["attr-value"].inside.entity=C.languages.markup.entity,C.languages.markup.doctype.inside["internal-subset"].inside=C.languages.markup,C.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(C.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:C.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:C.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},C.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(C.languages.markup.tag,"addAttribute",{value:function(e,t){C.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:C.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),C.languages.html=C.languages.markup,C.languages.mathml=C.languages.markup,C.languages.svg=C.languages.markup,C.languages.xml=C.languages.extend("markup",{}),C.languages.ssml=C.languages.xml,C.languages.atom=C.languages.xml,C.languages.rss=C.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?: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]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.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:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"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":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(C),C.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:/[{}[\];(),.:]/},C.languages.javascript=C.languages.extend("clike",{"class-name":[C.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}|\?\?=?|\?\.?|[~:]/}),C.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,C.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:C.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:C.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:C.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:C.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:C.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),C.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:C.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"}}),C.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),C.languages.markup&&(C.languages.markup.tag.addInlined("script","javascript"),C.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")),C.languages.js=C.languages.javascript,C.languages.actionscript=C.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:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),C.languages.actionscript["class-name"].alias="function",delete C.languages.actionscript.parameter,delete C.languages.actionscript["literal-property"],C.languages.markup&&C.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:C.languages.markup}}),c=/#(?!\{).+/,u={pattern:/#\{[^}]+\}/,alias:"variable"},(l=C).languages.coffeescript=l.languages.extend("javascript",{comment:c,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:u}}],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"}}),l.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:c,interpolation:u}}}),l.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:l.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:u}}]}),l.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete l.languages.coffeescript["template-string"],l.languages.coffee=l.languages.coffeescript,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 s=0,l=i.length;s<l;s++)i[s]instanceof RegExp&&(i[s]={pattern:i[s]}),r(i[s]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(C),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"))}(C),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})}(C),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}(C),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)),l(n)):s[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")),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(C),C.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:C.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+/},C.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 s=p(/^\{$/,/^\}$/);if(-1!==s)for(var l=n;l<s;l++){var c=t[l];"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],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))o++;else if(r.test(s)&&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)}})),C.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 s(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 l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.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,l,p,f,m,h,g,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(g=(h="string"==typeof b?b:b.content).indexOf(i))&&(++c,l=h.substring(0,g),m=u[i],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(m,f)).length&&((p=[1,1]).push.apply(p,s(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,m),f=h.substring(g+i.length),m=[],l&&m.push(l),m.push(p),f&&(t(h=[f]),m.push.apply(m,h)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(m)),a+=m.length-1):b.content=m)):(g=b.content,Array.isArray(g)?t(g):t([g]))}}(l),new e.Token(i,l,"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,s,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,s=e.languages[c])&&(a[1]=l(i,s,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(C),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}(C),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)}(C),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})}(C),C.languages.n4js=C.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/}),C.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),C.languages.n4jsd=C.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]*/}}(C),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===s(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:s(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=s(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=s(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=s(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 s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(C),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}(C),C.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:/[{}[\]();,.:\\]/},C.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=C.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}(C),C.languages.c=C.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|[?:~]|[-+*/%&|^!=<>]=?/}),C.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),C.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},C.languages.c.string],char:C.languages.c.char,comment:C.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:C.languages.c}}}}),C.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 C.languages.c.boolean,C.languages.objectivec=C.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 C.languages.objectivec["class-name"],C.languages.objc=C.languages.objectivec,C.languages.reason=C.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/}),C.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 C.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}(C),C.languages.go=C.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/}),C.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete C.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"])}(C),C.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:/[{}[\];(),.:]/},C.languages.python["string-interpolation"].inside.interpolation.inside.rest=C.languages.python,C.languages.py=C.languages.python;((e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>A,duotoneLight:()=>j,github:()=>R,jettwaveDark:()=>q,jettwaveLight:()=>H,nightOwl:()=>L,nightOwlLight:()=>N,oceanicNext:()=>D,okaidia:()=>I,oneDark:()=>G,oneLight:()=>V,palenight:()=>M,shadesOfPurple:()=>F,synthwave84:()=>z,ultramin:()=>B,vsDark:()=>$,vsLight:()=>U});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)"}}]},A={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"}}]},j={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"}}]},R={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"}}]},L={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)"}}]},N={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)"}}]},P="#c5a5c5",O="#8dc891",D={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:P}},{types:["attr-value"],style:{color:O}},{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:O}},{types:["punctuation"],style:{color:O}},{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:P}},{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}}]},I={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"}}]},M={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)"}}]},F={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)"}}]},z={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"}}]},B={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)"}}]},$={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)"}}]},U={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)"}}]},q={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"}}]},H={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"}}]},G={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%)"}}]},V={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%)"}}]},W=(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=k(k({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=S(k({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Q=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)},Y=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},Z=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];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=Y(c,u.type),u.alias&&(c=Y(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;s.push({types:c,content:d[0]});for(let t=1;t<p;t++)Q(s),l.push(s=[]),s.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return Q(s),l},X=({children:e,language:t,code:n,theme:o,prism:i})=>{const s=t.toLowerCase(),l=((e,t)=>{const[n,o]=(0,r.useState)(W(t,e)),a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)((()=>{t===a.current&&e===i.current||(a.current=t,i.current=e,o(W(t,e)))}),[e,t]),n})(s,o),c=(e=>(0,r.useCallback)((t=>{var n=t,{className:r,style:o,line:i}=n,s=_(n,["className","style","line"]);const l=S(k({},s),{className:a("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=k(k({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,r.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,r.useCallback)((e=>{var n=e,{token:r,className:o,style:i}=n,s=_(n,["token","className","style"]);const l=S(k({},s),{className:a("token",...r.types,o),children:r.content,style:t(r)});return null!=i&&(l.style=k(k({},l.style||{}),i)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:o})=>{const a=(0,r.useRef)(e);return(0,r.useMemo)((()=>{if(null==n)return Z([t]);const e={code:t,grammar:n,language:o,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),Z(e.tokens)}),[t,n,o])})({prism:i,language:s,code:n,grammar:i.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},J=e=>(0,r.createElement)(X,S(k({},e),{prism:e.prism||C,theme:e.theme||$,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)}}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/search-9b7":{"__comp":"1a4e3797","__context":{"plugin":"a0c5838c"}},"/docs-125":{"__comp":"5e95c892","__context":{"plugin":"deaab6a5"}},"/docs/1.x.x-370":{"__comp":"a7bd4aaa","version":"8f5f22a9"},"/docs/1.x.x-e79":{"__comp":"a94703ab"},"/docs/1.x.x/administration/cli/cheatsheet-375":{"__comp":"17896441","content":"b5de05fe"},"/docs/1.x.x/administration/cli/installation-4dc":{"__comp":"17896441","content":"5514a4b8"},"/docs/1.x.x/administration/cli/remote-access-97c":{"__comp":"17896441","content":"bc1a89ad"},"/docs/1.x.x/administration/webconsole-62a":{"__comp":"17896441","content":"093b4e4f"},"/docs/1.x.x/api/agents/create-b97":{"__comp":"17896441","content":"9840208a"},"/docs/1.x.x/api/agents/delete-b72":{"__comp":"17896441","content":"1cd31f12"},"/docs/1.x.x/api/agents/get-f9a":{"__comp":"17896441","content":"ec64d50d"},"/docs/1.x.x/api/agents/list-4c3":{"__comp":"17896441","content":"6c35bbce"},"/docs/1.x.x/api/agents/update-b29":{"__comp":"17896441","content":"19dd4331"},"/docs/1.x.x/api/config/get-4bc":{"__comp":"17896441","content":"71153375"},"/docs/1.x.x/api/config/update-983":{"__comp":"17896441","content":"b4dd6982"},"/docs/1.x.x/api/domains/create-815":{"__comp":"17896441","content":"9d10a623"},"/docs/1.x.x/api/domains/delete-542":{"__comp":"17896441","content":"40f2f3c6"},"/docs/1.x.x/api/domains/get-c5a":{"__comp":"17896441","content":"d3c35fce"},"/docs/1.x.x/api/domains/list-3bc":{"__comp":"17896441","content":"8a9effda"},"/docs/1.x.x/api/domains/update-633":{"__comp":"17896441","content":"b1e2c3e5"},"/docs/1.x.x/api/gateways/create-404":{"__comp":"17896441","content":"943e77c3"},"/docs/1.x.x/api/gateways/delete-de6":{"__comp":"17896441","content":"40f2a0b4"},"/docs/1.x.x/api/gateways/get-d16":{"__comp":"17896441","content":"b8ab588d"},"/docs/1.x.x/api/gateways/list-5bf":{"__comp":"17896441","content":"5e82a060"},"/docs/1.x.x/api/gateways/update-8a3":{"__comp":"17896441","content":"9a5a69d5"},"/docs/1.x.x/api/location/create-ee5":{"__comp":"17896441","content":"4e27cd47"},"/docs/1.x.x/api/location/delete-682":{"__comp":"17896441","content":"646468fb"},"/docs/1.x.x/api/location/list-f64":{"__comp":"17896441","content":"0f2bd920"},"/docs/1.x.x/api/numbers/create-6ef":{"__comp":"17896441","content":"99f83bea"},"/docs/1.x.x/api/numbers/delete-6a0":{"__comp":"17896441","content":"4d0c799d"},"/docs/1.x.x/api/numbers/get-b9d":{"__comp":"17896441","content":"ed519cbf"},"/docs/1.x.x/api/numbers/list-c63":{"__comp":"17896441","content":"6c14cd7d"},"/docs/1.x.x/api/numbers/update-a01":{"__comp":"17896441","content":"4dcd5895"},"/docs/1.x.x/api/overview-d3c":{"__comp":"17896441","content":"321dfeeb"},"/docs/1.x.x/api/peers/create-f5b":{"__comp":"17896441","content":"411db075"},"/docs/1.x.x/api/peers/delete-349":{"__comp":"17896441","content":"a552b93b"},"/docs/1.x.x/api/peers/get-395":{"__comp":"17896441","content":"9a4dfeaa"},"/docs/1.x.x/api/peers/list-70b":{"__comp":"17896441","content":"bc2f9ced"},"/docs/1.x.x/api/peers/update-d81":{"__comp":"17896441","content":"95069fb2"},"/docs/1.x.x/api/registry-46f":{"__comp":"17896441","content":"72607e62"},"/docs/1.x.x/api/status/get-0e4":{"__comp":"17896441","content":"9799683e"},"/docs/1.x.x/api/status/update-95d":{"__comp":"17896441","content":"7df8ae3f"},"/docs/1.x.x/api/sys/info-bf8":{"__comp":"17896441","content":"1b166456"},"/docs/1.x.x/api/sys/logs-847":{"__comp":"17896441","content":"6e2907e5"},"/docs/1.x.x/api/token-069":{"__comp":"17896441","content":"656951a7"},"/docs/1.x.x/concepts-b93":{"__comp":"17896441","content":"35bee977"},"/docs/1.x.x/configuration/agents-4d7":{"__comp":"17896441","content":"a30498ab"},"/docs/1.x.x/configuration/domains-4b7":{"__comp":"17896441","content":"81e5f1d0"},"/docs/1.x.x/configuration/gateways-cbd":{"__comp":"17896441","content":"876e022a"},"/docs/1.x.x/configuration/general-52e":{"__comp":"17896441","content":"3e7ceef0"},"/docs/1.x.x/configuration/numbers-f3e":{"__comp":"17896441","content":"7efb1a82"},"/docs/1.x.x/configuration/peers-113":{"__comp":"17896441","content":"ee7973d9"},"/docs/1.x.x/configuration/users-459":{"__comp":"17896441","content":"017ddd06"},"/docs/1.x.x/guides/basic-setup-890":{"__comp":"17896441","content":"da51cc8f"},"/docs/1.x.x/guides/routr-as-asterisk-frontend-2a0":{"__comp":"17896441","content":"09b719bb"},"/docs/1.x.x/guides/running-on-kubernetes-7dc":{"__comp":"17896441","content":"1ea220c7"},"/docs/1.x.x/guides/running-with-docker-or-compose-5c2":{"__comp":"17896441","content":"23efd64d"},"/docs/1.x.x/guides/securing-the-signaling-path-99f":{"__comp":"17896441","content":"a9d63626"},"/docs/1.x.x/introduction/community-060":{"__comp":"17896441","content":"e10372bb"},"/docs/1.x.x/introduction/comparison-595":{"__comp":"17896441","content":"bb373259"},"/docs/1.x.x/introduction/faq-e8b":{"__comp":"17896441","content":"a40a3312"},"/docs/1.x.x/introduction/glossary-85c":{"__comp":"17896441","content":"918bfdcb"},"/docs/1.x.x/introduction/installation-1c1":{"__comp":"17896441","content":"3325c53c"},"/docs/1.x.x/introduction/media-f84":{"__comp":"17896441","content":"f3f39cc5"},"/docs/1.x.x/introduction/overview-973":{"__comp":"17896441","content":"a4cb0559"},"/docs/1.x.x/introduction/performance-tests/user-location-93b":{"__comp":"17896441","content":"7c32d245"},"/docs/1.x.x/introduction/roadmap-c45":{"__comp":"17896441","content":"3a673d53"},"/docs/1.x.x/introduction/test-plan-859":{"__comp":"17896441","content":"759bfbe1"},"/docs/1.x.x/welcome-055":{"__comp":"17896441","content":"64332b0f"},"/docs/2.0.0-1e6":{"__comp":"a7bd4aaa","version":"935f2afb"},"/docs/2.0.0-45e":{"__comp":"a94703ab"},"/docs/2.0.0/changelog-abc":{"__comp":"17896441","content":"9beb87c2"},"/docs/2.0.0/community-943":{"__comp":"17896441","content":"5ef0e9d6"},"/docs/2.0.0/connect/command-line/ctl-817":{"__comp":"17896441","content":"ed175a37"},"/docs/2.0.0/connect/command-line/overview-928":{"__comp":"17896441","content":"ea5491a0"},"/docs/2.0.0/connect/concepts-93c":{"__comp":"17896441","content":"5a1924d4"},"/docs/2.0.0/connect/home-or-office-setup-28c":{"__comp":"17896441","content":"2a36568f"},"/docs/2.0.0/connect/introduction-b89":{"__comp":"17896441","content":"d7a9d534"},"/docs/2.0.0/connect/nodesdk/overview-909":{"__comp":"17896441","content":"8ac6f1f4"},"/docs/2.0.0/connect/nodesdk/sdk-d65":{"__comp":"17896441","content":"43d3d555"},"/docs/2.0.0/connect/quick-start/docker-8f4":{"__comp":"17896441","content":"f4357d2a"},"/docs/2.0.0/connect/quick-start/kubernetes-ca7":{"__comp":"17896441","content":"3c0cfdd0"},"/docs/2.0.0/connect/securing-the-server-d31":{"__comp":"17896441","content":"f1b4aa58"},"/docs/2.0.0/connect/sending-call-events-to-nats-f0a":{"__comp":"17896441","content":"8613bfde"},"/docs/2.0.0/connect/webrtc-support-dcc":{"__comp":"17896441","content":"129db88c"},"/docs/2.0.0/contributing-373":{"__comp":"17896441","content":"4d54d076"},"/docs/2.0.0/development/alterations/methods-990":{"__comp":"17896441","content":"39d73575"},"/docs/2.0.0/development/alterations/overview-7a2":{"__comp":"17896441","content":"b396445b"},"/docs/2.0.0/development/building-a-chat-application-f4b":{"__comp":"17896441","content":"b3bbf2ca"},"/docs/2.0.0/development/building-a-middleware-ad6":{"__comp":"17896441","content":"956a4ea6"},"/docs/2.0.0/development/building-a-processor-3aa":{"__comp":"17896441","content":"92a92b88"},"/docs/2.0.0/development/building-a-scaip-processor-c5f":{"__comp":"17896441","content":"26da1a01"},"/docs/2.0.0/development/components/apiserver-3ea":{"__comp":"17896441","content":"7cf72cd4"},"/docs/2.0.0/development/components/dispatcher-49c":{"__comp":"17896441","content":"02617853"},"/docs/2.0.0/development/components/edgeport-a3e":{"__comp":"17896441","content":"33664cb1"},"/docs/2.0.0/development/components/location-ea7":{"__comp":"17896441","content":"f5184ac4"},"/docs/2.0.0/development/components/overview-80e":{"__comp":"17896441","content":"76273f75"},"/docs/2.0.0/development/components/registry-416":{"__comp":"17896441","content":"bc843d59"},"/docs/2.0.0/development/components/requester-b17":{"__comp":"17896441","content":"c60c73ac"},"/docs/2.0.0/development/components/rtprelay-816":{"__comp":"17896441","content":"144994e6"},"/docs/2.0.0/development/components/simpleauth-141":{"__comp":"17896441","content":"210b7c69"},"/docs/2.0.0/development/custom-data-with-the-apiserver-9aa":{"__comp":"17896441","content":"3f9d54d1"},"/docs/2.0.0/development/development-mode-with-gitpod-503":{"__comp":"17896441","content":"ff3f7f2b"},"/docs/2.0.0/development/extending-the-ctl-aa9":{"__comp":"17896441","content":"a7c6e145"},"/docs/2.0.0/development/introduction-aca":{"__comp":"17896441","content":"6a8a88b7"},"/docs/2.0.0/development/metrics-events-logs-and-traces-523":{"__comp":"17896441","content":"54969ead"},"/docs/2.0.0/development/orchestration-with-docker-05f":{"__comp":"17896441","content":"1ad9bfe0"},"/docs/2.0.0/development/orchestration-with-kubernetes-694":{"__comp":"17896441","content":"21169ea0"},"/docs/2.0.0/development/quick-start-2f8":{"__comp":"17896441","content":"9fcefd11"},"/docs/2.0.0/development/testing-with-seet-771":{"__comp":"17896441","content":"4e3cbe94"},"/docs/2.0.0/faqs-72b":{"__comp":"17896441","content":"1ffdd7de"},"/docs/2.0.0/overview/architecture-455":{"__comp":"17896441","content":"d72ac48e"},"/docs/2.0.0/overview/concepts-482":{"__comp":"17896441","content":"118e913f"},"/docs/2.0.0/overview/deploy-with-docker-3ac":{"__comp":"17896441","content":"06896101"},"/docs/2.0.0/overview/introduction-8f9":{"__comp":"17896441","content":"8d7e75fb"},"/docs/2.0.0/tutorials/deploying-to-civo-with-helm-4df":{"__comp":"17896441","content":"5a510007"},"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser-502":{"__comp":"17896441","content":"c2ef5137"},"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes-450":{"__comp":"17896441","content":"1a1a9e3d"},"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr-b1f":{"__comp":"17896441","content":"db70960d"},"/-fcb":{"__comp":"c4f5d8e4","__context":{"plugin":"0abf3980"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.d06dc193.js.LICENSE.txt b/assets/js/main.f2bc7f64.js.LICENSE.txt similarity index 76% rename from assets/js/main.d06dc193.js.LICENSE.txt rename to assets/js/main.f2bc7f64.js.LICENSE.txt index eb75d6910..91dc89499 100644 --- a/assets/js/main.d06dc193.js.LICENSE.txt +++ b/assets/js/main.f2bc7f64.js.LICENSE.txt @@ -1,15 +1,22 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - /* 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 - * use-sync-external-store-shim.production.min.js + * react-dom.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -18,16 +25,8 @@ object-assign */ /** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT <https://opensource.org/licenses/MIT> - * @author Lea Verou <https://lea.verou.me> - * @namespace - * @public - */ - -/** @license React v0.20.2 - * scheduler.production.min.js + * @license React + * react-jsx-runtime.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -35,8 +34,9 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/** @license React v16.13.1 - * react-is.production.min.js +/** + * @license React + * react.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -44,8 +44,9 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/** @license React v17.0.2 - * react-dom.production.min.js +/** + * @license React + * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -53,8 +54,8 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/** @license React v17.0.2 - * react.production.min.js +/** @license React v16.13.1 + * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * diff --git a/assets/js/runtime~main.5d2ad584.js b/assets/js/runtime~main.5d2ad584.js deleted file mode 100644 index 1e2fa46f7..000000000 --- a/assets/js/runtime~main.5d2ad584.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,d,a,f,b,c={},t={};function r(e){var d=t[e];if(void 0!==d)return d.exports;var a=t[e]={id:e,loaded:!1,exports:{}};return c[e].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=c,r.c=t,e=[],r.O=(d,a,f,b)=>{if(!a){var c=1/0;for(i=0;i<e.length;i++){a=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&b||c>=b)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,b<c&&(c=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(d=n)}}return d}b=b||0;for(var i=e.length;i>0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[a,f,b]},r.n=e=>{var d=e&&e.__esModule?()=>e.default:()=>e;return r.d(d,{a:d}),d},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};d=d||[null,a({}),a([]),a(a)];for(var t=2&f&&e;"object"==typeof t&&!~d.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((d=>c[d]=()=>e[d]));return c.default=()=>e,r.d(b,c),b},r.d=(e,d)=>{for(var a in d)r.o(d,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:d[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((d,a)=>(r.f[a](e,d),d)),[])),r.u=e=>"assets/js/"+({12:"9799683e",53:"935f2afb",80:"9beb87c2",119:"54969ead",257:"92a92b88",433:"7efb1a82",849:"bb373259",867:"943e77c3",995:"5a1924d4",1186:"a30498ab",1189:"759bfbe1",1328:"a0c5838c",1395:"ed519cbf",1407:"1a1a9e3d",1408:"95069fb2",1424:"b4dd6982",1535:"da51cc8f",1583:"c60c73ac",1668:"144994e6",1697:"4e27cd47",1790:"35bee977",1839:"8d7e75fb",1948:"5a510007",1965:"b5de05fe",1968:"c2ef5137",1995:"956a4ea6",1996:"bc843d59",2361:"0f2bd920",2593:"6c14cd7d",2634:"3c0cfdd0",2885:"ee7973d9",3136:"39d73575",3173:"7cf72cd4",3185:"06896101",3211:"1ffdd7de",3320:"6e2907e5",3375:"d7a9d534",3410:"7df8ae3f",3411:"b3bbf2ca",3516:"19dd4331",3731:"8f5f22a9",3794:"9d10a623",3804:"656951a7",3809:"1ad9bfe0",3902:"a4cb0559",4011:"26da1a01",4058:"129db88c",4155:"db70960d",4195:"c4f5d8e4",4277:"23efd64d",4295:"09b719bb",4532:"b8ab588d",4567:"f3f39cc5",4569:"210b7c69",4732:"bc1a89ad",4807:"1ea220c7",4859:"21169ea0",4920:"a7c6e145",4987:"deaab6a5",5464:"8613bfde",5490:"2a36568f",5528:"b1e2c3e5",5664:"876e022a",6069:"f1b4aa58",6074:"411db075",6083:"6a8a88b7",6127:"1cd31f12",6186:"918bfdcb",6224:"43d3d555",6292:"4e3cbe94",6349:"ff3f7f2b",6513:"d72ac48e",6547:"5514a4b8",6581:"40f2a0b4",6789:"f5184ac4",6807:"ea5491a0",6846:"8ac6f1f4",7011:"4d0c799d",7025:"9a5a69d5",7043:"b396445b",7080:"4d54d076",7235:"0abf3980",7237:"ed175a37",7258:"6c35bbce",7279:"81e5f1d0",7287:"7c32d245",7325:"76273f75",7388:"a40a3312",7409:"a552b93b",7468:"017ddd06",7580:"9a4dfeaa",7655:"64332b0f",7795:"bc2f9ced",7851:"9840208a",7918:"17896441",7920:"1a4e3797",7979:"118e913f",8076:"3f9d54d1",8229:"ec64d50d",8275:"646468fb",8305:"f4357d2a",8389:"9fcefd11",8445:"33664cb1",8464:"5e82a060",8643:"1b166456",8654:"3325c53c",8827:"321dfeeb",8845:"a9d63626",8854:"3a673d53",8989:"71153375",9027:"3e7ceef0",9092:"8a9effda",9108:"d3c35fce",9124:"e10372bb",9494:"72607e62",9514:"1be78505",9587:"4dcd5895",9710:"093b4e4f",9748:"40f2f3c6",9880:"5ef0e9d6",9917:"99f83bea",9949:"02617853"}[e]||e)+"."+{12:"1d8d20ca",53:"7f970a9d",80:"ada17958",119:"ebbccc5b",257:"573f4f56",433:"be8d2fd2",849:"696b16d2",867:"86023bb0",995:"a8c201b1",1186:"b83e40ec",1189:"ff627b45",1328:"46f903f4",1395:"65e02f98",1407:"e90b3a1d",1408:"d264ec03",1424:"b556540b",1426:"99e9e261",1535:"0a51a822",1583:"ad8b41b4",1668:"86e74c64",1697:"23397cb1",1790:"fed7fa83",1839:"121f3c52",1948:"05a6af86",1965:"0471e697",1968:"b9f7a6ae",1995:"9e74849b",1996:"3700be61",2361:"703591af",2593:"905756f6",2634:"004313f8",2885:"ed8e71cf",3136:"a5784d74",3173:"590cd8be",3185:"d45a6bbc",3211:"fd67ff6a",3320:"c187fd92",3375:"a8a822f5",3410:"36f25f3b",3411:"021d4da0",3516:"7d3b5d29",3731:"a0d44d2a",3794:"bd4bd866",3804:"507c6aff",3809:"3711034a",3902:"cb3c8eb0",4011:"05e77ca2",4058:"eddd5deb",4155:"1ab329cc",4195:"7093b4d3",4277:"663a4a48",4295:"fe491b53",4532:"a4431753",4567:"73d34d25",4569:"a893dcf4",4732:"4d932593",4807:"4d9064f9",4859:"35b2402c",4920:"844e278e",4972:"cda16f58",4987:"85ad07f4",5464:"f3db3df3",5490:"02fc9beb",5528:"55924adb",5664:"bfbee56b",6069:"fbdcc037",6074:"f8ce7c00",6083:"1c818d41",6127:"a9208342",6186:"858bb8f9",6224:"c68cf535",6292:"f25ac18d",6349:"23168425",6513:"2388c19c",6547:"07e210c6",6581:"583a660e",6789:"5d035928",6807:"29b4b762",6846:"6c72da16",6945:"2dea2b25",7011:"24d91ca6",7025:"91d3f7b3",7043:"cb86b0d2",7080:"67aee960",7235:"abb8d247",7237:"1f831195",7258:"4b8cb27d",7279:"3eed5d07",7287:"0a3ded36",7325:"49123404",7388:"9ec213d1",7409:"1ba3f9b1",7468:"8c6b78cd",7580:"58e82486",7655:"9b376f8b",7795:"b395469f",7851:"8f21b249",7918:"bbe201c0",7920:"e0927861",7979:"8a938d1c",8076:"e3677f00",8229:"25dae9fa",8275:"cd9b8a3f",8305:"eeda20d9",8389:"b4c4cbab",8445:"cd324040",8464:"d76f4323",8643:"ccf891d9",8654:"6802c0f0",8827:"57976d5f",8845:"61eab5bf",8854:"9e34c384",8894:"92d1342d",8989:"408119ca",9027:"029f6e0f",9092:"7535c462",9108:"653aa120",9124:"4a2d306c",9494:"e25fef97",9514:"8faf5f23",9587:"b14ce444",9710:"dce8db0c",9748:"ea8a822e",9880:"fe4d5bb3",9917:"8a078a9e",9949:"a016c4b2"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,d)=>Object.prototype.hasOwnProperty.call(e,d),f={},b="routr-docs:",r.l=(e,d,a,c)=>{if(f[e])f[e].push(d);else{var t,o;if(void 0!==a)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")==b+a){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",b+a),t.src=e),f[e]=[d];var l=(d,a)=>{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(a))),d)return d(a)},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)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",71153375:"8989","9799683e":"12","935f2afb":"53","9beb87c2":"80","54969ead":"119","92a92b88":"257","7efb1a82":"433",bb373259:"849","943e77c3":"867","5a1924d4":"995",a30498ab:"1186","759bfbe1":"1189",a0c5838c:"1328",ed519cbf:"1395","1a1a9e3d":"1407","95069fb2":"1408",b4dd6982:"1424",da51cc8f:"1535",c60c73ac:"1583","144994e6":"1668","4e27cd47":"1697","35bee977":"1790","8d7e75fb":"1839","5a510007":"1948",b5de05fe:"1965",c2ef5137:"1968","956a4ea6":"1995",bc843d59:"1996","0f2bd920":"2361","6c14cd7d":"2593","3c0cfdd0":"2634",ee7973d9:"2885","39d73575":"3136","7cf72cd4":"3173","06896101":"3185","1ffdd7de":"3211","6e2907e5":"3320",d7a9d534:"3375","7df8ae3f":"3410",b3bbf2ca:"3411","19dd4331":"3516","8f5f22a9":"3731","9d10a623":"3794","656951a7":"3804","1ad9bfe0":"3809",a4cb0559:"3902","26da1a01":"4011","129db88c":"4058",db70960d:"4155",c4f5d8e4:"4195","23efd64d":"4277","09b719bb":"4295",b8ab588d:"4532",f3f39cc5:"4567","210b7c69":"4569",bc1a89ad:"4732","1ea220c7":"4807","21169ea0":"4859",a7c6e145:"4920",deaab6a5:"4987","8613bfde":"5464","2a36568f":"5490",b1e2c3e5:"5528","876e022a":"5664",f1b4aa58:"6069","411db075":"6074","6a8a88b7":"6083","1cd31f12":"6127","918bfdcb":"6186","43d3d555":"6224","4e3cbe94":"6292",ff3f7f2b:"6349",d72ac48e:"6513","5514a4b8":"6547","40f2a0b4":"6581",f5184ac4:"6789",ea5491a0:"6807","8ac6f1f4":"6846","4d0c799d":"7011","9a5a69d5":"7025",b396445b:"7043","4d54d076":"7080","0abf3980":"7235",ed175a37:"7237","6c35bbce":"7258","81e5f1d0":"7279","7c32d245":"7287","76273f75":"7325",a40a3312:"7388",a552b93b:"7409","017ddd06":"7468","9a4dfeaa":"7580","64332b0f":"7655",bc2f9ced:"7795","9840208a":"7851","1a4e3797":"7920","118e913f":"7979","3f9d54d1":"8076",ec64d50d:"8229","646468fb":"8275",f4357d2a:"8305","9fcefd11":"8389","33664cb1":"8445","5e82a060":"8464","1b166456":"8643","3325c53c":"8654","321dfeeb":"8827",a9d63626:"8845","3a673d53":"8854","3e7ceef0":"9027","8a9effda":"9092",d3c35fce:"9108",e10372bb:"9124","72607e62":"9494","1be78505":"9514","4dcd5895":"9587","093b4e4f":"9710","40f2f3c6":"9748","5ef0e9d6":"9880","99f83bea":"9917","02617853":"9949"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(d,a)=>{var f=r.o(e,d)?e[d]:void 0;if(0!==f)if(f)a.push(f[2]);else if(/^(1303|532)$/.test(d))e[d]=0;else{var b=new Promise(((a,b)=>f=e[d]=[a,b]));a.push(f[2]=b);var c=r.p+r.u(d),t=new Error;r.l(c,(a=>{if(r.o(e,d)&&(0!==(f=e[d])&&(e[d]=void 0),f)){var b=a&&("load"===a.type?"missing":a.type),c=a&&a.target&&a.target.src;t.message="Loading chunk "+d+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,f[1](t)}}),"chunk-"+d,d)}},r.O.j=d=>0===e[d];var d=(d,a)=>{var f,b,c=a[0],t=a[1],o=a[2],n=0;if(c.some((d=>0!==e[d]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(d&&d(a);n<c.length;n++)b=c[n],r.o(e,b)&&e[b]&&e[b][0](),e[b]=0;return r.O(i)},a=self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[];a.forEach(d.bind(null,0)),a.push=d.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.6aecb1f6.js b/assets/js/runtime~main.6aecb1f6.js new file mode 100644 index 000000000..069cc6837 --- /dev/null +++ b/assets/js/runtime~main.6aecb1f6.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,d,f,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(a,d,f,c)=>{if(!d){var b=1/0;for(i=0;i<e.length;i++){d=e[i][0],f=e[i][1],c=e[i][2];for(var t=!0,o=0;o<d.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[d,f,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var d in a)r.o(a,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,d)=>(r.f[d](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"118e913f",49:"e10372bb",208:"1b166456",286:"d7a9d534",364:"54969ead",529:"7c32d245",537:"321dfeeb",583:"5514a4b8",620:"8ac6f1f4",767:"7efb1a82",803:"b5de05fe",821:"646468fb",823:"4d0c799d",831:"3a673d53",911:"5ef0e9d6",1079:"a7c6e145",1080:"759bfbe1",1171:"144994e6",1214:"876e022a",1224:"943e77c3",1304:"35bee977",1459:"4d54d076",1703:"210b7c69",1780:"39d73575",1870:"918bfdcb",1953:"b1e2c3e5",2138:"1a4e3797",2333:"3f9d54d1",2358:"95069fb2",2401:"26da1a01",2405:"7df8ae3f",2433:"5a1924d4",2506:"0f2bd920",2514:"ee7973d9",2607:"d3c35fce",2634:"c4f5d8e4",2692:"129db88c",2964:"2a36568f",3102:"9fcefd11",3191:"02617853",3244:"6a8a88b7",3296:"8613bfde",3383:"1ad9bfe0",3539:"9beb87c2",3578:"76273f75",3624:"43d3d555",3688:"a0c5838c",3690:"0abf3980",3738:"06896101",3741:"8a9effda",3797:"bc843d59",3857:"a30498ab",4011:"ea5491a0",4050:"956a4ea6",4082:"b396445b",4126:"19dd4331",4236:"ed175a37",4366:"6e2907e5",4480:"3c0cfdd0",4682:"99f83bea",4714:"093b4e4f",4719:"8d7e75fb",4862:"6c35bbce",5009:"656951a7",5056:"1cd31f12",5362:"8f5f22a9",5365:"bc2f9ced",5613:"3e7ceef0",5659:"b8ab588d",5804:"bb373259",5872:"a552b93b",6038:"5e82a060",6099:"f5184ac4",6341:"6c14cd7d",6346:"bc1a89ad",6541:"09b719bb",6549:"db70960d",6575:"f4357d2a",6615:"4dcd5895",6692:"4e3cbe94",6695:"9799683e",6782:"deaab6a5",6792:"1ea220c7",6903:"ff3f7f2b",6926:"40f2a0b4",6944:"3325c53c",7063:"d72ac48e",7098:"a7bd4aaa",7225:"23efd64d",7337:"9a5a69d5",7372:"a9d63626",7387:"f3f39cc5",7408:"9a4dfeaa",7638:"ed519cbf",7782:"1ffdd7de",7940:"92a92b88",8167:"9840208a",8190:"b3bbf2ca",8253:"4e27cd47",8329:"64332b0f",8353:"40f2f3c6",8401:"17896441",8512:"1a1a9e3d",8535:"411db075",8581:"935f2afb",8732:"b4dd6982",8755:"f1b4aa58",8911:"71153375",8937:"7cf72cd4",9012:"5a510007",9042:"72607e62",9048:"a94703ab",9188:"a4cb0559",9465:"c2ef5137",9504:"21169ea0",9537:"c60c73ac",9583:"81e5f1d0",9647:"5e95c892",9692:"da51cc8f",9845:"017ddd06",9900:"ec64d50d",9922:"a40a3312",9953:"33664cb1",9955:"9d10a623"}[e]||e)+"."+{1:"22aac4d7",49:"f875b5b9",208:"afa392b3",286:"acc28f6a",364:"01cf159a",416:"2c3d437b",529:"80c5bf10",537:"607289a8",583:"b85640cf",620:"56eaa81a",767:"15e4652c",803:"2a9dab58",821:"28bd5243",823:"82777be3",831:"2766e28e",911:"72a3fe22",1079:"b8df2a42",1080:"035fb5f8",1171:"12bed236",1214:"fec538fd",1224:"c18b42bc",1304:"e12c0329",1459:"1e8f115b",1703:"f12cb937",1780:"2275c69d",1870:"982771c7",1953:"f009a04f",2138:"9432810d",2237:"09ea1ac9",2333:"c4d5fa12",2358:"b3b4552d",2401:"3be03227",2405:"46854fda",2433:"161693fb",2506:"1ab834b7",2514:"d3592e4d",2607:"81e9ce52",2634:"4659817a",2692:"13220621",2964:"d948f060",3102:"f0fb126c",3191:"a06ae3cb",3244:"4d11689b",3296:"82349e8a",3383:"ba73e09d",3539:"5ebf1e1f",3578:"60924f2a",3624:"fc23fdad",3688:"5b15e2b4",3690:"d6c002e8",3738:"5deb77fe",3741:"5b2b876e",3797:"b0cc575a",3857:"812d55ec",4011:"a12d1751",4050:"65e6eb8e",4082:"4d16d64d",4126:"92fe643f",4236:"09425780",4366:"766a8f96",4480:"c1beae7e",4682:"e53f7fb4",4714:"b05d61ed",4719:"639e4c36",4862:"00ee5040",5009:"c9f52622",5056:"a5a94d63",5362:"b0c4d9ca",5365:"dba43639",5613:"c6e6babd",5659:"06e68070",5804:"887e1edb",5872:"6326ae55",6038:"c1d9a442",6099:"15ae4dba",6341:"f1e17186",6346:"81431dea",6541:"105201e4",6549:"892a5e80",6575:"a6c56766",6615:"fb90af12",6692:"0efb67be",6695:"8030dda4",6782:"e271f229",6792:"919e9360",6903:"b883c263",6926:"bcebf01b",6944:"f6a55c0f",7063:"b02011c0",7098:"eccafe3d",7225:"69bca8aa",7337:"1e1e317b",7372:"ef9d935a",7387:"b8fb4284",7408:"a4107647",7638:"c20eaab7",7782:"43072233",7940:"2c0f2381",8167:"22624fd6",8190:"60bb6537",8253:"40cb91a8",8329:"849013cf",8353:"6108f911",8401:"04422b2e",8512:"25a9d97e",8535:"9b5d818d",8581:"9b7d34d8",8732:"a5471632",8755:"d829509f",8911:"1ac7f02d",8913:"0805a9ae",8937:"cce3242e",9012:"f35cb9c6",9042:"8c39e033",9048:"75b37e51",9188:"b622069b",9462:"7d4144d6",9465:"98ec0fa4",9504:"41ddd5b2",9537:"f7a57bd6",9583:"d7a2877e",9647:"0fe135c9",9692:"b5045421",9845:"bd7758e0",9900:"390e4709",9922:"2b4c3cf4",9953:"e1df95ca",9955:"4e6d4ada"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="routr-docs:",r.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==d)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")==c+d){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+d),t.src=e),f[e]=[a];var l=(a,d)=>{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(d))),a)return a(d)},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)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",71153375:"8911","118e913f":"1",e10372bb:"49","1b166456":"208",d7a9d534:"286","54969ead":"364","7c32d245":"529","321dfeeb":"537","5514a4b8":"583","8ac6f1f4":"620","7efb1a82":"767",b5de05fe:"803","646468fb":"821","4d0c799d":"823","3a673d53":"831","5ef0e9d6":"911",a7c6e145:"1079","759bfbe1":"1080","144994e6":"1171","876e022a":"1214","943e77c3":"1224","35bee977":"1304","4d54d076":"1459","210b7c69":"1703","39d73575":"1780","918bfdcb":"1870",b1e2c3e5:"1953","1a4e3797":"2138","3f9d54d1":"2333","95069fb2":"2358","26da1a01":"2401","7df8ae3f":"2405","5a1924d4":"2433","0f2bd920":"2506",ee7973d9:"2514",d3c35fce:"2607",c4f5d8e4:"2634","129db88c":"2692","2a36568f":"2964","9fcefd11":"3102","02617853":"3191","6a8a88b7":"3244","8613bfde":"3296","1ad9bfe0":"3383","9beb87c2":"3539","76273f75":"3578","43d3d555":"3624",a0c5838c:"3688","0abf3980":"3690","06896101":"3738","8a9effda":"3741",bc843d59:"3797",a30498ab:"3857",ea5491a0:"4011","956a4ea6":"4050",b396445b:"4082","19dd4331":"4126",ed175a37:"4236","6e2907e5":"4366","3c0cfdd0":"4480","99f83bea":"4682","093b4e4f":"4714","8d7e75fb":"4719","6c35bbce":"4862","656951a7":"5009","1cd31f12":"5056","8f5f22a9":"5362",bc2f9ced:"5365","3e7ceef0":"5613",b8ab588d:"5659",bb373259:"5804",a552b93b:"5872","5e82a060":"6038",f5184ac4:"6099","6c14cd7d":"6341",bc1a89ad:"6346","09b719bb":"6541",db70960d:"6549",f4357d2a:"6575","4dcd5895":"6615","4e3cbe94":"6692","9799683e":"6695",deaab6a5:"6782","1ea220c7":"6792",ff3f7f2b:"6903","40f2a0b4":"6926","3325c53c":"6944",d72ac48e:"7063",a7bd4aaa:"7098","23efd64d":"7225","9a5a69d5":"7337",a9d63626:"7372",f3f39cc5:"7387","9a4dfeaa":"7408",ed519cbf:"7638","1ffdd7de":"7782","92a92b88":"7940","9840208a":"8167",b3bbf2ca:"8190","4e27cd47":"8253","64332b0f":"8329","40f2f3c6":"8353","1a1a9e3d":"8512","411db075":"8535","935f2afb":"8581",b4dd6982:"8732",f1b4aa58:"8755","7cf72cd4":"8937","5a510007":"9012","72607e62":"9042",a94703ab:"9048",a4cb0559:"9188",c2ef5137:"9465","21169ea0":"9504",c60c73ac:"9537","81e5f1d0":"9583","5e95c892":"9647",da51cc8f:"9692","017ddd06":"9845",ec64d50d:"9900",a40a3312:"9922","33664cb1":"9953","9d10a623":"9955"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,d)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(d=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],t=d[1],o=d[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(d);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},d=self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[];d.forEach(a.bind(null,0)),d.push=a.bind(null,d.push.bind(d))})()})(); \ No newline at end of file diff --git a/docs/1.x.x/administration/cli/cheatsheet/index.html b/docs/1.x.x/administration/cli/cheatsheet/index.html index fea1a0138..a8261ec42 100644 --- a/docs/1.x.x/administration/cli/cheatsheet/index.html +++ b/docs/1.x.x/administration/cli/cheatsheet/index.html @@ -1,23 +1,107 @@ <!doctype html> -<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-1.x.x plugin-docs plugin-id-default docs-doc-id-administration/cli/cheatsheet" data-has-hydrated="false"> +<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-1.x.x docs-doc-page docs-doc-id-administration/cli/cheatsheet" data-has-hydrated="false"> <head> <meta charset="UTF-8"> -<meta name="generator" content="Docusaurus v2.4.3"> -<title data-rh="true">Cheatsheet | Routr Docs + +Cheatsheet | Routr Docs - - - + + + -
-
Version: 1.x.x

Cheatsheet

The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.

Installation

To get the Routr Command-Line Tool run the following command:

npm install -g routr-ctl

The command-line tool is now globally accessible.

Login to a Routr server

To login to a Routr server, use the login command.

rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit

The current API version is v1beta1

Syntax

Use the following syntax to run rctl commands from your terminal window:

rctl COMMAND [REF] [flags]

where COMMAND, subcommand REF, and flags are:

  • COMMAND: Specifies the operation that you want to perform on one or more resources. For example, create, get, delete, locate(loc).

  • subcommand: Specifies the resource type. Resource types are case-sensitive, and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output:

  $ rctl get gateway gweef506
$ rctl get gateways gweef506
$ rctl get gw gweef506
  • REF: Specifies the reference to the resource. References are case-sensitive. For a full list, omit the reference. For example, $ rctl get agents.

  • flags: Specifies optional flags. For example, you can use the --filter to further reduce the output of the get command .

The --filter flag uses JsonPath to perform the filtering. The root is always '$'. -All you need to add is the path to the property and the filter operators. For example:

# This returns all the Numbers in Gateway 'gweef506'
rctl get numbers --filter "@.metadata.gwRef=='gweef506'"

If you need help, just run rctl --help from the terminal window.

$ rctl --help
usage: rctl [-h] [-v] COMMAND ...

A tool for the management of a Routr instance

named arguments:
-h, --help show this help message and exit
-v, --version print version information and quit

Commands:
COMMAND
get display a list of resources
create (crea) creates new resource(s)
apply apply changes over existing resource(s)
delete (del) delete an existing resource(s)
locate (loc) locate sip device(s)
registry (reg) shows gateways registrations
proxy run a proxy to the server (beta)
login sets connection info
logout clear session credentials
logs dumps all the available system logs
restart restarts the engine
stop stops the engine
ping checks engine status
version (ver) obtain rctl's version information
config manage routr configuration

Run 'rctl COMMAND --help' for more information on a command

Important: Some commands (i.e.: create, delete) are not available in the default implementation of the resources modules. Only persistent implementations support these commands.

Examples: Common operations

Use the following set of examples to help you familiarize yourself with running the commonly used rctl operations:

rctl locate or rctl loc - Locate a sip device registered on the Routr server

// Locate all Sip Devices registered against a Routr server
$ rctl loc

rctl registry or rctl reg - Shows Gateways current registration.

// Shows the registry
$ rctl reg

rctl get - List one or more resources.

// List all numbers
$ rctl get numbers

// List all numbers that belong to gateway reference gweef506
$ rctl get numbers --filter "@.metadata.ref=='gweef506'"

// List number by reference
$ rctl get numbers dd50baa4

// List all agents
$ rctl get agents

rctl create - create a new resource.

// Create a new gateway(s) using a .yaml or .yml file
$ rctl create -f new-gateway.yaml

rctl apply - update an existing resource(s)

// Update an existing resource(s) .yaml or .yml.
$ rctl apply -f new-gateway.yaml

rctl delete - delete a resource.

// Delete all numbers for gateway reference gweef506
$ rctl delete numbers --filter "@.metadata.gwRef=='gweef506'"

// Delete a single agent (using delete alias)
$ rctl del agent ag3f77f6

Cheat Sheet

Create, delete, and update are only available in some implementations of the resources module.

Request and store token

# Request authentication for subsequent commands
$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit

Clear out the session credentials

# Clear session credentials
$ rctl logout

Launch the Web Console

# The Web Console re-uses the credentials of your Command-Line Tool
rctl proxy

Showing the Registry

# Shows all the Gateways that are currently available
$ rctl registry # Shows only current registrations. You may use `reg` for short

Locating SIP Devices

# Find all sip devices available at the location service
$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes

Creating Resources

# Create new peers and agents
$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml
$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml

Finding Resources

# Get Numbers
$ rctl get numbers # List all available Numbers
$ rctl get number # List all available Numbers
$ rctl get number --filter "@.metadata.ref=='dd50baa4'" # Shows Number with reference 'Number0001'
$ rctl get number --filter "@.metadata.gwRef=='gweef506'" # Shows Numbers with Gateway reference 'GW1232'

# Get agents
$ rctl get agents # List all Agents

Deleting Resources

# Delete command by refernce or filter
$ rctl delete agent ag3f77f6 # Delete Agent by reference
$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter

Updating Resources

$ rctl apply -f asterisk.yaml                         # Create Peer in file asterisk.yaml
$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml

Dump all available logs

$ rctl logs

Restart the engine

# To restart the engine immediately use the --now flag
$ rctl restart --now

Stop the engine

# To stop the engine immediately use the --now flag
$ rctl restart --now

Check the engine status

$ rctl ping

Display version information

$ rctl ver

Manage general configuration

# To update configuration use the apply subommand
$ rctl config apply -f /path/to/config.yml

# To see the configuration use the describe subcommand
$ rctl config describe --full
- - +
Version: 1.x.x

Cheatsheet

+

The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.

+

Installation

+

To get the Routr Command-Line Tool run the following command:

+
npm install -g routr-ctl
+

The command-line tool is now globally accessible.

+

Login to a Routr server

+

To login to a Routr server, use the login command.

+
rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit
+
+

The current API version is v1beta1

+
+

Syntax

+

Use the following syntax to run rctl commands from your terminal window:

+
rctl COMMAND [REF] [flags]
+

where COMMAND, subcommand REF, and flags are:

+
    +
  • +

    COMMAND: Specifies the operation that you want to perform on one or more resources. For example, create, get, delete, locate(loc).

    +
  • +
  • +

    subcommand: Specifies the resource type. Resource types are case-sensitive, and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output:

    +
  • +
+
  $ rctl get gateway gweef506
$ rctl get gateways gweef506
$ rctl get gw gweef506
+
    +
  • +

    REF: Specifies the reference to the resource. References are case-sensitive. For a full list, omit the reference. For example, $ rctl get agents.

    +
  • +
  • +

    flags: Specifies optional flags. For example, you can use the --filter to further reduce the output of the get command .

    +
  • +
+

The --filter flag uses JsonPath to perform the filtering. The root is always '$'. +All you need to add is the path to the property and the filter operators. For example:

+
# This returns all the Numbers in Gateway 'gweef506'
rctl get numbers --filter "@.metadata.gwRef=='gweef506'"
+

If you need help, just run rctl --help from the terminal window.

+
$ rctl --help
usage: rctl [-h] [-v] COMMAND ...

A tool for the management of a Routr instance

named arguments:
-h, --help show this help message and exit
-v, --version print version information and quit

Commands:
COMMAND
get display a list of resources
create (crea) creates new resource(s)
apply apply changes over existing resource(s)
delete (del) delete an existing resource(s)
locate (loc) locate sip device(s)
registry (reg) shows gateways registrations
proxy run a proxy to the server (beta)
login sets connection info
logout clear session credentials
logs dumps all the available system logs
restart restarts the engine
stop stops the engine
ping checks engine status
version (ver) obtain rctl's version information
config manage routr configuration

Run 'rctl COMMAND --help' for more information on a command
+
+

Important: Some commands (i.e.: create, delete) are not available in the default implementation of the resources modules. Only persistent implementations support these commands.

+
+

Examples: Common operations

+

Use the following set of examples to help you familiarize yourself with running the commonly used rctl operations:

+

rctl locate or rctl loc - Locate a sip device registered on the Routr server

+
// Locate all Sip Devices registered against a Routr server
$ rctl loc
+

rctl registry or rctl reg - Shows Gateways current registration.

+
// Shows the registry
$ rctl reg
+

rctl get - List one or more resources.

+
// List all numbers
$ rctl get numbers

// List all numbers that belong to gateway reference gweef506
$ rctl get numbers --filter "@.metadata.ref=='gweef506'"

// List number by reference
$ rctl get numbers dd50baa4

// List all agents
$ rctl get agents
+

rctl create - create a new resource.

+
// Create a new gateway(s) using a .yaml or .yml file
$ rctl create -f new-gateway.yaml
+

rctl apply - update an existing resource(s)

+
// Update an existing resource(s) .yaml or .yml.
$ rctl apply -f new-gateway.yaml
+

rctl delete - delete a resource.

+
// Delete all numbers for gateway reference gweef506
$ rctl delete numbers --filter "@.metadata.gwRef=='gweef506'"

// Delete a single agent (using delete alias)
$ rctl del agent ag3f77f6
+

Cheat Sheet

+
+

Create, delete, and update are only available in some implementations of the resources module.

+
+

Request and store token

+
# Request authentication for subsequent commands
$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit
+

Clear out the session credentials

+
# Clear session credentials
$ rctl logout
+

Launch the Web Console

+
# The Web Console re-uses the credentials of your Command-Line Tool
rctl proxy
+

Showing the Registry

+
# Shows all the Gateways that are currently available
$ rctl registry # Shows only current registrations. You may use `reg` for short
+

Locating SIP Devices

+
# Find all sip devices available at the location service
$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes
+

Creating Resources

+
# Create new peers and agents
$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml
$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml
+

Finding Resources

+
# Get Numbers
$ rctl get numbers # List all available Numbers
$ rctl get number # List all available Numbers
$ rctl get number --filter "@.metadata.ref=='dd50baa4'" # Shows Number with reference 'Number0001'
$ rctl get number --filter "@.metadata.gwRef=='gweef506'" # Shows Numbers with Gateway reference 'GW1232'

# Get agents
$ rctl get agents # List all Agents
+

Deleting Resources

+
# Delete command by refernce or filter
$ rctl delete agent ag3f77f6 # Delete Agent by reference
$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter
+

Updating Resources

+
$ rctl apply -f asterisk.yaml                         # Create Peer in file asterisk.yaml
$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml
+

Dump all available logs

+
$ rctl logs
+

Restart the engine

+
# To restart the engine immediately use the --now flag
$ rctl restart --now
+

Stop the engine

+
# To stop the engine immediately use the --now flag
$ rctl restart --now
+

Check the engine status

+
$ rctl ping
+

Display version information

+
$ rctl ver
+

Manage general configuration

+
# To update configuration use the apply subommand
$ rctl config apply -f /path/to/config.yml

# To see the configuration use the describe subcommand
$ rctl config describe --full
\ No newline at end of file diff --git a/docs/1.x.x/administration/cli/installation/index.html b/docs/1.x.x/administration/cli/installation/index.html index a03685bc6..618409d91 100644 --- a/docs/1.x.x/administration/cli/installation/index.html +++ b/docs/1.x.x/administration/cli/installation/index.html @@ -1,22 +1,29 @@ - + - -Installation | Routr Docs + +Installation | Routr Docs - - - + + + -
-
Version: 1.x.x

Installation

To get the Routr Command-Line Tool run the following command:

npm install -g routr-ctl

The command-line tool is now globally accessible.

Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:

sudo snap install rctl

Login to a Routr server

To log in to a Routr server and being issuing commands run the following commands.

rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit

The current API version is v1beta1

- - +
Version: 1.x.x

Installation

To get the Routr Command-Line Tool run the following command:

+
npm install -g routr-ctl
+

The command-line tool is now globally accessible.

+

Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:

+
sudo snap install rctl
+

Login to a Routr server

+

To log in to a Routr server and being issuing commands run the following commands.

+
rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit
+
+

The current API version is v1beta1

+
\ No newline at end of file diff --git a/docs/1.x.x/administration/cli/remote-access/index.html b/docs/1.x.x/administration/cli/remote-access/index.html index 4c3839fbe..d66b3c46f 100644 --- a/docs/1.x.x/administration/cli/remote-access/index.html +++ b/docs/1.x.x/administration/cli/remote-access/index.html @@ -1,22 +1,25 @@ - + - -Remote Access | Routr Docs + +Remote Access | Routr Docs - - - + + + -
-
Version: 1.x.x

Remote Access

By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.

Here is an example using a self-signed certificate(usually enough).

keytool -genkey -keyalg RSA \
-noprompt \
-alias routr \
-keystore api-cert.jks \
-storepass changeit \
-keypass changeit \
-validity 365 \
-keysize 2048 \
-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \
-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1

Remember to place the certificate in the etc/certs folder

- - +
Version: 1.x.x

Remote Access

+

By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.

+

Here is an example using a self-signed certificate(usually enough).

+
keytool -genkey -keyalg RSA \
-noprompt \
-alias routr \
-keystore api-cert.jks \
-storepass changeit \
-keypass changeit \
-validity 365 \
-keysize 2048 \
-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \
-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1
+
+

Remember to place the certificate in the etc/certs folder

+
\ No newline at end of file diff --git a/docs/1.x.x/administration/webconsole/index.html b/docs/1.x.x/administration/webconsole/index.html index 4557c3e93..c41e1d680 100644 --- a/docs/1.x.x/administration/webconsole/index.html +++ b/docs/1.x.x/administration/webconsole/index.html @@ -1,22 +1,31 @@ - + - -WebUI | Routr Docs + +WebUI | Routr Docs - - - + + + -
-
Version: 1.x.x

WebUI

The Web Console — WC for short — is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.

WebUI Animation

How to install the Web Console?

The WC ships with the Command-Line tool. You do not need to install it separately.

Launching the Web Console

To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:

rctl proxy

The WC re-uses the credentials of your Command-Line Tool

Does the WC affect the server's performance?

No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance.

- - +
Version: 1.x.x

WebUI

+

The Web Console — WC for short — is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.

+

WebUI Animation

+

How to install the Web Console?

+

The WC ships with the Command-Line tool. You do not need to install it separately.

+

Launching the Web Console

+

To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:

+
rctl proxy
+
+

The WC re-uses the credentials of your Command-Line Tool

+
+

Does the WC affect the server's performance?

+

No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance.

\ No newline at end of file diff --git a/docs/1.x.x/api/agents/create/index.html b/docs/1.x.x/api/agents/create/index.html index 1d14802d7..41253cafd 100644 --- a/docs/1.x.x/api/agents/create/index.html +++ b/docs/1.x.x/api/agents/create/index.html @@ -1,23 +1,33 @@ - + - -createAgent | Routr Docs + +createAgent | Routr Docs - - - + + + -
-
Version: 1.x.x

createAgent

Creates a new Agent resource. The Domain must exist before creating the Agent. -Otherwise, this method responds with a UNFULFILLED_DEPENDENCY_RESPONSE.

URL

/agents

Method

POST

Parameters

This method does not receive any parameters.

Request body

A file containing an Agent resource in json format.

Response

If successful this method creates an Agent resource.

Sample Call

POST /api/{apiversion}/agents
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "ag3f77f6"
}
- - +
Version: 1.x.x

createAgent

+

Creates a new Agent resource. The Domain must exist before creating the Agent. +Otherwise, this method responds with a UNFULFILLED_DEPENDENCY_RESPONSE.

+

URL

+

/agents

+

Method

+

POST

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing an Agent resource in json format.

+

Response

+

If successful this method creates an Agent resource.

+

Sample Call

+
POST /api/{apiversion}/agents
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "ag3f77f6"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/delete/index.html b/docs/1.x.x/api/agents/delete/index.html index 245690dbf..19fbbde4a 100644 --- a/docs/1.x.x/api/agents/delete/index.html +++ b/docs/1.x.x/api/agents/delete/index.html @@ -1,22 +1,32 @@ - + - -deleteAgent | Routr Docs + +deleteAgent | Routr Docs - - - + + + -
-
Version: 1.x.x

deleteAgent

Removes an Agent resource from a persistent database.

URL

/agents/{ref}

Method

DELETE

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method removes an Agent resource.

Sample Call

DELETE /api/v1beta1/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

deleteAgent

+

Removes an Agent resource from a persistent database.

+

URL

+

/agents/{ref}

+

Method

+

DELETE

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method removes an Agent resource.

+

Sample Call

+
DELETE /api/v1beta1/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/get/index.html b/docs/1.x.x/api/agents/get/index.html index 817530dc5..65311a46d 100644 --- a/docs/1.x.x/api/agents/get/index.html +++ b/docs/1.x.x/api/agents/get/index.html @@ -1,22 +1,32 @@ - + - -getAgent | Routr Docs + +getAgent | Routr Docs - - - + + + -
-
Version: 1.x.x

getAgent

This method returns an Agent resource.

URL

/agents/{ref}

Method

GET

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method returns an Agent resource.

Sample Call

GET /api/{apiversion}/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}
}
- - +
Version: 1.x.x

getAgent

+

This method returns an Agent resource.

+

URL

+

/agents/{ref}

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns an Agent resource.

+

Sample Call

+
GET /api/{apiversion}/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/list/index.html b/docs/1.x.x/api/agents/list/index.html index 36076f2ef..e963791e6 100644 --- a/docs/1.x.x/api/agents/list/index.html +++ b/docs/1.x.x/api/agents/list/index.html @@ -1,22 +1,33 @@ - + - -listAgents | Routr Docs + +listAgents | Routr Docs - - - + + + -
-
Version: 1.x.x

listAgents

This method returns a list of Agent resources.

URL

/agents

Method

GET

Parameters

Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Note: The filter parameter uses JsonPath format

Request body

Do not supply a request body with this method.

Response

If successful this method returns a list of Agent resources.

Sample Call

GET /api/{apiversion}/agents
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}]
}
- - +
Version: 1.x.x

listAgents

+

This method returns a list of Agent resources.

+

URL

+

/agents

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Note: The filter parameter uses JsonPath format

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a list of Agent resources.

+

Sample Call

+
GET /api/{apiversion}/agents
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/update/index.html b/docs/1.x.x/api/agents/update/index.html index 30f5c4a7d..5ddad2a5d 100644 --- a/docs/1.x.x/api/agents/update/index.html +++ b/docs/1.x.x/api/agents/update/index.html @@ -1,22 +1,32 @@ - + - -updateAgent | Routr Docs + +updateAgent | Routr Docs - - - + + + -
-
Version: 1.x.x

updateAgent

Updates an existing Agent resource.

URL

/agents/{ref}

Method

PUT

Parameters

This method does not receive any parameters.

Request body

A file containing an Agent resource in json format.

Response

If successful this method updates an Agent resource.

Sample Call

PUT /api/v1beta1/agents/ag3f77f6
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

updateAgent

+

Updates an existing Agent resource.

+

URL

+

/agents/{ref}

+

Method

+

PUT

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing an Agent resource in json format.

+

Response

+

If successful this method updates an Agent resource.

+

Sample Call

+
PUT /api/v1beta1/agents/ag3f77f6
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/config/get/index.html b/docs/1.x.x/api/config/get/index.html index 12e110137..adaf92ba3 100644 --- a/docs/1.x.x/api/config/get/index.html +++ b/docs/1.x.x/api/config/get/index.html @@ -1,22 +1,32 @@ - + - -getConfiguration | Routr Docs + +getConfiguration | Routr Docs - - - + + + -
-
Version: 1.x.x

getConfiguration

This method returns the servers' configuration.

URL

/system/config

Method

GET

Parameters

Parameter NameTypeValueDescription
fullquerybooleanIf set to true it will return a merged configuration between defaults and user defined values

Request body

Do not supply a request body with this method.

Response

If successful this method returns the current configuration from the server.

Sample Call

GET /api/{apiversion}/system/config
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": {
...
}
}
- - +
Version: 1.x.x

getConfiguration

+

This method returns the servers' configuration.

+

URL

+

/system/config

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
fullquerybooleanIf set to true it will return a merged configuration between defaults and user defined values
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns the current configuration from the server.

+

Sample Call

+
GET /api/{apiversion}/system/config
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": {
...
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/config/update/index.html b/docs/1.x.x/api/config/update/index.html index e5037b60e..82e5b7637 100644 --- a/docs/1.x.x/api/config/update/index.html +++ b/docs/1.x.x/api/config/update/index.html @@ -1,22 +1,32 @@ - + - -updateConfiguration | Routr Docs + +updateConfiguration | Routr Docs - - - + + + -
-
Version: 1.x.x

updateConfiguration

This method updates the servers' configuration.

URL

/system/config

Method

PUT

Parameters

This method does not receive any parameters.

Request body

A file containing the servers' configuration in json format.

Response

The changes will take effect on the next time the instance restart.

Sample Call

PUT /api/{apiversion}/config
{
"apiVersion": "v1beta1",
"spec": {
"dataSource": {
"provider": "redis_data_provider"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

updateConfiguration

+

This method updates the servers' configuration.

+

URL

+

/system/config

+

Method

+

PUT

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing the servers' configuration in json format.

+

Response

+

The changes will take effect on the next time the instance restart.

+

Sample Call

+
PUT /api/{apiversion}/config
{
"apiVersion": "v1beta1",
"spec": {
"dataSource": {
"provider": "redis_data_provider"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/create/index.html b/docs/1.x.x/api/domains/create/index.html index 983e84415..b14dc91fe 100644 --- a/docs/1.x.x/api/domains/create/index.html +++ b/docs/1.x.x/api/domains/create/index.html @@ -1,22 +1,32 @@ - + - -createDomain | Routr Docs + +createDomain | Routr Docs - - - + + + -
-
Version: 1.x.x

createDomain

Creates a new Domain resource.

URL

/domains

Method

POST

Parameters

This method does not receive any parameters.

Request body

A file containing a Domain resource in json format.

Response

If successful this method creates a Domain resource.

Sample Call

POST /api/{apiversion}/domains
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dm6c87r2"
}
- - +
Version: 1.x.x

createDomain

+

Creates a new Domain resource.

+

URL

+

/domains

+

Method

+

POST

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Domain resource in json format.

+

Response

+

If successful this method creates a Domain resource.

+

Sample Call

+
POST /api/{apiversion}/domains
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dm6c87r2"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/delete/index.html b/docs/1.x.x/api/domains/delete/index.html index fe6536ca0..a52196963 100644 --- a/docs/1.x.x/api/domains/delete/index.html +++ b/docs/1.x.x/api/domains/delete/index.html @@ -1,24 +1,34 @@ - + - -deleteDomain | Routr Docs + +deleteDomain | Routr Docs - - - + + + -
-
Version: 1.x.x

deleteDomain

Removes a Domain resource from a persistent database. Before removing +

Version: 1.x.x

deleteDomain

+

Removes a Domain resource from a persistent database. Before removing a Domain, ensure you have remove all of it child Agents. Otherwise, -this method returns a FOUND_DEPENDENT_OBJECTS_RESPONSE

URL

/domains/{ref}

Method

DELETE

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method removes a Domain resource.

Sample Call

DELETE /api/v1beta1/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +this method returns a FOUND_DEPENDENT_OBJECTS_RESPONSE

+

URL

+

/domains/{ref}

+

Method

+

DELETE

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method removes a Domain resource.

+

Sample Call

+
DELETE /api/v1beta1/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/get/index.html b/docs/1.x.x/api/domains/get/index.html index 0f6462289..84dee83d2 100644 --- a/docs/1.x.x/api/domains/get/index.html +++ b/docs/1.x.x/api/domains/get/index.html @@ -1,22 +1,32 @@ - + - -getDomain | Routr Docs + +getDomain | Routr Docs - - - + + + -
-
Version: 1.x.x

getDomain

This method returns a Gateway resource.

URL

/domains/{ref}

Method

GET

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method returns a Domain resource.

Sample Call

GET /api/{apiversion}/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}
}
- - +
Version: 1.x.x

getDomain

+

This method returns a Gateway resource.

+

URL

+

/domains/{ref}

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a Domain resource.

+

Sample Call

+
GET /api/{apiversion}/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/list/index.html b/docs/1.x.x/api/domains/list/index.html index 93964c33a..d59667b23 100644 --- a/docs/1.x.x/api/domains/list/index.html +++ b/docs/1.x.x/api/domains/list/index.html @@ -1,22 +1,33 @@ - + - -listDomains | Routr Docs + +listDomains | Routr Docs - - - + + + -
-
Version: 1.x.x

listDomains

This method returns a list of Domain resources.

URL

/domains

Method

GET

Parameters

Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Note: The filter parameter uses JsonPath format

Request body

Do not supply a request body with this method.

Response

If successful this method returns a list of Domain resources.

Sample Call

GET /api/{apiversion}/domains
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}]
}
- - +
Version: 1.x.x

listDomains

+

This method returns a list of Domain resources.

+

URL

+

/domains

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Note: The filter parameter uses JsonPath format

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a list of Domain resources.

+

Sample Call

+
GET /api/{apiversion}/domains
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/update/index.html b/docs/1.x.x/api/domains/update/index.html index becbcf9ef..3f529b7d1 100644 --- a/docs/1.x.x/api/domains/update/index.html +++ b/docs/1.x.x/api/domains/update/index.html @@ -1,22 +1,32 @@ - + - -updateDomain | Routr Docs + +updateDomain | Routr Docs - - - + + + -
-
Version: 1.x.x

updateDomain

Updates an existing Domain resource.

URL

/domains/{ref}

Method

PUT

Parameters

This method does not receive any parameters.

Request body

A file containing a Domain resource in json format.

Response

If successful this method updates a Domain resource.

Sample Call

PUT /api/v1beta1/domains/dm6c87r2
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

updateDomain

+

Updates an existing Domain resource.

+

URL

+

/domains/{ref}

+

Method

+

PUT

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Domain resource in json format.

+

Response

+

If successful this method updates a Domain resource.

+

Sample Call

+
PUT /api/v1beta1/domains/dm6c87r2
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/create/index.html b/docs/1.x.x/api/gateways/create/index.html index 7e1375ef7..595506352 100644 --- a/docs/1.x.x/api/gateways/create/index.html +++ b/docs/1.x.x/api/gateways/create/index.html @@ -1,22 +1,32 @@ - + - -createGateway | Routr Docs + +createGateway | Routr Docs - - - + + + -
-
Version: 1.x.x

createGateway

Creates a new Gateway resource.

URL

/gateways

Method

POST

Parameters

This method does not receive any parameters.

Request body

A file containing a Gateway resource in json format.

Response

If successful this method creates a Gateway resource.

Sample Call

POST /api/{apiversion}/gateways
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc."
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}


HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "gw5c77t2"
}
- - +
Version: 1.x.x

createGateway

+

Creates a new Gateway resource.

+

URL

+

/gateways

+

Method

+

POST

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Gateway resource in json format.

+

Response

+

If successful this method creates a Gateway resource.

+

Sample Call

+
POST /api/{apiversion}/gateways
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc."
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}


HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "gw5c77t2"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/delete/index.html b/docs/1.x.x/api/gateways/delete/index.html index fdc30e519..0988192f4 100644 --- a/docs/1.x.x/api/gateways/delete/index.html +++ b/docs/1.x.x/api/gateways/delete/index.html @@ -1,24 +1,34 @@ - + - -deleteGateway | Routr Docs + +deleteGateway | Routr Docs - - - + + + -
-
Version: 1.x.x

deleteGateway

Removes a Gateway resource from a persistent database. Before removing +

Version: 1.x.x

deleteGateway

+

Removes a Gateway resource from a persistent database. Before removing a Gateway, ensure you have remove all of it child Numbers. Otherwise, -this method returns a FOUND_DEPENDENT_OBJECTS_RESPONSE

URL

/gateways/{ref}

Method

DELETE

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method removes a Gateway resource.

Sample Call

DELETE /api/v1beta1/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +this method returns a FOUND_DEPENDENT_OBJECTS_RESPONSE

+

URL

+

/gateways/{ref}

+

Method

+

DELETE

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method removes a Gateway resource.

+

Sample Call

+
DELETE /api/v1beta1/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/get/index.html b/docs/1.x.x/api/gateways/get/index.html index 35a2a0739..b29521aba 100644 --- a/docs/1.x.x/api/gateways/get/index.html +++ b/docs/1.x.x/api/gateways/get/index.html @@ -1,22 +1,32 @@ - + - -getGateway | Routr Docs + +getGateway | Routr Docs - - - + + + -
-
Version: 1.x.x

getGateway

This method returns a Gateway resource.

URL

/gateways/{ref}

Method

GET

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method returns a Gateway resource.

Sample Call

GET /api/{apiversion}/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}
}
- - +
Version: 1.x.x

getGateway

+

This method returns a Gateway resource.

+

URL

+

/gateways/{ref}

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a Gateway resource.

+

Sample Call

+
GET /api/{apiversion}/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/list/index.html b/docs/1.x.x/api/gateways/list/index.html index 2aa12a453..122ba206e 100644 --- a/docs/1.x.x/api/gateways/list/index.html +++ b/docs/1.x.x/api/gateways/list/index.html @@ -1,22 +1,33 @@ - + - -listGateways | Routr Docs + +listGateways | Routr Docs - - - + + + -
-
Version: 1.x.x

listGateways

This method returns a list of Gateways resources.

URL

/gateways

Method

GET

Parameters

Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Note: The filter parameter uses JsonPath format

Request body

Do not supply a request body with this method.

Response

If successful this method returns a list of Gateways resources.

Sample Call

GET /api/{apiversion}/gateways
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}]
}
- - +
Version: 1.x.x

listGateways

+

This method returns a list of Gateways resources.

+

URL

+

/gateways

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Note: The filter parameter uses JsonPath format

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a list of Gateways resources.

+

Sample Call

+
GET /api/{apiversion}/gateways
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/update/index.html b/docs/1.x.x/api/gateways/update/index.html index 50f5f7125..8dada9372 100644 --- a/docs/1.x.x/api/gateways/update/index.html +++ b/docs/1.x.x/api/gateways/update/index.html @@ -1,22 +1,32 @@ - + - -updateGateways | Routr Docs + +updateGateways | Routr Docs - - - + + + -
-
Version: 1.x.x

updateGateways

Updates an existing Gateway resource.

URL

/gateways/{ref}

Method

PUT

Parameters

This method does not receive any parameters.

Request body

A file containing a Gateway resource in json format.

Response

If successful this method updates a Gateway resource.

Sample Call

PUT /api/v1beta1/gateways/gw5c77t2
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

updateGateways

+

Updates an existing Gateway resource.

+

URL

+

/gateways/{ref}

+

Method

+

PUT

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Gateway resource in json format.

+

Response

+

If successful this method updates a Gateway resource.

+

Sample Call

+
PUT /api/v1beta1/gateways/gw5c77t2
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/location/create/index.html b/docs/1.x.x/api/location/create/index.html index 3abdf18b3..6711f3b73 100644 --- a/docs/1.x.x/api/location/create/index.html +++ b/docs/1.x.x/api/location/create/index.html @@ -1,22 +1,32 @@ - + - -addEndpoint | Routr Docs + +addEndpoint | Routr Docs - - - + + + -
-
Version: 1.x.x

addEndpoint

Adds an entry into the location table

URL

/location/{addressOfRecord}

Method

POST

Parameters

Parameter NameTypeValueDescription
addressOfRecordpathstringAddress of record for the new entry

Request body

Supply a json containing an address, port, expires, user values.

Response

This method adds an entry to the location table. Useful for end-to-end testing.

Sample Call

POST /api/{apiversion}/location/sip:guest@guest
{
"user": "guest",
"address": "192.168.1.149",
"port": 5080,
"expires": 600
}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Added location entry"
}
- - +
Version: 1.x.x

addEndpoint

+

Adds an entry into the location table

+

URL

+

/location/{addressOfRecord}

+

Method

+

POST

+

Parameters

+
Parameter NameTypeValueDescription
addressOfRecordpathstringAddress of record for the new entry
+

Request body

+

Supply a json containing an address, port, expires, user values.

+

Response

+

This method adds an entry to the location table. Useful for end-to-end testing.

+

Sample Call

+
POST /api/{apiversion}/location/sip:guest@guest
{
"user": "guest",
"address": "192.168.1.149",
"port": 5080,
"expires": 600
}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Added location entry"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/location/delete/index.html b/docs/1.x.x/api/location/delete/index.html index bc8a1164b..ad5ea8586 100644 --- a/docs/1.x.x/api/location/delete/index.html +++ b/docs/1.x.x/api/location/delete/index.html @@ -1,22 +1,32 @@ - + - -evictEndpoint | Routr Docs + +evictEndpoint | Routr Docs - - - + + + -
-
Version: 1.x.x

evictEndpoint

Evicts an entry from the location table

URL

/location/{addressOfRecord}

Method

DELETE

Parameters

Parameter NameTypeValueDescription
addressOfRecordpathstringAddress of record for the entry

Request body

Do not supply a request body with this method.

Response

This method removes and entry for the give address of record

Sample Call

DELETE /api/{apiversion}/location/sip:guest@guest
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Location entry evicted"
}
- - +
Version: 1.x.x

evictEndpoint

+

Evicts an entry from the location table

+

URL

+

/location/{addressOfRecord}

+

Method

+

DELETE

+

Parameters

+
Parameter NameTypeValueDescription
addressOfRecordpathstringAddress of record for the entry
+

Request body

+

Do not supply a request body with this method.

+

Response

+

This method removes and entry for the give address of record

+

Sample Call

+
DELETE /api/{apiversion}/location/sip:guest@guest
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Location entry evicted"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/location/list/index.html b/docs/1.x.x/api/location/list/index.html index f03002b83..4caff5a06 100644 --- a/docs/1.x.x/api/location/list/index.html +++ b/docs/1.x.x/api/location/list/index.html @@ -1,23 +1,33 @@ - + - -listEndpoints | Routr Docs + +listEndpoints | Routr Docs - - - + + + -
-
Version: 1.x.x

listEndpoints

Gets a list of registered devices.

URL

/location

Method

GET

Parameters

Parameter NameTypeValueDescription
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Request body

Do not supply a request body with this method.

Response

This method returns a list with registered devices in -the response body.

Sample Call

GET /api/{apiversion}/location
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data":[{
"addressOfRecord": "sip:1001@sip.local",
"contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"
}]
}
- - +
Version: 1.x.x

listEndpoints

+

Gets a list of registered devices.

+

URL

+

/location

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Request body

+

Do not supply a request body with this method.

+

Response

+

This method returns a list with registered devices in +the response body.

+

Sample Call

+
GET /api/{apiversion}/location
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data":[{
"addressOfRecord": "sip:1001@sip.local",
"contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/create/index.html b/docs/1.x.x/api/numbers/create/index.html index f615add19..4573e72e3 100644 --- a/docs/1.x.x/api/numbers/create/index.html +++ b/docs/1.x.x/api/numbers/create/index.html @@ -1,23 +1,33 @@ - + - -createNumber | Routr Docs + +createNumber | Routr Docs - - - + + + -
-
Version: 1.x.x

createNumber

Creates a new Number. The Gateway must exist before creating the Number. -Otherwise, this method responds with a UNFULFILLED_DEPENDENCY_RESPONSE.

URL

/numbers

Method

POST

Parameters

This method does not receive any parameters.

Request body

A file containing a Number resource in json format.

Response

If successful this method creates a Number.

Sample Call

POST /api/{apiversion}/numbers
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dd50baa4"
}
- - +
Version: 1.x.x

createNumber

+

Creates a new Number. The Gateway must exist before creating the Number. +Otherwise, this method responds with a UNFULFILLED_DEPENDENCY_RESPONSE.

+

URL

+

/numbers

+

Method

+

POST

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Number resource in json format.

+

Response

+

If successful this method creates a Number.

+

Sample Call

+
POST /api/{apiversion}/numbers
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dd50baa4"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/delete/index.html b/docs/1.x.x/api/numbers/delete/index.html index 918a9c702..78ba6c524 100644 --- a/docs/1.x.x/api/numbers/delete/index.html +++ b/docs/1.x.x/api/numbers/delete/index.html @@ -1,22 +1,32 @@ - + - -deleteNumber | Routr Docs + +deleteNumber | Routr Docs - - - + + + -
-
Version: 1.x.x

deleteNumber

Removes a Number from a persistent database.

URL

/numbers/{ref}

Method

DELETE

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method removes a Number.

Sample Call

DELETE /api/v1beta1/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

deleteNumber

+

Removes a Number from a persistent database.

+

URL

+

/numbers/{ref}

+

Method

+

DELETE

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method removes a Number.

+

Sample Call

+
DELETE /api/v1beta1/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/get/index.html b/docs/1.x.x/api/numbers/get/index.html index b811e32e2..3ca04693f 100644 --- a/docs/1.x.x/api/numbers/get/index.html +++ b/docs/1.x.x/api/numbers/get/index.html @@ -1,22 +1,32 @@ - + - -getNumber | Routr Docs + +getNumber | Routr Docs - - - + + + -
-
Version: 1.x.x

getNumber

This method returns an Agent resource.

URL

/numbers/{ref}

Method

GET

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method returns a Number.

Sample Call

GET /api/{apiversion}/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}
}
- - +
Version: 1.x.x

getNumber

+

This method returns an Agent resource.

+

URL

+

/numbers/{ref}

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a Number.

+

Sample Call

+
GET /api/{apiversion}/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/list/index.html b/docs/1.x.x/api/numbers/list/index.html index 411c99a20..e64f5ffd3 100644 --- a/docs/1.x.x/api/numbers/list/index.html +++ b/docs/1.x.x/api/numbers/list/index.html @@ -1,22 +1,33 @@ - + - -listNumbers | Routr Docs + +listNumbers | Routr Docs - - - + + + -
-
Version: 1.x.x

listNumbers

This method returns a list of Numbers.

URL

/numbers

Method

GET

Parameters

Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Note: The filter parameter uses JsonPath format

Request body

Do not supply a request body with this method.

Response

If successful this method returns a list of Numbers.

Sample Call

GET /api/{apiversion}/numbers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}]
}
- - +
Version: 1.x.x

listNumbers

+

This method returns a list of Numbers.

+

URL

+

/numbers

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Note: The filter parameter uses JsonPath format

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a list of Numbers.

+

Sample Call

+
GET /api/{apiversion}/numbers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/update/index.html b/docs/1.x.x/api/numbers/update/index.html index 6941aa322..2e3b85300 100644 --- a/docs/1.x.x/api/numbers/update/index.html +++ b/docs/1.x.x/api/numbers/update/index.html @@ -1,22 +1,32 @@ - + - -updateNumber | Routr Docs + +updateNumber | Routr Docs - - - + + + -
-
Version: 1.x.x

updateNumber

Updates an existing Number.

URL

/numbers/{ref}

Method

PUT

Parameters

This method does not receive any parameters.

Request body

A file containing a Number resource in json format.

Response

If successful this method updates a Number.

Sample Call

PUT /api/v1beta1/numbers/dd50baa4
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

updateNumber

+

Updates an existing Number.

+

URL

+

/numbers/{ref}

+

Method

+

PUT

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Number resource in json format.

+

Response

+

If successful this method updates a Number.

+

Sample Call

+
PUT /api/v1beta1/numbers/dd50baa4
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/overview/index.html b/docs/1.x.x/api/overview/index.html index 1ecf4d506..6ac725ceb 100644 --- a/docs/1.x.x/api/overview/index.html +++ b/docs/1.x.x/api/overview/index.html @@ -1,22 +1,34 @@ - + - -overview | Routr Docs + +overview | Routr Docs - - - + + + -
-
Version: 1.x.x

overview

Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.

The endpoint for the API is:

/api/{apiversion}

Authentication

A JWT token is used to authenticate the server. To obtain the token, use the /api/{apiversion}/token endpoint with basic authentication. Use the information from the User resource.

You must append the token to all requests as a query parameter.

Sample call

To obtain the token

curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token

# Resulted in
{
"status":200,
"message":"Successful request",
"data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"
}

To use the token

curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...

# Resulted in
{
"status":200,
"message":"Successful request",
"data":[
{
"addressOfRecord":"sip:1001@sip.local",
"contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"
}
]
}

Error Responses

The following are general errors we might have to account for:

CodeContent
400 BAD_REQUEST{ status: "400", message : "Bad Request" }
401 UNAUTHORIZED{ status: "401", message : "You are unauthorized to make this request." }
405 NOT_SUPPORTED{ status: "405", message : "Operation not supported by data source provider" }
409 CONFLICT{ status: "409", message : "An attempt was made to create an object that already exists" }
4091 UNFULFILLED_DEPENDENCY_RESPONSE{ status: "4091", message : "Found one or more unfulfilled dependencies" }
- - +
Version: 1.x.x

overview

Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.

+

The endpoint for the API is:

+

/api/{apiversion}

+

Authentication

+

A JWT token is used to authenticate the server. To obtain the token, use the /api/{apiversion}/token endpoint with basic authentication. Use the information from the User resource.

+
+

You must append the token to all requests as a query parameter.

+
+

Sample call

+

To obtain the token

+
curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token

# Resulted in
{
"status":200,
"message":"Successful request",
"data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"
}
+

To use the token

+
curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...

# Resulted in
{
"status":200,
"message":"Successful request",
"data":[
{
"addressOfRecord":"sip:1001@sip.local",
"contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"
}
]
}
+

Error Responses

+

The following are general errors we might have to account for:

+
CodeContent
400 BAD_REQUEST{ status: "400", message : "Bad Request" }
401 UNAUTHORIZED{ status: "401", message : "You are unauthorized to make this request." }
405 NOT_SUPPORTED{ status: "405", message : "Operation not supported by data source provider" }
409 CONFLICT{ status: "409", message : "An attempt was made to create an object that already exists" }
4091 UNFULFILLED_DEPENDENCY_RESPONSE{ status: "4091", message : "Found one or more unfulfilled dependencies" }
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/create/index.html b/docs/1.x.x/api/peers/create/index.html index 2cdd8a23e..cc6cf6761 100644 --- a/docs/1.x.x/api/peers/create/index.html +++ b/docs/1.x.x/api/peers/create/index.html @@ -1,22 +1,32 @@ - + - -createPeer | Routr Docs + +createPeer | Routr Docs - - - + + + -
-
Version: 1.x.x

createPeer

Creates a new Peer resource.

URL

/peers

Method

POST

Parameters

This method does not receive any parameters.

Request body

A file containing a Peer resource in json format.

Response

If successful this method creates a Peer resource.

Sample Call

POST /api/{apiversion}/peers
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "pr2c77f4"
}
- - +
Version: 1.x.x

createPeer

+

Creates a new Peer resource.

+

URL

+

/peers

+

Method

+

POST

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Peer resource in json format.

+

Response

+

If successful this method creates a Peer resource.

+

Sample Call

+
POST /api/{apiversion}/peers
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "pr2c77f4"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/delete/index.html b/docs/1.x.x/api/peers/delete/index.html index 2beff9880..40938f25f 100644 --- a/docs/1.x.x/api/peers/delete/index.html +++ b/docs/1.x.x/api/peers/delete/index.html @@ -1,22 +1,32 @@ - + - -deletePeer | Routr Docs + +deletePeer | Routr Docs - - - + + + -
-
Version: 1.x.x

deletePeer

Removes a Peer resource from a persistent database.

URL

/peers/{ref}

Method

DELETE

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method removes a Peer resource.

Sample Call

DELETE /api/v1beta1/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

deletePeer

+

Removes a Peer resource from a persistent database.

+

URL

+

/peers/{ref}

+

Method

+

DELETE

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method removes a Peer resource.

+

Sample Call

+
DELETE /api/v1beta1/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/get/index.html b/docs/1.x.x/api/peers/get/index.html index 5209f7815..1e64b3dc1 100644 --- a/docs/1.x.x/api/peers/get/index.html +++ b/docs/1.x.x/api/peers/get/index.html @@ -1,22 +1,32 @@ - + - -getPeer | Routr Docs + +getPeer | Routr Docs - - - + + + -
-
Version: 1.x.x

getPeer

This method returns a Peer resource.

URL

/peers/{ref}

Method

GET

Parameters

Parameter NameTypeValueDescription
refpathstringResource reference

Request body

Do not supply a request body with this method.

Response

If successful this method returns a Peer resource.

Sample Call

GET /api/{apiversion}/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}
}
- - +
Version: 1.x.x

getPeer

+

This method returns a Peer resource.

+

URL

+

/peers/{ref}

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
refpathstringResource reference
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a Peer resource.

+

Sample Call

+
GET /api/{apiversion}/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/list/index.html b/docs/1.x.x/api/peers/list/index.html index 73f4f5334..68174eec9 100644 --- a/docs/1.x.x/api/peers/list/index.html +++ b/docs/1.x.x/api/peers/list/index.html @@ -1,22 +1,33 @@ - + - -listPeers | Routr Docs + +listPeers | Routr Docs - - - + + + -
-
Version: 1.x.x

listPeers

This method returns a list of Peer resources.

URL

/peers

Method

GET

Parameters

Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Note: The filter parameter uses JsonPath format

Request body

Do not supply a request body with this method.

Response

If successful this method returns a list of Peer resources.

Sample Call

GET /api/{apiversion}/peers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}]
}
- - +
Version: 1.x.x

listPeers

+

This method returns a list of Peer resources.

+

URL

+

/peers

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
filterquerystringUse filter to narrow the elements shown
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Note: The filter parameter uses JsonPath format

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns a list of Peer resources.

+

Sample Call

+
GET /api/{apiversion}/peers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/update/index.html b/docs/1.x.x/api/peers/update/index.html index e465db81a..59e28f2c4 100644 --- a/docs/1.x.x/api/peers/update/index.html +++ b/docs/1.x.x/api/peers/update/index.html @@ -1,22 +1,32 @@ - + - -updatePeer | Routr Docs + +updatePeer | Routr Docs - - - + + + -
-
Version: 1.x.x

updatePeer

Updates an existing Peer resource.

URL

/peers/{ref}

Method

PUT

Parameters

This method does not receive any parameters.

Request body

A file containing a Peer resource in json format.

Response

If successful this method updates a Peer resource.

Sample Call

PUT /api/v1beta1/peers/pr2c77f4
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
- - +
Version: 1.x.x

updatePeer

+

Updates an existing Peer resource.

+

URL

+

/peers/{ref}

+

Method

+

PUT

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

A file containing a Peer resource in json format.

+

Response

+

If successful this method updates a Peer resource.

+

Sample Call

+
PUT /api/v1beta1/peers/pr2c77f4
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/registry/index.html b/docs/1.x.x/api/registry/index.html index 755a4aa4e..07d532684 100644 --- a/docs/1.x.x/api/registry/index.html +++ b/docs/1.x.x/api/registry/index.html @@ -1,22 +1,31 @@ - + - -registry | Routr Docs + +registry | Routr Docs - - - + + + -
-
Version: 1.x.x

registry

This method gets a list of available(online) gateways.

URL

/registry

Method

GET

Parameters

Parameter NameTypeValueDescription
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request

Request body

Do not supply a request body with this method.

Response

This method returns a list with registered devices.

Sample Call

GET /api/{apiversion}/registry
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [
{
"username": "215706",
"host": "atlanta2.voip.ms",
"ip":"209.217.224.50",
"expires": 600,
"registeredOn": 1588525156280,
"gwRef": "gw50a1a4ca",
"gwURI": "sip:215706@atlanta2.voip.ms:5060",
"regOnFormatted": "a few seconds ago"
}
]
}
- - +
Version: 1.x.x

registry

This method gets a list of available(online) gateways.

+

URL

+

/registry

+

Method

+

GET

+

Parameters

+
Parameter NameTypeValueDescription
pagequerynumberPagination index
itemsPerPagequerynumberNumber of elements per request
+

Request body

+

Do not supply a request body with this method.

+

Response

+

This method returns a list with registered devices.

+

Sample Call

+
GET /api/{apiversion}/registry
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [
{
"username": "215706",
"host": "atlanta2.voip.ms",
"ip":"209.217.224.50",
"expires": 600,
"registeredOn": 1588525156280,
"gwRef": "gw50a1a4ca",
"gwURI": "sip:215706@atlanta2.voip.ms:5060",
"regOnFormatted": "a few seconds ago"
}
]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/status/get/index.html b/docs/1.x.x/api/status/get/index.html index 16eac86a1..db397b548 100644 --- a/docs/1.x.x/api/status/get/index.html +++ b/docs/1.x.x/api/status/get/index.html @@ -1,24 +1,34 @@ - + - -checkSystemStatus | Routr Docs + +checkSystemStatus | Routr Docs - - - + + + -
-
Version: 1.x.x

checkSystemStatus

Pings an instance of Routr engine.

URL

/system/status

Method

GET

Parameters

This method does not receive any parameters.

Request body

Do not supply a request body with this method.

Response

If successful, this method will return a status = 200. A client implementing +

Version: 1.x.x

checkSystemStatus

+

Pings an instance of Routr engine.

+

URL

+

/system/status

+

Method

+

GET

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful, this method will return a status = 200. A client implementing this method can assumed that no answer or a bad answer means that the server -us down or "unhealthy."

Sample Call

GET /api/{apiversion}/system/status
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data": "up"
}
- - +us down or "unhealthy."

+

Sample Call

+
GET /api/{apiversion}/system/status
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data": "up"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/status/update/index.html b/docs/1.x.x/api/status/update/index.html index 89c1d8f50..a53e10716 100644 --- a/docs/1.x.x/api/status/update/index.html +++ b/docs/1.x.x/api/status/update/index.html @@ -1,22 +1,32 @@ - + - -restartServer | Routr Docs + +restartServer | Routr Docs - - - + + + -
-
Version: 1.x.x

restartServer

This method returns information about the server.

URL

/system/status/{status}

Method

POST

Parameters

Parameter NameTypeValueDescription
statuspathstringThis accepts either down or restarting parameters
nowquerybooleanIf set to true it will not wait for current calls to finish

Request body

Do not supply a request body with this method.

Response

If successful this method causes the server to change its status.

Sample Call

POST /api/{apiversion}/system/status/reload
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Request sent to server"
}
- - +
Version: 1.x.x

restartServer

+

This method returns information about the server.

+

URL

+

/system/status/{status}

+

Method

+

POST

+

Parameters

+
Parameter NameTypeValueDescription
statuspathstringThis accepts either down or restarting parameters
nowquerybooleanIf set to true it will not wait for current calls to finish
+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method causes the server to change its status.

+

Sample Call

+
POST /api/{apiversion}/system/status/reload
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Request sent to server"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/sys/info/index.html b/docs/1.x.x/api/sys/info/index.html index dbd8218e5..a0f77ccf1 100644 --- a/docs/1.x.x/api/sys/info/index.html +++ b/docs/1.x.x/api/sys/info/index.html @@ -1,22 +1,32 @@ - + - -getServerInfo | Routr Docs + +getServerInfo | Routr Docs - - - + + + -
-
Version: 1.x.x

getServerInfo

This method returns information about the server.

URL

/system/info

Method

GET

Parameters

This method does not receive any parameters.

Request body

Do not supply a request body with this method.

Response

If successful this method returns relevant information about the server.

Sample Call

GET /api/{apiversion}/system/info
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":{
"version":"v1.0",
"apiVersion":"v1beta1",
"apiPath":"/api/v1beta1",
"env":[
{
"var":"EXTERN_ADDR",
"value":"172.220.246.46"
},
{
"var":"LOCALNETS",
"value": "192.168.1.149/31"
},
{
"var":"REGISTRAR_INTF",
"value": "External"
}
]
}
}
- - +
Version: 1.x.x

getServerInfo

+

This method returns information about the server.

+

URL

+

/system/info

+

Method

+

GET

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns relevant information about the server.

+

Sample Call

+
GET /api/{apiversion}/system/info
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":{
"version":"v1.0",
"apiVersion":"v1beta1",
"apiPath":"/api/v1beta1",
"env":[
{
"var":"EXTERN_ADDR",
"value":"172.220.246.46"
},
{
"var":"LOCALNETS",
"value": "192.168.1.149/31"
},
{
"var":"REGISTRAR_INTF",
"value": "External"
}
]
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/sys/logs/index.html b/docs/1.x.x/api/sys/logs/index.html index 22d39b9bb..a08e7b29c 100644 --- a/docs/1.x.x/api/sys/logs/index.html +++ b/docs/1.x.x/api/sys/logs/index.html @@ -1,22 +1,32 @@ - + - -getServerLogs | Routr Docs + +getServerLogs | Routr Docs - - - + + + -
-
Version: 1.x.x

getServerLogs

This method returns logs from the server

URL

/system/logs

Method

GET

Parameters

This method does not receive any parameters.

Request body

Do not supply a request body with this method.

Response

If successful this method returns logging information from the server.

Sample Call

GET /api/{apiversion}/system/logs
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":"[DEBUG] 2020-04-13 12:29:49.785..."
}
- - +
Version: 1.x.x

getServerLogs

+

This method returns logs from the server

+

URL

+

/system/logs

+

Method

+

GET

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful this method returns logging information from the server.

+

Sample Call

+
GET /api/{apiversion}/system/logs
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":"[DEBUG] 2020-04-13 12:29:49.785..."
}
\ No newline at end of file diff --git a/docs/1.x.x/api/token/index.html b/docs/1.x.x/api/token/index.html index 7765097d2..eb1481705 100644 --- a/docs/1.x.x/api/token/index.html +++ b/docs/1.x.x/api/token/index.html @@ -1,22 +1,33 @@ - + - -token | Routr Docs + +token | Routr Docs - - - + + + -
-
Version: 1.x.x

token

This method gets a token for subsequent API calls.

URL

/token

Method

GET

Parameters

This method does not receive any parameters.

Request body

Do not supply a request body with this method.

Response

If successful, this method returns a string with a token.

Sample Call

GET /api/{apiversion}/token
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"
}

Notes

You must send a basic authentication header with this request.

- - +
Version: 1.x.x

token

This method gets a token for subsequent API calls.

+

URL

+

/token

+

Method

+

GET

+

Parameters

+

This method does not receive any parameters.

+

Request body

+

Do not supply a request body with this method.

+

Response

+

If successful, this method returns a string with a token.

+

Sample Call

+
GET /api/{apiversion}/token
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"
}
+

Notes

+

You must send a basic authentication header with this request.

\ No newline at end of file diff --git a/docs/1.x.x/concepts/index.html b/docs/1.x.x/concepts/index.html index 6a40351a1..17faa18c4 100644 --- a/docs/1.x.x/concepts/index.html +++ b/docs/1.x.x/concepts/index.html @@ -1,23 +1,78 @@ - + - -Concepts | Routr Docs + +Concepts | Routr Docs - - - + + + -
-
Version: 1.x.x

Concepts

The following are some key concepts, including some of the essential routing strategies implemented in Routr.

Intra-Domain Routing

Intra-Domain Routing(IDR) offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not.

For a small company with less than 50 users, you may define a domain sip.domain.com. Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames.

A multinational company like Walmart have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains sip.0001.walmart.com and sip.0002.walmart.com, and... you get the idea.

Double Agents



Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's spec.domain[*] list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain.

Single Domain Example

The following yaml configuration shows a simple setup, involving one Domain and two Agents:

Domain configuration

- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Office
spec:
context:
domainUri: sip.local

Agents configuration

- apiVersion: v1beta1
kind: Agent
metadata:
name: John Doe
spec:
credentials:
username: john
secret: '1234'
domains: [sip.local]
- kind: Agent
apiVersion: v1beta1
metadata:
name: Janie Doe
spec:
credentials:
username: janie
secret: '1234'
domains: [sip.local]

Voila! That's all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."

To configure your sip devices use the information found in config/agents.yml. Also, you must use the Host/IP of Routr server as -the OUTBOUND PROXY of your sip device.

Routing Rules

The following rules apply to Intra-Domain Routing:

  • Agents can only call other Agents in the same Domain
  • Agents must belong to a Domain
  • Agents Are not allowed to send a Digest username different than the username in the From-Header

Domain Ingress Routing

In Routr, the process of receiving a call from PSTN to a Domain is as Domain Ingress Routing(DIR) and it is done using a Gateway resource. The yaml file config/gateways.yml contains the Gateways. The following example shows a typical Gateway configuration.

- apiVersion: v1beta1
kind: Gateway
metadata:
name: Plain Old Phone Service Provider
spec:
regService:
host: sip.provider.net
credentials:
username: 'gwuser'
secret: gwsecret
transport: udp
registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network

You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected.

Please examine the following example:

- apiVersion: v1beta1
kind: Number
metadata:
gwRef: dd50baa4
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUri: 'tel:17066041487'
aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in

Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.

Routing Rules

The spec.location block of a Number resource configuration, determines the path of an inbound call from the PSTN. The aorLink refers to an Address of Record(Agent or Peer) that is available in the location service.

Domain Egress Routing

Domain Egress Routing(DER) is the way that Routr deals with a call request to a callee that exists in the Public Switched Telephone Network(PSTN) and not in the callers' Domain. The EgressPolicy consists of a rule, and a numberRef defined in the spec.context section of Domains resources.

The rule and numberRef is defined as follows:

  • rule is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first.

  • numberRef is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway.

Routing Rules

Agents can only perform outbound calls using the Egress Policy of their Domains.

Peers Routing

Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling.

Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the Location Service just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent.

The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the spec.location settings in the numbers.yml configuration file.

Routing Rules

Agents are not allowed to call Peers.

A future version of the Peer resource might feature a spec.acceptFrom.* field to allow calls from Domains or specific Agents.

- - +
Version: 1.x.x

Concepts

+

The following are some key concepts, including some of the essential routing strategies implemented in Routr.

+

Intra-Domain Routing

+

Intra-Domain Routing(IDR) offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not.

+

For a small company with less than 50 users, you may define a domain sip.domain.com. Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames.

+

A multinational company like Walmart have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains sip.0001.walmart.com and sip.0002.walmart.com, and... you get the idea.

+

Double Agents

+ +
+
+

Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's spec.domain[*] list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain.

+

Single Domain Example

+

The following yaml configuration shows a simple setup, involving one Domain and two Agents:

+

Domain configuration

+
- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Office
spec:
context:
domainUri: sip.local
+

Agents configuration

+
- apiVersion: v1beta1
kind: Agent
metadata:
name: John Doe
spec:
credentials:
username: john
secret: '1234'
domains: [sip.local]
- kind: Agent
apiVersion: v1beta1
metadata:
name: Janie Doe
spec:
credentials:
username: janie
secret: '1234'
domains: [sip.local]
+

Voila! That's all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."

+
+

To configure your sip devices use the information found in config/agents.yml. Also, you must use the Host/IP of Routr server as +the OUTBOUND PROXY of your sip device.

+
+

Routing Rules

+

The following rules apply to Intra-Domain Routing:

+
    +
  • Agents can only call other Agents in the same Domain
  • +
  • Agents must belong to a Domain
  • +
  • Agents Are not allowed to send a Digest username different than the username in the From-Header
  • +
+

Domain Ingress Routing

+

In Routr, the process of receiving a call from PSTN to a Domain is as Domain Ingress Routing(DIR) and it is done using a Gateway resource. The yaml file config/gateways.yml contains the Gateways. The following example shows a typical Gateway configuration.

+
- apiVersion: v1beta1
kind: Gateway
metadata:
name: Plain Old Phone Service Provider
spec:
regService:
host: sip.provider.net
credentials:
username: 'gwuser'
secret: gwsecret
transport: udp
registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network
+

You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected.

+

Please examine the following example:

+
- apiVersion: v1beta1
kind: Number
metadata:
gwRef: dd50baa4
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUri: 'tel:17066041487'
aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in
+

Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.

+

Routing Rules

+

The spec.location block of a Number resource configuration, determines the path of an inbound call from the PSTN. The aorLink refers to an Address of Record(Agent or Peer) that is available in the location service.

+

Domain Egress Routing

+

Domain Egress Routing(DER) is the way that Routr deals with a call request to a callee that exists in the Public Switched Telephone Network(PSTN) and not in the callers' Domain. The EgressPolicy consists of a rule, and a numberRef defined in the spec.context section of Domains resources.

+

The rule and numberRef is defined as follows:

+
    +
  • +

    rule is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first.

    +
  • +
  • +

    numberRef is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway.

    +
  • +
+

Routing Rules

+

Agents can only perform outbound calls using the Egress Policy of their Domains.

+

Peers Routing

+

Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling.

+

Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the Location Service just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent.

+

The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the spec.location settings in the numbers.yml configuration file.

+

Routing Rules

+

Agents are not allowed to call Peers.

+
+

A future version of the Peer resource might feature a spec.acceptFrom.* field to allow calls from Domains or specific Agents.

+
\ No newline at end of file diff --git a/docs/1.x.x/configuration/agents/index.html b/docs/1.x.x/configuration/agents/index.html index 9bfd380d0..41f964180 100644 --- a/docs/1.x.x/configuration/agents/index.html +++ b/docs/1.x.x/configuration/agents/index.html @@ -1,23 +1,29 @@ - + - -Agents | Routr Docs + +Agents | Routr Docs - - - + + + -
-
Version: 1.x.x

Agents

Agents represent SIP endpoints such as softphones, IP phones, or paging speakers. -A Domain binds agents together. An Agent can belong to one or multiple Domains.

The Agents configuration can be provided using the file config/agents.yml located at the root of your Routr installation.

If using Redis this configuration gets stored in the database.

Agent Resource

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP deviceYes
spec.privacyIf set to Private the server removes identifiable information for the requests. Defaults to NoneNo
spec.credentials.usernameAgent's credential usernameYes
spec.credentials.secretAgent's credential secretYes
spec.domains[*]Context/s in which this Agent is allowed to communicate. FQDN is recommendedYes

Example

- apiVersion: v1beta1
kind: Agent
metadata:
name: John Doe
spec:
credentials:
username: john
secret: '1234'
domains: [sip.local]
- - +
Version: 1.x.x

Agents

+

Agents represent SIP endpoints such as softphones, IP phones, or paging speakers. +A Domain binds agents together. An Agent can belong to one or multiple Domains.

+

The Agents configuration can be provided using the file config/agents.yml located at the root of your Routr installation.

+
+

If using Redis this configuration gets stored in the database.

+
+

Agent Resource

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP deviceYes
spec.privacyIf set to Private the server removes identifiable information for the requests. Defaults to NoneNo
spec.credentials.usernameAgent's credential usernameYes
spec.credentials.secretAgent's credential secretYes
spec.domains[*]Context/s in which this Agent is allowed to communicate. FQDN is recommendedYes
+

Example

+
- apiVersion: v1beta1
kind: Agent
metadata:
name: John Doe
spec:
credentials:
username: john
secret: '1234'
domains: [sip.local]
\ No newline at end of file diff --git a/docs/1.x.x/configuration/domains/index.html b/docs/1.x.x/configuration/domains/index.html index 45e0a87fa..084152df4 100644 --- a/docs/1.x.x/configuration/domains/index.html +++ b/docs/1.x.x/configuration/domains/index.html @@ -1,23 +1,34 @@ - + - -Domains | Routr Docs + +Domains | Routr Docs - - - + + + -
-
Version: 1.x.x

Domains

Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and -outgoing calling. The domains configuration can be provided using the file config/domains.yml located at the root of your Routr installation.

If using Redis this configuration gets stored in the database.

Domain Resource

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP domainYes
spec.context.domainUriDomain URI. FQDN is recommendedYes
spec.context.egressPolicy.ruleRegular expression indicating when a call will be routed via spec.context.egressPolicy.numberRefNo
spec.context.egressPolicy.numberRefReference to the Number that will route the callNo
spec.context.accessControlList.allow[*]Traffic allow for Network in listNo
spec.context.accessControlList.deny[*]Traffic disabled for Network in listNo

ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:

  • 0.0.0.0/1 # all
  • 192.168.1.0/255.255.255.0
  • 192.168.0.1/31

Example

- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Server
spec:
context:
domainUri: sip.local
egressPolicy:
rule: .*
numberRef: Number0001
accessControlList:
deny: [0.0.0.0/1] # Deny all
allow: [192.168.0.1/31]
- - +
Version: 1.x.x

Domains

+

Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and +outgoing calling. The domains configuration can be provided using the file config/domains.yml located at the root of your Routr installation.

+
+

If using Redis this configuration gets stored in the database.

+
+

Domain Resource

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP domainYes
spec.context.domainUriDomain URI. FQDN is recommendedYes
spec.context.egressPolicy.ruleRegular expression indicating when a call will be routed via spec.context.egressPolicy.numberRefNo
spec.context.egressPolicy.numberRefReference to the Number that will route the callNo
spec.context.accessControlList.allow[*]Traffic allow for Network in listNo
spec.context.accessControlList.deny[*]Traffic disabled for Network in listNo
+

ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:

+
    +
  • 0.0.0.0/1 # all
  • +
  • 192.168.1.0/255.255.255.0
  • +
  • 192.168.0.1/31
  • +
+

Example

+
- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Server
spec:
context:
domainUri: sip.local
egressPolicy:
rule: .*
numberRef: Number0001
accessControlList:
deny: [0.0.0.0/1] # Deny all
allow: [192.168.0.1/31]
\ No newline at end of file diff --git a/docs/1.x.x/configuration/gateways/index.html b/docs/1.x.x/configuration/gateways/index.html index 78e48807c..7ed349010 100644 --- a/docs/1.x.x/configuration/gateways/index.html +++ b/docs/1.x.x/configuration/gateways/index.html @@ -1,22 +1,31 @@ - + - -Gateways | Routr Docs + +Gateways | Routr Docs - - - + + + -
-
Version: 1.x.x

Gateways

Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.

The Gateways configuration can be provided using the file config/gateways.yml. The file is located at the root of your Routr installation, or as defined in the environment variable CONFIG_FILE.

If using Redis this configuration gets stored in the database.

For static IP authentication be sure to properly configure the spec.externAddr and spec.localnets in config.yml.

Gateway Resource

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP deviceYes
metadata.refReference to this resourceNo
spec.sendRegisterSend SIP REGISTER package to gateway host. Defaults to falseNo
spec.credentials.usernameGateway username. No required for static IP authenticationNo
spec.credentials.secretGateway secret. No required for static IP authenticationNo
spec.hostGateway hostYes
spec.transportTransport protocolYes
spec.expiresRequested lifespan of the registration in seconds. Defaults to 600No
spec.registries.[*]Additional registries for ingress callsNo

Example of Gateway in Registration Mode

- apiVersion: v1beta1
kind: Gateway
metadata:
name: Provider, Inc
ref: GW0001
spec:
host: sip.provider.com
transport: tcp
credentials:
username: 'user'
secret: changeit

Example if Gateway using Static Mode

- apiVersion: v1beta1
kind: Gateway
metadata:
name: Provider 2, Inc
ref: GW0002
spec:
host: sip2.provider.com
port: 5080
transport: tcp
- - +
Version: 1.x.x

Gateways

+

Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.

+

The Gateways configuration can be provided using the file config/gateways.yml. The file is located at the root of your Routr installation, or as defined in the environment variable CONFIG_FILE.

+
+

If using Redis this configuration gets stored in the database.

+
+

For static IP authentication be sure to properly configure the spec.externAddr and spec.localnets in config.yml.

+

Gateway Resource

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP deviceYes
metadata.refReference to this resourceNo
spec.sendRegisterSend SIP REGISTER package to gateway host. Defaults to falseNo
spec.credentials.usernameGateway username. No required for static IP authenticationNo
spec.credentials.secretGateway secret. No required for static IP authenticationNo
spec.hostGateway hostYes
spec.transportTransport protocolYes
spec.expiresRequested lifespan of the registration in seconds. Defaults to 600No
spec.registries.[*]Additional registries for ingress callsNo
+

Example of Gateway in Registration Mode

+
- apiVersion: v1beta1
kind: Gateway
metadata:
name: Provider, Inc
ref: GW0001
spec:
host: sip.provider.com
transport: tcp
credentials:
username: 'user'
secret: changeit
+

Example if Gateway using Static Mode

+
- apiVersion: v1beta1
kind: Gateway
metadata:
name: Provider 2, Inc
ref: GW0002
spec:
host: sip2.provider.com
port: 5080
transport: tcp
\ No newline at end of file diff --git a/docs/1.x.x/configuration/general/index.html b/docs/1.x.x/configuration/general/index.html index b7fb9c024..df4e11af2 100644 --- a/docs/1.x.x/configuration/general/index.html +++ b/docs/1.x.x/configuration/general/index.html @@ -1,29 +1,55 @@ - + - -General | Routr Docs + +General | Routr Docs - - - + + + -
-
Version: 1.x.x

General

The general configuration affects your entire Routr instance. The general configuration -can be provided using the file config/config.yml located at the root of your Routr installation.

General Configuration Parameters

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
metadata.userAgentSets sip header User-Agent to the desired valueNo
spec.dataSource.providerDefines data provider. Defaults to files_data_providerNo
spec.dataSource.parametersData Source Parameters. Ex.: 'host=localhost,port=6379'No
spec.bindAddrDefault stack IP addressNo
spec.externAddrIP address to advertiseNo
spec.localnetsLocal networks. Use in combination with spec.externAddrNo
spec.recordRouteStay within the signaling pathNo
spec.transport.[*].bindAddrOverwrites spec.bindAddr for transport entryNo
spec.transport.[*].portTransport portYes
spec.transport.[*].protocolValid values are: tcp, udp, tls, sctp, ws, wssYes
spec.registrarIntfInternal causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ExternalNo
spec.accessControlList.deny.[*]Deny incoming traffic from network listNo
spec.accessControlList.allow.[*]Allow incoming traffic from network listNo
spec.restService.bindAddrRestful service listening addressNo
spec.restService.portRestful service port. Defaults to 4567No
spec.restService.minThreadsMinimum thread allocation. Defaults to 8No
spec.restService.maxThreadsMaximum thread allocation. Defaults to 200No
spec.restService.timeOutMillisWill reject requests that last more than this value. Defaults to 5000(5 seconds)No
spec.restService.unsecuredDisabled https for restful calls. Defaults to falseNo
spec.restService.keyStorePath to keyStoreNo
spec.restService.trueStorePath to trueStoreNo
spec.restService.keyStorePasswordPassword for keyStoreNo
spec.restService.trueStorePasswordPassword for trueStoreNo
spec.securityContext.keyStorePath to keyStoreYes
spec.securityContext.trustStorePath to trueStoreYes
spec.securityContext.keyStorePasswordPassword for keyStoreYes
spec.securityContext.keyStoreTypeKeyStore typeYes
spec.securityContext.client.authTypeType of client authentication. Defaults to DisabledAll. See https://goo.gl/1vKbXW for more optionsNo
spec.securityContext.client.protocols.[*]Accepted TLS protocols. Defaults to [TLSv1.2]No
spec.securityContext.debuggingTurns ON or OFF ssl debugging. Defaults to falseNo
spec.ex_rtpEngine.enabledIf enabled, it will send all media thru the RTPEngine. Defaults to falseNo
spec.ex_rtpEngine.protoReserved to allow for NG commands via http, https, and udp. Currently only http is supportedNo
spec.ex_rtpEngine.hostAddress for RTPEngineNo
spec.ex_rtpEngine.portPort for RTPEngineNo
spec.ex_convertTelToE164If enabled, it will convert the number on ingress calls to E164 format before routing the call. Defaults to falseNo
spec.ex_uniqueGatewayPerHostPortIf enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to falseNo

Variables prefixed with ex_ are experimental features and may be removed or renamed in the future.

Transport Configuration

Routr supports tcp, udp, tls, sctp, ws, and wss as transport protocols.

The server requires at least one transport protocol. -To bind a transport protocol to a specific IP address, you can use the spec.transport.bindAddr or more generally spec.bindAddr.

Datasource Providers

Routr currently implements two data providers: redis_data_provider and files_data_provider. The default data provider is the files_data_provider.

The docker distribution of the server uses redis_data_provider by default

Redis Data Provider

The parameters for redis_data_provider are:

ParameterDescriptionRequired
hostRedis host. Defaults to 'localhost'No
portRedis port. The default port is 6379No
secretPassword to access databaseNo

Files Data Provider

The parameters for files_data_provider are:

ParameterDescriptionRequired
pathPath to configuration files. Defaults to the config folderNo

This implementation has the limitation that writes operations have to be performed manually on the files.

Configuring the server behind a NAT

The spec.externAddr and spec.localnets parameters help Routr identify the +

Version: 1.x.x

General

+

The general configuration affects your entire Routr instance. The general configuration +can be provided using the file config/config.yml located at the root of your Routr installation.

+

General Configuration Parameters

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
metadata.userAgentSets sip header User-Agent to the desired valueNo
spec.dataSource.providerDefines data provider. Defaults to files_data_providerNo
spec.dataSource.parametersData Source Parameters. Ex.: 'host=localhost,port=6379'No
spec.bindAddrDefault stack IP addressNo
spec.externAddrIP address to advertiseNo
spec.localnetsLocal networks. Use in combination with spec.externAddrNo
spec.recordRouteStay within the signaling pathNo
spec.transport.[*].bindAddrOverwrites spec.bindAddr for transport entryNo
spec.transport.[*].portTransport portYes
spec.transport.[*].protocolValid values are: tcp, udp, tls, sctp, ws, wssYes
spec.registrarIntfInternal causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ExternalNo
spec.accessControlList.deny.[*]Deny incoming traffic from network listNo
spec.accessControlList.allow.[*]Allow incoming traffic from network listNo
spec.restService.bindAddrRestful service listening addressNo
spec.restService.portRestful service port. Defaults to 4567No
spec.restService.minThreadsMinimum thread allocation. Defaults to 8No
spec.restService.maxThreadsMaximum thread allocation. Defaults to 200No
spec.restService.timeOutMillisWill reject requests that last more than this value. Defaults to 5000(5 seconds)No
spec.restService.unsecuredDisabled https for restful calls. Defaults to falseNo
spec.restService.keyStorePath to keyStoreNo
spec.restService.trueStorePath to trueStoreNo
spec.restService.keyStorePasswordPassword for keyStoreNo
spec.restService.trueStorePasswordPassword for trueStoreNo
spec.securityContext.keyStorePath to keyStoreYes
spec.securityContext.trustStorePath to trueStoreYes
spec.securityContext.keyStorePasswordPassword for keyStoreYes
spec.securityContext.keyStoreTypeKeyStore typeYes
spec.securityContext.client.authTypeType of client authentication. Defaults to DisabledAll. See https://goo.gl/1vKbXW for more optionsNo
spec.securityContext.client.protocols.[*]Accepted TLS protocols. Defaults to [TLSv1.2]No
spec.securityContext.debuggingTurns ON or OFF ssl debugging. Defaults to falseNo
spec.ex_rtpEngine.enabledIf enabled, it will send all media thru the RTPEngine. Defaults to falseNo
spec.ex_rtpEngine.protoReserved to allow for NG commands via http, https, and udp. Currently only http is supportedNo
spec.ex_rtpEngine.hostAddress for RTPEngineNo
spec.ex_rtpEngine.portPort for RTPEngineNo
spec.ex_convertTelToE164If enabled, it will convert the number on ingress calls to E164 format before routing the call. Defaults to falseNo
spec.ex_uniqueGatewayPerHostPortIf enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to falseNo
+
+

Variables prefixed with ex_ are experimental features and may be removed or renamed in the future.

+
+

Transport Configuration

+

Routr supports tcp, udp, tls, sctp, ws, and wss as transport protocols.

+

The server requires at least one transport protocol. +To bind a transport protocol to a specific IP address, you can use the spec.transport.bindAddr or more generally spec.bindAddr.

+

Datasource Providers

+

Routr currently implements two data providers: redis_data_provider and files_data_provider. The default data provider is the files_data_provider.

+
+

The docker distribution of the server uses redis_data_provider by default

+
+

Redis Data Provider

+

The parameters for redis_data_provider are:

+
ParameterDescriptionRequired
hostRedis host. Defaults to 'localhost'No
portRedis port. The default port is 6379No
secretPassword to access databaseNo
+

Files Data Provider

+

The parameters for files_data_provider are:

+
ParameterDescriptionRequired
pathPath to configuration files. Defaults to the config folderNo
+

This implementation has the limitation that writes operations have to be performed manually on the files.

+

Configuring the server behind a NAT

+

The spec.externAddr and spec.localnets parameters help Routr identify the correct path for any given traffic. The spec.externAddr is typically the Internet facing IP address. The spec.localnets is an array with valid CIDR, IP/Mask, or single IP values. -Here is quick example:

spec:
externAddr: 172.220.231.23
localnets: [172.17.0.2/16]

Access Control List

The Access Control List(ACL) provides with a security mechanism to disable network +Here is quick example:

+
spec:
externAddr: 172.220.231.23
localnets: [172.17.0.2/16]
+

Access Control List

+

The Access Control List(ACL) provides with a security mechanism to disable network access from unwanted sources. ACL rules exist at general or Domain level. Here is an example, -blocking all traffic except from IP address 192.168.0.1.

spec:
accessControlList:
deny: [0.0.0.0/1] # Deny all
allow: [192.168.0.1/31]

Basic Example

apiVersion: v1beta1
spec:
transport:
- protocol: tcp
port: 5060
- protocol: udp
port: 5060
- - +blocking all traffic except from IP address 192.168.0.1.

+
spec:
accessControlList:
deny: [0.0.0.0/1] # Deny all
allow: [192.168.0.1/31]
+

Basic Example

+
apiVersion: v1beta1
spec:
transport:
- protocol: tcp
port: 5060
- protocol: udp
port: 5060
\ No newline at end of file diff --git a/docs/1.x.x/configuration/numbers/index.html b/docs/1.x.x/configuration/numbers/index.html index a1288d2db..8df94c7ff 100644 --- a/docs/1.x.x/configuration/numbers/index.html +++ b/docs/1.x.x/configuration/numbers/index.html @@ -1,22 +1,28 @@ - + - -Numbers | Routr Docs + +Numbers | Routr Docs - - - + + + -
-
Version: 1.x.x

Numbers

Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.

The Numbers configuration can be provided using the file config/numbers.yml located at the root of your Routr installation.

If using Redis this configuration gets stored in the database.

Number Resource

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.refReference to this resourceNo
metadata.gwRefReference to parent GatewayYes
metadata.geoInfo.cityCity of the NumberNo
metadata.geoInfo.countryCountry of the NumberNo
metadata.geoInfo.countryISOCodeThe Country ISO code for the Number (i.e., US)No
spec.location.telUrlNumber URI available in the location serverYes
spec.location.aorLinkAddress of record of SIP device for call routingYes

Example

- apiVersion: v1beta1
kind: Number
metadata:
ref: Number0001
gwRef: GW0001
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUrl: 'tel:17066041487'
aorLink: 'sip:john@sip.local'
- - +
Version: 1.x.x

Numbers

+

Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.

+

The Numbers configuration can be provided using the file config/numbers.yml located at the root of your Routr installation.

+
+

If using Redis this configuration gets stored in the database.

+
+

Number Resource

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.refReference to this resourceNo
metadata.gwRefReference to parent GatewayYes
metadata.geoInfo.cityCity of the NumberNo
metadata.geoInfo.countryCountry of the NumberNo
metadata.geoInfo.countryISOCodeThe Country ISO code for the Number (i.e., US)No
spec.location.telUrlNumber URI available in the location serverYes
spec.location.aorLinkAddress of record of SIP device for call routingYes
+

Example

+
- apiVersion: v1beta1
kind: Number
metadata:
ref: Number0001
gwRef: GW0001
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUrl: 'tel:17066041487'
aorLink: 'sip:john@sip.local'
\ No newline at end of file diff --git a/docs/1.x.x/configuration/peers/index.html b/docs/1.x.x/configuration/peers/index.html index cae6d0756..422dd7e33 100644 --- a/docs/1.x.x/configuration/peers/index.html +++ b/docs/1.x.x/configuration/peers/index.html @@ -1,22 +1,32 @@ - + - -Peers | Routr Docs + +Peers | Routr Docs - - - + + + -
-
Version: 1.x.x

Peers

Like Agents, Peers represent SIP endpoints such as Media Servers.

Unlike Agents, Peers aren't bound by a Domain.

The Peers configuration can be provided using the file config/peers.yml located at the root of your Routr installation.

If using Redis this configuration gets stored in the database.

Peer Resource

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP deviceYes
spec.credentials.usernamePeer's credential usernameYes
spec.credentials.secretPeer's credential secretYes
spec.deviceWhen set it is used by the location serviceNo
spec.contactAddrWhen set advertises this as the contactURINo

Example

- apiVersion: v1beta1
kind: Peer
metadata:
name: Asterisk (Media Server)
spec:
credentials:
username: ast
secret: 'astsecret'
device: astserver # If is not define the IP address will be used
contactAddr: '192.168.1.2:6060'

This peer can be reached using the AOR: ast@astserver.

- - +
Version: 1.x.x

Peers

+

Like Agents, Peers represent SIP endpoints such as Media Servers.

+

Unlike Agents, Peers aren't bound by a Domain.

+

The Peers configuration can be provided using the file config/peers.yml located at the root of your Routr installation.

+
+

If using Redis this configuration gets stored in the database.

+
+

Peer Resource

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the SIP deviceYes
spec.credentials.usernamePeer's credential usernameYes
spec.credentials.secretPeer's credential secretYes
spec.deviceWhen set it is used by the location serviceNo
spec.contactAddrWhen set advertises this as the contactURINo
+

Example

+
- apiVersion: v1beta1
kind: Peer
metadata:
name: Asterisk (Media Server)
spec:
credentials:
username: ast
secret: 'astsecret'
device: astserver # If is not define the IP address will be used
contactAddr: '192.168.1.2:6060'
+
+

This peer can be reached using the AOR: ast@astserver.

+
\ No newline at end of file diff --git a/docs/1.x.x/configuration/users/index.html b/docs/1.x.x/configuration/users/index.html index 99a1874c4..52230b089 100644 --- a/docs/1.x.x/configuration/users/index.html +++ b/docs/1.x.x/configuration/users/index.html @@ -1,23 +1,38 @@ - + - -Users | Routr Docs + +Users | Routr Docs - - - + + + -
-
Version: 1.x.x

Users

Users exist in Routr to perform administrative actions on a Routr instance. -The Users configuration can be provided using the file config/users.yml located at the root of your Routr installation.

If using Redis this configuration gets stored in the database.

User Resource

PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the User deviceYes
spec.credentials.usernameUser's credential usernameYes
spec.credentials.secretUser's credential secretYes

Example

- apiVersion: v1beta1
kind: User
metadata:
name: Administrator
spec:
credentials:
username: admin
secret: changeit

Changing the password? (Redis)

First, run the command redis-cli smembers users to obtain the reference to the user. Here is an example:

$ redis-cli smembers users
1) "5aa69ead8fd6861d92385bac"

Then, retrieve the document for reference running redis-cli get {REF}. For example

$ redis-cli get 5aa69ead8fd6861d92385bac
"{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"oldpass\"}}}"

Finally, search and change the old password and update your document using redis-cli set {REF} {DOCUMENT}. Like this:

$ redis-cli set 5aa69ead8fd6861d92385bac
"{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"newpass\"}}}"

A new token is issued after your next login with rctl

- - +
Version: 1.x.x

Users

+

Users exist in Routr to perform administrative actions on a Routr instance. +The Users configuration can be provided using the file config/users.yml located at the root of your Routr installation.

+
+

If using Redis this configuration gets stored in the database.

+
+

User Resource

+
PropertyDescriptionRequired
apiVersionIndicates the version of the resource (Not yet implemented)Yes
kindDefines the type of resourceYes
metadata.nameFriendly name for the User deviceYes
spec.credentials.usernameUser's credential usernameYes
spec.credentials.secretUser's credential secretYes
+

Example

+
- apiVersion: v1beta1
kind: User
metadata:
name: Administrator
spec:
credentials:
username: admin
secret: changeit
+

Changing the password? (Redis)

+

First, run the command redis-cli smembers users to obtain the reference to the user. Here is an example:

+
$ redis-cli smembers users
1) "5aa69ead8fd6861d92385bac"
+

Then, retrieve the document for reference running redis-cli get {REF}. For example

+
$ redis-cli get 5aa69ead8fd6861d92385bac
"{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"oldpass\"}}}"
+

Finally, search and change the old password and update your document using redis-cli set {REF} {DOCUMENT}. Like this:

+
$ redis-cli set 5aa69ead8fd6861d92385bac
"{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"newpass\"}}}"
+
+

A new token is issued after your next login with rctl

+
\ No newline at end of file diff --git a/docs/1.x.x/guides/basic-setup/index.html b/docs/1.x.x/guides/basic-setup/index.html index c9a3d0381..3f716674b 100644 --- a/docs/1.x.x/guides/basic-setup/index.html +++ b/docs/1.x.x/guides/basic-setup/index.html @@ -1,22 +1,89 @@ - + - -Basic Setup | Routr Docs + +Basic Setup | Routr Docs - - - + + + -
-
Version: 1.x.x

Basic Setup

This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.

Content

Requirements

This tutorial assumes the following:

  • Two SIP phones connected to the same LAN
  • A fresh installation of Routr
  • SIP providers such as voip.ms or did.logic.com

Setting up the Server

A set of sample configuration covering this scenario is available in the Github repo. You might overwrite the files in the config folder if you wish to skip this section.

Configuring the Gateway

To configure the Gateway, you must consult your SIP provider and obtain the credentials and registration host. The key fields for the configuration are metadata.ref, spec.regService.host and spec.regService.credentials. Here is an example:

- apiVersion: v1beta1
kind: Gateway
metadata:
name: Provider Inc
spec:
host: sip.provider.net
credentials:
username: 'youruser'
secret: 'yoursecret'
transport: udp

Configuring the Number

To configure your Number or virtual number, you must open and edit the file config/numbers.yml. Notice in the example below, how your reference the Gateway by using the field metadata.geRef. The key field while configuring Numbers are spec.location.telUrl and spec.location.aorLink. Keep in mind that the value in spec.location.telUrl must be formatted, precisely, as sent by the provider.

- apiVersion: v1beta1
kind: Number
metadata:
gwRef: gweef506
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUrl: 'tel:17066041487'
aorLink: 'sip:1001@sip.local'

Creating a new Domain and EgressPolicy

Routr is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an EgressPolicy to allow calls outside the Domain. Here is how the file config/domains.yml needs to look like:

- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Office
spec:
context:
domainUri: sip.local
egressPolicy:
rule: .*
numberRef: dd50baa4

Creating the Agents

We now create the Agents 1001 and 1002. Keep in mind that field spec.credentials.username can be alphanumeric, so john or john001 is also acceptable.

Pay close attention to the credentials block since it contains the username and secret for both Agents.

- apiVersion: v1beta1
kind: Agent
metadata:
name: John Doe
spec:
credentials:
username: '1001'
secret: '1234'
domains: [sip.local]
- apiVersion: v1beta1
kind: Agent
metadata:
name: Janie Doe
spec:
credentials:
username: '1002'
secret: '1234'
domains: [sip.local]

To verify your configuration, start the server by issuing the command routr. In a separate window, use the following commands:

  • rctl get gateway
  • rctl get number
  • rctl get domain
  • rctl get agents

Your output should be as follows:

Starting the Server

Verifying the Configuration

Configuring the SIP devices

We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.

Configure your softphone using the information you gather in the last step. Start by completing only the required information: username, domain, password. Also, In the advanced section use the server's IP as your Registry Server and Proxy. Here is how mine looks like:

Make sure to check the box "Use this account" to register your device

If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the .rctl locate to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both 1001 and 1002 are present in the location service and therefore, can reach each other.

Making calls

The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: 1001@sip.local or 7853178060@sip.local).

What's Next?

You can check out the https://github.com/fonoster../wiki/Home to see more examples. If you have any questions, start an issue or contact us via:

- - +
Version: 1.x.x

Basic Setup

+

This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.

+

Content

+ +

Requirements

+

This tutorial assumes the following:

+
    +
  • Two SIP phones connected to the same LAN
  • +
  • A fresh installation of Routr
  • +
  • SIP providers such as voip.ms or did.logic.com
  • +
+

Setting up the Server

+

A set of sample configuration covering this scenario is available in the Github repo. You might overwrite the files in the config folder if you wish to skip this section.

+

Configuring the Gateway

+

To configure the Gateway, you must consult your SIP provider and obtain the credentials and registration host. The key fields for the configuration are metadata.ref, spec.regService.host and spec.regService.credentials. Here is an example:

+
- apiVersion: v1beta1
kind: Gateway
metadata:
name: Provider Inc
spec:
host: sip.provider.net
credentials:
username: 'youruser'
secret: 'yoursecret'
transport: udp
+

Configuring the Number

+

To configure your Number or virtual number, you must open and edit the file config/numbers.yml. Notice in the example below, how your reference the Gateway by using the field metadata.geRef. The key field while configuring Numbers are spec.location.telUrl and spec.location.aorLink. Keep in mind that the value in spec.location.telUrl must be formatted, precisely, as sent by the provider.

+
- apiVersion: v1beta1
kind: Number
metadata:
gwRef: gweef506
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUrl: 'tel:17066041487'
aorLink: 'sip:1001@sip.local'
+

Creating a new Domain and EgressPolicy

+

Routr is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an EgressPolicy to allow calls outside the Domain. Here is how the file config/domains.yml needs to look like:

+
- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Office
spec:
context:
domainUri: sip.local
egressPolicy:
rule: .*
numberRef: dd50baa4
+

Creating the Agents

+

We now create the Agents 1001 and 1002. Keep in mind that field spec.credentials.username can be alphanumeric, so john or john001 is also acceptable.

+

Pay close attention to the credentials block since it contains the username and secret for both Agents.

+
- apiVersion: v1beta1
kind: Agent
metadata:
name: John Doe
spec:
credentials:
username: '1001'
secret: '1234'
domains: [sip.local]
- apiVersion: v1beta1
kind: Agent
metadata:
name: Janie Doe
spec:
credentials:
username: '1002'
secret: '1234'
domains: [sip.local]
+

To verify your configuration, start the server by issuing the command routr. In a separate window, use the following commands:

+
    +
  • rctl get gateway
  • +
  • rctl get number
  • +
  • rctl get domain
  • +
  • rctl get agents
  • +
+

Your output should be as follows:

+

Starting the Server

+ +

Verifying the Configuration

+ +

Configuring the SIP devices

+
+

We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.

+
+

Configure your softphone using the information you gather in the last step. Start by completing only the required information: username, domain, password. Also, In the advanced section use the server's IP as your Registry Server and Proxy. Here is how mine looks like:

+ + +
+

Make sure to check the box "Use this account" to register your device

+
+

If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the .rctl locate to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both 1001 and 1002 are present in the location service and therefore, can reach each other.

+ +

Making calls

+

The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: 1001@sip.local or 7853178060@sip.local).

+

What's Next?

+

You can check out the https://github.com/fonoster../wiki/Home to see more examples. If you have any questions, start an issue or contact us via:

+
\ No newline at end of file diff --git a/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html b/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html index f5e090a7f..fc02c5894 100644 --- a/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html +++ b/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html @@ -1,22 +1,78 @@ - + - -Routr as Asterisk frontend | Routr Docs + +Routr as Asterisk frontend | Routr Docs - - - + + + -
-
Version: 1.x.x

Routr as Asterisk frontend

This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:

Content

Requirements

This tutorial assumes the following:

  • You have a SIP phone connected to the same LAN as Routr and Asterisk
  • If using a hardware phone, this can reach Asterisk and Routr and the other way around
  • You have a fresh installation of Routr and Asterisk

Before starting this guide make sure to have a fresh installation of Routr server.

Configuration Overview

With a fresh installation of Routr, you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario.

The first file we need to examine and change is config/peers.yml. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field spec.device and change it to match the Agents domain(sip.local). The file now looks similar to this:

config/peers.yml

- apiVersion: v1beta1
kind: Peer
metadata:
name: Asterisk PBX
spec:
device: 'sip.local'
credentials:
username: ast
secret: '1234'

Head to the console and run the command rctl -- get peers to confirm that the Peer exist. The result should be as follows:

Next, we focus our attention on domains.yml and agents.yml. With a fresh installation, we don't need to make any changes to these files. However, you could run the commands get domains and get agents to ensure that both, the Agent and the Domain, exist on the server. Your output should look similar to:

Use the information in agents.yml to configure your SIP phone. The relevant information is found in spec.credentials. Mine looks like this:

Make the adjustments based on your prefer SIP phone.

You can verify that your device registered correctly with Routr by running the locate command:

Configuring Asterisk

Using PJSIP

Backup your pjsip.conf and pjsip_wizard.conf. Update your pjsip.conf with the following:

[transport-tcp]
type=transport
protocol=tcp
bind=0.0.0.0:6060

Then, in your pjsip_wizard.conf:

[routr]
type = wizard
sends_auth = yes
sends_registrations = yes
remote_hosts = 192.168.1.2
outbound_auth/username = ast
outbound_auth/password = 1234
registration/retry_interval = 10
registration/expiration = 900
endpoint/allow = ulaw
endpoint/allow = alaw
endpoint/allow = opus
endpoint/context = default
transport = transport-tcp

Using the "old" Chan SIP

First backup your sip.conf. Then, replace your configuration and edit the file to reflect the following:

[general]
udpbindaddr=0.0.0.0:6060
context=default
register => ast:1234@192.168.1.2:5060/1001 ; This information must match the credentials in `config/peers.yml`

Configuring the Dialplan

We are going to use a very simple dialplan to play a sound file. Again, make a backup of your configuration and replace its content with this:

[default]
exten => 1001,1,Answer
exten => 1001,n,Playback(tt-monkeys)
exten => 1001,n,Hangup

Restart your Asterisk and check the location service. A new device now appears.

Calling Asterisk from John's device

We can now call ast@sip.local and if everything went well listen to a group of really annoying monkeys :).

What's Next?

You can check out the wiki to see more examples. If you have any questions start an issue or contact us via:

- - +
Version: 1.x.x

Routr as Asterisk frontend

+

This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:

+ +

Content

+ +

Requirements

+

This tutorial assumes the following:

+
    +
  • You have a SIP phone connected to the same LAN as Routr and Asterisk
  • +
  • If using a hardware phone, this can reach Asterisk and Routr and the other way around
  • +
  • You have a fresh installation of Routr and Asterisk
  • +
+
+

Before starting this guide make sure to have a fresh installation of Routr server.

+
+

Configuration Overview

+

With a fresh installation of Routr, you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario.

+

The first file we need to examine and change is config/peers.yml. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field spec.device and change it to match the Agents domain(sip.local). The file now looks similar to this:

+

config/peers.yml

+
- apiVersion: v1beta1
kind: Peer
metadata:
name: Asterisk PBX
spec:
device: 'sip.local'
credentials:
username: ast
secret: '1234'
+

Head to the console and run the command rctl -- get peers to confirm that the Peer exist. The result should be as follows:

+ +

Next, we focus our attention on domains.yml and agents.yml. With a fresh installation, we don't need to make any changes to these files. However, you could run the commands get domains and get agents to ensure that both, the Agent and the Domain, exist on the server. Your output should look similar to:

+ +

Use the information in agents.yml to configure your SIP phone. The relevant information is found in spec.credentials. Mine looks like this:

+ + +
+

Make the adjustments based on your prefer SIP phone.

+
+

You can verify that your device registered correctly with Routr by running the locate command:

+ +

Configuring Asterisk

+

Using PJSIP

+

Backup your pjsip.conf and pjsip_wizard.conf. Update your pjsip.conf with the following:

+
[transport-tcp]
type=transport
protocol=tcp
bind=0.0.0.0:6060
+

Then, in your pjsip_wizard.conf:

+
[routr]
type = wizard
sends_auth = yes
sends_registrations = yes
remote_hosts = 192.168.1.2
outbound_auth/username = ast
outbound_auth/password = 1234
registration/retry_interval = 10
registration/expiration = 900
endpoint/allow = ulaw
endpoint/allow = alaw
endpoint/allow = opus
endpoint/context = default
transport = transport-tcp
+

Using the "old" Chan SIP

+

First backup your sip.conf. Then, replace your configuration and edit the file to reflect the following:

+
[general]
udpbindaddr=0.0.0.0:6060
context=default
register => ast:1234@192.168.1.2:5060/1001 ; This information must match the credentials in `config/peers.yml`
+

Configuring the Dialplan

+

We are going to use a very simple dialplan to play a sound file. Again, make a backup of your configuration and replace its content with this:

+
[default]
exten => 1001,1,Answer
exten => 1001,n,Playback(tt-monkeys)
exten => 1001,n,Hangup
+

Restart your Asterisk and check the location service. A new device now appears.

+ +

Calling Asterisk from John's device

+

We can now call ast@sip.local and if everything went well listen to a group of really annoying monkeys :).

+

What's Next?

+

You can check out the wiki to see more examples. If you have any questions start an issue or contact us via:

+
\ No newline at end of file diff --git a/docs/1.x.x/guides/running-on-kubernetes/index.html b/docs/1.x.x/guides/running-on-kubernetes/index.html index 942859a04..52cdfd180 100644 --- a/docs/1.x.x/guides/running-on-kubernetes/index.html +++ b/docs/1.x.x/guides/running-on-kubernetes/index.html @@ -1,22 +1,27 @@ - + - -Running on Kubernetes | Routr Docs + +Running on Kubernetes | Routr Docs - - - + + + -
-
Version: 1.x.x

Running on Kubernetes

This document is a short guide about running the dockerized version of Routr Server on Kubernetes.

Run in Kubernetes

To run Routr in Kubernetes, you must set your EXTERN_ADDR in .k8s/routr.yml.

This variable must be set to the public address(if running Routr locally, use your host address)

Additionally, you must create the following Kubernetes resources:

kubectl create -f k8s/configmaps.yml
kubectl create -f k8s/redis.yml
kubectl create -f k8s/routr.yml
- - +
Version: 1.x.x

Running on Kubernetes

+

This document is a short guide about running the dockerized version of Routr Server on Kubernetes.

+

Run in Kubernetes

+

To run Routr in Kubernetes, you must set your EXTERN_ADDR in .k8s/routr.yml.

+
+

This variable must be set to the public address(if running Routr locally, use your host address)

+
+

Additionally, you must create the following Kubernetes resources:

+
kubectl create -f k8s/configmaps.yml
kubectl create -f k8s/redis.yml
kubectl create -f k8s/routr.yml
\ No newline at end of file diff --git a/docs/1.x.x/guides/running-with-docker-or-compose/index.html b/docs/1.x.x/guides/running-with-docker-or-compose/index.html index 7f0e0a8cc..a869f3c78 100644 --- a/docs/1.x.x/guides/running-with-docker-or-compose/index.html +++ b/docs/1.x.x/guides/running-with-docker-or-compose/index.html @@ -1,22 +1,20 @@ - + - -Running with Docker | Routr Docs + +Running with Docker | Routr Docs - - - + + + -
-
Version: 1.x.x

Running with Docker

Please refer to Docker Hub for a detail guide on how to use Routr's docker image.

- - +
Version: 1.x.x

Running with Docker

+

Please refer to Docker Hub for a detail guide on how to use Routr's docker image.

\ No newline at end of file diff --git a/docs/1.x.x/guides/securing-the-signaling-path/index.html b/docs/1.x.x/guides/securing-the-signaling-path/index.html index 426fd61f7..965a088f8 100644 --- a/docs/1.x.x/guides/securing-the-signaling-path/index.html +++ b/docs/1.x.x/guides/securing-the-signaling-path/index.html @@ -1,22 +1,56 @@ - + - -Securing the signaling path | Routr Docs + +Securing the signaling path | Routr Docs - - - + + + -
-
Version: 1.x.x

Securing the signaling path

Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.

For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path

Creating a Java Keystore(.JKS) certificate

We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free Let's Encrypt service.

Creating a self-signed Certificate

Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into etc/certs in your Routr installation and run the following script:

keytool -genkey -keyalg RSA \
-noprompt \
-alias routr \
-keystore domains-cert.jks \
-storepass changeit \
-keypass changeit \
-validity 365 \
-keysize 2048 \
-dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \
-ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1

Remember to adjust the values to match your project's information.

WSS does not work with a self-signed certificate. However, you can add a security exception by using https instead of wss in your browser's search bar and then accepting the security certificate.

Creating a Certificate using Let's Encrypt

The recommended way to create a valid certificate for Routr is using the free service Let's Encrypt. Please go to https://letsencrypt.org/ for details on how to install the required tooling. To generate the certificate, use the following steps:

Create keys

certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com

Change to the directory where we created the certificates(generally at /etc/letsencrypt/live/sip.ocean.com).

Create a PKCS12 file containing full chain and private key

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 -name domains-cert.jks

Please make a note of the password since you need it in the next step.

Convert PKCS12 to Keystore

keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks

Installing the Certificate in Routr

To enable secure signaling in Routr, copy your certificate in etc/certs and edit the file config/config.yml to look like this:

apiVersion: v1beta1
metadata:
userAgent: Routr v1.0
spec:
securityContext:
keyStore: etc/certs/domains-cert.jks
trustStore: etc/certs/domains-cert.jks
keyStorePassword: 'changeit'
trustStorePassword: 'changeit'
keyStoreType: 'jks'
debugging: true # Enabled debug only for testing
transport:
- protocol: tls
port: 5061
...

If you set the property spec.securityContext.debugging to true, you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:

openssl s_client -host 192.168.1.2 -port 5061    # Remember to use Routr's IP

Setting up the Sip Phones

For this guide, we are using Blink Pro.

Go to the account that you want to secure, select Advanced -> Sip Signaling and change the parameter Primary Proxy to ${proxyHost}:${proxyPort};transport=tls. See the example in the following image:

If everything went well, you should see a green padlock like the one in the image below:

- - +
Version: 1.x.x

Securing the signaling path

+

Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.

+
+

For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path

+
+ +

Creating a Java Keystore(.JKS) certificate

+

We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free Let's Encrypt service.

+

Creating a self-signed Certificate

+

Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into etc/certs in your Routr installation and run the following script:

+
keytool -genkey -keyalg RSA \
-noprompt \
-alias routr \
-keystore domains-cert.jks \
-storepass changeit \
-keypass changeit \
-validity 365 \
-keysize 2048 \
-dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \
-ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1
+

Remember to adjust the values to match your project's information.

+
+

WSS does not work with a self-signed certificate. However, you can add a security exception by using https instead of wss in your browser's search bar and then accepting the security certificate.

+
+

Creating a Certificate using Let's Encrypt

+

The recommended way to create a valid certificate for Routr is using the free service Let's Encrypt. Please go to https://letsencrypt.org/ for details on how to install the required tooling. To generate the certificate, use the following steps:

+

➊ Create keys

+
certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com
+

Change to the directory where we created the certificates(generally at /etc/letsencrypt/live/sip.ocean.com).

+

➋ Create a PKCS12 file containing full chain and private key

+
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 -name domains-cert.jks
+

Please make a note of the password since you need it in the next step.

+

➌ Convert PKCS12 to Keystore

+
keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks
+

Installing the Certificate in Routr

+

To enable secure signaling in Routr, copy your certificate in etc/certs and edit the file config/config.yml to look like this:

+
apiVersion: v1beta1
metadata:
userAgent: Routr v1.0
spec:
securityContext:
keyStore: etc/certs/domains-cert.jks
trustStore: etc/certs/domains-cert.jks
keyStorePassword: 'changeit'
trustStorePassword: 'changeit'
keyStoreType: 'jks'
debugging: true # Enabled debug only for testing
transport:
- protocol: tls
port: 5061
...
+

If you set the property spec.securityContext.debugging to true, you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:

+
openssl s_client -host 192.168.1.2 -port 5061    # Remember to use Routr's IP
+

Setting up the Sip Phones

+
+

For this guide, we are using Blink Pro.

+
+

Go to the account that you want to secure, select Advanced -> Sip Signaling and change the parameter Primary Proxy to ${proxyHost}:${proxyPort};transport=tls. See the example in the following image:

+ +

If everything went well, you should see a green padlock like the one in the image below:

+
\ No newline at end of file diff --git a/docs/1.x.x/introduction/community/index.html b/docs/1.x.x/introduction/community/index.html index 5926f8e3a..e8b5ace5f 100644 --- a/docs/1.x.x/introduction/community/index.html +++ b/docs/1.x.x/introduction/community/index.html @@ -1,23 +1,46 @@ - + - -Community | Routr Docs + +Community | Routr Docs - - - + + + -
-
Version: 1.x.x

Community

Routr is developed in the open. Here are some of the channels we use to communicate and contribute:

Discord community -GitHub Discussions

User mailing lists:

  • routr-announce – for announcements like new releases
  • routr-users – for discussions around Routr usage and community support

Twitter: @Fonoster

Issue tracker: Use the GitHub issue tracker for the various Routr repositories to file bugs and features request. If you need support, please send your questions to the routr-users mailing list rather than filing a GitHub issue.

Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below.

Contributing

We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request.

Development: GitHub Discussions – for discussions around Routr development

Developer Summits

We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019.

2019 developer summit notes (Come back to see updated link)

Code of Conduct

To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

Commercial Support

The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically.

Pedro Sanders (independent contractor)

Acknowledgments

Routr was developed initially by Pedro Sanders. Fonoster sponsored the majority of its development.

Pedro Sanders contributed Routr's logo.

- - +
Version: 1.x.x

Community

+

Routr is developed in the open. Here are some of the channels we use to communicate and contribute:

+

Discord community +GitHub Discussions

+

User mailing lists:

+
    +
  • routr-announce – for announcements like new releases
  • +
  • routr-users – for discussions around Routr usage and community support
  • +
+

Twitter: @Fonoster

+

Issue tracker: Use the GitHub issue tracker for the various Routr repositories to file bugs and features request. If you need support, please send your questions to the routr-users mailing list rather than filing a GitHub issue.

+
+

Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below.

+
+

Contributing

+

We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request.

+

Development: GitHub Discussions – for discussions around Routr development

+

Developer Summits

+

We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019.

+

2019 developer summit notes (Come back to see updated link)

+

Code of Conduct

+

To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

+

Commercial Support

+

The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically.

+

Pedro Sanders (independent contractor)

+

Acknowledgments

+

Routr was developed initially by Pedro Sanders. Fonoster sponsored the majority of its development.

+

Pedro Sanders contributed Routr's logo.

\ No newline at end of file diff --git a/docs/1.x.x/introduction/comparison/index.html b/docs/1.x.x/introduction/comparison/index.html index 0700b83ce..4be3919f0 100644 --- a/docs/1.x.x/introduction/comparison/index.html +++ b/docs/1.x.x/introduction/comparison/index.html @@ -1,22 +1,43 @@ - + - -Comparison | Routr Docs + +Comparison | Routr Docs - - - + + + -
-
Version: 1.x.x

Comparison

A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.

Routr vs Asterisk/FreeSWITCH?

Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses.

Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role.

Routr vs Kamailio/OpenSER?

Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:

  • Proxy, Registrar, Location, Forking, Redirect
  • Load Balancing
  • Session Border Controller
  • Gateway to the PSTN

Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach.

So what is the problem with Kamailio/OpenSER?

Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code.

What can we do to make it better?

Our vision for a Next-generation SIP Server can be summarized as follows:

  • Make Routr Cloud-Native (After all it is 2019)
  • It does not require any coding / Most use-cases are configurable
  • Offer the tooling and APIs for easy extensibility
  • Great documentation

If you want to support the initiative, please join the discussion.

- - +
Version: 1.x.x

Comparison

+

A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.

+

Routr vs Asterisk/FreeSWITCH?

+

Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses.

+

Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role.

+

Routr vs Kamailio/OpenSER?

+

Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:

+
    +
  • Proxy, Registrar, Location, Forking, Redirect
  • +
  • Load Balancing
  • +
  • Session Border Controller
  • +
  • Gateway to the PSTN
  • +
+

Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach.

+

So what is the problem with Kamailio/OpenSER?

+

Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code.

+

What can we do to make it better?

+

Our vision for a Next-generation SIP Server can be summarized as follows:

+
    +
  • Make Routr Cloud-Native (After all it is 2019)
  • +
  • It does not require any coding / Most use-cases are configurable
  • +
  • Offer the tooling and APIs for easy extensibility
  • +
  • Great documentation
  • +
+

If you want to support the initiative, please join the discussion.

\ No newline at end of file diff --git a/docs/1.x.x/introduction/faq/index.html b/docs/1.x.x/introduction/faq/index.html index 3002a3fae..ae96e89d1 100644 --- a/docs/1.x.x/introduction/faq/index.html +++ b/docs/1.x.x/introduction/faq/index.html @@ -1,23 +1,30 @@ - + - -FAQ | Routr Docs + +FAQ | Routr Docs - - - + + + -
-
Version: 1.x.x

FAQ

What is Routr?

Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the overview.

What dependencies does Routr have?

Routr server runs standalone and has no external dependencies. However, -you might need to use Redis depending in the complexity of your requirements.

How does Routr compare with other SIP servers

See the comparison page.

What language is used to develop Routr?

Most components in Routr are written in Javascript(with Oracle's GraalJS).

What license does Routr uses?

Routr is released under the MIT license.

- - +
Version: 1.x.x

FAQ

+

What is Routr?

+

Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the overview.

+

What dependencies does Routr have?

+

Routr server runs standalone and has no external dependencies. However, +you might need to use Redis depending in the complexity of your requirements.

+

How does Routr compare with other SIP servers

+

See the comparison page.

+

What language is used to develop Routr?

+

Most components in Routr are written in Javascript(with Oracle's GraalJS).

+

What license does Routr uses?

+

Routr is released under the MIT license.

\ No newline at end of file diff --git a/docs/1.x.x/introduction/glossary/index.html b/docs/1.x.x/introduction/glossary/index.html index 05f0e2116..cdca57025 100644 --- a/docs/1.x.x/introduction/glossary/index.html +++ b/docs/1.x.x/introduction/glossary/index.html @@ -1,23 +1,41 @@ - + - -Glossary | Routr Docs + +Glossary | Routr Docs - - - + + + -
-
Version: 1.x.x

Glossary

This following table features some essential concepts, including the different routing types implemented by the server.

User

Users perform administrative actions on the server.

Agent

Agents represent SIP endpoints such as softphones and IP phones, or paging speakers.

Domain

Enables the creation of isolated groups of Agents

Peer

Similar to Agents but without Domain boundaries

Gateway

IP entity that allows call termination

Number

Routes and translate calls between the PSTN and Routr

Intra-Domain Routing (IDR)

Routing strategy for signaling within the same Domain

Domain Ingress Routing (DIR)

Routing strategy used when an Agent or Peer must go outside the Domain using -a Gateway

Domain Egress Routing (DER)

Calling from an Agent to the PSTN thru a Gateway

Peer Egress Routing (PER)

Similar to DER but applies only to Peers.

- - +
Version: 1.x.x

Glossary

+

This following table features some essential concepts, including the different routing types implemented by the server.

+

User

+

Users perform administrative actions on the server.

+

Agent

+

Agents represent SIP endpoints such as softphones and IP phones, or paging speakers.

+

Domain

+

Enables the creation of isolated groups of Agents

+

Peer

+

Similar to Agents but without Domain boundaries

+

Gateway

+

IP entity that allows call termination

+

Number

+

Routes and translate calls between the PSTN and Routr

+

Intra-Domain Routing (IDR)

+

Routing strategy for signaling within the same Domain

+

Domain Ingress Routing (DIR)

+

Routing strategy used when an Agent or Peer must go outside the Domain using +a Gateway

+

Domain Egress Routing (DER)

+

Calling from an Agent to the PSTN thru a Gateway

+

Peer Egress Routing (PER)

+

Similar to DER but applies only to Peers.

\ No newline at end of file diff --git a/docs/1.x.x/introduction/installation/index.html b/docs/1.x.x/introduction/installation/index.html index b81e5243f..0e3c32248 100644 --- a/docs/1.x.x/introduction/installation/index.html +++ b/docs/1.x.x/introduction/installation/index.html @@ -1,22 +1,48 @@ - + - -Installation | Routr Docs + +Installation | Routr Docs - - - + + + -
-
Version: 1.x.x

Installation

Instant Server Installation with Snaps

Install Routr in seconds on Linux (Ubuntu and others) with:

sudo snap install routr-server

Get it from the Snap Store

Routr Snap is recommended for Linux deployments

Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions.

DigitalOcean droplet

Build and Deploy to a DigitalOcean droplet

do-btn-blue

Docker

Deploy with docker compose

Docker logo

OR Use the automated build image of our most recent release

docker pull fonoster/routr:latest

OR select a specific release (details of releases available):

docker pull fonoster/routr:vX.X.X

Kubernetes

Deploy to Kubernetes in few easy steps

Google Cloud Shell

Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface.

Open in Cloud Shell

Custom

There are no special requirements to install and run the server. Just follow this easy steps:

Download the server for your platform

PlatformDownload
Linuxtar.gz
macOStar.gz
Windowstar.gz, zip

Then extract it:

tar xvfz routr-*.tar.gz
cd routr-*

Run the server using the routr command

./routr
- - +
Version: 1.x.x

Installation

+

Instant Server Installation with Snaps

+

Install Routr in seconds on Linux (Ubuntu and others) with:

+
sudo snap install routr-server
+

Get it from the Snap Store

+

Routr Snap is recommended for Linux deployments

+

Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions.

+

DigitalOcean droplet

+

Build and Deploy to a DigitalOcean droplet

+

do-btn-blue

+

Docker

+

Deploy with docker compose

+

Docker logo

+

OR Use the automated build image of our most recent release

+
docker pull fonoster/routr:latest
+

OR select a specific release (details of releases available):

+
docker pull fonoster/routr:vX.X.X
+

Kubernetes

+

Deploy to Kubernetes in few easy steps

+

Google Cloud Shell

+

Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface.

+

Open in Cloud Shell

+

Custom

+

There are no special requirements to install and run the server. Just follow this easy steps:

+

➊ Download the server for your platform

+
PlatformDownload
Linuxtar.gz
macOStar.gz
Windowstar.gz, zip
+

➋ Then extract it:

+
tar xvfz routr-*.tar.gz
cd routr-*
+

➌ Run the server using the routr command

+
./routr
\ No newline at end of file diff --git a/docs/1.x.x/introduction/media/index.html b/docs/1.x.x/introduction/media/index.html index 20cc3c798..a06eaa647 100644 --- a/docs/1.x.x/introduction/media/index.html +++ b/docs/1.x.x/introduction/media/index.html @@ -1,22 +1,30 @@ - + - -Media | Routr Docs + +Media | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/1.x.x/introduction/overview/index.html b/docs/1.x.x/introduction/overview/index.html index 9726d4eda..3c30c5ae3 100644 --- a/docs/1.x.x/introduction/overview/index.html +++ b/docs/1.x.x/introduction/overview/index.html @@ -1,22 +1,48 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
-
Version: 1.x.x

Overview

What is Routr?

Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at @fonoster.

Features

Routr's main features are:

  • Typical Sip Server functions; Proxy, Registrar, Location Service
  • Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List
  • Transport: TCP, UDP, TLS, WebSocket
  • Routr currently supports Redis, HTTP Requests, and YAML files as the data source
  • Server management and monitoring with the RESTful API, CLI, and Web Console
  • Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress

Components

The Routr ecosystem consists of three main components:

  • The Routr server which is the main component of the ecosystem
  • The command-line interface, rctl, for remote management of the server
  • An optional web console for easy management of the server

Architecture

This diagram illustrates the architecture of Routr and some of its ecosystem components:




At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software.

Use cases

Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in Docker, and Kubernetes.

Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI.

- - +
Version: 1.x.x

Overview

+

What is Routr?

+

Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at @fonoster.

+

Features

+

Routr's main features are:

+
    +
  • Typical Sip Server functions; Proxy, Registrar, Location Service
  • +
  • Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List
  • +
  • Transport: TCP, UDP, TLS, WebSocket
  • +
  • Routr currently supports Redis, HTTP Requests, and YAML files as the data source
  • +
  • Server management and monitoring with the RESTful API, CLI, and Web Console
  • +
  • Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress
  • +
+

Components

+

The Routr ecosystem consists of three main components:

+
    +
  • The Routr server which is the main component of the ecosystem
  • +
  • The command-line interface, rctl, for remote management of the server
  • +
  • An optional web console for easy management of the server
  • +
+

Architecture

+

This diagram illustrates the architecture of Routr and some of its ecosystem components:

+
+ +
+
+

At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software.

+

Use cases

+

Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in Docker, and Kubernetes.

+

Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI.

\ No newline at end of file diff --git a/docs/1.x.x/introduction/performance-tests/user-location/index.html b/docs/1.x.x/introduction/performance-tests/user-location/index.html index 5c057de40..b72a6aead 100644 --- a/docs/1.x.x/introduction/performance-tests/user-location/index.html +++ b/docs/1.x.x/introduction/performance-tests/user-location/index.html @@ -1,32 +1,64 @@ - + - -Routr 1.0RC3 - User Location Lookup Performance Tests | Routr Docs + +Routr 1.0RC3 - User Location Lookup Performance Tests | Routr Docs - - - + + + -
-
Version: 1.x.x

Routr 1.0RC3 - User Location Lookup Performance Tests

Author: -Pedro Sanders

  1. Overview
  2. User Location Performance Tests
    1. New registrations
    2. Update registrations
    3. User location lookup
  3. Conclusions
  4. Notes
  5. References

Overview

Scope

These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3. +

Version: 1.x.x

Routr 1.0RC3 - User Location Lookup Performance Tests

+

Author: +Pedro Sanders

+
  1. Overview
  2. User Location Performance Tests
    1. New registrations
    2. Update registrations
    3. User location lookup
  3. Conclusions
  4. Notes
  5. References
+

Overview

+

Scope

+

These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3. These can be useful to help you better dimension your Routr installation. For these test the login module -was deactivated. The network configuration used during the test is depicted in the following image:

Software

As load generator (UAC side) it was used SIPp docker image.

All used SIP-related software was configured to use TCP as the transport protocol for SIP.

Platform

Description of the elements used:

Equipment #1 - [Processor], [Memory] with [Operating system] testing. -Equipment #2 - [Processor], [Memory] with [Operating system] testing. -Equipment #x - [Processor], [Memory] with [Operating system] testing.

Performance Tests

Routr running without any special

SIPp was used to generate [# of interaction] MESSAGE requests via Routr. -The results reflect the capacity [General or sub topic] and speed (average response time).

Flow -SIP entities definition:

UAC - [UAC]:5070 -UAS - [UAS]:5070 -Proxy - [PROXY_IP]:5060

SIP messages flow for one complete transaction:

UAC ---> MESSAGE ---> Routr ---> MESSAGE ---> UAS
UAC <--- 200 OK <--- Routr <--- 200 OK <--- UAS

Configuration -SIPP command:

[Used SIPp command config ]

Results

Results reported by SIPp on the UAC servers:

FactorValueNote
Iterations200000
Max concurrent requests70
Max allowed Rate10000requests per second
Average Request Rate8047.966requests per second
Failures0
Retransmissions0
Timeout0
Elapsed Time00:00:24:85100:00:24:851



Routr config file:

[Whatever config applies]

[Graphical results]

  1. Conclusions
  2. Notes
  3. References
- - +was deactivated. The network configuration used during the test is depicted in the following image:

+

Software

+

As load generator (UAC side) it was used SIPp.

+

All used SIP-related software was configured to use TCP as the transport protocol for SIP.

+

Platform

+

Description of the elements used:

+

Equipment #1 - [Processor], [Memory] with [Operating system] testing. +Equipment #2 - [Processor], [Memory] with [Operating system] testing. +Equipment #x - [Processor], [Memory] with [Operating system] testing.

+

Performance Tests

+

Routr running without any special

+

SIPp was used to generate [# of interaction] MESSAGE requests via Routr. +The results reflect the capacity [General or sub topic] and speed (average response time).

+

Flow +SIP entities definition:

+

UAC - [UAC]:5070 +UAS - [UAS]:5070 +Proxy - [PROXY_IP]:5060

+

SIP messages flow for one complete transaction:

+
UAC ---> MESSAGE ---> Routr ---> MESSAGE ---> UAS
UAC <--- 200 OK <--- Routr <--- 200 OK <--- UAS
+

Configuration +SIPP command:

+
[Used SIPp command config ]
+

Results

+

Results reported by SIPp on the UAC servers:

+
FactorValueNote
Iterations200000
Max concurrent requests70
Max allowed Rate10000requests per second
Average Request Rate8047.966requests per second
Failures0
Retransmissions0
Timeout0
Elapsed Time00:00:24:85100:00:24:851
+
+ +
+
+

Routr config file:

+
[Whatever config applies]
+

[Graphical results]

+
    +
  1. Conclusions
  2. +
  3. Notes
  4. +
  5. References
  6. +
\ No newline at end of file diff --git a/docs/1.x.x/introduction/roadmap/index.html b/docs/1.x.x/introduction/roadmap/index.html index 8adb01b3f..e2b55a0a2 100644 --- a/docs/1.x.x/introduction/roadmap/index.html +++ b/docs/1.x.x/introduction/roadmap/index.html @@ -1,22 +1,28 @@ - + - -Roadmap | Routr Docs + +Roadmap | Routr Docs - - - + + + -
-
Version: 1.x.x

Roadmap

The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.

Accounting, Authentication, and Authorization

Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events.

IM and Presence

We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr.

Per-domain Certificate

Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate.

Support the Ecosystem

We want to release a stable version of the web UI soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr.

- - +
Version: 1.x.x

Roadmap

+

The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.

+

Accounting, Authentication, and Authorization

+

Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events.

+

IM and Presence

+

We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr.

+

Per-domain Certificate

+

Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate.

+

Support the Ecosystem

+

We want to release a stable version of the web UI soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr.

\ No newline at end of file diff --git a/docs/1.x.x/introduction/test-plan/index.html b/docs/1.x.x/introduction/test-plan/index.html index 36070c52d..a6ead5a81 100644 --- a/docs/1.x.x/introduction/test-plan/index.html +++ b/docs/1.x.x/introduction/test-plan/index.html @@ -1,22 +1,34 @@ - + - -Test Plan | Routr Docs + +Test Plan | Routr Docs - - - + + + -
-
Version: 1.x.x

Test Plan

DUT and Endpoints Configuration

  • Routr has a Gateway resource configured to use TCP transport.
  • The Gateway resource is configured with a range of E.164 numbers.
  • Routr is configured to support Registration mode.
  • A Domain named sip.local exist with Agents 1001@sip.local and 1002@sip.local
  • The Gateway is capable of handling RFC6140 registrations

Test Case Summary

Test Case IDTitleRequired
1.1.1Registration SetupYes
1.1.2Registration FailureYes
1.1.3Maintaining RegistrationYes
1.1.4AuthenticationYes
1.1.5TLS Server ModeNo
1.2.1DNS LookupYes
1.2.2Static Mode Failure DetectionNo
1.2.3TLS AuthenticationNo
1.2.4TLS Certificate ValidationNo
1.3.1Intra-Domain Routing / Successful Invite SetupYes
1.3.2Intra-Domain Routing / Invite Rejected by CalleeYes
1.3.3Intra-Domain Routing / Invite Cancelled by CallerYes
1.3.4Intra-Domain Routing / Invite Cancelled by CalleeYes
1.4.1Domain-Ingress Routing / Successful Invite SetupYes
1.4.2Domain-Ingress Routing / Invite Rejected by CalleeYes
1.4.3Domain-Ingress Routing / Invite Cancelled by CallerYes
1.4.4Domain-Ingress Routing / Invite Cancelled by CalleeYes
1.5.1Domain-Egress Routing / Successful Invite SetupYes
1.5.2Domain-Egress Routing / Invite Rejected by CalleeYes
1.5.3Domain-Egress Routing / Invite Cancelled by CallerYes
1.5.4Domain-Egress Routing / Invite Cancelled by CalleeYes
1.6.1Peer-Egress Routing / Successful Invite SetupYes

Test Cases

Test Case 1.1.1: Registration Setup

Objective: This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped.

Procedure:

DescriptionExpected Result
Step 1Restart Routr to send a REGISTER message to the GatewayRoutr restarts
Step 2Wait for the server to restartUAS receives correct registration sequence
Step 3Clear the registration tableRegistry table is empty
- - +
Version: 1.x.x

Test Plan

+

DUT and Endpoints Configuration

+
    +
  • Routr has a Gateway resource configured to use TCP transport.
  • +
  • The Gateway resource is configured with a range of E.164 numbers.
  • +
  • Routr is configured to support Registration mode.
  • +
  • A Domain named sip.local exist with Agents 1001@sip.local and 1002@sip.local
  • +
  • The Gateway is capable of handling RFC6140 registrations
  • +
+

Test Case Summary

+
Test Case IDTitleRequired
1.1.1Registration SetupYes
1.1.2Registration FailureYes
1.1.3Maintaining RegistrationYes
1.1.4AuthenticationYes
1.1.5TLS Server ModeNo
1.2.1DNS LookupYes
1.2.2Static Mode Failure DetectionNo
1.2.3TLS AuthenticationNo
1.2.4TLS Certificate ValidationNo
1.3.1Intra-Domain Routing / Successful Invite SetupYes
1.3.2Intra-Domain Routing / Invite Rejected by CalleeYes
1.3.3Intra-Domain Routing / Invite Cancelled by CallerYes
1.3.4Intra-Domain Routing / Invite Cancelled by CalleeYes
1.4.1Domain-Ingress Routing / Successful Invite SetupYes
1.4.2Domain-Ingress Routing / Invite Rejected by CalleeYes
1.4.3Domain-Ingress Routing / Invite Cancelled by CallerYes
1.4.4Domain-Ingress Routing / Invite Cancelled by CalleeYes
1.5.1Domain-Egress Routing / Successful Invite SetupYes
1.5.2Domain-Egress Routing / Invite Rejected by CalleeYes
1.5.3Domain-Egress Routing / Invite Cancelled by CallerYes
1.5.4Domain-Egress Routing / Invite Cancelled by CalleeYes
1.6.1Peer-Egress Routing / Successful Invite SetupYes
+

Test Cases

+

Test Case 1.1.1: Registration Setup

+

Objective: This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped.

+

Procedure:

+
DescriptionExpected Result
Step 1Restart Routr to send a REGISTER message to the GatewayRoutr restarts
Step 2Wait for the server to restartUAS receives correct registration sequence
Step 3Clear the registration tableRegistry table is empty
\ No newline at end of file diff --git a/docs/1.x.x/welcome/index.html b/docs/1.x.x/welcome/index.html index 3b40edf1a..cdf686c55 100644 --- a/docs/1.x.x/welcome/index.html +++ b/docs/1.x.x/welcome/index.html @@ -1,22 +1,20 @@ - + - -Welcome | Routr Docs + +Welcome | Routr Docs - - - + + + -
-
Version: 1.x.x

Welcome

Use the left-hand to navigate to find topics of interest.

- - +
Version: 1.x.x

Welcome

+

Use the left-hand to navigate to find topics of interest.

\ No newline at end of file diff --git a/docs/2.0.0/changelog/index.html b/docs/2.0.0/changelog/index.html index a8aa33398..44aafde9c 100644 --- a/docs/2.0.0/changelog/index.html +++ b/docs/2.0.0/changelog/index.html @@ -1,22 +1,20 @@ - + - -Changelog | Routr Docs + +Changelog | Routr Docs - - - + + + - - - + \ No newline at end of file diff --git a/docs/2.0.0/community/index.html b/docs/2.0.0/community/index.html index 47eb31c99..ce4001f82 100644 --- a/docs/2.0.0/community/index.html +++ b/docs/2.0.0/community/index.html @@ -1,22 +1,41 @@ - + - -Community | Routr Docs + +Community | Routr Docs - - - + + + -
-
Version: 2.0.0

Community

We are developing Routr in the open. These are the channels we use for communication and contribution:

Twitter: @Fonoster

Issue tracker: Use the GitHub issue tracker for Routr repository to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue.

Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required.

Contributing

We welcome community contributions! Please see the CONTRIBUTING.md file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request.

Development: GitHub Discussions – for discussions around Routr development

Developer Summits

We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting.

Code of Conduct

To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

Commercial Support

The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically.

Pedro Sanders (creator and maintainer)

Acknowledgments

Routr was developed initially by Pedro Sanders. Fonoster and Camanio AB sponsored the majority of its development.

- - +
Version: 2.0.0

Community

+

We are developing Routr in the open. These are the channels we use for communication and contribution:

+ +

Twitter: @Fonoster

+

Issue tracker: Use the GitHub issue tracker for Routr repository to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue.

+
+

Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required.

+
+

Contributing

+

We welcome community contributions! Please see the CONTRIBUTING.md file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request.

+

Development: GitHub Discussions – for discussions around Routr development

+

Developer Summits

+

We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting.

+

Code of Conduct

+

To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

+

Commercial Support

+

The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically.

+

Pedro Sanders (creator and maintainer)

+

Acknowledgments

+

Routr was developed initially by Pedro Sanders. Fonoster and Camanio AB sponsored the majority of its development.

\ No newline at end of file diff --git a/docs/2.0.0/connect/command-line/ctl/index.html b/docs/2.0.0/connect/command-line/ctl/index.html index d6b8d455a..c233d8811 100644 --- a/docs/2.0.0/connect/command-line/ctl/index.html +++ b/docs/2.0.0/connect/command-line/ctl/index.html @@ -1,22 +1,204 @@ - + - -CTL | Routr Docs + +CTL | Routr Docs - - - + + + -
-
Version: 2.0.0

CTL

Command-Line for Routr server.

Usage

$ npm install -g @routr/ctl
$ rctl COMMAND
running command...
$ rctl (--version)
@routr/ctl/2.1.11 linux-x64 node-v18.17.1
$ rctl --help [COMMAND]
USAGE
$ rctl COMMAND
...

Commands

rctl acl create

Creates a new ACL

USAGE
$ rctl acl create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new ACL

EXAMPLES
$ rctl acl create
Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793

See code: dist/commands/acl/create.ts

rctl acl delete [REF]

Deletes an Access Control List

USAGE
$ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes an Access Control List

EXAMPLES
$ rctl acl delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/acl/delete.ts

rctl acl describe [REF]

shows details of an ACL

USAGE
$ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the ACL

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details of an ACL

See code: dist/commands/acl/describe.ts

rctl acl get [REF]

Shows a list of paginated ACLs or a single ACL if a ref is provided

USAGE
$ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to an ACL

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated ACLs or a single ACL if a ref is provided

EXAMPLES
$ rctl acl get
Ref Name Deny List Allow List
9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28

See code: dist/commands/acl/get.ts

rctl acl update REF

Updates an existing ACL

USAGE
$ rctl acl update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an ACL

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing ACL

EXAMPLES
$ rctl acl update
Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/acl/update.ts

rctl agents create

Creates a new Agent

USAGE
$ rctl agents create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Agent

EXAMPLES
$ rctl agents create
Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793

See code: dist/commands/agents/create.ts

rctl agents delete [REF]

Deletes an Agent

USAGE
$ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes an Agent

EXAMPLES
$ rctl agents delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/agents/delete.ts

rctl agents describe [REF]

shows details of an Agent

USAGE
$ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Agent

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details of an Agent

See code: dist/commands/agents/describe.ts

rctl agents get [REF]

Shows a list of paginated Agents or a single Agent if ref is provided

USAGE
$ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF Optional Agents reference

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] The number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Agents or a single Agent if ref is provided

EXAMPLES
$ rctl agents get
Ref Name Username Domain Privacy Enabled
d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes

See code: dist/commands/agents/get.ts

rctl agents update REF

Updates an existing Agent

USAGE
$ rctl agents update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Agent

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Agent

EXAMPLES
$ rctl agents update
Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/agents/update.ts

rctl autocomplete [SHELL]

display autocomplete installation instructions

USAGE
$ rctl autocomplete [SHELL] [-r]

ARGUMENTS
SHELL shell type

FLAGS
-r, --refresh-cache Refresh cache (ignores displaying instructions)

DESCRIPTION
display autocomplete installation instructions

EXAMPLES
$ rctl autocomplete

$ rctl autocomplete bash

$ rctl autocomplete zsh

$ rctl autocomplete --refresh-cache

See code: @oclif/plugin-autocomplete

rctl credentials create

Creates a new set of Credentials

USAGE
$ rctl credentials create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new set of Credentials

EXAMPLES
$ rctl credentials create
Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793

See code: dist/commands/credentials/create.ts

rctl credentials delete [REF]

Deletes a set of Credentials

USAGE
$ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a set of Credentials

EXAMPLES
$ rctl credentials delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/credentials/delete.ts

rctl credentials describe [REF]

shows details for a set of Credentials

USAGE
$ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the set of Credentials

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a set of Credentials

See code: dist/commands/credentials/describe.ts

rctl credentials get [REF]

Shows a list of paginated Credentials or a single set if ref is provided

USAGE
$ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a set of Credentials

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Credentials or a single set if ref is provided

EXAMPLES
$ rctl credentials get
Ref Name Deny List Allow List
80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25

See code: dist/commands/credentials/get.ts

rctl credentials update REF

Updates an existing set of Credentials

USAGE
$ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing set of Credentials

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing set of Credentials

EXAMPLES
$ rctl credentials update
Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/credentials/update.ts

rctl domains create

Creates a new set Domain

USAGE
$ rctl domains create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new set Domain

EXAMPLES
$ rctl domains create
Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793

See code: dist/commands/domains/create.ts

rctl domains delete [REF]

Deletes a Domain

USAGE
$ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Domain

EXAMPLES
$ rctl domains delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/domains/delete.ts

rctl domains describe [REF]

show details of a Domain

USAGE
$ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Domain

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
show details of a Domain

See code: dist/commands/domains/describe.ts

rctl domains get [REF]

Shows a list of paginated Domains or a single Domain if ref is provided

USAGE
$ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Domain

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Domains or a single Domain if ref is provided

EXAMPLES
$ rctl domains get
Ref Name URI
ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local

See code: dist/commands/domains/get.ts

rctl domains update REF

Updates an existing Domain

USAGE
$ rctl domains update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Domain

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Domain

EXAMPLES
$ rctl domains update
Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/domains/update.ts

rctl numbers create

Creates a new Number

USAGE
$ rctl numbers create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Number

EXAMPLES
$ rctl numbers create
Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468

See code: dist/commands/numbers/create.ts

rctl numbers delete [REF]

Deletes a Number

USAGE
$ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Number

EXAMPLES
$ rctl numbers delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/numbers/delete.ts

rctl numbers describe [REF]

shows details for a Number

USAGE
$ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Number

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a Number

See code: dist/commands/numbers/describe.ts

rctl numbers get [REF]

Shows a list of paginated Numbers or a single Number if ref is provided

USAGE
$ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Number

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Numbers or a single Number if ref is provided

EXAMPLES
$ rctl numbers get
Ref Name Telephony URL AOR Link Geo
a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)

See code: dist/commands/numbers/get.ts

rctl numbers update REF

Updates an existing set of Credentials

USAGE
$ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Number

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing set of Credentials

EXAMPLES
$ rctl numbers update
Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/numbers/update.ts

rctl peers create

Creates a new Peer

USAGE
$ rctl peers create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Peer

EXAMPLES
$ rctl peers create
Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793

See code: dist/commands/peers/create.ts

rctl peers delete [REF]

Deletes a Peer

USAGE
$ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Peer

EXAMPLES
$ rctl peers delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/peers/delete.ts

rctl peers describe [REF]

shows details for a Peer

USAGE
$ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Peer

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a Peer

See code: dist/commands/peers/describe.ts

rctl peers get [REF]

Shows a list of paginated Peers or a single Peer if ref is provided

USAGE
$ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Peer

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Peers or a single Peer if ref is provided

EXAMPLES
$ rctl peers get
Ref Name Username AOR Balancing Algorithm Session Affinity
6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes

See code: dist/commands/peers/get.ts

rctl peers update REF

Updates an existing Peer

USAGE
$ rctl peers update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Peer

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Peer

EXAMPLES
$ rctl peers update
Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/peers/update.ts

rctl plugins

List installed plugins.

USAGE
$ rctl plugins [--core]

FLAGS
--core Show core plugins.

DESCRIPTION
List installed plugins.

EXAMPLES
$ rctl plugins

See code: @oclif/plugin-plugins

rctl plugins:install PLUGIN...

Installs a plugin into the CLI.

USAGE
$ rctl plugins:install PLUGIN...

ARGUMENTS
PLUGIN Plugin to install.

FLAGS
-f, --force Run yarn install with force flag.
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Installs a plugin into the CLI.
Can be installed from npm or a git url.

Installation of a user-installed plugin will override a core plugin.

e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
the CLI without the need to patch and update the whole CLI.


ALIASES
$ rctl plugins add

EXAMPLES
$ rctl plugins:install myplugin

$ rctl plugins:install https://github.com/someuser/someplugin

$ rctl plugins:install someuser/someplugin

rctl plugins:inspect PLUGIN...

Displays installation properties of a plugin.

USAGE
$ rctl plugins:inspect PLUGIN...

ARGUMENTS
PLUGIN [default: .] Plugin to inspect.

FLAGS
-h, --help Show CLI help.
-v, --verbose

GLOBAL FLAGS
--json Format output as json.

DESCRIPTION
Displays installation properties of a plugin.

EXAMPLES
$ rctl plugins:inspect myplugin

See code: @oclif/plugin-plugins

rctl plugins:install PLUGIN...

Installs a plugin into the CLI.

USAGE
$ rctl plugins:install PLUGIN...

ARGUMENTS
PLUGIN Plugin to install.

FLAGS
-f, --force Run yarn install with force flag.
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Installs a plugin into the CLI.
Can be installed from npm or a git url.

Installation of a user-installed plugin will override a core plugin.

e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
the CLI without the need to patch and update the whole CLI.


ALIASES
$ rctl plugins add

EXAMPLES
$ rctl plugins:install myplugin

$ rctl plugins:install https://github.com/someuser/someplugin

$ rctl plugins:install someuser/someplugin

See code: @oclif/plugin-plugins

Links a plugin into the CLI for development.

USAGE
$ rctl plugins:link PLUGIN

ARGUMENTS
PATH [default: .] path to plugin

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Links a plugin into the CLI for development.
Installation of a linked plugin will override a user-installed or core plugin.

e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
command will override the user-installed or core plugin implementation. This is useful for development work.


EXAMPLES
$ rctl plugins:link myplugin

See code: @oclif/plugin-plugins

rctl plugins:uninstall PLUGIN...

Removes a plugin from the CLI.

USAGE
$ rctl plugins:uninstall PLUGIN...

ARGUMENTS
PLUGIN plugin to uninstall

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Removes a plugin from the CLI.

ALIASES
$ rctl plugins unlink
$ rctl plugins remove

rctl plugins:uninstall PLUGIN...

Removes a plugin from the CLI.

USAGE
$ rctl plugins:uninstall PLUGIN...

ARGUMENTS
PLUGIN plugin to uninstall

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Removes a plugin from the CLI.

ALIASES
$ rctl plugins unlink
$ rctl plugins remove

See code: @oclif/plugin-plugins

rctl plugins:uninstall PLUGIN...

Removes a plugin from the CLI.

USAGE
$ rctl plugins:uninstall PLUGIN...

ARGUMENTS
PLUGIN plugin to uninstall

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Removes a plugin from the CLI.

ALIASES
$ rctl plugins unlink
$ rctl plugins remove

rctl plugins update

Update installed plugins.

USAGE
$ rctl plugins update [-h] [-v]

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Update installed plugins.

See code: @oclif/plugin-plugins

rctl trunks create

Creates a new Trunk

USAGE
$ rctl trunks create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Trunk

EXAMPLES
$ rctl trunks create
Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793

See code: dist/commands/trunks/create.ts

rctl trunks delete [REF]

Deletes a Trunk

USAGE
$ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Trunk

EXAMPLES
$ rctl trunks delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

See code: dist/commands/trunks/delete.ts

rctl trunks describe [REF]

shows details for a Trunk

USAGE
$ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Trunk

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a Trunk

See code: dist/commands/trunks/describe.ts

rctl trunks get [REF]

Shows a list of paginated Trunks or a single Trunk if ref is provided

USAGE
$ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Trunk

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Trunks or a single Trunk if ref is provided

EXAMPLES
$ rctl trunks get
Ref Name Inbound SIP URI
8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net

See code: dist/commands/trunks/get.ts

rctl trunks update REF

Updates an existing Trunk

USAGE
$ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Trunk

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Trunk

EXAMPLES
$ rctl trunks update
Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555

See code: dist/commands/trunks/update.ts

- - +
Version: 2.0.0

CTL

+

Command-Line for Routr server.

+ +

Usage

+
$ npm install -g @routr/ctl
$ rctl COMMAND
running command...
$ rctl (--version)
@routr/ctl/2.1.11 linux-x64 node-v18.17.1
$ rctl --help [COMMAND]
USAGE
$ rctl COMMAND
...
+

Commands

+

rctl acl create

+

Creates a new ACL

+
USAGE
$ rctl acl create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new ACL

EXAMPLES
$ rctl acl create
Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793
+

See code: dist/commands/acl/create.ts

+

rctl acl delete [REF]

+

Deletes an Access Control List

+
USAGE
$ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes an Access Control List

EXAMPLES
$ rctl acl delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/acl/delete.ts

+

rctl acl describe [REF]

+

shows details of an ACL

+
USAGE
$ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the ACL

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details of an ACL
+

See code: dist/commands/acl/describe.ts

+

rctl acl get [REF]

+

Shows a list of paginated ACLs or a single ACL if a ref is provided

+
USAGE
$ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to an ACL

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated ACLs or a single ACL if a ref is provided

EXAMPLES
$ rctl acl get
Ref Name Deny List Allow List
9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28
+

See code: dist/commands/acl/get.ts

+

rctl acl update REF

+

Updates an existing ACL

+
USAGE
$ rctl acl update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an ACL

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing ACL

EXAMPLES
$ rctl acl update
Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/acl/update.ts

+

rctl agents create

+

Creates a new Agent

+
USAGE
$ rctl agents create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Agent

EXAMPLES
$ rctl agents create
Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793
+

See code: dist/commands/agents/create.ts

+

rctl agents delete [REF]

+

Deletes an Agent

+
USAGE
$ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes an Agent

EXAMPLES
$ rctl agents delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/agents/delete.ts

+

rctl agents describe [REF]

+

shows details of an Agent

+
USAGE
$ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Agent

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details of an Agent
+

See code: dist/commands/agents/describe.ts

+

rctl agents get [REF]

+

Shows a list of paginated Agents or a single Agent if ref is provided

+
USAGE
$ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF Optional Agents reference

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] The number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Agents or a single Agent if ref is provided

EXAMPLES
$ rctl agents get
Ref Name Username Domain Privacy Enabled
d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes
+

See code: dist/commands/agents/get.ts

+

rctl agents update REF

+

Updates an existing Agent

+
USAGE
$ rctl agents update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Agent

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Agent

EXAMPLES
$ rctl agents update
Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/agents/update.ts

+

rctl autocomplete [SHELL]

+

display autocomplete installation instructions

+
USAGE
$ rctl autocomplete [SHELL] [-r]

ARGUMENTS
SHELL shell type

FLAGS
-r, --refresh-cache Refresh cache (ignores displaying instructions)

DESCRIPTION
display autocomplete installation instructions

EXAMPLES
$ rctl autocomplete

$ rctl autocomplete bash

$ rctl autocomplete zsh

$ rctl autocomplete --refresh-cache
+

See code: @oclif/plugin-autocomplete

+

rctl credentials create

+

Creates a new set of Credentials

+
USAGE
$ rctl credentials create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new set of Credentials

EXAMPLES
$ rctl credentials create
Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793
+

See code: dist/commands/credentials/create.ts

+

rctl credentials delete [REF]

+

Deletes a set of Credentials

+
USAGE
$ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a set of Credentials

EXAMPLES
$ rctl credentials delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/credentials/delete.ts

+

rctl credentials describe [REF]

+

shows details for a set of Credentials

+
USAGE
$ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the set of Credentials

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a set of Credentials
+

See code: dist/commands/credentials/describe.ts

+

rctl credentials get [REF]

+

Shows a list of paginated Credentials or a single set if ref is provided

+
USAGE
$ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a set of Credentials

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Credentials or a single set if ref is provided

EXAMPLES
$ rctl credentials get
Ref Name Deny List Allow List
80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25
+

See code: dist/commands/credentials/get.ts

+

rctl credentials update REF

+

Updates an existing set of Credentials

+
USAGE
$ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing set of Credentials

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing set of Credentials

EXAMPLES
$ rctl credentials update
Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/credentials/update.ts

+

rctl domains create

+

Creates a new set Domain

+
USAGE
$ rctl domains create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new set Domain

EXAMPLES
$ rctl domains create
Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793
+

See code: dist/commands/domains/create.ts

+

rctl domains delete [REF]

+

Deletes a Domain

+
USAGE
$ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Domain

EXAMPLES
$ rctl domains delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/domains/delete.ts

+

rctl domains describe [REF]

+

show details of a Domain

+
USAGE
$ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Domain

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
show details of a Domain
+

See code: dist/commands/domains/describe.ts

+

rctl domains get [REF]

+

Shows a list of paginated Domains or a single Domain if ref is provided

+
USAGE
$ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Domain

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Domains or a single Domain if ref is provided

EXAMPLES
$ rctl domains get
Ref Name URI
ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local
+

See code: dist/commands/domains/get.ts

+

rctl domains update REF

+

Updates an existing Domain

+
USAGE
$ rctl domains update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Domain

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Domain

EXAMPLES
$ rctl domains update
Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/domains/update.ts

+

rctl numbers create

+

Creates a new Number

+
USAGE
$ rctl numbers create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Number

EXAMPLES
$ rctl numbers create
Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468
+

See code: dist/commands/numbers/create.ts

+

rctl numbers delete [REF]

+

Deletes a Number

+
USAGE
$ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Number

EXAMPLES
$ rctl numbers delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/numbers/delete.ts

+

rctl numbers describe [REF]

+

shows details for a Number

+
USAGE
$ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Number

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a Number
+

See code: dist/commands/numbers/describe.ts

+

rctl numbers get [REF]

+

Shows a list of paginated Numbers or a single Number if ref is provided

+
USAGE
$ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Number

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Numbers or a single Number if ref is provided

EXAMPLES
$ rctl numbers get
Ref Name Telephony URL AOR Link Geo
a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)
+

See code: dist/commands/numbers/get.ts

+

rctl numbers update REF

+

Updates an existing set of Credentials

+
USAGE
$ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Number

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing set of Credentials

EXAMPLES
$ rctl numbers update
Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/numbers/update.ts

+

rctl peers create

+

Creates a new Peer

+
USAGE
$ rctl peers create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Peer

EXAMPLES
$ rctl peers create
Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793
+

See code: dist/commands/peers/create.ts

+

rctl peers delete [REF]

+

Deletes a Peer

+
USAGE
$ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Peer

EXAMPLES
$ rctl peers delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/peers/delete.ts

+

rctl peers describe [REF]

+

shows details for a Peer

+
USAGE
$ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Peer

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a Peer
+

See code: dist/commands/peers/describe.ts

+

rctl peers get [REF]

+

Shows a list of paginated Peers or a single Peer if ref is provided

+
USAGE
$ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Peer

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Peers or a single Peer if ref is provided

EXAMPLES
$ rctl peers get
Ref Name Username AOR Balancing Algorithm Session Affinity
6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes
+

See code: dist/commands/peers/get.ts

+

rctl peers update REF

+

Updates an existing Peer

+
USAGE
$ rctl peers update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Peer

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Peer

EXAMPLES
$ rctl peers update
Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/peers/update.ts

+

rctl plugins

+

List installed plugins.

+
USAGE
$ rctl plugins [--core]

FLAGS
--core Show core plugins.

DESCRIPTION
List installed plugins.

EXAMPLES
$ rctl plugins
+

See code: @oclif/plugin-plugins

+

rctl plugins:install PLUGIN...

+

Installs a plugin into the CLI.

+
USAGE
$ rctl plugins:install PLUGIN...

ARGUMENTS
PLUGIN Plugin to install.

FLAGS
-f, --force Run yarn install with force flag.
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Installs a plugin into the CLI.
Can be installed from npm or a git url.

Installation of a user-installed plugin will override a core plugin.

e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
the CLI without the need to patch and update the whole CLI.


ALIASES
$ rctl plugins add

EXAMPLES
$ rctl plugins:install myplugin

$ rctl plugins:install https://github.com/someuser/someplugin

$ rctl plugins:install someuser/someplugin
+

rctl plugins:inspect PLUGIN...

+

Displays installation properties of a plugin.

+
USAGE
$ rctl plugins:inspect PLUGIN...

ARGUMENTS
PLUGIN [default: .] Plugin to inspect.

FLAGS
-h, --help Show CLI help.
-v, --verbose

GLOBAL FLAGS
--json Format output as json.

DESCRIPTION
Displays installation properties of a plugin.

EXAMPLES
$ rctl plugins:inspect myplugin
+

See code: @oclif/plugin-plugins

+

rctl plugins:install PLUGIN...

+

Installs a plugin into the CLI.

+
USAGE
$ rctl plugins:install PLUGIN...

ARGUMENTS
PLUGIN Plugin to install.

FLAGS
-f, --force Run yarn install with force flag.
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Installs a plugin into the CLI.
Can be installed from npm or a git url.

Installation of a user-installed plugin will override a core plugin.

e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
the CLI without the need to patch and update the whole CLI.


ALIASES
$ rctl plugins add

EXAMPLES
$ rctl plugins:install myplugin

$ rctl plugins:install https://github.com/someuser/someplugin

$ rctl plugins:install someuser/someplugin
+

See code: @oclif/plugin-plugins

+ +

Links a plugin into the CLI for development.

+
USAGE
$ rctl plugins:link PLUGIN

ARGUMENTS
PATH [default: .] path to plugin

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Links a plugin into the CLI for development.
Installation of a linked plugin will override a user-installed or core plugin.

e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
command will override the user-installed or core plugin implementation. This is useful for development work.


EXAMPLES
$ rctl plugins:link myplugin
+

See code: @oclif/plugin-plugins

+

rctl plugins:uninstall PLUGIN...

+

Removes a plugin from the CLI.

+
USAGE
$ rctl plugins:uninstall PLUGIN...

ARGUMENTS
PLUGIN plugin to uninstall

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Removes a plugin from the CLI.

ALIASES
$ rctl plugins unlink
$ rctl plugins remove
+

rctl plugins:uninstall PLUGIN...

+

Removes a plugin from the CLI.

+
USAGE
$ rctl plugins:uninstall PLUGIN...

ARGUMENTS
PLUGIN plugin to uninstall

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Removes a plugin from the CLI.

ALIASES
$ rctl plugins unlink
$ rctl plugins remove
+

See code: @oclif/plugin-plugins

+

rctl plugins:uninstall PLUGIN...

+

Removes a plugin from the CLI.

+
USAGE
$ rctl plugins:uninstall PLUGIN...

ARGUMENTS
PLUGIN plugin to uninstall

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Removes a plugin from the CLI.

ALIASES
$ rctl plugins unlink
$ rctl plugins remove
+

rctl plugins update

+

Update installed plugins.

+
USAGE
$ rctl plugins update [-h] [-v]

FLAGS
-h, --help Show CLI help.
-v, --verbose

DESCRIPTION
Update installed plugins.
+

See code: @oclif/plugin-plugins

+

rctl trunks create

+

Creates a new Trunk

+
USAGE
$ rctl trunks create [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Creates a new Trunk

EXAMPLES
$ rctl trunks create
Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793
+

See code: dist/commands/trunks/create.ts

+

rctl trunks delete [REF]

+

Deletes a Trunk

+
USAGE
$ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Deletes a Trunk

EXAMPLES
$ rctl trunks delete
Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
+

See code: dist/commands/trunks/delete.ts

+

rctl trunks describe [REF]

+

shows details for a Trunk

+
USAGE
$ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to the Trunk

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
shows details for a Trunk
+

See code: dist/commands/trunks/describe.ts

+

rctl trunks get [REF]

+

Shows a list of paginated Trunks or a single Trunk if ref is provided

+
USAGE
$ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

ARGUMENTS
REF optional reference to a Trunk

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server
-s, --size=<value> [default: 50] the number of items to return
-x, --extended extended output format

DESCRIPTION
Shows a list of paginated Trunks or a single Trunk if ref is provided

EXAMPLES
$ rctl trunks get
Ref Name Inbound SIP URI
8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net
+

See code: dist/commands/trunks/get.ts

+

rctl trunks update REF

+

Updates an existing Trunk

+
USAGE
$ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]

ARGUMENTS
REF reference to an existing Trunk

FLAGS
-c, --cacert=<value> path to the CA certificate to verify the server
-e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
-i, --insecure allow insecure connections to the routr server

DESCRIPTION
Updates an existing Trunk

EXAMPLES
$ rctl trunks update
Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555
+

See code: dist/commands/trunks/update.ts

\ No newline at end of file diff --git a/docs/2.0.0/connect/command-line/overview/index.html b/docs/2.0.0/connect/command-line/overview/index.html index a8218bbce..0326ba8d1 100644 --- a/docs/2.0.0/connect/command-line/overview/index.html +++ b/docs/2.0.0/connect/command-line/overview/index.html @@ -1,22 +1,24 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
-
Version: 2.0.0

Overview

The command-line tool contains all commands you will need to manage your Routr Connect server.

To install Routr with npm, you will need to run the following command:

npm install --location=global @routr/ctl

Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.

Please see the following sections for more information on each command.

- - +
Version: 2.0.0

Overview

+

The command-line tool contains all commands you will need to manage your Routr Connect server.

+

To install Routr with npm, you will need to run the following command:

+
npm install --location=global @routr/ctl
+

Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.

+

Please see the following sections for more information on each command.

\ No newline at end of file diff --git a/docs/2.0.0/connect/concepts/index.html b/docs/2.0.0/connect/concepts/index.html index 1325515ad..a755b2b91 100644 --- a/docs/2.0.0/connect/concepts/index.html +++ b/docs/2.0.0/connect/concepts/index.html @@ -1,22 +1,49 @@ - + - -Concepts | Routr Docs + +Concepts | Routr Docs - - - + + + -
-
Version: 2.0.0

Concepts

The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.

The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.

The following routing types are supported:

Agent-to-Agent

The agent-to-agent routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:

Domain configuration

- apiVersion: v2beta1
kind: Domain
ref: domain-01
metadata:
name: Local Domain
spec:
context:
domainUri: sip.local

Agents configuration

- apiVersion: v2beta1
kind: Agent
ref: agent-01
metadata:
name: John Doe
spec:
username: "1001"
domainRef: domain-01
credentialsRef: credentials-01

- apiVersion: v2beta1
kind: Agent
ref: agent-02
metadata:
name: Jane Doe
spec:
username: "1002"
domainRef: domain-01
credentialsRef: credentials-02

With the configuration above, John and Jane can call each other using their usernames.

Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources.

Agent-to-PSTN

In the Connect Mode, the agent-to-pstn routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking.

The egressPolicies section of the Domain resource handles the routing. The examples below show how these resources relate to each other.

Domain configuration

- apiVersion: v2beta1
kind: Domain
ref: domain-01
metadata:
name: Local Domain
spec:
accessControlListRef: acl-01
context:
domainUri: sip.local
egressPolicies:
- rule: ".*"
numberRef: number-01

Number configuration

- apiVersion: v2beta1
kind: Number
ref: number-01
metadata:
name: "(910)343-4434"
geoInfo:
city: Durham, NC
country: USA
countryISOCode: US
spec:
trunkRef: trunk-01
location:
telUrl: tel:+19103434434

With the previous configuration, any Agent in the Domain can call the PSTN using the Number (910)343-4434.

From-PSTN

The from-pstn routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The location section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:

- apiVersion: v2beta1
kind: Number
ref: number-01
metadata:
name: "(910)343-4434"
geoInfo:
city: Durham, NC
country: USA
countryISOCode: US
spec:
trunkRef: trunk-01
location:
telUrl: tel:+19103434434
aorLink: sip:john@sip.local

You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr.

Peer-to-PSTN

The peer-to-pstn routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike agent-to-pstn, this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the Trunking resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table.

Agent-to-Peer

This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain's boundaries, the Agent must have a valid JWT token in the X-Connect-Token header. Incidentally, required claims in the JWT token include fields similar to the Agent resource. Here is an example of the payload of a JWT token:

{
"ref": "agent-01",
"domainRef": "domain-01",
"aor": "sip:1001@sip.local",
"aorLink": "asterisk@default",
"domain": "sip.local",
"privacy": "NONE",
"allowedMethods": ["INVITE", "REGISTER"]
}
- - +
Version: 2.0.0

Concepts

+

The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.

+

The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.

+

The following routing types are supported:

+

Agent-to-Agent

+

The agent-to-agent routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:

+

Domain configuration

+
- apiVersion: v2beta1
kind: Domain
ref: domain-01
metadata:
name: Local Domain
spec:
context:
domainUri: sip.local
+

Agents configuration

+
- apiVersion: v2beta1
kind: Agent
ref: agent-01
metadata:
name: John Doe
spec:
username: "1001"
domainRef: domain-01
credentialsRef: credentials-01

- apiVersion: v2beta1
kind: Agent
ref: agent-02
metadata:
name: Jane Doe
spec:
username: "1002"
domainRef: domain-01
credentialsRef: credentials-02
+

With the configuration above, John and Jane can call each other using their usernames.

+
+

Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources.

+
+

Agent-to-PSTN

+

In the Connect Mode, the agent-to-pstn routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking.

+

The egressPolicies section of the Domain resource handles the routing. The examples below show how these resources relate to each other.

+

Domain configuration

+
- apiVersion: v2beta1
kind: Domain
ref: domain-01
metadata:
name: Local Domain
spec:
accessControlListRef: acl-01
context:
domainUri: sip.local
egressPolicies:
- rule: ".*"
numberRef: number-01
+

Number configuration

+
- apiVersion: v2beta1
kind: Number
ref: number-01
metadata:
name: "(910)343-4434"
geoInfo:
city: Durham, NC
country: USA
countryISOCode: US
spec:
trunkRef: trunk-01
location:
telUrl: tel:+19103434434
+

With the previous configuration, any Agent in the Domain can call the PSTN using the Number (910)343-4434.

+

From-PSTN

+

The from-pstn routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The location section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:

+
- apiVersion: v2beta1
kind: Number
ref: number-01
metadata:
name: "(910)343-4434"
geoInfo:
city: Durham, NC
country: USA
countryISOCode: US
spec:
trunkRef: trunk-01
location:
telUrl: tel:+19103434434
aorLink: sip:john@sip.local
+

You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr.

+

Peer-to-PSTN

+

The peer-to-pstn routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike agent-to-pstn, this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the Trunking resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table.

+

Agent-to-Peer

+

This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain's boundaries, the Agent must have a valid JWT token in the X-Connect-Token header. Incidentally, required claims in the JWT token include fields similar to the Agent resource. Here is an example of the payload of a JWT token:

+
{
"ref": "agent-01",
"domainRef": "domain-01",
"aor": "sip:1001@sip.local",
"aorLink": "sip:asterisk@default",
"domain": "sip.local",
"privacy": "NONE",
"allowedMethods": ["INVITE", "REGISTER"]
}
\ No newline at end of file diff --git a/docs/2.0.0/connect/home-or-office-setup/index.html b/docs/2.0.0/connect/home-or-office-setup/index.html index 9a068dbe3..1b998740f 100644 --- a/docs/2.0.0/connect/home-or-office-setup/index.html +++ b/docs/2.0.0/connect/home-or-office-setup/index.html @@ -1,22 +1,20 @@ - + - -Home or Office Setup | Routr Docs + +Home or Office Setup | Routr Docs - - - + + + - - - + \ No newline at end of file diff --git a/docs/2.0.0/connect/introduction/index.html b/docs/2.0.0/connect/introduction/index.html index 1dd501e81..98429da7f 100644 --- a/docs/2.0.0/connect/introduction/index.html +++ b/docs/2.0.0/connect/introduction/index.html @@ -1,22 +1,30 @@ - + - -Introduction | Routr Docs + +Introduction | Routr Docs - - - + + + -
-
Version: 2.0.0

Introduction

The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.

In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr.

Some of the use cases for the Connect Mode are:

  • Power your office or home phone system
  • Create an Intercom network
  • Power a SIP network on a CPaaS
  • Connect your phone system to the PSTN
  • Connect your phone system to Microsoft Teams (coming soon)
  • Connect your phone system to AWS Chime (coming soon)
- - +
Version: 2.0.0

Introduction

+

The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.

+

In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr.

+

Some of the use cases for the Connect Mode are:

+
    +
  • Power your office or home phone system
  • +
  • Create an Intercom network
  • +
  • Power a SIP network on a CPaaS
  • +
  • Connect your phone system to the PSTN
  • +
  • Connect your phone system to Microsoft Teams (coming soon)
  • +
  • Connect your phone system to AWS Chime (coming soon)
  • +
\ No newline at end of file diff --git a/docs/2.0.0/connect/nodesdk/overview/index.html b/docs/2.0.0/connect/nodesdk/overview/index.html index 1da8bd4cb..5a578d67b 100644 --- a/docs/2.0.0/connect/nodesdk/overview/index.html +++ b/docs/2.0.0/connect/nodesdk/overview/index.html @@ -1,23 +1,37 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
-
Version: 2.0.0

Overview

Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.

This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server.

The following example demonstrates how you can use the Node.js SDK to create a new Domain.

To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK.

Let’s begin by creating a new project:

mkdir my-project 
cd my-project
npm init -y

The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings. -Next, install the SDK width:

npm install --save @routr/sdk

The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:

Filename: index.js

const SDK = require("@routr/sdk");
const domains = new SDK.Domains();

const request = {
name: "Local domain",
domainUri: "sip.local",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
egressPolicies: [{
rule: ".*",
numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}],
extended: { "key": "value" }
};

domains.createDomain(request)
.then(console.log)
.catch(console.error); // an error occurred

In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool.

The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)

Now, go ahead and run the code:

node index.js

If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at https://www.npmjs.com/package/@routr/sdk.

Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos.

- - +
Version: 2.0.0

Overview

+

Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.

+

This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server.

+

The following example demonstrates how you can use the Node.js SDK to create a new Domain.

+

To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK.

+

Let’s begin by creating a new project:

+
mkdir my-project 
cd my-project
npm init -y
+

The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings. +Next, install the SDK width:

+
npm install --save @routr/sdk
+

The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:

+

Filename: index.js

+
const SDK = require("@routr/sdk");
const domains = new SDK.Domains();

const request = {
name: "Local domain",
domainUri: "sip.local",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
egressPolicies: [{
rule: ".*",
numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}],
extended: { "key": "value" }
};

domains.createDomain(request)
.then(console.log)
.catch(console.error); // an error occurred
+

In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool.

+

The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)

+

Now, go ahead and run the code:

+
node index.js
+

If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at https://www.npmjs.com/package/@routr/sdk.

+

Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos.

\ No newline at end of file diff --git a/docs/2.0.0/connect/nodesdk/sdk/index.html b/docs/2.0.0/connect/nodesdk/sdk/index.html index 0ac2be327..bdc7f98bb 100644 --- a/docs/2.0.0/connect/nodesdk/sdk/index.html +++ b/docs/2.0.0/connect/nodesdk/sdk/index.html @@ -1,78 +1,511 @@ - + - -SDK | Routr Docs + +SDK | Routr Docs - - - + + + -
-
Version: 2.0.0

SDK

Installation

$ npm install --save @routr/sdk

APIs

ACL ⇐ APIClient

Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get -and delete Access Control Lists. The ACL API requires of a running Routr deployment.

Kind: global class
+

Version: 2.0.0

SDK

+ +

Installation

+
$ npm install --save @routr/sdk
+

APIs

+ + +

ACL ⇐ APIClient

+

Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get +and delete Access Control Lists. The ACL API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new ACL(options)

Constructs a new ACL API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const acl = new SDK.ACL()

const request = {
name: "Peer network",
allow: "27.116.56.0/22",
deny: "0.0.0.0/0"
}

acl.createACL(request)
.then(console.log)
.catch(console.error) // an error occurred

acL.createACL(request) ⇒ Promise.<CreateACLResponse>

Creates a new AccessControlList on Routr.

Kind: instance method of ACL
-Returns: Promise.<CreateACLResponse> - The newly created AccessControlList
-Throws:

  • if request is null
ParamTypeDescription
requestCreateACLRequestThe request to create an ACL
request.namestringName of the ACL
request.allowArray.<string>List of IP addresses or CIDR blocks to allow
request.denyArray.<string>List of IP addresses or CIDR blocks to deny
request.extendedObjectOptional extended attributes

Example

const request = {
name: "Peer network",
allow: "27.116.56.0/22",
deny: "0.0.0.0/0"
}

acl.createACL(request)
.then(console.log)
.catch(console.error) // an error occurred

acL.updateACL(request) ⇒ Promise.<UpdateACLResponse>

Updates an already existing AccessControlList on Routr.

Kind: instance method of ACL
-Returns: Promise.<UpdateACLResponse> - The AccessControlList

ParamTypeDescription
requestUpdateACLRequestPartial with the fields to update
request.namestringName of the ACL
request.allowArray.<string>List of IP addresses or CIDR blocks to allow
request.denyArray.<string>List of IP addresses or CIDR blocks to deny
request.extendedObjectOptional extended attributes

Example

const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "Peer network updated",
}

acl.updateACL(request)
.then(console.log)
.catch(console.error) // an error occurred

acL.getACL(ref) ⇒ Promise.<GetACLResponse>

Gets an AccessControlList from Routr.

Kind: instance method of ACL
-Returns: Promise.<GetACLResponse> - The AccessControlList

ParamTypeDescription
refstringThe ACL reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

acl.getACL(ref)
.then(console.log)
.catch(console.error) // an error occurred

acL.deleteACL(ref) ⇒ Promise.<void>

Deletes an AccessControlList from Routr.

Kind: instance method of ACL

ParamTypeDescription
refstringThe ACL reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

acl.deleteACL(ref)
.then(console.log)
.catch(console.error) // an error occurred

acL.listACLs(request) ⇒ Promise.<ListACLResponse>

Lists all AccessControlLists from Routr with pagination.

Kind: instance method of ACL
-Returns: Promise.<ListACLResponse> - The list of AccessControlLists

ParamTypeDescription
requestListACLRequestThe request to list ACLs
request.pageSizenumberThe number of ACLs to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

acl.listACLs(request)
.then(console.log)
.catch(console.error) // an error occurred

Agents ⇐ APIClient

Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get -and delete Agents. The Agents API requires of a running Routr deployment.

Kind: global class
+See: module:core:APIClient

+ + +

new ACL(options)

+

Constructs a new ACL API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const acl = new SDK.ACL()

const request = {
name: "Peer network",
allow: "27.116.56.0/22",
deny: "0.0.0.0/0"
}

acl.createACL(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

acL.createACL(request) ⇒ Promise.<CreateACLResponse>

+

Creates a new AccessControlList on Routr.

+

Kind: instance method of ACL
+Returns: Promise.<CreateACLResponse> - The newly created AccessControlList
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreateACLRequestThe request to create an ACL
request.namestringName of the ACL
request.allowArray.<string>List of IP addresses or CIDR blocks to allow
request.denyArray.<string>List of IP addresses or CIDR blocks to deny
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
name: "Peer network",
allow: "27.116.56.0/22",
deny: "0.0.0.0/0"
}

acl.createACL(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

acL.updateACL(request) ⇒ Promise.<UpdateACLResponse>

+

Updates an already existing AccessControlList on Routr.

+

Kind: instance method of ACL
+Returns: Promise.<UpdateACLResponse> - The AccessControlList

+
ParamTypeDescription
requestUpdateACLRequestPartial with the fields to update
request.namestringName of the ACL
request.allowArray.<string>List of IP addresses or CIDR blocks to allow
request.denyArray.<string>List of IP addresses or CIDR blocks to deny
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "Peer network updated",
}

acl.updateACL(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

acL.getACL(ref) ⇒ Promise.<GetACLResponse>

+

Gets an AccessControlList from Routr.

+

Kind: instance method of ACL
+Returns: Promise.<GetACLResponse> - The AccessControlList

+
ParamTypeDescription
refstringThe ACL reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

acl.getACL(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

acL.deleteACL(ref) ⇒ Promise.<void>

+

Deletes an AccessControlList from Routr.

+

Kind: instance method of ACL

+
ParamTypeDescription
refstringThe ACL reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

acl.deleteACL(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

acL.listACLs(request) ⇒ Promise.<ListACLResponse>

+

Lists all AccessControlLists from Routr with pagination.

+

Kind: instance method of ACL
+Returns: Promise.<ListACLResponse> - The list of AccessControlLists

+
ParamTypeDescription
requestListACLRequestThe request to list ACLs
request.pageSizenumberThe number of ACLs to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

acl.listACLs(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

Agents ⇐ APIClient

+

Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get +and delete Agents. The Agents API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new Agents(options)

Constructs a new Agent API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const agents = new SDK.Agents()

const request = {
name: "Jonh Doe",
username: "jdoe",
privacy: Privacy.PRIVATE,
domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
enabled: true,
extended: {
"key": "value"
}
}

agents.createAgent(request)
.then(console.log)
.catch(console.error) // an error occurred

agents.createAgent(request) ⇒ Promise.<CreateAgentResponse>

Creates a new Agent on Routr.

Kind: instance method of Agents
-Returns: Promise.<CreateAgentResponse> - The newly created Agent
-Throws:

  • if request is null
ParamTypeDescription
requestCreateAgentRequestThe request to create an Agent
request.namestringName of the Agent
request.usernamestringUsername of the Agent
request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
request.domainRefstringDomain reference of the Domain the Agent belongs to
request.credentialsRefstringCredentials reference of the Credentials for the Agent
request.enabledbooleanWhether the Agent is enabled or not (for future use)
request.extendedObjectOptional extended attributes

Example

const request = {
name: "Jonh Doe",
username: "jdoe",
privacy: Privacy.PRIVATE,
domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
enabled: true,
extended: {
"key": "value"
}
}

agents.createAgent(request)
.then(console.log)
.catch(console.error) // an error occurred

agents.updateAgent(request) ⇒ Promise.<UpdateAgentResponse>

Updates an already existing Agent on Routr.

Kind: instance method of Agents
-Returns: Promise.<UpdateAgentResponse> - The updated Agent

ParamTypeDescription
requestUpdateAgentRequestPartial with the fields to update
request.namestringName of the Agent
request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
request.domainRefstringDomain reference of the Domain the Agent belongs to
request.credentialsRefstringCredentials reference of the Credentials for the Agent
request.enabledbooleanWhether the Agent is enabled or not (for future use)
request.extendedObjectOptional extended attributes

Example

const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "John D Doe",
enabled: false
}

agents.updateAgent(request)
.then(console.log)
.catch(console.error) // an error occurred

agents.getAgent(ref) ⇒ Promise.<GetAgentResponse>

Gets an Agent from Routr.

Kind: instance method of Agents
-Returns: Promise.<GetAgentResponse> - The Agent

ParamTypeDescription
refstringThe Agent's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

agents.getAgent(ref)
.then(console.log)
.catch(console.error) // an error occurred

agents.deleteAgent(ref) ⇒ Promise.<void>

Deletes an Agent from Routr.

Kind: instance method of Agents

ParamTypeDescription
refstringThe Agent's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

agents.deleteAgent(ref)
.then(console.log)
.catch(console.error) // an error occurred

agents.listAgents(request) ⇒ Promise.<ListAgentResponse>

Lists all Agents from Routr with pagination.

Kind: instance method of Agents
-Returns: Promise.<ListAgentResponse> - The list of Agents in the current page

ParamTypeDescription
requestListAgentRequestThe request to list Agents
request.pageSizenumberThe number of Agents to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

agents.listAgents(request)
.then(console.log)
.catch(console.error) // an error occurred

Credentials ⇐ APIClient

Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get -and delete Credentials. The Credentials API requires of a running Routr deployment.

Kind: global class
+See: module:core:APIClient

+ + +

new Agents(options)

+

Constructs a new Agent API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const agents = new SDK.Agents()

const request = {
name: "Jonh Doe",
username: "jdoe",
privacy: Privacy.PRIVATE,
domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
enabled: true,
extended: {
"key": "value"
}
}

agents.createAgent(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

agents.createAgent(request) ⇒ Promise.<CreateAgentResponse>

+

Creates a new Agent on Routr.

+

Kind: instance method of Agents
+Returns: Promise.<CreateAgentResponse> - The newly created Agent
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreateAgentRequestThe request to create an Agent
request.namestringName of the Agent
request.usernamestringUsername of the Agent
request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
request.domainRefstringDomain reference of the Domain the Agent belongs to
request.credentialsRefstringCredentials reference of the Credentials for the Agent
request.enabledbooleanWhether the Agent is enabled or not (for future use)
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
name: "Jonh Doe",
username: "jdoe",
privacy: Privacy.PRIVATE,
domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
enabled: true,
extended: {
"key": "value"
}
}

agents.createAgent(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

agents.updateAgent(request) ⇒ Promise.<UpdateAgentResponse>

+

Updates an already existing Agent on Routr.

+

Kind: instance method of Agents
+Returns: Promise.<UpdateAgentResponse> - The updated Agent

+
ParamTypeDescription
requestUpdateAgentRequestPartial with the fields to update
request.namestringName of the Agent
request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
request.domainRefstringDomain reference of the Domain the Agent belongs to
request.credentialsRefstringCredentials reference of the Credentials for the Agent
request.enabledbooleanWhether the Agent is enabled or not (for future use)
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "John D Doe",
enabled: false
}

agents.updateAgent(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

agents.getAgent(ref) ⇒ Promise.<GetAgentResponse>

+

Gets an Agent from Routr.

+

Kind: instance method of Agents
+Returns: Promise.<GetAgentResponse> - The Agent

+
ParamTypeDescription
refstringThe Agent's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

agents.getAgent(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

agents.deleteAgent(ref) ⇒ Promise.<void>

+

Deletes an Agent from Routr.

+

Kind: instance method of Agents

+
ParamTypeDescription
refstringThe Agent's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

agents.deleteAgent(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

agents.listAgents(request) ⇒ Promise.<ListAgentResponse>

+

Lists all Agents from Routr with pagination.

+

Kind: instance method of Agents
+Returns: Promise.<ListAgentResponse> - The list of Agents in the current page

+
ParamTypeDescription
requestListAgentRequestThe request to list Agents
request.pageSizenumberThe number of Agents to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

agents.listAgents(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

Credentials ⇐ APIClient

+

Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get +and delete Credentials. The Credentials API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new Credentials(options)

Constructs a new Credentials API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const credentials = new SDK.Credentials()

const request = {
name: "Credentials for John Doe",
username: "jdoe",
password: "123456",
extended: {
"key": "value"
}
}

credentials.createCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred

credentials.createCredentials(request) ⇒ Promise.<CreateCredentialsResponse>

Creates a new Credentials on Routr.

Kind: instance method of Credentials
-Returns: Promise.<CreateCredentialsResponse> - The newly created Credentials
-Throws:

  • if request is null
ParamTypeDescription
requestCreateCredentialsRequestThe request to create an Credentials
request.namestringThe friendly name of the Credentials
request.usernamestringUsername of the Credentials
request.passwordstringPassword of the Credentials
request.extendedObjectOptional extended attributes

Example

const request = {
name: "Credentials for John Doe",
username: "jdoe",
password: "123456",
extended: {
"key": "value"
}
}

credentials.createCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred

credentials.updateCredentials(request) ⇒ Promise.<UpdateCredentialsResponse>

Updates an already existing Credentials on Routr.

Kind: instance method of Credentials
-Returns: Promise.<UpdateCredentialsResponse> - The updated Credentials

ParamTypeDescription
requestUpdateCredentialsRequestPartial with the fields to update
request.namestringThe friendly name of the Credentials
request.usernamestringUsername of the Credentials
request.passwordstringPassword of the Credentials
request.extendedObjectOptional extended attributes

Example

const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "John Doe's Credentials"
}

credentials.updateCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred

credentials.getCredentials(ref) ⇒ Promise.<GetCredentialsResponse>

Gets an Credentials from Routr.

Kind: instance method of Credentials
-Returns: Promise.<GetCredentialsResponse> - The Credentials

ParamTypeDescription
refstringThe Credentials's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

credentials.getCredentials(ref)
.then(console.log)
.catch(console.error) // an error occurred

credentials.deleteCredentials(ref) ⇒ Promise.<void>

Deletes an Credentials from Routr.

Kind: instance method of Credentials

ParamTypeDescription
refstringThe Credentials's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

credentials.deleteCredentials(ref)
.then(console.log)
.catch(console.error) // an error occurred

credentials.listCredentials(request) ⇒ Promise.<ListCredentialsResponse>

Lists all Credentials from Routr with pagination.

Kind: instance method of Credentials
-Returns: Promise.<ListCredentialsResponse> - The list of Credentials in the current page

ParamTypeDescription
requestListCredentialsRequestThe request to list Credentials
request.pageSizenumberThe number of Credentials to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

credentials.listCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred

Domains ⇐ APIClient

Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get -and delete Domains. The Domains API requires of a running Routr deployment.

Kind: global class
+See: module:core:APIClient

+ + +

new Credentials(options)

+

Constructs a new Credentials API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const credentials = new SDK.Credentials()

const request = {
name: "Credentials for John Doe",
username: "jdoe",
password: "123456",
extended: {
"key": "value"
}
}

credentials.createCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

credentials.createCredentials(request) ⇒ Promise.<CreateCredentialsResponse>

+

Creates a new Credentials on Routr.

+

Kind: instance method of Credentials
+Returns: Promise.<CreateCredentialsResponse> - The newly created Credentials
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreateCredentialsRequestThe request to create an Credentials
request.namestringThe friendly name of the Credentials
request.usernamestringUsername of the Credentials
request.passwordstringPassword of the Credentials
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
name: "Credentials for John Doe",
username: "jdoe",
password: "123456",
extended: {
"key": "value"
}
}

credentials.createCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

credentials.updateCredentials(request) ⇒ Promise.<UpdateCredentialsResponse>

+

Updates an already existing Credentials on Routr.

+

Kind: instance method of Credentials
+Returns: Promise.<UpdateCredentialsResponse> - The updated Credentials

+
ParamTypeDescription
requestUpdateCredentialsRequestPartial with the fields to update
request.namestringThe friendly name of the Credentials
request.usernamestringUsername of the Credentials
request.passwordstringPassword of the Credentials
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "John Doe's Credentials"
}

credentials.updateCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

credentials.getCredentials(ref) ⇒ Promise.<GetCredentialsResponse>

+

Gets an Credentials from Routr.

+

Kind: instance method of Credentials
+Returns: Promise.<GetCredentialsResponse> - The Credentials

+
ParamTypeDescription
refstringThe Credentials's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

credentials.getCredentials(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

credentials.deleteCredentials(ref) ⇒ Promise.<void>

+

Deletes an Credentials from Routr.

+

Kind: instance method of Credentials

+
ParamTypeDescription
refstringThe Credentials's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

credentials.deleteCredentials(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

credentials.listCredentials(request) ⇒ Promise.<ListCredentialsResponse>

+

Lists all Credentials from Routr with pagination.

+

Kind: instance method of Credentials
+Returns: Promise.<ListCredentialsResponse> - The list of Credentials in the current page

+
ParamTypeDescription
requestListCredentialsRequestThe request to list Credentials
request.pageSizenumberThe number of Credentials to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

credentials.listCredentials(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

Domains ⇐ APIClient

+

Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get +and delete Domains. The Domains API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new Domains(options)

Constructs a new Domain API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const domains = new SDK.Domains()

const request = {
name: "Local domain",
domainUri: "sip.local",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
egressPolicies: [{
rule: ".*",
numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}],
extended: {
"key": "value"
}
}

domains.createDomain(request)
.then(console.log)
.catch(console.error) // an error occurred

domains.createDomain(request) ⇒ Promise.<CreateDomainResponse>

Creates a new Domain on Routr.

Kind: instance method of Domains
-Returns: Promise.<CreateDomainResponse> - The newly created Domain
-Throws:

  • if request is null
ParamTypeDescription
requestCreateDomainRequestThe request to create an Domain
request.namestringName of the Domain
request.domainUristringThe FQDN of the Domain
request.accessControlListRefstringThe reference to the AccessControlList for the Domain
request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
request.extendedstringOptional extended attributes

Example

const request = {
name: "Local domain",
domainUri: "sip.local",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
egressPolicies: [{
rule: ".*",
numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}],
extended: {
"key": "value"
}
}

domains.createDomain(request)
.then(console.log)
.catch(console.error) // an error occurred

domains.updateDomain(request) ⇒ Promise.<UpdateDomainResponse>

Updates an already existing Domain on Routr.

Kind: instance method of Domains
-Returns: Promise.<UpdateDomainResponse> - The updated Domain

ParamTypeDescription
requestUpdateDomainRequestPartial with the fields to update
request.namestringName of the Domain
request.accessControlListRefstringThe reference to the AccessControlList for the Domain
request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
request.extendedstringOptional extended attributes

Example

const request = {
name: "Local domain updated",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}

domains.updateDomain(request)
.then(console.log)
.catch(console.error) // an error occurred

domains.getDomain(ref) ⇒ Promise.<GetDomainResponse>

Gets a Domain from Routr.

Kind: instance method of Domains
-Returns: Promise.<GetDomainResponse> - The Domain

ParamTypeDescription
refstringThe Domain's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

domains.getDomain(ref)
.then(console.log)
.catch(console.error) // an error occurred

domains.deleteDomain(ref) ⇒ Promise.<void>

Deletes a Domain from Routr.

Kind: instance method of Domains

ParamTypeDescription
refstringThe Domain's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

domains.deleteDomain(ref)
.then(console.log)
.catch(console.error) // an error occurred

domains.listDomains(request) ⇒ Promise.<ListDomainResponse>

Lists all Domains from Routr with pagination.

Kind: instance method of Domains
-Returns: Promise.<ListDomainResponse> - The list of Domains

ParamTypeDescription
requestListDomainRequestThe request to list Domains
request.pageSizenumberThe number of Domains to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

domains.listDomains(request)
.then(console.log)
.catch(console.error) // an error occurred

Numbers ⇐ APIClient

Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get -and delete Numbers. The Number API requires of a running Routr deployment.

Kind: global class
+See: module:core:APIClient

+ + +

new Domains(options)

+

Constructs a new Domain API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const domains = new SDK.Domains()

const request = {
name: "Local domain",
domainUri: "sip.local",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
egressPolicies: [{
rule: ".*",
numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}],
extended: {
"key": "value"
}
}

domains.createDomain(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

domains.createDomain(request) ⇒ Promise.<CreateDomainResponse>

+

Creates a new Domain on Routr.

+

Kind: instance method of Domains
+Returns: Promise.<CreateDomainResponse> - The newly created Domain
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreateDomainRequestThe request to create an Domain
request.namestringName of the Domain
request.domainUristringThe FQDN of the Domain
request.accessControlListRefstringThe reference to the AccessControlList for the Domain
request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
request.extendedstringOptional extended attributes
+

Example

+
const request = {
name: "Local domain",
domainUri: "sip.local",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
egressPolicies: [{
rule: ".*",
numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}],
extended: {
"key": "value"
}
}

domains.createDomain(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

domains.updateDomain(request) ⇒ Promise.<UpdateDomainResponse>

+

Updates an already existing Domain on Routr.

+

Kind: instance method of Domains
+Returns: Promise.<UpdateDomainResponse> - The updated Domain

+
ParamTypeDescription
requestUpdateDomainRequestPartial with the fields to update
request.namestringName of the Domain
request.accessControlListRefstringThe reference to the AccessControlList for the Domain
request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
request.extendedstringOptional extended attributes
+

Example

+
const request = {
name: "Local domain updated",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
}

domains.updateDomain(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

domains.getDomain(ref) ⇒ Promise.<GetDomainResponse>

+

Gets a Domain from Routr.

+

Kind: instance method of Domains
+Returns: Promise.<GetDomainResponse> - The Domain

+
ParamTypeDescription
refstringThe Domain's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

domains.getDomain(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

domains.deleteDomain(ref) ⇒ Promise.<void>

+

Deletes a Domain from Routr.

+

Kind: instance method of Domains

+
ParamTypeDescription
refstringThe Domain's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

domains.deleteDomain(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

domains.listDomains(request) ⇒ Promise.<ListDomainResponse>

+

Lists all Domains from Routr with pagination.

+

Kind: instance method of Domains
+Returns: Promise.<ListDomainResponse> - The list of Domains

+
ParamTypeDescription
requestListDomainRequestThe request to list Domains
request.pageSizenumberThe number of Domains to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

domains.listDomains(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

Numbers ⇐ APIClient

+

Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get +and delete Numbers. The Number API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new Numbers(options)

Constructs a new Number API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const numbers = new SDK.Numbers()

const request = {
name: "(415) 555-1212",
telUrl: "teL:+14155551212",
trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
aorLink: "sip:100@sip.local",
city: "San Francisco",
country: "United States",
countryISOCode: "US",
sessionAffinityHeader: "X-Room-Id"
extraHeaders: [{
name: "X-Room-Id",
value: "abc-us-123"
}],
extended: {
"key": "value"
}
}

numbers.createNumber(request)
.then(console.log)
.catch(console.error) // an error occurred

numbers.createNumber(request) ⇒ Promise.<CreateNumberResponse>

Creates a new Number on Routr.

Kind: instance method of Numbers
-Returns: Promise.<CreateNumberResponse> - The newly created Number
-Throws:

  • if request is null
ParamTypeDescription
requestCreateNumberRequestThe request to create an Number
request.namestringName of the Number
request.telUrlstringThe number URI to be used (e.g., te:+1234567890)
request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
request.citystringThe city where the number is located
request.countrystringThe country where the number is located
request.countryISOCodestringThe country ISO code where the number is located
request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
request.trunkRefstringThe Trunk reference to be used
request.sessionAffinityHeaderstringOptional session affinity header
request.extendedstringOptional extended attributes

Example

const request = {
name: "(415) 555-1212",
telUrl: "teL:+14155551212",
trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
aorLink: "sip:100@sip.local",
city: "San Francisco",
country: "United States",
countryISOCode: "US",
sessionAffinityHeader: "X-Room-Id"
extraHeaders: [{
name: "X-Room-Id",
value: "abc-us-123"
}],
extended: {
"key": "value"
}
}

numbers.createNumber(request)
.then(console.log)
.catch(console.error) // an error occurred

numbers.updateNumber(request) ⇒ Promise.<UpdateNumberResponse>

Updates an already existing Number on Routr.

Kind: instance method of Numbers
-Returns: Promise.<UpdateNumberResponse> - The updated Number

ParamTypeDescription
requestUpdateNumberRequestPartial with the fields to update
request.namestringName of the Number
request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
request.trunkRefstringThe Trunk reference to be used
request.sessionAffinityHeaderstringOptional session affinity header
request.extendedstringOptional extended attributes

Example

const request = {
name: "(415) 555-1212 (friendly name)",
aorLink: "sip:2001@sip.local"
}

numbers.updateNumber(request)
.then(console.log)
.catch(console.error) // an error occurred

numbers.getNumber(ref) ⇒ Promise.<GetNumberResponse>

Gets a Number from Routr.

Kind: instance method of Numbers
-Returns: Promise.<GetNumberResponse> - The Number

ParamTypeDescription
refstringThe Number's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

numbers.getNumber(ref)
.then(console.log)
.catch(console.error) // an error occurred

numbers.deleteNumber(ref) ⇒ Promise.<void>

Deletes a Number from Routr.

Kind: instance method of Numbers

ParamTypeDescription
refstringThe Number's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

numbers.deleteNumber(ref)
.then(console.log)
.catch(console.error) // an error occurred

numbers.listNumbers(request) ⇒ Promise.<ListNumberResponse>

Lists all Numbers from Routr with pagination.

Kind: instance method of Numbers
-Returns: Promise.<ListNumberResponse> - The list of Numbers

ParamTypeDescription
requestListNumberRequestThe request to list Numbers
request.pageSizenumberThe number of Numbers to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

numbers.listNumbers(request)
.then(console.log)
.catch(console.error) // an error occurred

Peers ⇐ APIClient

Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get -and delete Peers. The Peers API requires of a running Routr deployment.

Kind: global class
+See: module:core:APIClient

+ + +

new Numbers(options)

+

Constructs a new Number API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const numbers = new SDK.Numbers()

const request = {
name: "(415) 555-1212",
telUrl: "teL:+14155551212",
trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
aorLink: "sip:100@sip.local",
city: "San Francisco",
country: "United States",
countryISOCode: "US",
sessionAffinityHeader: "X-Room-Id"
extraHeaders: [{
name: "X-Room-Id",
value: "abc-us-123"
}],
extended: {
"key": "value"
}
}

numbers.createNumber(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

numbers.createNumber(request) ⇒ Promise.<CreateNumberResponse>

+

Creates a new Number on Routr.

+

Kind: instance method of Numbers
+Returns: Promise.<CreateNumberResponse> - The newly created Number
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreateNumberRequestThe request to create an Number
request.namestringName of the Number
request.telUrlstringThe number URI to be used (e.g., te:+1234567890)
request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
request.citystringThe city where the number is located
request.countrystringThe country where the number is located
request.countryISOCodestringThe country ISO code where the number is located
request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
request.trunkRefstringThe Trunk reference to be used
request.sessionAffinityHeaderstringOptional session affinity header
request.extendedstringOptional extended attributes
+

Example

+
const request = {
name: "(415) 555-1212",
telUrl: "teL:+14155551212",
trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
aorLink: "sip:100@sip.local",
city: "San Francisco",
country: "United States",
countryISOCode: "US",
sessionAffinityHeader: "X-Room-Id"
extraHeaders: [{
name: "X-Room-Id",
value: "abc-us-123"
}],
extended: {
"key": "value"
}
}

numbers.createNumber(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

numbers.updateNumber(request) ⇒ Promise.<UpdateNumberResponse>

+

Updates an already existing Number on Routr.

+

Kind: instance method of Numbers
+Returns: Promise.<UpdateNumberResponse> - The updated Number

+
ParamTypeDescription
requestUpdateNumberRequestPartial with the fields to update
request.namestringName of the Number
request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
request.trunkRefstringThe Trunk reference to be used
request.sessionAffinityHeaderstringOptional session affinity header
request.extendedstringOptional extended attributes
+

Example

+
const request = {
name: "(415) 555-1212 (friendly name)",
aorLink: "sip:2001@sip.local"
}

numbers.updateNumber(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

numbers.getNumber(ref) ⇒ Promise.<GetNumberResponse>

+

Gets a Number from Routr.

+

Kind: instance method of Numbers
+Returns: Promise.<GetNumberResponse> - The Number

+
ParamTypeDescription
refstringThe Number's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

numbers.getNumber(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

numbers.deleteNumber(ref) ⇒ Promise.<void>

+

Deletes a Number from Routr.

+

Kind: instance method of Numbers

+
ParamTypeDescription
refstringThe Number's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

numbers.deleteNumber(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

numbers.listNumbers(request) ⇒ Promise.<ListNumberResponse>

+

Lists all Numbers from Routr with pagination.

+

Kind: instance method of Numbers
+Returns: Promise.<ListNumberResponse> - The list of Numbers

+
ParamTypeDescription
requestListNumberRequestThe request to list Numbers
request.pageSizenumberThe number of Numbers to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

numbers.listNumbers(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

Peers ⇐ APIClient

+

Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get +and delete Peers. The Peers API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new Peers(options)

Constructs a new Peer API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const peers = new SDK.Peers()

const request = {
name: "Asterisk Conference Server",
username: "conference",
aor: "sip:conference@sip.local",
contactAddr: "10.0.0.1:5060",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
withSessionAffinity: true,
enabled: true,
extended: {
"key": "value"
}
}

peers.createPeer(request)
.then(console.log)
.catch(console.error) // an error occurred

peers.createPeer(request) ⇒ Promise.<CreatePeerResponse>

Creates a new Peer on Routr.

Kind: instance method of Peers
-Returns: Promise.<CreatePeerResponse> - The newly created Peer
-Throws:

  • if request is null
ParamTypeDescription
requestCreatePeerRequestThe request to create an Peer
request.namestringName of the Peer
request.aorstringAddress of Record of the Peer
request.contactAddrstringOptional contact address of the Peer
request.accessControlListRefstringAccess Control List reference of the Peer
request.credentialsRefstringCredentials reference of the Credentials for the Peer
request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
request.enabledbooleanWhether the Peer is enabled or not (for future use)
request.extendedObjectOptional extended attributes

Example

const request = {
name: "Asterisk Conference Server",
username: "conference",
aor: "sip:conference@sip.local",
contactAddr: "10.0.0.1:5060",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
withSessionAffinity: true,
enabled: true,
extended: {
"key": "value"
}
}

peers.createPeer(request)
.then(console.log)
.catch(console.error) // an error occurred

peers.updatePeer(request) ⇒ Promise.<UpdatePeerResponse>

Updates an already existing Peer on Routr.

Kind: instance method of Peers
-Returns: Promise.<UpdatePeerResponse> - The updated Peer

ParamTypeDescription
requestUpdatePeerRequestPartial with the fields to update
request.namestringName of the Peer
request.aorstringAddress of Record of the Peer
request.contactAddrstringOptional contact address of the Peer
request.accessControlListRefstringAccess Control List reference of the Peer
request.credentialsRefstringCredentials reference of the Credentials for the Peer
request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
request.enabledbooleanWhether the Peer is enabled or not (for future use)
request.extendedObjectOptional extended attributes

Example

const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "Feature Server"
}

peers.updatePeer(request)
.then(console.log)
.catch(console.error) // an error occurred

peers.getPeer(ref) ⇒ Promise.<GetPeerResponse>

Gets an Peer from Routr.

Kind: instance method of Peers
-Returns: Promise.<GetPeerResponse> - The Peer

ParamTypeDescription
refstringThe Peer's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

peers.getPeer(ref)
.then(console.log)
.catch(console.error) // an error occurred

peers.deletePeer(ref) ⇒ Promise.<void>

Deletes an Peer from Routr.

Kind: instance method of Peers

ParamTypeDescription
refstringThe Peer's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

peers.deletePeer(ref)
.then(console.log)
.catch(console.error) // an error occurred

peers.listPeers(request) ⇒ Promise.<ListPeerResponse>

Lists all Peers from Routr with pagination.

Kind: instance method of Peers
-Returns: Promise.<ListPeerResponse> - The list of Peers in the current page

ParamTypeDescription
requestListPeerRequestThe request to list Peers
request.pageSizenumberThe number of Peers to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

peers.listPeers(request)
.then(console.log)
.catch(console.error) // an error occurred

Trunks ⇐ APIClient

Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get -and delete Trunks. The Trunks API requires of a running Routr deployment.

Kind: global class
+See: module:core:APIClient

+ + +

new Peers(options)

+

Constructs a new Peer API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const peers = new SDK.Peers()

const request = {
name: "Asterisk Conference Server",
username: "conference",
aor: "sip:conference@sip.local",
contactAddr: "10.0.0.1:5060",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
withSessionAffinity: true,
enabled: true,
extended: {
"key": "value"
}
}

peers.createPeer(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

peers.createPeer(request) ⇒ Promise.<CreatePeerResponse>

+

Creates a new Peer on Routr.

+

Kind: instance method of Peers
+Returns: Promise.<CreatePeerResponse> - The newly created Peer
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreatePeerRequestThe request to create an Peer
request.namestringName of the Peer
request.aorstringAddress of Record of the Peer
request.contactAddrstringOptional contact address of the Peer
request.accessControlListRefstringAccess Control List reference of the Peer
request.credentialsRefstringCredentials reference of the Credentials for the Peer
request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
request.enabledbooleanWhether the Peer is enabled or not (for future use)
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
name: "Asterisk Conference Server",
username: "conference",
aor: "sip:conference@sip.local",
contactAddr: "10.0.0.1:5060",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
withSessionAffinity: true,
enabled: true,
extended: {
"key": "value"
}
}

peers.createPeer(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

peers.updatePeer(request) ⇒ Promise.<UpdatePeerResponse>

+

Updates an already existing Peer on Routr.

+

Kind: instance method of Peers
+Returns: Promise.<UpdatePeerResponse> - The updated Peer

+
ParamTypeDescription
requestUpdatePeerRequestPartial with the fields to update
request.namestringName of the Peer
request.aorstringAddress of Record of the Peer
request.contactAddrstringOptional contact address of the Peer
request.accessControlListRefstringAccess Control List reference of the Peer
request.credentialsRefstringCredentials reference of the Credentials for the Peer
request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
request.enabledbooleanWhether the Peer is enabled or not (for future use)
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "Feature Server"
}

peers.updatePeer(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

peers.getPeer(ref) ⇒ Promise.<GetPeerResponse>

+

Gets an Peer from Routr.

+

Kind: instance method of Peers
+Returns: Promise.<GetPeerResponse> - The Peer

+
ParamTypeDescription
refstringThe Peer's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

peers.getPeer(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

peers.deletePeer(ref) ⇒ Promise.<void>

+

Deletes an Peer from Routr.

+

Kind: instance method of Peers

+
ParamTypeDescription
refstringThe Peer's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

peers.deletePeer(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

peers.listPeers(request) ⇒ Promise.<ListPeerResponse>

+

Lists all Peers from Routr with pagination.

+

Kind: instance method of Peers
+Returns: Promise.<ListPeerResponse> - The list of Peers in the current page

+
ParamTypeDescription
requestListPeerRequestThe request to list Peers
request.pageSizenumberThe number of Peers to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

peers.listPeers(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

Trunks ⇐ APIClient

+

Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get +and delete Trunks. The Trunks API requires of a running Routr deployment.

+

Kind: global class
Extends: APIClient
-See: module:core:APIClient

new Trunks(options)

Constructs a new Trunk API object.

ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint

Example

const SDK = require("@routr/sdk")
const trunks = new SDK.Trunks()

const request = {
name: "Trunk from Twilio",
inboundUri: "sip:twilio.sip.acme.io",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
uris: [{
host: "acme.sip.twilio.com",
port: 5060,
transport: "udp",
user: "AC1234567890",
weight: 1,
priority: 1
}],
extended: {
"key": "value"
}
}

trunks.createTrunk(request)
.then(console.log)
.catch(console.error) // an error occurred

trunks.createTrunk(request) ⇒ Promise.<CreateTrunkResponse>

Creates a new Trunk on Routr.

Kind: instance method of Trunks
-Returns: Promise.<CreateTrunkResponse> - The newly created Trunk
-Throws:

  • if request is null
ParamTypeDescription
requestCreateTrunkRequestThe request to create an Trunk
request.namestringName of the Trunk
request.inboundUristringInbound URI of the Trunk
request.accessControlListRefstringAccess Control List reference
request.inboundCredentialsRefstringThe reference of the inbound credentials
request.outboundCredentialsRefstringThe reference of the outbound credentials
request.urisArray.<TrunkURI>The outbound URIs of the Trunk

Example

const request = {
name: "Trunk from Twilio",
inboundUri: "sip:twilio.sip.acme.io",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
uris: [{
host: "acme.sip.twilio.com",
port: 5060,
transport: "udp",
user: "AC1234567890",
weight: 1,
priority: 1
}],
extended: {
"key": "value"
}
}

trunks.createTrunk(request)
.then(console.log)
.catch(console.error) // an error occurred

trunks.updateTrunk(request) ⇒ Promise.<UpdateTrunkResponse>

Updates an already existing Trunk on Routr.

Kind: instance method of Trunks
-Returns: Promise.<UpdateTrunkResponse> - The updated Trunk

ParamTypeDescription
requestUpdateTrunkRequestPartial with the fields to update
request.namestringName of the Trunk
request.inboundUristringInbound URI of the Trunk
request.accessControlListRefstringAccess Control List reference
request.inboundCredentialsRefstringThe reference of the inbound credentials
request.outboundCredentialsRefstringThe reference of the outbound credentials
request.urisArray.<TrunkURI>The outbound URIs of the Trunk
request.extendedObjectOptional extended attributes

Example

const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "Trunk from Twilio (US-East)",
}

trunks.updateTrunk(request)
.then(console.log)
.catch(console.error) // an error occurred

trunks.getTrunk(ref) ⇒ Promise.<GetTrunkResponse>

Gets an Trunk from Routr.

Kind: instance method of Trunks
-Returns: Promise.<GetTrunkResponse> - The Trunk

ParamTypeDescription
refstringThe Trunk's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

trunks.getTrunk(ref)
.then(console.log)
.catch(console.error) // an error occurred

trunks.deleteTrunk(ref) ⇒ Promise.<void>

Deletes an Trunk from Routr.

Kind: instance method of Trunks

ParamTypeDescription
refstringThe Trunk's reference

Example

const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

trunks.deleteTrunk(ref)
.then(console.log)
.catch(console.error) // an error occurred

trunks.listTrunks(request) ⇒ Promise.<ListTrunkResponse>

Lists all Trunks from Routr with pagination.

Kind: instance method of Trunks
-Returns: Promise.<ListTrunkResponse> - The list of Trunks in the current page

ParamTypeDescription
requestListTrunkRequestThe request to list Trunks
request.pageSizenumberThe number of Trunks to return
request.pageTokenstringThe page token to use for pagination

Example

const request = {
pageSize: 10
}

trunks.listTrunks(request)
.then(console.log)
.catch(console.error) // an error occurred
- - +See: module:core:APIClient

+ + +

new Trunks(options)

+

Constructs a new Trunk API object.

+
ParamTypeDescription
optionsClientOptionsOptions to indicate the objects endpoint
+

Example

+
const SDK = require("@routr/sdk")
const trunks = new SDK.Trunks()

const request = {
name: "Trunk from Twilio",
inboundUri: "sip:twilio.sip.acme.io",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
uris: [{
host: "acme.sip.twilio.com",
port: 5060,
transport: "udp",
user: "AC1234567890",
weight: 1,
priority: 1
}],
extended: {
"key": "value"
}
}

trunks.createTrunk(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

trunks.createTrunk(request) ⇒ Promise.<CreateTrunkResponse>

+

Creates a new Trunk on Routr.

+

Kind: instance method of Trunks
+Returns: Promise.<CreateTrunkResponse> - The newly created Trunk
+Throws:

+
    +
  • if request is null
  • +
+
ParamTypeDescription
requestCreateTrunkRequestThe request to create an Trunk
request.namestringName of the Trunk
request.inboundUristringInbound URI of the Trunk
request.accessControlListRefstringAccess Control List reference
request.inboundCredentialsRefstringThe reference of the inbound credentials
request.outboundCredentialsRefstringThe reference of the outbound credentials
request.urisArray.<TrunkURI>The outbound URIs of the Trunk
+

Example

+
const request = {
name: "Trunk from Twilio",
inboundUri: "sip:twilio.sip.acme.io",
accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
uris: [{
host: "acme.sip.twilio.com",
port: 5060,
transport: "udp",
user: "AC1234567890",
weight: 1,
priority: 1
}],
extended: {
"key": "value"
}
}

trunks.createTrunk(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

trunks.updateTrunk(request) ⇒ Promise.<UpdateTrunkResponse>

+

Updates an already existing Trunk on Routr.

+

Kind: instance method of Trunks
+Returns: Promise.<UpdateTrunkResponse> - The updated Trunk

+
ParamTypeDescription
requestUpdateTrunkRequestPartial with the fields to update
request.namestringName of the Trunk
request.inboundUristringInbound URI of the Trunk
request.accessControlListRefstringAccess Control List reference
request.inboundCredentialsRefstringThe reference of the inbound credentials
request.outboundCredentialsRefstringThe reference of the outbound credentials
request.urisArray.<TrunkURI>The outbound URIs of the Trunk
request.extendedObjectOptional extended attributes
+

Example

+
const request = {
ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
name: "Trunk from Twilio (US-East)",
}

trunks.updateTrunk(request)
.then(console.log)
.catch(console.error) // an error occurred
+ +

trunks.getTrunk(ref) ⇒ Promise.<GetTrunkResponse>

+

Gets an Trunk from Routr.

+

Kind: instance method of Trunks
+Returns: Promise.<GetTrunkResponse> - The Trunk

+
ParamTypeDescription
refstringThe Trunk's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

trunks.getTrunk(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

trunks.deleteTrunk(ref) ⇒ Promise.<void>

+

Deletes an Trunk from Routr.

+

Kind: instance method of Trunks

+
ParamTypeDescription
refstringThe Trunk's reference
+

Example

+
const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

trunks.deleteTrunk(ref)
.then(console.log)
.catch(console.error) // an error occurred
+ +

trunks.listTrunks(request) ⇒ Promise.<ListTrunkResponse>

+

Lists all Trunks from Routr with pagination.

+

Kind: instance method of Trunks
+Returns: Promise.<ListTrunkResponse> - The list of Trunks in the current page

+
ParamTypeDescription
requestListTrunkRequestThe request to list Trunks
request.pageSizenumberThe number of Trunks to return
request.pageTokenstringThe page token to use for pagination
+

Example

+
const request = {
pageSize: 10
}

trunks.listTrunks(request)
.then(console.log)
.catch(console.error) // an error occurred
\ No newline at end of file diff --git a/docs/2.0.0/connect/quick-start/docker/index.html b/docs/2.0.0/connect/quick-start/docker/index.html index 0187f91d8..975b61211 100644 --- a/docs/2.0.0/connect/quick-start/docker/index.html +++ b/docs/2.0.0/connect/quick-start/docker/index.html @@ -1,22 +1,38 @@ - + - -Docker installation | Routr Docs + +Docker installation | Routr Docs - - - + + + -
-
Version: 2.0.0

Docker installation

First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

Filename: compose.yaml

version: "3"

services:

routr:
image: fonoster/routr-one:latest
environment:
EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
ports:
- 51908:51908
- 5060:5060/udp

volumes:
shared:

Then, start the server with:

# Be sure to replace with your IP address
DOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up

Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:

docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'

You should see a containers with its status. Your output should look like the one below:

CONTAINER ID  IMAGE                                     STATUS
6c63fd573768 fonoster/routr-one:latest Up About a minute

If the status of your service is "Up," you are ready to go.

Finally, install the command-line tool and start building your SIP Network.

You can install the tool with npm as follows:

npm install --location=global @routr/ctl

And here is an example of creating a SIP Domain:

rctl domains create --insecure

The --insecure flag is required as we did not set up the TLS settings.

For additional examples, refer to the command line documentation.

- - +
Version: 2.0.0

Docker installation

+

First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

+

Filename: compose.yaml

+
version: "3"

services:

routr:
image: fonoster/routr-one:latest
environment:
EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
ports:
- 51908:51908
- 5060:5060/udp

volumes:
shared:
+

Then, start the server with:

+
# Be sure to replace with your IP address
DOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up
+

Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:

+
docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'
+

You should see a containers with its status. Your output should look like the one below:

+
CONTAINER ID  IMAGE                                     STATUS
6c63fd573768 fonoster/routr-one:latest Up About a minute
+

If the status of your service is "Up," you are ready to go.

+

Finally, install the command-line tool and start building your SIP Network.

+

You can install the tool with npm as follows:

+
npm install --location=global @routr/ctl
+

And here is an example of creating a SIP Domain:

+
rctl domains create --insecure
+
+

The --insecure flag is required as we did not set up the TLS settings.

+
+

For additional examples, refer to the command line documentation.

\ No newline at end of file diff --git a/docs/2.0.0/connect/quick-start/kubernetes/index.html b/docs/2.0.0/connect/quick-start/kubernetes/index.html index d321babde..5495f8e12 100644 --- a/docs/2.0.0/connect/quick-start/kubernetes/index.html +++ b/docs/2.0.0/connect/quick-start/kubernetes/index.html @@ -1,22 +1,34 @@ - + - -Installing in Kubernetes | Routr Docs + +Installing in Kubernetes | Routr Docs - - - + + + -
-
Version: 2.0.0

Installing in Kubernetes

Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.

You can use Minikube or Docker Desktop to create a local Kubernetes cluster.

First, add the Helm repository:

helm repo add routr https://routr.io/charts
helm repo update

Then, create a namespace for Routr:

kubectl create namespace sipnet

Next, install Routr with the following command:

helm install sipnet routr/routr-connect --namespace sipnet

Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:

kubectl get pods -n sipnet

You should see a list of pods and their status. If the status is Running, then you are ready to go.

For more details, please refer to the chart's README.

Please see the Command-Line Tools section for detauls on how to interact with Routr Connect via the CLI.

- - +
Version: 2.0.0

Installing in Kubernetes

+

Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.

+
+

You can use Minikube or Docker Desktop to create a local Kubernetes cluster.

+
+

First, add the Helm repository:

+
helm repo add routr https://routr.io/charts
helm repo update
+

Then, create a namespace for Routr:

+
kubectl create namespace sipnet
+

Next, install Routr with the following command:

+
helm install sipnet routr/routr-connect --namespace sipnet
+

Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:

+
kubectl get pods -n sipnet
+

You should see a list of pods and their status. If the status is Running, then you are ready to go.

+

For more details, please refer to the chart's README.

+

Please see the Command-Line Tools section for detauls on how to interact with Routr Connect via the CLI.

\ No newline at end of file diff --git a/docs/2.0.0/connect/securing-the-server/index.html b/docs/2.0.0/connect/securing-the-server/index.html index 31e485275..d17ecf4f2 100644 --- a/docs/2.0.0/connect/securing-the-server/index.html +++ b/docs/2.0.0/connect/securing-the-server/index.html @@ -1,22 +1,20 @@ - + - -Securing the Server | Routr Docs + +Securing the Server | Routr Docs - - - + + + - - - + \ No newline at end of file diff --git a/docs/2.0.0/connect/sending-call-events-to-nats/index.html b/docs/2.0.0/connect/sending-call-events-to-nats/index.html index b713c01c0..d07cb08cd 100644 --- a/docs/2.0.0/connect/sending-call-events-to-nats/index.html +++ b/docs/2.0.0/connect/sending-call-events-to-nats/index.html @@ -1,23 +1,66 @@ - + - -Sending Call Events to NATS | Routr Docs + +Sending Call Events to NATS | Routr Docs - - - + + + -
-
Version: 2.0.0

Sending Call Events to NATS

Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATS_PUBLISHER_ENABLED to true as well as the environment variable NATS_PUBLISHER_URL to the URL of your NATS server. For example:

version: "3"
services:
routr:
image: fonoster/routr-one:latest
ports:
- 51908:51908
- 5060:5060/udp
environment:
- NATS_PUBLISHER_ENABLED=true
- NATS_PUBLISHER_URL=nats:4222

Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events. -As of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added.

To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:

nats context add nats \
--server demo.nats.io:4222 \
--description "nats events" \
--select

You should then see something like this:

NATS context add

In the previous command, we connected to the demo.nats.io server, which is a public NATS server. You can use your own NATS server if you have one.

Then, you can subscribe to the routr.call.started subject by running the following command:

nats sub routr.call.started

The routr.call.started event contains the following fields:

  • callId: The unique identifier of the call
  • from: The caller's phone number
  • to: The callee's phone number
  • startTime: The time the call started formatted as an ISO 8601 string
  • extraHeaders: Any extra headers that were sent with the call

Every header startarting with X- is considered an extra header. For example, if you send a call with the following headers:

X-My-Header: my-value
X-Another-Header: another-value

Then, the extraHeaders field will contain the following:

{
"X-My-Header": "my-value",
"X-Another-Header": "another-value"
}

After subscribing to the subject and making a call, you should see something like this:

NATS call started

Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events.

nats sub routr.call.ended

The routr.call.ended event contains the following fields:

  • callId: The unique identifier of the call
  • endTime: The time the call ended formatted as an ISO 8601 string
  • hangupCause: The reason the call ended
  • extraHeaders: Any extra headers that were sent with the call

Please see the HangupCause.java class for a list of possible hangup causes.

Lastly, you can subscribe to the routr.endpoint.registered subject to receive endpoint registered events.

nats sub routr.endpoint.registered

The routr.endpoint.registered event contains the following fields:

  • aor: The address of record of the endpoint
  • registeredAt: The time the endpoint registered formatted as an ISO 8601 string
  • expires: The time in seconds the endpoint will remain registered
  • extraHeaders: Any extra headers that were sent with the call

You can use the NATS_PUBLISHER_SUBJECT environment variable to change the based subject name. For example, you can set it to myserver to receive call events in the myserver.calls.started subject.

- - +
Version: 2.0.0

Sending Call Events to NATS

+

Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATS_PUBLISHER_ENABLED to true as well as the environment variable NATS_PUBLISHER_URL to the URL of your NATS server. For example:

+
version: "3"
services:
routr:
image: fonoster/routr-one:latest
ports:
- 51908:51908
- 5060:5060/udp
environment:
- NATS_PUBLISHER_ENABLED=true
- NATS_PUBLISHER_URL=nats:4222
+

Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events. +As of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added.

+

To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:

+
nats context add nats \
--server demo.nats.io:4222 \
--description "nats events" \
--select
+

You should then see something like this:

+

NATS context add

+

In the previous command, we connected to the demo.nats.io server, which is a public NATS server. You can use your own NATS server if you have one.

+

Then, you can subscribe to the routr.call.started subject by running the following command:

+
nats sub routr.call.started
+

The routr.call.started event contains the following fields:

+
    +
  • callId: The unique identifier of the call
  • +
  • from: The caller's phone number
  • +
  • to: The callee's phone number
  • +
  • startTime: The time the call started formatted as an ISO 8601 string
  • +
  • extraHeaders: Any extra headers that were sent with the call
  • +
+

Every header startarting with X- is considered an extra header. For example, if you send a call with the following headers:

+
X-My-Header: my-value
X-Another-Header: another-value
+

Then, the extraHeaders field will contain the following:

+
{
"X-My-Header": "my-value",
"X-Another-Header": "another-value"
}
+

After subscribing to the subject and making a call, you should see something like this:

+

NATS call started

+

Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events.

+
nats sub routr.call.ended
+

The routr.call.ended event contains the following fields:

+
    +
  • callId: The unique identifier of the call
  • +
  • endTime: The time the call ended formatted as an ISO 8601 string
  • +
  • hangupCause: The reason the call ended
  • +
  • extraHeaders: Any extra headers that were sent with the call
  • +
+
+

Please see the HangupCause.java class for a list of possible hangup causes.

+
+

Lastly, you can subscribe to the routr.endpoint.registered subject to receive endpoint registered events.

+
nats sub routr.endpoint.registered
+

The routr.endpoint.registered event contains the following fields:

+
    +
  • aor: The address of record of the endpoint
  • +
  • registeredAt: The time the endpoint registered formatted as an ISO 8601 string
  • +
  • expires: The time in seconds the endpoint will remain registered
  • +
  • extraHeaders: Any extra headers that were sent with the call
  • +
+

You can use the NATS_PUBLISHER_SUBJECT environment variable to change the based subject name. For example, you can set it to myserver to receive call events in the myserver.calls.started subject.

\ No newline at end of file diff --git a/docs/2.0.0/connect/webrtc-support/index.html b/docs/2.0.0/connect/webrtc-support/index.html index 40f9b0d97..45b55be81 100644 --- a/docs/2.0.0/connect/webrtc-support/index.html +++ b/docs/2.0.0/connect/webrtc-support/index.html @@ -1,22 +1,27 @@ - + - -WebRTC Support | Routr Docs + +WebRTC Support | Routr Docs - - - + + + -
-
Version: 2.0.0

WebRTC Support

The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.

Let’s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients.

Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step.

To enable WebRTC interoperability, you will need to update your compose.yaml file to include the RTPENGINE_HOST environment variable. Here is an example:

version: "3"

services:

routr:
image: fonoster/routr-one:latest
environment:
EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
RTPENGINE_HOST: ${RTPE_HOST}
ports:
- 51908:51908
- 5060:5060/udp

-- snip --

If using Helm, you will need to add the following configuration to your values.yaml file:

rtprelay:
enabled: true
rtpeHost: /* rtpengine */
rtpPort: 22222

Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere.

- - +
Version: 2.0.0

WebRTC Support

+

The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.

+

Let’s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients.

+

Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step.

+

To enable WebRTC interoperability, you will need to update your compose.yaml file to include the RTPENGINE_HOST environment variable. Here is an example:

+
version: "3"

services:

routr:
image: fonoster/routr-one:latest
environment:
EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
RTPENGINE_HOST: ${RTPE_HOST}
ports:
- 51908:51908
- 5060:5060/udp

-- snip --
+

If using Helm, you will need to add the following configuration to your values.yaml file:

+
rtprelay:
enabled: true
rtpeHost: /* rtpengine */
rtpPort: 22222
+

Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere.

\ No newline at end of file diff --git a/docs/2.0.0/contributing/index.html b/docs/2.0.0/contributing/index.html index 6366a9ccf..1d5d98db8 100644 --- a/docs/2.0.0/contributing/index.html +++ b/docs/2.0.0/contributing/index.html @@ -1,23 +1,105 @@ - + - -Contributing Guide | Routr Docs + +Contributing Guide | Routr Docs - - - + + + -
-
Version: 2.0.0

Contributing Guide

Welcome! We are glad that you want to contribute to our project! 💖

As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:

  • Problems found during setting up a new developer environment
  • Gaps in our Quickstart Guide or documentation
  • Bugs in our automation scripts

If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!

Ways to Contribute

We welcome many different types of contributions including:

  • New features
  • Builds, CI/CD
  • Bug fixes
  • Documentation
  • Issue Triage
  • Answering questions on Discord/GitHub Discussions
  • Web design
  • UI/UX
  • Communications / Social Media / Blog Posts
  • Release management

Not everything happens through a GitHub pull request. Please come to our meetings or contact us and let's discuss how we can work -together.

Come to Meetings

Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don’t have anything you feel like you want to contribute. Just being there is enough!

You can find out more about our meetings here. You don’t have to turn on your video. The first time you come, introducing yourself is more than enough.

Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences.

Find an Issue

We have good first issues for new contributors and help wanted issues suitable for any contributor. good first issue has extra information to help you make your first contribution. help wanted are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request.

Sometimes there won’t be any issues with these labels. That’s ok! There is likely still something for you to work on. If you want to contribute but you don’t know where to start or can't find a suitable issue, you can reach out to us via Discord or GitHub Discussions and we will help you find something.

Once you see an issue that you'd like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.

Ask for Help

The best way to reach us with a question when contributing is to ask on:

Pull Request Lifecycle

Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request.

After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:

  • Enhancements in your code
  • Additional tests or updates to the documentation
  • Changes in your implementation approach
  • Dividing your pull request into smaller, more manageable parts

Depending on the project’s roadmap and priorities, you might also be asked to:

  • Delay the integration of your pull request to align with future releases
  • Close your current pull request and, if needed, open a new one with revised changes

Development Environment Setup

See our Development environment setup guide to get started locally or using Gitpod.

Sign your Commits

DCO

Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The Developer Certificate of Origin (DCO) is a way to certify that you wrote and have the right to contribute the code you are submitting to the project.

You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit.

This is my commit message

Signed-off-by: Your Name <your.name@example.com>

Git has a -s command line option to do this automatically:

git commit -s -m 'This is my commit message'

If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running

git commit --amend -s

Pull Request Checklist

When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:

  • Your code builds and passes tests locally
  • Your code passes our automated checks
  • You have signed your commits
  • You have added tests for your code (if applicable)
  • You have updated the documentation (if applicable)
- - +
Version: 2.0.0

Contributing Guide

+ +

Welcome! We are glad that you want to contribute to our project! 💖

+

As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:

+
    +
  • Problems found during setting up a new developer environment
  • +
  • Gaps in our Quickstart Guide or documentation
  • +
  • Bugs in our automation scripts
  • +
+

If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!

+

Ways to Contribute

+

We welcome many different types of contributions including:

+
    +
  • New features
  • +
  • Builds, CI/CD
  • +
  • Bug fixes
  • +
  • Documentation
  • +
  • Issue Triage
  • +
  • Answering questions on Discord/GitHub Discussions
  • +
  • Web design
  • +
  • UI/UX
  • +
  • Communications / Social Media / Blog Posts
  • +
  • Release management
  • +
+

Not everything happens through a GitHub pull request. Please come to our meetings or contact us and let's discuss how we can work +together.

+

Come to Meetings

+

Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don’t have anything you feel like you want to contribute. Just being there is enough!

+

You can find out more about our meetings here. You don’t have to turn on your video. The first time you come, introducing yourself is more than enough.

+

Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences.

+

Find an Issue

+

We have good first issues for new contributors and help wanted issues suitable for any contributor. good first issue has extra information to help you make your first contribution. help wanted are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request.

+

Sometimes there won’t be any issues with these labels. That’s ok! There is likely still something for you to work on. If you want to contribute but you don’t know where to start or can't find a suitable issue, you can reach out to us via Discord or GitHub Discussions and we will help you find something.

+

Once you see an issue that you'd like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.

+

Ask for Help

+

The best way to reach us with a question when contributing is to ask on:

+ +

Pull Request Lifecycle

+

Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request.

+

After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:

+
    +
  • Enhancements in your code
  • +
  • Additional tests or updates to the documentation
  • +
  • Changes in your implementation approach
  • +
  • Dividing your pull request into smaller, more manageable parts
  • +
+

Depending on the project’s roadmap and priorities, you might also be asked to:

+
    +
  • Delay the integration of your pull request to align with future releases
  • +
  • Close your current pull request and, if needed, open a new one with revised changes
  • +
+

Development Environment Setup

+

See our Development environment setup guide to get started locally or using Gitpod.

+

Sign your Commits

+

DCO

+

Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The Developer Certificate of Origin (DCO) is a way to certify that you wrote and have the right to contribute the code you are submitting to the project.

+

You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit.

+
This is my commit message

Signed-off-by: Your Name <your.name@example.com>
+

Git has a -s command line option to do this automatically:

+
git commit -s -m 'This is my commit message'
+

If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running

+
git commit --amend -s
+

Pull Request Checklist

+

When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:

+
    +
  • Your code builds and passes tests locally
  • +
  • Your code passes our automated checks
  • +
  • You have signed your commits
  • +
  • You have added tests for your code (if applicable)
  • +
  • You have updated the documentation (if applicable)
  • +
\ No newline at end of file diff --git a/docs/2.0.0/development/alterations/methods/index.html b/docs/2.0.0/development/alterations/methods/index.html index e0c8c297b..8ff3e6d68 100644 --- a/docs/2.0.0/development/alterations/methods/index.html +++ b/docs/2.0.0/development/alterations/methods/index.html @@ -1,22 +1,20 @@ - + - -Alteration Methods | Routr Docs + +Alteration Methods | Routr Docs - - - + + + - - - + \ No newline at end of file diff --git a/docs/2.0.0/development/alterations/overview/index.html b/docs/2.0.0/development/alterations/overview/index.html index 0c7d5e4b3..48f76bd2c 100644 --- a/docs/2.0.0/development/alterations/overview/index.html +++ b/docs/2.0.0/development/alterations/overview/index.html @@ -1,22 +1,20 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + - - - + \ No newline at end of file diff --git a/docs/2.0.0/development/building-a-chat-application/index.html b/docs/2.0.0/development/building-a-chat-application/index.html index 63a328637..9f2791e3a 100644 --- a/docs/2.0.0/development/building-a-chat-application/index.html +++ b/docs/2.0.0/development/building-a-chat-application/index.html @@ -1,22 +1,20 @@ - + - -Building a Chat Application | Routr Docs + +Building a Chat Application | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/2.0.0/development/building-a-middleware/index.html b/docs/2.0.0/development/building-a-middleware/index.html index 6f19cca19..fc37107f7 100644 --- a/docs/2.0.0/development/building-a-middleware/index.html +++ b/docs/2.0.0/development/building-a-middleware/index.html @@ -1,22 +1,20 @@ - + - -Building a Middleware | Routr Docs + +Building a Middleware | Routr Docs - - - + + + -
-
Version: 2.0.0

Building a Middleware

Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.

- - +
Version: 2.0.0

Building a Middleware

+

Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.

\ No newline at end of file diff --git a/docs/2.0.0/development/building-a-processor/index.html b/docs/2.0.0/development/building-a-processor/index.html index f36eac94a..df506fa2c 100644 --- a/docs/2.0.0/development/building-a-processor/index.html +++ b/docs/2.0.0/development/building-a-processor/index.html @@ -1,22 +1,47 @@ - + - -Building a Processor | Routr Docs + +Building a Processor | Routr Docs - - - + + + -
-
Version: 2.0.0

Building a Processor

Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.

Here is a non-exhaustive list of things you can do with a Processor:

  • Build an instant messaging application
  • Create a custom logic for a SCAIP system
  • Build a SIP Recorder when combined with RTPEngine
  • Doorbell Camera System integration
  • Custom logic for a SIP IoT system

Processor Contract

A Processor is a gRPC service that implements the Processor interface. The interface is defined in the processor.proto file.

Here is the definition of the Processor interface:

syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of the calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid session information
INFO = 12;
// Asks the recipient to issue call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}

As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly.

You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS.

One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript.

As an example, here is the JSON representation of a SIP REGISTER message:

{
"ref": "AynhXaFtbdXwHrUEzt_rUQ..",
"edgePortRef": "edgeport-01",
"method": "REGISTER",
"externalAddrs": ["200.22.21.42"],
"localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],
"listeningPoints": [
{
"host": "0.0.0.0",
"port": 5060,
"transport": "TCP"
},
{
"host": "0.0.0.0",
"port": 5060,
"transport": "UDP"
}
],
"sender": {
"host": "127.0.0.1",
"port": 36214,
"transport": "TCP"
},
"message": {
"via": [
{
"host": "proxy",
"port": 5060,
"branch": "z9hG4bK-524287-1---7315a24d84546819",
"transport": "TCP"
},
{
"host": "127.0.0.1",
"port": 36214,
"branch": "z9hG4bK-524287-1---7315a24d84546819",
"transport": "TCP"
}
],
"extensions": [
{
"name": "CSeq",
"value": "14 REGISTER"
},
{
"name": "Allow",
"value": "INVITE"
},
{
"name": "User-Agent",
"value": "Z 5.4.12 v2.10.13.2"
},
{
"name": "Allow-Events",
"value": "presence"
}
],
"from": {
"address": {
"uri": {
"user": "1001",
"userPassword": "",
"host": "sip.local",
"transportParam": "UDP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "John Doe",
"wildcard": false
},
"tag": "9041462a"
},
"to": {
"address": {
"uri": {
"user": "1001",
"userPassword": "",
"host": "sip.local",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
},
"tag": ""
},
"contact": {
"address": {
"uri": {
"user": "1001",
"userPassword": "",
"host": "127.0.0.1",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 36214,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
},
"expires": -1,
"qValue": -1
},
"callId": {
"callId": "AynhXaFtbdXwHrUEzt_rUQ.."
},
"contentLength": {
"contentLength": 0
},
"maxForwards": {
"maxForwards": 70
},
"expires": {
"expires": 60
},
"recordRoute": [
{
"parameters": {
"a": "1",
"b": "2"
},
"address": {
"uri": {
"user": "",
"userPassword": "",
"host": "sip.local",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
}
}
],
"route": [
{
"parameters": null,
"address": {
"uri": {
"user": "",
"userPassword": "",
"host": "10.100.42.127",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
}
},
{
"parameters": null,
"address": {
"uri": {
"user": "",
"userPassword": "",
"host": "10.100.42.128",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
}
}
],
"authorization": {
"realm": "sip.local",
"scheme": "Digest",
"cNonce": "acbcc60094edde23f49b01e18bafd34e",
"nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",
"algorithm": "MD5",
"qop": "",
"opaque": "",
"response": "227fe247ff0b9fa4fcf2706b587bf995",
"username": "1001",
"uri": "sip:sip.local;transport=TCP",
"nonceCount": 13
},
"requestUri": {
"user": "",
"userPassword": "",
"host": "sip.local",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"messageType": "REQUEST"
}
}

Building a Processor from a Template

To make it easier to build processors, we provide a template you can use to get started. The template is available in the routr-processor-template.

To use the template, you must have NodeJS installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:

npx degit fonoster/nodejs-processor my-processor

The previous command will create a new folder called my-processor with the following structure:

.
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── commitlint.config.js
├── compose.yaml
├── package-lock.json
├── package.json
├── src
│ ├── envs.ts
│ ├── handlers.ts
│ └── index.ts
├── test
│ └── unit.test.ts
└── tsconfig.json

The most important file is the handlers.ts file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor.

From there, you can install the dependencies and start the processor:

cd my-processor
npm install
npm start

You may now start sending SIP messages to your processor from EdgePort or Dispatcher.

- - +
Version: 2.0.0

Building a Processor

+

Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.

+

Here is a non-exhaustive list of things you can do with a Processor:

+
    +
  • Build an instant messaging application
  • +
  • Create a custom logic for a SCAIP system
  • +
  • Build a SIP Recorder when combined with RTPEngine
  • +
  • Doorbell Camera System integration
  • +
  • Custom logic for a SIP IoT system
  • +
+

Processor Contract

+

A Processor is a gRPC service that implements the Processor interface. The interface is defined in the processor.proto file.

+

Here is the definition of the Processor interface:

+
syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of the calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid session information
INFO = 12;
// Asks the recipient to issue call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}
+

As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly.

+

You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS.

+

One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript.

+

As an example, here is the JSON representation of a SIP REGISTER message:

+
{
"ref": "AynhXaFtbdXwHrUEzt_rUQ..",
"edgePortRef": "edgeport-01",
"method": "REGISTER",
"externalAddrs": ["200.22.21.42"],
"localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],
"listeningPoints": [
{
"host": "0.0.0.0",
"port": 5060,
"transport": "TCP"
},
{
"host": "0.0.0.0",
"port": 5060,
"transport": "UDP"
}
],
"sender": {
"host": "127.0.0.1",
"port": 36214,
"transport": "TCP"
},
"message": {
"via": [
{
"host": "proxy",
"port": 5060,
"branch": "z9hG4bK-524287-1---7315a24d84546819",
"transport": "TCP"
},
{
"host": "127.0.0.1",
"port": 36214,
"branch": "z9hG4bK-524287-1---7315a24d84546819",
"transport": "TCP"
}
],
"extensions": [
{
"name": "CSeq",
"value": "14 REGISTER"
},
{
"name": "Allow",
"value": "INVITE"
},
{
"name": "User-Agent",
"value": "Z 5.4.12 v2.10.13.2"
},
{
"name": "Allow-Events",
"value": "presence"
}
],
"from": {
"address": {
"uri": {
"user": "1001",
"userPassword": "",
"host": "sip.local",
"transportParam": "UDP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "John Doe",
"wildcard": false
},
"tag": "9041462a"
},
"to": {
"address": {
"uri": {
"user": "1001",
"userPassword": "",
"host": "sip.local",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
},
"tag": ""
},
"contact": {
"address": {
"uri": {
"user": "1001",
"userPassword": "",
"host": "127.0.0.1",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 36214,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
},
"expires": -1,
"qValue": -1
},
"callId": {
"callId": "AynhXaFtbdXwHrUEzt_rUQ.."
},
"contentLength": {
"contentLength": 0
},
"maxForwards": {
"maxForwards": 70
},
"expires": {
"expires": 60
},
"recordRoute": [
{
"parameters": {
"a": "1",
"b": "2"
},
"address": {
"uri": {
"user": "",
"userPassword": "",
"host": "sip.local",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
}
}
],
"route": [
{
"parameters": null,
"address": {
"uri": {
"user": "",
"userPassword": "",
"host": "10.100.42.127",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
}
},
{
"parameters": null,
"address": {
"uri": {
"user": "",
"userPassword": "",
"host": "10.100.42.128",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"displayName": "",
"wildcard": false
}
}
],
"authorization": {
"realm": "sip.local",
"scheme": "Digest",
"cNonce": "acbcc60094edde23f49b01e18bafd34e",
"nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",
"algorithm": "MD5",
"qop": "",
"opaque": "",
"response": "227fe247ff0b9fa4fcf2706b587bf995",
"username": "1001",
"uri": "sip:sip.local;transport=TCP",
"nonceCount": 13
},
"requestUri": {
"user": "",
"userPassword": "",
"host": "sip.local",
"transportParam": "TCP",
"mAddrParam": "",
"methodParam": "",
"userParam": "",
"ttlParam": -1,
"port": 5060,
"lrParam": false,
"secure": false
},
"messageType": "REQUEST"
}
}
+

Building a Processor from a Template

+

To make it easier to build processors, we provide a template you can use to get started. The template is available in the routr-processor-template.

+

To use the template, you must have NodeJS installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:

+
npx degit fonoster/nodejs-processor my-processor
+

The previous command will create a new folder called my-processor with the following structure:

+
.
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── commitlint.config.js
├── compose.yaml
├── package-lock.json
├── package.json
├── src
│ ├── envs.ts
│ ├── handlers.ts
│ └── index.ts
├── test
│ └── unit.test.ts
└── tsconfig.json
+

The most important file is the handlers.ts file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor.

+

From there, you can install the dependencies and start the processor:

+
cd my-processor
npm install
npm start
+

You may now start sending SIP messages to your processor from EdgePort or Dispatcher.

\ No newline at end of file diff --git a/docs/2.0.0/development/building-a-scaip-processor/index.html b/docs/2.0.0/development/building-a-scaip-processor/index.html index 787da74b2..f8916c060 100644 --- a/docs/2.0.0/development/building-a-scaip-processor/index.html +++ b/docs/2.0.0/development/building-a-scaip-processor/index.html @@ -1,22 +1,20 @@ - + - -Building a SCAIP Processor | Routr Docs + +Building a SCAIP Processor | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/2.0.0/development/components/apiserver/index.html b/docs/2.0.0/development/components/apiserver/index.html index 742487546..3839c7cdf 100644 --- a/docs/2.0.0/development/components/apiserver/index.html +++ b/docs/2.0.0/development/components/apiserver/index.html @@ -1,22 +1,127 @@ - + - -APIServer | Routr Docs + +APIServer | Routr Docs - - - + + + -
-
Version: 2.0.0

APIServer

The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.

The APIServer has two implementations: the pgdata for persistent data storage in a PostgreSQL database and the simpledata for storing data in files. The simpledata implementation is intended for testing and small deployments.

The pgdata has several advantages over the simpledata implementation. The first advantage is that the pgdata allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the extended attribute, enabling you to store additional data in the database in JSON format—more on this in later sections.

Data Migration

The pgdata implementation uses Prisma to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily.

Configuration Spec

pgdata

The pgdata has the following environment variables available for configuration:

  • DATABASE_URL - The URL of the PostgreSQL database. Example: postgresql://postgres:postgres@localhost:5432/routr
  • BIND_ADDR - The address where the APIServer will listen for gRPC requests. Default to 0.0.0.0:51907
  • EXTERNAL_SERVER_BIND_ADDR - The address where the APIServer will listen for HTTP requests. Default to 0.0.0.0:51908
  • TLS_ON - Enables TLS for the gRPC server. Default to false
  • VERIFY_CLIENT_CERT - Enables client certificate verification. Default to false
  • CACERT - The path to the CA certificate. Default to /etc/routr/certs/ca.crt
  • SERVER_CERT - The path to the server certificate. Default to /etc/routr/certs/server.crt
  • ENFORCE_E164 - Enables E164 validation for Numbers. Default to false
  • ENFORCE_E164_WITH_MOBILE_PREFIX - Enables E164 validation for Numbers with mobile prefixes. Default to false

For details about connecting to the pgdata to manage the data, see the CTL and SDK documentation.

simpledata

The simpledata has the following environment variables available for configuration:

  • PATH_TO_RESOURCES - The path to the directory where the data will be stored. Example: /etc/routr/resources
  • BIND_ADDR - The address where the APIServer will listen for gRPC requests. Default to 0.0.0.0:51907

Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components.

In your resources directory, you will find the following files:

  • agents.yaml - A list of Agents
  • domains.yaml - A list of Domains to which Agents belong
  • trunks.yaml - Represents the list of Trunks
  • numbers.yaml - A list of Numbers to which Trunks belong
  • peers.yaml - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)
  • credentials.yaml - A list of Credentials for Peers and Agents
  • acl.yaml - The list of ACLs

You may also provide a .json file instead of a .yaml file.

The Agents configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the AgentYes
kindThe kind of resourceYes
refReference to the AgentYes
metadata.nameA friendly name for the AgentYes
spec.usernameThe username of the AgentYes
spec.domainRefReference to the Domain of the AgentYes
spec.credentialsRefReference to the Credentials of the AgentYes
spec.privacyThe privacy settings of the Agent (Private or None)No
spec.enabledThe enabled status of the Agent (reserved for future use)No

An example of an Agents configuration file:

Filename: agents.yaml

- apiVersion: v2beta1
kind: Agent
ref: agent-01
metadata:
name: John Doe
spec:
username: "1001"
domainRef: domain-01
credentialsRef: credentials-01
privacy: Private

In the example above, the Agent agent-01 has the username 1001, belongs to the Domain domain-01, and uses the Credentials credentials-01. Both the Domain and the Credentials are required for the Agent to work.

The Domains configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the DomainYes
kindThe kind of resourceYes
refReference to the DomainYes
metadata.nameA friendly name for the DomainYes
spec.context.domainUriThe domain URIYes
spec.context.egressPoliciesThe list of egress policiesNo
spec.context.egressPolicies[*].ruleThe regular expression to match the numberYes
spec.context.egressPolicies[*].numberRefReference to the NumberYes

An example of a Domains configuration file:

Filename: domains.yaml

- apiVersion: v2beta1
kind: Domain
ref: domain-01
metadata:
name: Local Domain
spec:
context:
domainUri: sip.local
egressPolicies:
- rule: ".*"
numberRef: number-01

In the example above, the Domain domain-01 has the Domain URI sip.local and the egress policy .* that matches all numbers. The egress policy is associated with the Number number-01. The Number number-01 is required for the Domain to work.

Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the NumberYes
kindThe kind of resourceYes
refReference to the NumberYes
metadata.nameA friendly name for the NumberYes
metadata.geoInfo.cityThe city where the Number is locatedNo
metadata.geoInfo.countryThe country where the Number is locatedNo
metadata.geoInfo.countryISOCodeThe ISO code of the countryNo
spec.trunkRefReference to the TrunkYes
spec.location.telUrlThe tel URL of the NumberYes
spec.location.aorLinkThe Address of Record (AOR) of the NumberYes
spec.location.sessionAffinityHeaderThe session affinity header of the NumberNo
spec.location.extraHeadersThe extra headers of the NumberNo
spec.location.extraHeaders[*].nameThe name of the extra headerYes

Tthe ' tel: ' scheme is required when setting the spec.location.telUrl property. For example, tel:+17066041487. Here, tel: indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider.

Another important property is the spec.location.aorLink. The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers.

The spec.location.sessionAffinityHeader tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the X-Room-Id header to identify the session. The Location Service will use the header's value to identify the session.

An example of a Numbers configuration file:

Filename: numbers.yaml

- apiVersion: v2beta1
kind: Number
ref: number-01
metadata:
name: "(706)604-1487"
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
trunkRef: trunk-01
location:
telUrl: tel:+17066041487
aorLink: sip:conference@sip.local
sessionAffinityHeader: X-Room-Id
extraHeaders:
- name: X-Room-Id
value: jsa-shqm-iyo

Numbers must be associated with a Trunk to work.

The Trunks configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the TrunkYes
kindThe kind of resourceYes
refReference to the TrunkYes
metadata.nameA friendly name for the TrunkYes
metadata.regionReserved for future useNo
spec.inbound.uriThe inbound URI of the TrunkYes
spec.inbound.accessControlListRefReference to the ACL of the TrunkNo
spec.outbound.sendRegisterEnables outbound registrationNo
spec.outbound.credentialsRefReference to the Credentials of the TrunkNo
spec.outbound.urisThe list of outbound URIsNo
spec.outbound.uris[*].uriThe outbound URIYes
spec.outbound.uris[*].priorityReserved for future useNA
spec.outbound.uris[*].weightReserved for future useNA
spec.outbound.uris[*].enabledReserved for future useNA
spec.outbound.uris[*].transportThe transport of the outbound URINo
spec.outbound.uris[*].userThe user of the outbound URINo
spec.outbound.uris[*].hostThe host of the outbound URINo
spec.outbound.uris[*].portThe port of the outbound URINo

An example of a Trunks configuration file:

Filename: trunks.yaml

- apiVersion: v2beta1
kind: Trunk
ref: trunk-01
metadata:
name: Test Trunk
region: us-east1
spec:
inbound:
uri: trunk01.acme.com
accessControlListRef: acl-01
outbound:
sendRegister: true
credentialsRef: credentials-04
uris:
- uri:
user: pbx-1
host: sip.provider.net
port: 7060
transport: udp
enabled: true

In the spec.inbound section, the uri property helps Routr to identify the Trunk. Calls from the PSTN using the uri will be routed to the Trunk. The accessControlListRef property restricts the access to the Trunk. The accessControlListRef is optional.

In the spec.outbound section, the sendRegister property enables registration outbound registrations while the credentialsRef property for authentication with your trunk provider.

In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the PeerYes
kindThe kind of resourceYes
refReference to the PeerYes
metadata.nameA friendly name for the PeerYes
spec.aorThe Address of Record (AOR) of the PeerYes
spec.usernameThe username of the PeerYes
spec.credentialsRefReference to the Credentials of the PeerYes
spec.loadBalancing.withSessionAffinityEnables session affinityNo
spec.loadBalancing.algorithmThe load balancing algorithmNo

The spec.loadBalancing.withSessionAffinity property enables session affinity, and the spec.loadBalancing.algorithm property sets the load-balancing algorithm. The available algorithms are least-sessions and round-robin.

Remember that for the least-sessions algorithm to work, your SIP backend includes the special header X-Session-Count with the number of active sessions as part of the registration request.

We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date.

An example of a Peers configuration file:

Filename: peers.yaml

- apiVersion: v2beta1
kind: Peer
ref: peer-01
metadata:
name: Asterisk (Media Server)
spec:
aor: sip:conference@sip.local
username: asterisk
credentialsRef: credentials-03
loadBalancing:
withSessionAffinity: true
algorithm: least-sessions

Credentials in Routr help Agents and Peers authenticate with Routr.

The Credentials configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the CredentialsYes
kindThe kind of resourceYes
refReference to the CredentialsYes
metadata.nameA friendly name for the CredentialsYes
spec.credentials.usernameThe username of the CredentialsYes
spec.credentials.passwordThe password of the CredentialsYes

An example of a Credentials configuration file:

Filename: credentials.yaml

- apiVersion: v2beta1
kind: Credentials
ref: credentials-01
metadata:
name: Agent Credentials
spec:
credentials:
username: "1001"
password: "1234"

Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains.

The ACLs configuration file has the following structure:

PropertyDescriptionRequired
apiVersionThe API version of the ACLYes
kindThe kind of resourceYes
refReference to the ACLYes
metadata.nameA friendly name for the ACLYes
spec.accessControlList.denyThe list of deny rulesNo
spec.accessControlList.deny[*]The deny ruleYes
spec.accessControlList.allowThe list of allow rulesNo
spec.accessControlList.allow[*]The allow ruleYes

An example of an ACLs configuration file:

Filename: acl.yaml

- apiVersion: v2beta1
kind: AccessControlList
ref: acl-01
metadata:
name: Europe ACL
spec:
accessControlList:
deny:
- 0.0.0.0/1
allow:
- 192.168.1.3/31
- 127.0.0.1/8
- 10.111.221.22/31

Communication and Protobuf Spec

Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc.

The following protobuf defines the Agent service interface:

syntax = "proto3";

package fonoster.routr.connect.agents.v2beta1;

// The Agents service definition
service Agents {
// Creates a new Agent
rpc Create (CreateAgentRequest) returns (Agent) {}
// Updates an existing Agent
rpc Update (UpdateAgentRequest) returns (Agent) {}
// Gets an existing Agent
rpc Get (GetAgentRequest) returns (Agent) {}
// Deletes an existing Agent
rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}
// Lists all Agents
rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}
// Find Agents by field name and value
rpc FindBy (FindByRequest) returns (FindByResponse) {}
}

enum Privacy {
PRIVATE = 0;
NONE = 1;
}

// The message for the Agent resource
message Agent {
// The API version of the Agent
string api_version = 1;
// The unique identifier of the Agent
string ref = 2;
// The name of the Agent
string name = 3;
// The username of the Agent
string username = 4;
// The password of the Agent
Privacy privacy = 5;
// The enabled status of the Agent
bool enabled = 6;
// The created_at timestamp of the Agent
int32 created_at = 7;
// The updated_at timestamp of the Agent
int32 updated_at = 8;
// The domain of the Agent
fonoster.routr.connect.domains.v2beta1.Domain domain = 9;
// The credentials of the Agent
fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;
// The extended attributes of the Agent
.google.protobuf.Struct extended = 11;
}

// The request message for the Agents.Create method
message CreateAgentRequest {
// The name of the Agent
string name = 1;
// The username of the Agent
string username = 2;
// The password of the Agent
Privacy privacy = 3;
// The enabled status of the Agent
bool enabled = 4;
// Reference to the Domain of the Agent
string domain_ref = 5;
// Reference to the Credentials of the Agent
string credentials_ref = 6;
// The extended attributes of the Agent
.google.protobuf.Struct extended = 7;
}

// The request message for the Agents.Update method
message UpdateAgentRequest {
// The unique identifier of the Agent
string ref = 1;
// The name of the Agent
string name = 2;
// The privacy settings of the Agent
Privacy privacy = 3;
// The enabled status of the Agent
bool enabled = 4;
// Reference to the Domain of the Agent
string domain_ref = 5;
// Reference to the Credentials of the Agent
string credentials_ref = 6;
// The extended attributes of the Agent
.google.protobuf.Struct extended = 7;
}

// The request message for the Agents.Get method
message GetAgentRequest {
// The unique identifier of the Agent
string ref = 1;
}

// The request message for the Agents.Delete method
message DeleteAgentRequest {
// The unique identifier of the Agent
string ref = 1;
}

// The request message for the Agents.FindBy method
message FindByRequest {
// The field name to search
string field_name = 1;
// The value to search
string field_value = 2;
}

// The response message for the Agents.FindBy method
message FindByResponse {
// The list of Agents
repeated Agent items = 1;
}

// The request message for the Agents.List method
message ListAgentsRequest {
// The maximum number of items in the list
int32 page_size = 1;

// The next_page_token value returned from the previous request, if any
string page_token = 2;
}

// The response message for the Agents.List method
message ListAgentsResponse {
// List of Agents
repeated Agent items = 1;

// Token to retrieve the next page of results or empty if there are no more results in the list
string next_page_token = 2;
}

To see the complete protobuf spec, please visit the protobuf directory.

Launching the APIServer

Both implementations are available as Docker images from Docker Hub as fonoster/routr-pgdata and fonoster/routr-simpledata.

pgdata

To launch the pgdata implementation with Docker, you can use the following command:

docker run -it \
-e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \
-p 51907:51907 \
-p 51908:51908 \
fonoster/routr-pgdata

The port 51907 is used for internal communication, and the port 51908 is used for external communication. The CTL and SDK use the external port to manage the data.

simpledata

To launch the simpledata implementation with Docker, you can use the following command:

docker run -it \
-v /path/to/resources:/etc/routr/resources \
-p 51907:51907 \
fonoster/routr-simpledata

Quick Test with gRPCurl

One easy way to interact with the APIServer for testing and development is to use gRPCurl. The following example shows how to send a request to the Agents service within the APIServer:

grpcurl -plaintext \
-import-path /path/to/protos \
-proto agents.proto -d '{...}' \
localhost:51907 \
fonoster.routr.connect.agents.v2beta1.Agents/Get

Please remember that the simpledata implementation does not accept write operations.

- - +
Version: 2.0.0

APIServer

+

The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.

+

The APIServer has two implementations: the pgdata for persistent data storage in a PostgreSQL database and the simpledata for storing data in files. The simpledata implementation is intended for testing and small deployments.

+

The pgdata has several advantages over the simpledata implementation. The first advantage is that the pgdata allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the extended attribute, enabling you to store additional data in the database in JSON format—more on this in later sections.

+

Data Migration

+

The pgdata implementation uses Prisma to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily.

+

Configuration Spec

+

pgdata

+

The pgdata has the following environment variables available for configuration:

+
    +
  • DATABASE_URL - The URL of the PostgreSQL database. Example: postgresql://postgres:postgres@localhost:5432/routr
  • +
  • BIND_ADDR - The address where the APIServer will listen for gRPC requests. Default to 0.0.0.0:51907
  • +
  • EXTERNAL_SERVER_BIND_ADDR - The address where the APIServer will listen for HTTP requests. Default to 0.0.0.0:51908
  • +
  • TLS_ON - Enables TLS for the gRPC server. Default to false
  • +
  • VERIFY_CLIENT_CERT - Enables client certificate verification. Default to false
  • +
  • CACERT - The path to the CA certificate. Default to /etc/routr/certs/ca.crt
  • +
  • SERVER_CERT - The path to the server certificate. Default to /etc/routr/certs/server.crt
  • +
  • ENFORCE_E164 - Enables E164 validation for Numbers. Default to false
  • +
  • ENFORCE_E164_WITH_MOBILE_PREFIX - Enables E164 validation for Numbers with mobile prefixes. Default to false
  • +
+

For details about connecting to the pgdata to manage the data, see the CTL and SDK documentation.

+

simpledata

+

The simpledata has the following environment variables available for configuration:

+
    +
  • PATH_TO_RESOURCES - The path to the directory where the data will be stored. Example: /etc/routr/resources
  • +
  • BIND_ADDR - The address where the APIServer will listen for gRPC requests. Default to 0.0.0.0:51907
  • +
+

Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components.

+

In your resources directory, you will find the following files:

+
    +
  • agents.yaml - A list of Agents
  • +
  • domains.yaml - A list of Domains to which Agents belong
  • +
  • trunks.yaml - Represents the list of Trunks
  • +
  • numbers.yaml - A list of Numbers to which Trunks belong
  • +
  • peers.yaml - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)
  • +
  • credentials.yaml - A list of Credentials for Peers and Agents
  • +
  • acl.yaml - The list of ACLs
  • +
+
+

You may also provide a .json file instead of a .yaml file.

+
+

The Agents configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the AgentYes
kindThe kind of resourceYes
refReference to the AgentYes
metadata.nameA friendly name for the AgentYes
spec.usernameThe username of the AgentYes
spec.domainRefReference to the Domain of the AgentYes
spec.credentialsRefReference to the Credentials of the AgentYes
spec.privacyThe privacy settings of the Agent (Private or None)No
spec.enabledThe enabled status of the Agent (reserved for future use)No
+

An example of an Agents configuration file:

+

Filename: agents.yaml

+
- apiVersion: v2beta1
kind: Agent
ref: agent-01
metadata:
name: John Doe
spec:
username: "1001"
domainRef: domain-01
credentialsRef: credentials-01
privacy: Private
+

In the example above, the Agent agent-01 has the username 1001, belongs to the Domain domain-01, and uses the Credentials credentials-01. Both the Domain and the Credentials are required for the Agent to work.

+

The Domains configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the DomainYes
kindThe kind of resourceYes
refReference to the DomainYes
metadata.nameA friendly name for the DomainYes
spec.context.domainUriThe domain URIYes
spec.context.egressPoliciesThe list of egress policiesNo
spec.context.egressPolicies[*].ruleThe regular expression to match the numberYes
spec.context.egressPolicies[*].numberRefReference to the NumberYes
+

An example of a Domains configuration file:

+

Filename: domains.yaml

+
- apiVersion: v2beta1
kind: Domain
ref: domain-01
metadata:
name: Local Domain
spec:
context:
domainUri: sip.local
egressPolicies:
- rule: ".*"
numberRef: number-01
+

In the example above, the Domain domain-01 has the Domain URI sip.local and the egress policy .* that matches all numbers. The egress policy is associated with the Number number-01. The Number number-01 is required for the Domain to work.

+

Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the NumberYes
kindThe kind of resourceYes
refReference to the NumberYes
metadata.nameA friendly name for the NumberYes
metadata.geoInfo.cityThe city where the Number is locatedNo
metadata.geoInfo.countryThe country where the Number is locatedNo
metadata.geoInfo.countryISOCodeThe ISO code of the countryNo
spec.trunkRefReference to the TrunkYes
spec.location.telUrlThe tel URL of the NumberYes
spec.location.aorLinkThe Address of Record (AOR) of the NumberYes
spec.location.sessionAffinityHeaderThe session affinity header of the NumberNo
spec.location.extraHeadersThe extra headers of the NumberNo
spec.location.extraHeaders[*].nameThe name of the extra headerYes
+

Tthe ' tel: ' scheme is required when setting the spec.location.telUrl property. For example, tel:+17066041487. Here, tel: indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider.

+

Another important property is the spec.location.aorLink. The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers.

+

The spec.location.sessionAffinityHeader tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the X-Room-Id header to identify the session. The Location Service will use the header's value to identify the session.

+

An example of a Numbers configuration file:

+

Filename: numbers.yaml

+
- apiVersion: v2beta1
kind: Number
ref: number-01
metadata:
name: "(706)604-1487"
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
trunkRef: trunk-01
location:
telUrl: tel:+17066041487
aorLink: sip:conference@sip.local
sessionAffinityHeader: X-Room-Id
extraHeaders:
- name: X-Room-Id
value: jsa-shqm-iyo
+

Numbers must be associated with a Trunk to work.

+

The Trunks configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the TrunkYes
kindThe kind of resourceYes
refReference to the TrunkYes
metadata.nameA friendly name for the TrunkYes
metadata.regionReserved for future useNo
spec.inbound.uriThe inbound URI of the TrunkYes
spec.inbound.accessControlListRefReference to the ACL of the TrunkNo
spec.outbound.sendRegisterEnables outbound registrationNo
spec.outbound.credentialsRefReference to the Credentials of the TrunkNo
spec.outbound.urisThe list of outbound URIsNo
spec.outbound.uris[*].uriThe outbound URIYes
spec.outbound.uris[*].priorityReserved for future useNA
spec.outbound.uris[*].weightReserved for future useNA
spec.outbound.uris[*].enabledReserved for future useNA
spec.outbound.uris[*].transportThe transport of the outbound URINo
spec.outbound.uris[*].userThe user of the outbound URINo
spec.outbound.uris[*].hostThe host of the outbound URINo
spec.outbound.uris[*].portThe port of the outbound URINo
+

An example of a Trunks configuration file:

+

Filename: trunks.yaml

+
- apiVersion: v2beta1
kind: Trunk
ref: trunk-01
metadata:
name: Test Trunk
region: us-east1
spec:
inbound:
uri: trunk01.acme.com
accessControlListRef: acl-01
outbound:
sendRegister: true
credentialsRef: credentials-04
uris:
- uri:
user: pbx-1
host: sip.provider.net
port: 7060
transport: udp
enabled: true
+

In the spec.inbound section, the uri property helps Routr to identify the Trunk. Calls from the PSTN using the uri will be routed to the Trunk. The accessControlListRef property restricts the access to the Trunk. The accessControlListRef is optional.

+

In the spec.outbound section, the sendRegister property enables registration outbound registrations while the credentialsRef property for authentication with your trunk provider.

+

In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the PeerYes
kindThe kind of resourceYes
refReference to the PeerYes
metadata.nameA friendly name for the PeerYes
spec.aorThe Address of Record (AOR) of the PeerYes
spec.usernameThe username of the PeerYes
spec.credentialsRefReference to the Credentials of the PeerYes
spec.loadBalancing.withSessionAffinityEnables session affinityNo
spec.loadBalancing.algorithmThe load balancing algorithmNo
+

The spec.loadBalancing.withSessionAffinity property enables session affinity, and the spec.loadBalancing.algorithm property sets the load-balancing algorithm. The available algorithms are least-sessions and round-robin.

+

Remember that for the least-sessions algorithm to work, your SIP backend includes the special header X-Session-Count with the number of active sessions as part of the registration request.

+
+

We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date.

+
+

An example of a Peers configuration file:

+

Filename: peers.yaml

+
- apiVersion: v2beta1
kind: Peer
ref: peer-01
metadata:
name: Asterisk (Media Server)
spec:
aor: sip:conference@sip.local
username: asterisk
credentialsRef: credentials-03
loadBalancing:
withSessionAffinity: true
algorithm: least-sessions
+

Credentials in Routr help Agents and Peers authenticate with Routr.

+

The Credentials configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the CredentialsYes
kindThe kind of resourceYes
refReference to the CredentialsYes
metadata.nameA friendly name for the CredentialsYes
spec.credentials.usernameThe username of the CredentialsYes
spec.credentials.passwordThe password of the CredentialsYes
+

An example of a Credentials configuration file:

+

Filename: credentials.yaml

+
- apiVersion: v2beta1
kind: Credentials
ref: credentials-01
metadata:
name: Agent Credentials
spec:
credentials:
username: "1001"
password: "1234"
+

Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains.

+

The ACLs configuration file has the following structure:

+
PropertyDescriptionRequired
apiVersionThe API version of the ACLYes
kindThe kind of resourceYes
refReference to the ACLYes
metadata.nameA friendly name for the ACLYes
spec.accessControlList.denyThe list of deny rulesNo
spec.accessControlList.deny[*]The deny ruleYes
spec.accessControlList.allowThe list of allow rulesNo
spec.accessControlList.allow[*]The allow ruleYes
+

An example of an ACLs configuration file:

+

Filename: acl.yaml

+
- apiVersion: v2beta1
kind: AccessControlList
ref: acl-01
metadata:
name: Europe ACL
spec:
accessControlList:
deny:
- 0.0.0.0/1
allow:
- 192.168.1.3/31
- 127.0.0.1/8
- 10.111.221.22/31
+

Communication and Protobuf Spec

+

Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc.

+

The following protobuf defines the Agent service interface:

+
syntax = "proto3";

package fonoster.routr.connect.agents.v2beta1;

// The Agents service definition
service Agents {
// Creates a new Agent
rpc Create (CreateAgentRequest) returns (Agent) {}
// Updates an existing Agent
rpc Update (UpdateAgentRequest) returns (Agent) {}
// Gets an existing Agent
rpc Get (GetAgentRequest) returns (Agent) {}
// Deletes an existing Agent
rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}
// Lists all Agents
rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}
// Find Agents by field name and value
rpc FindBy (FindByRequest) returns (FindByResponse) {}
}

enum Privacy {
PRIVATE = 0;
NONE = 1;
}

// The message for the Agent resource
message Agent {
// The API version of the Agent
string api_version = 1;
// The unique identifier of the Agent
string ref = 2;
// The name of the Agent
string name = 3;
// The username of the Agent
string username = 4;
// The password of the Agent
Privacy privacy = 5;
// The enabled status of the Agent
bool enabled = 6;
// The created_at timestamp of the Agent
int32 created_at = 7;
// The updated_at timestamp of the Agent
int32 updated_at = 8;
// The domain of the Agent
fonoster.routr.connect.domains.v2beta1.Domain domain = 9;
// The credentials of the Agent
fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;
// The extended attributes of the Agent
.google.protobuf.Struct extended = 11;
}

// The request message for the Agents.Create method
message CreateAgentRequest {
// The name of the Agent
string name = 1;
// The username of the Agent
string username = 2;
// The password of the Agent
Privacy privacy = 3;
// The enabled status of the Agent
bool enabled = 4;
// Reference to the Domain of the Agent
string domain_ref = 5;
// Reference to the Credentials of the Agent
string credentials_ref = 6;
// The extended attributes of the Agent
.google.protobuf.Struct extended = 7;
}

// The request message for the Agents.Update method
message UpdateAgentRequest {
// The unique identifier of the Agent
string ref = 1;
// The name of the Agent
string name = 2;
// The privacy settings of the Agent
Privacy privacy = 3;
// The enabled status of the Agent
bool enabled = 4;
// Reference to the Domain of the Agent
string domain_ref = 5;
// Reference to the Credentials of the Agent
string credentials_ref = 6;
// The extended attributes of the Agent
.google.protobuf.Struct extended = 7;
}

// The request message for the Agents.Get method
message GetAgentRequest {
// The unique identifier of the Agent
string ref = 1;
}

// The request message for the Agents.Delete method
message DeleteAgentRequest {
// The unique identifier of the Agent
string ref = 1;
}

// The request message for the Agents.FindBy method
message FindByRequest {
// The field name to search
string field_name = 1;
// The value to search
string field_value = 2;
}

// The response message for the Agents.FindBy method
message FindByResponse {
// The list of Agents
repeated Agent items = 1;
}

// The request message for the Agents.List method
message ListAgentsRequest {
// The maximum number of items in the list
int32 page_size = 1;

// The next_page_token value returned from the previous request, if any
string page_token = 2;
}

// The response message for the Agents.List method
message ListAgentsResponse {
// List of Agents
repeated Agent items = 1;

// Token to retrieve the next page of results or empty if there are no more results in the list
string next_page_token = 2;
}
+

To see the complete protobuf spec, please visit the protobuf directory.

+

Launching the APIServer

+

Both implementations are available as Docker images from Docker Hub as fonoster/routr-pgdata and fonoster/routr-simpledata.

+

pgdata

+

To launch the pgdata implementation with Docker, you can use the following command:

+
docker run -it \
-e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \
-p 51907:51907 \
-p 51908:51908 \
fonoster/routr-pgdata
+

The port 51907 is used for internal communication, and the port 51908 is used for external communication. The CTL and SDK use the external port to manage the data.

+

simpledata

+

To launch the simpledata implementation with Docker, you can use the following command:

+
docker run -it \
-v /path/to/resources:/etc/routr/resources \
-p 51907:51907 \
fonoster/routr-simpledata
+

Quick Test with gRPCurl

+

One easy way to interact with the APIServer for testing and development is to use gRPCurl. The following example shows how to send a request to the Agents service within the APIServer:

+
grpcurl -plaintext \
-import-path /path/to/protos \
-proto agents.proto -d '{...}' \
localhost:51907 \
fonoster.routr.connect.agents.v2beta1.Agents/Get
+

Please remember that the simpledata implementation does not accept write operations.

\ No newline at end of file diff --git a/docs/2.0.0/development/components/dispatcher/index.html b/docs/2.0.0/development/components/dispatcher/index.html index b6d400994..01a4c795b 100644 --- a/docs/2.0.0/development/components/dispatcher/index.html +++ b/docs/2.0.0/development/components/dispatcher/index.html @@ -1,22 +1,54 @@ - + - -Message Dispatcher | Routr Docs + +Message Dispatcher | Routr Docs - - - + + + -
-
Version: 2.0.0

Message Dispatcher

The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.

The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor.

The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor.

┌────────┐ ┌──────────────────┐             ┌─────────────────┐
│EdgePort│ │Message Dispatcher│ │Message Processor│
└───┬────┘ └──────┬───────────┘ └────────┬────────┘
│ │ │
│gRPC request │ │
│────────────>│ │
│ │ │
│ │findProcessor() & forwardMessage()│
│ │─────────────────────────────────>│
│ │ │
│ │ Processed Message │
│ │<─────────────────────────────────│
│ │ │
│gRPC response│ │
│<────────────│ │
┌───┴────┐ ┌──────┴───────────┐ ┌────────┴────────┐
│EdgePort│ │Message Dispatcher│ │Message Processor│
└────────┘ └──────────────────┘ └─────────────────┘

Configuration Spec

To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure.

You can configure the Dispatcher using a YAML or JSON file that has the following structure:

PropertyDescriptionRequired
refReference to the DispatcherYes
spec.bindAddrIpv4 interface to accept requests onNo
spec.processorsList of ProcessorsYes
spec.processors[*].refReference to the ProcessorYes
spec.processors[*].matchFuncMatching functionYes
spec.processors[*].addrAddress of the ProcessorYes
spec.processors[*].methodsList of SIP Methods supported by the ProcessorYes
spec.middlewaresList of MiddlewaresNo
spec.middlewares[*].refReference to the MiddlewareYes
spec.middlewares[*].addrAddress of the MiddlewareYes
spec.middlewares[*].postProcessorWhether to process the SIP Message after the ProcessorYes

Here is an example of a configuration file:

Filename: dispatcher.yaml or dispatcher.json

kind: MessageDispatcher
apiVersion: v2beta1
ref: message-dispatcher
spec:
bindAddr: 0.0.0.0:51901
processors:
- ref: connect-processor
addr: connect:51904
matchFunc: req => true
methods:
- REGISTER
- MESSAGE
- INVITE
- ACK
- BYE
- CANCEL

The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing.

The matchFunc is a javascript function that leverages the JSON representation of the SIPMessage protobuf.

This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor.

kind: MessageDispatcher
apiVersion: v2beta1
ref: message-dispatcher
spec:
bindAddr: 0.0.0.0:51901
processors:
- ref: im-processor
addr: im:51904
matchFunc: req => req.method === "MESSAGE"
methods:
- MESSAGE
- ref: connect-processor
addr: connect:51904
matchFunc: req => true
methods:
- REGISTER
- INVITE
- ACK
- BYE
- CANCEL

The following examples show typical matching functions:

Match all SIP Messages.

req => true

Match SIP Messages with a specific method.

req => req.method === "MESSAGE"

Match SIP Messages with a specific method and a specific header.

req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"

Match SIP Messages with a specific User-Agent header.

req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))

Communication and Protobuf Spec

The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:

syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of the calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid-session information
INFO = 12;
// Asks the recipient to issue a call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}

Link to the protobuf definition.

Launching the Dispatcher with Docker

The Message Dispatcher is available as a Docker image from Docker Hub. To launch the Dispatcher with Docker, you can use the following command:

docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher

The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port 51901 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51901.

Quick Test with gRPCurl

One easy way to interact with the Dispatcher for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the Dispatcher.

grpcurl -plaintext \
-import-path /path/to/protos \
-proto processor.proto -d '{...}' \
localhost:51901 \
fonoster.routr.processor.v2beta1.Processor/ProcessMessage
- - +
Version: 2.0.0

Message Dispatcher

+

The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.

+

The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor.

+

The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor.

+
┌────────┐ ┌──────────────────┐             ┌─────────────────┐
│EdgePort│ │Message Dispatcher│ │Message Processor│
└───┬────┘ └──────┬───────────┘ └────────┬────────┘
│ │ │
│gRPC request │ │
│────────────>│ │
│ │ │
│ │findProcessor() & forwardMessage()│
│ │─────────────────────────────────>│
│ │ │
│ │ Processed Message │
│ │<─────────────────────────────────│
│ │ │
│gRPC response│ │
│<────────────│ │
┌───┴────┐ ┌──────┴───────────┐ ┌────────┴────────┐
│EdgePort│ │Message Dispatcher│ │Message Processor│
└────────┘ └──────────────────┘ └─────────────────┘
+

Configuration Spec

+

To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure.

+

You can configure the Dispatcher using a YAML or JSON file that has the following structure:

+
PropertyDescriptionRequired
refReference to the DispatcherYes
spec.bindAddrIpv4 interface to accept requests onNo
spec.processorsList of ProcessorsYes
spec.processors[*].refReference to the ProcessorYes
spec.processors[*].matchFuncMatching functionYes
spec.processors[*].addrAddress of the ProcessorYes
spec.processors[*].methodsList of SIP Methods supported by the ProcessorYes
spec.middlewaresList of MiddlewaresNo
spec.middlewares[*].refReference to the MiddlewareYes
spec.middlewares[*].addrAddress of the MiddlewareYes
spec.middlewares[*].postProcessorWhether to process the SIP Message after the ProcessorYes
+

Here is an example of a configuration file:

+

Filename: dispatcher.yaml or dispatcher.json

+
kind: MessageDispatcher
apiVersion: v2beta1
ref: message-dispatcher
spec:
bindAddr: 0.0.0.0:51901
processors:
- ref: connect-processor
addr: connect:51904
matchFunc: req => true
methods:
- REGISTER
- MESSAGE
- INVITE
- ACK
- BYE
- CANCEL
+

The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing.

+

The matchFunc is a javascript function that leverages the JSON representation of the SIPMessage protobuf.

+

This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor.

+
kind: MessageDispatcher
apiVersion: v2beta1
ref: message-dispatcher
spec:
bindAddr: 0.0.0.0:51901
processors:
- ref: im-processor
addr: im:51904
matchFunc: req => req.method === "MESSAGE"
methods:
- MESSAGE
- ref: connect-processor
addr: connect:51904
matchFunc: req => true
methods:
- REGISTER
- INVITE
- ACK
- BYE
- CANCEL
+

The following examples show typical matching functions:

+

Match all SIP Messages.

+
req => true
+

Match SIP Messages with a specific method.

+
req => req.method === "MESSAGE"
+

Match SIP Messages with a specific method and a specific header.

+
req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"
+

Match SIP Messages with a specific User-Agent header.

+
req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))
+

Communication and Protobuf Spec

+

The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:

+
syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of the calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid-session information
INFO = 12;
// Asks the recipient to issue a call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}
+

Link to the protobuf definition.

+

Launching the Dispatcher with Docker

+

The Message Dispatcher is available as a Docker image from Docker Hub. To launch the Dispatcher with Docker, you can use the following command:

+
docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher
+

The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port 51901 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51901.

+

Quick Test with gRPCurl

+

One easy way to interact with the Dispatcher for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the Dispatcher.

+
grpcurl -plaintext \
-import-path /path/to/protos \
-proto processor.proto -d '{...}' \
localhost:51901 \
fonoster.routr.processor.v2beta1.Processor/ProcessMessage
\ No newline at end of file diff --git a/docs/2.0.0/development/components/edgeport/index.html b/docs/2.0.0/development/components/edgeport/index.html index 128922d33..84dbf0a31 100644 --- a/docs/2.0.0/development/components/edgeport/index.html +++ b/docs/2.0.0/development/components/edgeport/index.html @@ -1,22 +1,55 @@ - + - -EdgePort | Routr Docs + +EdgePort | Routr Docs - - - + + + -
-
Version: 2.0.0

EdgePort

The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.

The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher.

┌──────────┐  ┌────────┐ ┌──────────────────┐
│SIP Client│ │EdgePort│ │Message Dispatcher│
└────┬─────┘ └───┬────┘ └──────┬───────────┘
│ │ │
│SIP request │ │
│───────────>│ │
│ │ │
│ │gRPC request │
│ │────────────>│
│ │ │
│ │gRPC response│
│ │<────────────│
│ │ │
│SIP response│ │
│<───────────│ │
┌────┴─────┐ ┌───┴────┐ ┌──────┴───────────┐
│SIP Client│ │EdgePort│ │Message Dispatcher│
└──────────┘ └────────┘ └──────────────────┘

While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware.

For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher.

If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster.

Configuration Spec

To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure.

PropertyDescriptionRequired
refReference to the EdgePortYes
metadata.regionRegion where the EdgePort is located (reserved for future use)No
spec.unknownMethodActionWhat to do if an incoming request type is not allowed (reserved for future use)No
spec.transportEnabled Transport ProtocolsYes
spec.transport[*].protocolTransport protocolYes
spec.transport[*].bindAddrIpv4 interface to accept requests onNo
spec.transport[*].portPort to listen onYes
spec.methodsAcceptable SIP MethodsYes
spec.processorAdjacent service for message routingYes
spec.processor.addrAddress of the adjacent serviceYes
spec.localnetsNetworks considered to be in the same local networkNo
spec.externalAddrsEdgePort external ip addressesNo
spec.bindAddrIpv4 interface to accept requests onNo
spec.securityContextSecurity contextNo
spec.securityContext.clientClient security contextNo
spec.securityContext.client.protocolsTLS protocols used by the client (e.g., SSLv3, TLSv1.2)No
spec.securityContext.client.authTypeClient authentication type (e.g., Disabled, DisabledAll, Required, Wanted)No
spec.securityContext.keyStorePath to the key store fileNo
spec.securityContext.trustStorePath to the trust store fileNo
spec.securityContext.keyStorePasswordPassword for the key storeNo
spec.securityContext.trustStorePasswordPassword for the trust storeNo
spec.securityContext.keyStoreTypeType of the key store (e.g., pkcs12)No

The security context is required if the EdgePort is configured to use a secure protocol such as TLS or WSS.

Please see JAINSIP docs for details on the security context properties.

Here is an example of a configuration file:

Filename: dispatcher.yaml or dispatcher.json

kind: EdgePort
apiVersion: v2beta1
ref: edgeport-01
metadata:
region: default
spec:
unknownMethodAction: Discard
processor:
addr: dispatcher:51901
securityContext:
client:
protocols:
- SSLv3
- TLSv1.2
authType: DisabledAll
keyStorePassword: changeme
trustStorePassword: changeme
keyStore: "/etc/routr/certs/signaling.p12"
trustStore: "/etc/routr/certs/signaling.p12"
keyStoreType: pkcs12
externalAddrs:
- 10.111.220.2
- sip01.edgeport.net
localnets:
- 127.0.0.1/8
- 10.111.221.2/24
methods:
- REGISTER
- MESSAGE
- INVITE
- ACK
- BYE
- CANCEL
transport:
- protocol: tcp
port: 5060
- protocol: udp
port: 5060
- protocol: tls
port: 5061
- protocol: ws
port: 5062
- protocol: wss
port: 5063

The EdgePort requires the spec.externalAddrs field to function properly in NATed environments like Docker. When provided, the spec.externalAddrs is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address.

Environment Variables

The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec.

  • PROCESSOR_ADDR - Overwrites the spec.processor.addr property
  • HOSTNAME - Overwrites the ref property. If running in K8s, ref will be set to the pod's hostname.
  • IGNORE_LOOPBACK_FROM_LOCALNETS - If set to true, the EdgePort will ignore the loopback address from the localnets property. In Docker deployments, this is set to true by default.
  • CONSOLE_PUBLISHER_ENABLED - If set to true, the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes.
  • NATS_PUBLISHER_ENABLED - If set to true, the EdgePort will publish SIP messages to the NATS publisher.
  • NATS_PUBLISHER_SUBJECT - Overwrites the default subject the NATS publisher uses. The default subject is routr.
  • NATS_PUBLISHER_URL - This is required if NATS_PUBLISHER_ENABLED is set to true. It should contain the NATS server URL. For example: nats://nats:4222.

Communication and Protobuf Spec

While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition.

syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of the calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid session information
INFO = 12;
// Asks the recipient to issue call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}

Link to the protobuf definition.

Launching the EdgePort with Docker

The EdgePort is available as a Docker image from Docker Hub. To launch the EdgePort with Docker, you can use the following command:

docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport

The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port 5060 for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port 5061 for TLS traffic, you must add the following flag to the docker run command: -p 5061:5061.

- - +
Version: 2.0.0

EdgePort

+

The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.

+

The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher.

+
┌──────────┐  ┌────────┐ ┌──────────────────┐
│SIP Client│ │EdgePort│ │Message Dispatcher│
└────┬─────┘ └───┬────┘ └──────┬───────────┘
│ │ │
│SIP request │ │
│───────────>│ │
│ │ │
│ │gRPC request │
│ │────────────>│
│ │ │
│ │gRPC response│
│ │<────────────│
│ │ │
│SIP response│ │
│<───────────│ │
┌────┴─────┐ ┌───┴────┐ ┌──────┴───────────┐
│SIP Client│ │EdgePort│ │Message Dispatcher│
└──────────┘ └────────┘ └──────────────────┘
+

While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware.

+

For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher.

+

If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster.

+

Configuration Spec

+

To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure.

+
PropertyDescriptionRequired
refReference to the EdgePortYes
metadata.regionRegion where the EdgePort is located (reserved for future use)No
spec.unknownMethodActionWhat to do if an incoming request type is not allowed (reserved for future use)No
spec.transportEnabled Transport ProtocolsYes
spec.transport[*].protocolTransport protocolYes
spec.transport[*].bindAddrIpv4 interface to accept requests onNo
spec.transport[*].portPort to listen onYes
spec.methodsAcceptable SIP MethodsYes
spec.processorAdjacent service for message routingYes
spec.processor.addrAddress of the adjacent serviceYes
spec.localnetsNetworks considered to be in the same local networkNo
spec.externalAddrsEdgePort external ip addressesNo
spec.bindAddrIpv4 interface to accept requests onNo
spec.securityContextSecurity contextNo
spec.securityContext.clientClient security contextNo
spec.securityContext.client.protocolsTLS protocols used by the client (e.g., SSLv3, TLSv1.2)No
spec.securityContext.client.authTypeClient authentication type (e.g., Disabled, DisabledAll, Required, Wanted)No
spec.securityContext.keyStorePath to the key store fileNo
spec.securityContext.trustStorePath to the trust store fileNo
spec.securityContext.keyStorePasswordPassword for the key storeNo
spec.securityContext.trustStorePasswordPassword for the trust storeNo
spec.securityContext.keyStoreTypeType of the key store (e.g., pkcs12)No
+

The security context is required if the EdgePort is configured to use a secure protocol such as TLS or WSS.

+
+

Please see JAINSIP docs for details on the security context properties.

+
+

Here is an example of a configuration file:

+

Filename: dispatcher.yaml or dispatcher.json

+
kind: EdgePort
apiVersion: v2beta1
ref: edgeport-01
metadata:
region: default
spec:
unknownMethodAction: Discard
processor:
addr: dispatcher:51901
securityContext:
client:
protocols:
- SSLv3
- TLSv1.2
authType: DisabledAll
keyStorePassword: changeme
trustStorePassword: changeme
keyStore: "/etc/routr/certs/signaling.p12"
trustStore: "/etc/routr/certs/signaling.p12"
keyStoreType: pkcs12
externalAddrs:
- 10.111.220.2
- sip01.edgeport.net
localnets:
- 127.0.0.1/8
- 10.111.221.2/24
methods:
- REGISTER
- MESSAGE
- INVITE
- ACK
- BYE
- CANCEL
transport:
- protocol: tcp
port: 5060
- protocol: udp
port: 5060
- protocol: tls
port: 5061
- protocol: ws
port: 5062
- protocol: wss
port: 5063
+

The EdgePort requires the spec.externalAddrs field to function properly in NATed environments like Docker. When provided, the spec.externalAddrs is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address.

+

Environment Variables

+

The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec.

+
    +
  • PROCESSOR_ADDR - Overwrites the spec.processor.addr property
  • +
  • HOSTNAME - Overwrites the ref property. If running in K8s, ref will be set to the pod's hostname.
  • +
  • IGNORE_LOOPBACK_FROM_LOCALNETS - If set to true, the EdgePort will ignore the loopback address from the localnets property. In Docker deployments, this is set to true by default.
  • +
  • CONSOLE_PUBLISHER_ENABLED - If set to true, the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes.
  • +
  • NATS_PUBLISHER_ENABLED - If set to true, the EdgePort will publish SIP messages to the NATS publisher.
  • +
  • NATS_PUBLISHER_SUBJECT - Overwrites the default subject the NATS publisher uses. The default subject is routr.
  • +
  • NATS_PUBLISHER_URL - This is required if NATS_PUBLISHER_ENABLED is set to true. It should contain the NATS server URL. For example: nats://nats:4222.
  • +
+

Communication and Protobuf Spec

+

While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition.

+
syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of the calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid session information
INFO = 12;
// Asks the recipient to issue call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}
+

Link to the protobuf definition.

+

Launching the EdgePort with Docker

+

The EdgePort is available as a Docker image from Docker Hub. To launch the EdgePort with Docker, you can use the following command:

+
docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport
+

The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port 5060 for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port 5061 for TLS traffic, you must add the following flag to the docker run command: -p 5061:5061.

\ No newline at end of file diff --git a/docs/2.0.0/development/components/location/index.html b/docs/2.0.0/development/components/location/index.html index a9536a1fb..756906fbc 100644 --- a/docs/2.0.0/development/components/location/index.html +++ b/docs/2.0.0/development/components/location/index.html @@ -1,22 +1,50 @@ - + - -Location Service | Routr Docs + +Location Service | Routr Docs - - - + + + -
-
Version: 2.0.0

Location Service

In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

Two balancing algorithms are available. The first is round-robin, and the second is least-sessions.

Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN.

To do this, create a Peer configuration for your Asterisk server similar to the following:

apiVersion: v2beta1
kind: Peer
ref: peer-01
metadata:
name: Asterisk (Media Server)
spec:
aor: sip:conference@sip.local
username: asterisk
credentialsRef: credentials-01
loadBalancing:
withSessionAffinity: true
algorithm: least-sessions

Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

Configuration Spec

To configure the Location Service, you must provide a YAML or JSON configuration with the following structure.

PropertyDescriptionRequired
regionReserved for future useNo
bindAddrIPv4 interface on which to accept requestsNo
cacheCache configurationNo
cache.providerCache provider (Accepts either memory or redis)No
cache.parametersCache parameters (Comma-separated key-value pairs)No

The cache.parameters property is only needed if you are using the Redis provider.

The following table shows the available parameters for the Redis provider.

PropertyDescriptionRequired
usernameUsername (if required by Redis)No
passwordPassword (if required by Redis)No
hostRedis host (Defaults to localhost)No
portRedis port (Defaults to 6379)No
secureUse secure connection for RedisNo

Here is an example of a configuration file:

Filename: location.yaml or location.json

kind: Location
apiVersion: v2beta1
metadata:
region: default
spec:
bindAddr: 0.0.0.0:51902
cache:
provider: redis
parameters: "host=localhost,port=6379"

Notice that using the memory provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the least-session algorithm and run multiple instances of the Location Service. In such cases, you will need the redis provider.

Communication and Protobuf Spec

Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API.

syntax = "proto3";

package fonoster.routr.location.v2beta1;

import "google/protobuf/empty.proto";
import "common.proto";
import "processor.proto";

service Location {
rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}
rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}
rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}
}

// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)
message Route {
string user = 1;
string host = 2;
string port = 3;
string advertised_host = 13;
string advertised_port = 14;
fonoster.routr.common.v2beta1.Transport transport = 4;
int64 registered_on = 5;
int32 expires = 6;
int32 session_count = 7;
string edge_port_ref = 8;
repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;
repeated string localnets = 10;
repeated string external_addrs = 11;
// During route creation, an endpoint can request to add labels that can later be
// used as selectors. For example, a Softphone can add a label `priority=1` to indicate
// that it is the preferred endpoint for the given AOR.
map<string, string> labels = 12;
}

message AddRouteRequest {
// Address of record for the endpoint or trunk
string aor = 1;
Route route = 2;
}

message FindRoutesRequest {
message Backend {
enum Algoritm {
ROUND_ROBIN = 0;
LEAST_SESSIONS = 1;
}
string ref = 1;
bool with_session_affinity = 2;
Algoritm algorithm = 3;
}
string call_id = 1;
string aor = 2;
string session_affinity_ref = 3;
Backend backend = 4;
map<string, string> labels = 5;
}

message FindRoutesResponse {
repeated Route routes = 1;
}

message RemoveRoutesRequest {
string aor = 1;
}

Upon receiving a valid AddRoute request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition.

Link to the protobuf definition.

Launching the Location Service with Docker

The Location Service is available as a Docker image from Docker Hub. To launch the Location Service with Docker, you can use the following command:

docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location

The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port 51902 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51902.

Quick Test with gRPCurl

One easy way to interact with the Location Service for testing and development is to use gRPCurl. The following example shows how to send a request to the Location Service using gRPCurl:

grpcurl -plaintext \
-import-path /path/to/protos \
-proto location.proto -d '{...}' \
localhost:51901 \
fonoster.routr.location.v2beta1.Location/AddRouteRequest
- - +
Version: 2.0.0

Location Service

+

In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

+

Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

+

For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

+

Two balancing algorithms are available. The first is round-robin, and the second is least-sessions.

+

Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN.

+

To do this, create a Peer configuration for your Asterisk server similar to the following:

+
apiVersion: v2beta1
kind: Peer
ref: peer-01
metadata:
name: Asterisk (Media Server)
spec:
aor: sip:conference@sip.local
username: asterisk
credentialsRef: credentials-01
loadBalancing:
withSessionAffinity: true
algorithm: least-sessions
+

Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

+

Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

+

Configuration Spec

+

To configure the Location Service, you must provide a YAML or JSON configuration with the following structure.

+
PropertyDescriptionRequired
regionReserved for future useNo
bindAddrIPv4 interface on which to accept requestsNo
cacheCache configurationNo
cache.providerCache provider (Accepts either memory or redis)No
cache.parametersCache parameters (Comma-separated key-value pairs)No
+

The cache.parameters property is only needed if you are using the Redis provider.

+

The following table shows the available parameters for the Redis provider.

+
PropertyDescriptionRequired
usernameUsername (if required by Redis)No
passwordPassword (if required by Redis)No
hostRedis host (Defaults to localhost)No
portRedis port (Defaults to 6379)No
secureUse secure connection for RedisNo
+

Here is an example of a configuration file:

+

Filename: location.yaml or location.json

+
kind: Location
apiVersion: v2beta1
metadata:
region: default
spec:
bindAddr: 0.0.0.0:51902
cache:
provider: redis
parameters: "host=localhost,port=6379"
+

Notice that using the memory provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the least-session algorithm and run multiple instances of the Location Service. In such cases, you will need the redis provider.

+

Communication and Protobuf Spec

+

Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API.

+
syntax = "proto3";

package fonoster.routr.location.v2beta1;

import "google/protobuf/empty.proto";
import "common.proto";
import "processor.proto";

service Location {
rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}
rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}
rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}
}

// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)
message Route {
string user = 1;
string host = 2;
string port = 3;
string advertised_host = 13;
string advertised_port = 14;
fonoster.routr.common.v2beta1.Transport transport = 4;
int64 registered_on = 5;
int32 expires = 6;
int32 session_count = 7;
string edge_port_ref = 8;
repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;
repeated string localnets = 10;
repeated string external_addrs = 11;
// During route creation, an endpoint can request to add labels that can later be
// used as selectors. For example, a Softphone can add a label `priority=1` to indicate
// that it is the preferred endpoint for the given AOR.
map<string, string> labels = 12;
}

message AddRouteRequest {
// Address of record for the endpoint or trunk
string aor = 1;
Route route = 2;
}

message FindRoutesRequest {
message Backend {
enum Algoritm {
ROUND_ROBIN = 0;
LEAST_SESSIONS = 1;
}
string ref = 1;
bool with_session_affinity = 2;
Algoritm algorithm = 3;
}
string call_id = 1;
string aor = 2;
string session_affinity_ref = 3;
Backend backend = 4;
map<string, string> labels = 5;
}

message FindRoutesResponse {
repeated Route routes = 1;
}

message RemoveRoutesRequest {
string aor = 1;
}
+

Upon receiving a valid AddRoute request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition.

+

Link to the protobuf definition.

+

Launching the Location Service with Docker

+

The Location Service is available as a Docker image from Docker Hub. To launch the Location Service with Docker, you can use the following command:

+
docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location
+

The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port 51902 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51902.

+

Quick Test with gRPCurl

+

One easy way to interact with the Location Service for testing and development is to use gRPCurl. The following example shows how to send a request to the Location Service using gRPCurl:

+
grpcurl -plaintext \
-import-path /path/to/protos \
-proto location.proto -d '{...}' \
localhost:51901 \
fonoster.routr.location.v2beta1.Location/AddRouteRequest
\ No newline at end of file diff --git a/docs/2.0.0/development/components/overview/index.html b/docs/2.0.0/development/components/overview/index.html index 89ef180fc..bfa5da3a8 100644 --- a/docs/2.0.0/development/components/overview/index.html +++ b/docs/2.0.0/development/components/overview/index.html @@ -1,22 +1,22 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
-
Version: 2.0.0

Overview

┌────────────┐┌────────────┐                           
│EdgePort 001││EdgePort 002│
└┬───────────┘└┬───────────┘
┌▽─────────────▽───────────────────────┐
│Message Dispatcher │
└┬────────────────┬───────────────────┬┘
┌▽──────────────┐┌▽─────────────────┐┌▽───────────────┐
│IM Processor ││Connect Processor ││Twilio Processor│
└┬──────────────┘└──────────────────┘└────────────────┘
┌▽────────────────────────────┐
│Data APIs & External Services│
└─────────────────────────────┘

This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.

Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more.

- - +
Version: 2.0.0

Overview

+
┌────────────┐┌────────────┐                           
│EdgePort 001││EdgePort 002│
└┬───────────┘└┬───────────┘
┌▽─────────────▽───────────────────────┐
│Message Dispatcher │
└┬────────────────┬───────────────────┬┘
┌▽──────────────┐┌▽─────────────────┐┌▽───────────────┐
│IM Processor ││Connect Processor ││Twilio Processor│
└┬──────────────┘└──────────────────┘└────────────────┘
┌▽────────────────────────────┐
│Data APIs & External Services│
└─────────────────────────────┘
+

This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.

+

Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more.

\ No newline at end of file diff --git a/docs/2.0.0/development/components/registry/index.html b/docs/2.0.0/development/components/registry/index.html index 513956057..431b96695 100644 --- a/docs/2.0.0/development/components/registry/index.html +++ b/docs/2.0.0/development/components/registry/index.html @@ -1,22 +1,37 @@ - + - -Registry Service | Routr Docs + +Registry Service | Routr Docs - - - + + + -
-
Version: 2.0.0

Registry Service

The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.

Configuration Spec

To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure.

PropertyDescriptionRequired
requesterAddrAddress of service to send requestsYes
apiAddrAddress of API serviceYes
registerIntervalInterval for sending registration requests (Defaults to 60s)No
cacheCache configurationNo
cache.providerAccepts either memory or redisNo
cache.parametersComma-separated key-value pairsNo
methodsAcceptable SIP Methods (reserved for future use)No
edgePortsList of EdgePorts for outbound registrationsYes
edgePorts.addressAddress of EdgePortYes
edgePorts.regionRegion of EdgePort (reserved for future use)No

The cache.parameters property is only needed if you are using the Redis provider.

The following table shows the available parameters for the Redis provider.

PropertyDescriptionRequired
usernameUsername (if required by Redis)No
passwordPassword (if required by Redis)No
hostRedis host (Defaults to localhost)No
portRedis port (Defaults to 6379)No
secureUse secure connection for RedisNo

Here is an example of a configuration file:

Filename: registry.yaml or registry.json

kind: Registry
apiVersion: v2beta1
spec:
requesterAddr: requester:51909
apiAddr: apiserver:51907
cache:
provider: memory
methods:
- INVITE
- MESSAGE
edgePorts:
- address: sip01.edgeport.net:5060
region: us-east1
- address: sip02.edgeport.net:6060

Communication and Protobuf Spec

The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

syntax = "proto3";

package fonoster.routr.requester.v2beta1;

import "common.proto";
import "sipmessage.proto";
import "processor.proto";

// Requester service
service Requester {
// Send Message Request
rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
}

message SendMessageRequest {
string target = 1;
fonoster.routr.processor.v2beta1.Method method = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
}

message SendMessageResponse {
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
}

Link to the protobuf definition.

Launching the Registry Service with Docker

The Registry Service is available as a Docker image from Docker Hub. To launch the Registry Service with Docker, you can use the following command:

docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry

The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address requester:51909 and the API service using the address apiserver:51907.

- - +
Version: 2.0.0

Registry Service

+

The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.

+

Configuration Spec

+

To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure.

+
PropertyDescriptionRequired
requesterAddrAddress of service to send requestsYes
apiAddrAddress of API serviceYes
registerIntervalInterval for sending registration requests (Defaults to 60s)No
cacheCache configurationNo
cache.providerAccepts either memory or redisNo
cache.parametersComma-separated key-value pairsNo
methodsAcceptable SIP Methods (reserved for future use)No
edgePortsList of EdgePorts for outbound registrationsYes
edgePorts.addressAddress of EdgePortYes
edgePorts.regionRegion of EdgePort (reserved for future use)No
+

The cache.parameters property is only needed if you are using the Redis provider.

+

The following table shows the available parameters for the Redis provider.

+
PropertyDescriptionRequired
usernameUsername (if required by Redis)No
passwordPassword (if required by Redis)No
hostRedis host (Defaults to localhost)No
portRedis port (Defaults to 6379)No
secureUse secure connection for RedisNo
+

Here is an example of a configuration file:

+

Filename: registry.yaml or registry.json

+
kind: Registry
apiVersion: v2beta1
spec:
requesterAddr: requester:51909
apiAddr: apiserver:51907
cache:
provider: memory
methods:
- INVITE
- MESSAGE
edgePorts:
- address: sip01.edgeport.net:5060
region: us-east1
- address: sip02.edgeport.net:6060
+

Communication and Protobuf Spec

+

The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

+
syntax = "proto3";

package fonoster.routr.requester.v2beta1;

import "common.proto";
import "sipmessage.proto";
import "processor.proto";

// Requester service
service Requester {
// Send Message Request
rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
}

message SendMessageRequest {
string target = 1;
fonoster.routr.processor.v2beta1.Method method = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
}

message SendMessageResponse {
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
}
+

Link to the protobuf definition.

+

Launching the Registry Service with Docker

+

The Registry Service is available as a Docker image from Docker Hub. To launch the Registry Service with Docker, you can use the following command:

+
docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry
+

The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address requester:51909 and the API service using the address apiserver:51907.

\ No newline at end of file diff --git a/docs/2.0.0/development/components/requester/index.html b/docs/2.0.0/development/components/requester/index.html index aa0a929b0..e3eed22f5 100644 --- a/docs/2.0.0/development/components/requester/index.html +++ b/docs/2.0.0/development/components/requester/index.html @@ -1,22 +1,37 @@ - + - -Requester | Routr Docs + +Requester | Routr Docs - - - + + + -
-
Version: 2.0.0

Requester

The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.

Configuration Spec

The Requester service does not have a configuration file. However the following environment variables are available:

  • BIND_ADDR - Address to bind the service (Defaults to 0.0.0.0:51909)
  • ENABLE_HEALTHCHECKS - Enable health checks (Defaults to true)

Communication and Protobuf Spec

Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

syntax = "proto3";

package fonoster.routr.requester.v2beta1;

import "common.proto";
import "sipmessage.proto";
import "processor.proto";

// Requester service
service Requester {
// Send Message Request
rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
}

message SendMessageRequest {
string target = 1;
fonoster.routr.processor.v2beta1.Method method = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
}

message SendMessageResponse {
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
}

Link to the protobuf definition.

Launching the Requester with Docker

The Requester is available as a Docker image from Docker Hub. To launch the Requester with Docker, you can use the following command:

docker run -it -p 51909:51909 fonoster/routr-requester

The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port 51909 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port 51909.

Quick Test with gRPCurl

One easy way to interact with the Requester for testing and development is to use gRPCurl. The following example shows how to send a request to the Requester using gRPCurl:

grpcurl -plaintext \
-import-path /path/to/protos \
-proto requester.proto -d '{...}' \
localhost:51909 \
fonoster.routr.requester.v2beta1.Requester/SendMessage
- - +
Version: 2.0.0

Requester

+

The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.

+

Configuration Spec

+

The Requester service does not have a configuration file. However the following environment variables are available:

+
    +
  • BIND_ADDR - Address to bind the service (Defaults to 0.0.0.0:51909)
  • +
  • ENABLE_HEALTHCHECKS - Enable health checks (Defaults to true)
  • +
+

Communication and Protobuf Spec

+

Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

+
syntax = "proto3";

package fonoster.routr.requester.v2beta1;

import "common.proto";
import "sipmessage.proto";
import "processor.proto";

// Requester service
service Requester {
// Send Message Request
rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
}

message SendMessageRequest {
string target = 1;
fonoster.routr.processor.v2beta1.Method method = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
}

message SendMessageResponse {
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
}
+

Link to the protobuf definition.

+

Launching the Requester with Docker

+

The Requester is available as a Docker image from Docker Hub. To launch the Requester with Docker, you can use the following command:

+
docker run -it -p 51909:51909 fonoster/routr-requester
+

The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port 51909 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port 51909.

+

Quick Test with gRPCurl

+

One easy way to interact with the Requester for testing and development is to use gRPCurl. The following example shows how to send a request to the Requester using gRPCurl:

+
grpcurl -plaintext \
-import-path /path/to/protos \
-proto requester.proto -d '{...}' \
localhost:51909 \
fonoster.routr.requester.v2beta1.Requester/SendMessage
\ No newline at end of file diff --git a/docs/2.0.0/development/components/rtprelay/index.html b/docs/2.0.0/development/components/rtprelay/index.html index da56583c7..cb7d5bf79 100644 --- a/docs/2.0.0/development/components/rtprelay/index.html +++ b/docs/2.0.0/development/components/rtprelay/index.html @@ -1,22 +1,39 @@ - + - -RTPRelay | Routr Docs + +RTPRelay | Routr Docs - - - + + + -
-
Version: 2.0.0

RTPRelay

The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.

Configuration Spec

Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:

  • BIND_ADDR - The IP address and port to bind the gRPC server. Defaults to 0.0.0.0:51903
  • RTPENGINE_HOST - The IP address or hostname of the RTPEngine service. Required.
  • RTPENGINE_PORT - The port of the RTPEngine service. Defaults to 22222.
  • RTPENGINE_TIMEOUT - The timeout in milliseconds for the RTPEngine service. Defaults to 5000.

Communication and Protobuf Spec

Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:

syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid-session information
INFO = 12;
// Asks the recipient to issue a call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}

Link to the protobuf definition.

Launching the RTPRelay with Docker

The RTPRelay is available as a Docker image from Docker Hub. To launch the RTPRelay with Docker, you can use the following command:

docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay

The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

Quick Test with gRPCurl

One easy way to interact with the RTPRelay for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the RTPRelay.

grpcurl -plaintext \
-import-path /path/to/protos \
-proto processor.proto -d '{...}' \
localhost:51901 \
fonoster.routr.processor.v2beta1.Processor/ProcessMessage
- - +
Version: 2.0.0

RTPRelay

+

The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.

+

Configuration Spec

+

Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:

+
    +
  • BIND_ADDR - The IP address and port to bind the gRPC server. Defaults to 0.0.0.0:51903
  • +
  • RTPENGINE_HOST - The IP address or hostname of the RTPEngine service. Required.
  • +
  • RTPENGINE_PORT - The port of the RTPEngine service. Defaults to 22222.
  • +
  • RTPENGINE_TIMEOUT - The timeout in milliseconds for the RTPEngine service. Defaults to 5000.
  • +
+

Communication and Protobuf Spec

+

Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:

+
syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid-session information
INFO = 12;
// Asks the recipient to issue a call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}
+

Link to the protobuf definition.

+

Launching the RTPRelay with Docker

+

The RTPRelay is available as a Docker image from Docker Hub. To launch the RTPRelay with Docker, you can use the following command:

+
docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay
+

The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

+

Quick Test with gRPCurl

+

One easy way to interact with the RTPRelay for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the RTPRelay.

+
grpcurl -plaintext \
-import-path /path/to/protos \
-proto processor.proto -d '{...}' \
localhost:51901 \
fonoster.routr.processor.v2beta1.Processor/ProcessMessage
\ No newline at end of file diff --git a/docs/2.0.0/development/components/simpleauth/index.html b/docs/2.0.0/development/components/simpleauth/index.html index 89522d792..184228682 100644 --- a/docs/2.0.0/development/components/simpleauth/index.html +++ b/docs/2.0.0/development/components/simpleauth/index.html @@ -1,22 +1,43 @@ - + - -SimpleAuth Service | Routr Docs + +SimpleAuth Service | Routr Docs - - - + + + -
-
Version: 2.0.0

SimpleAuth Service

The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.

Configuration Spec

The SimpleAuth provides the following environment variables for configuration:

  • BIND_ADDR - The address where the service will listen for gRPC requests. Default: 0.0.0.0:51903
  • ALLOWLIST - A comma-separated list of Users allowed to bypass authentication
  • METHODS - A comma-separated list of SIP methods that require authentication (e.g., INVITE, REGISTER, MESSAGE). Required.
  • PATH_TO_AUTH - The path to a file containing the credentials for the users

Example of the authentication file:

Filename auth.json

[
{
"username": "1001",
"secret": "1234"
},
{
"username": "john",
"secret": "1234"
}
]

Communication and Protobuf Spec

The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid.

The following is the protobuf definition for the SimpleAuth service:


```protobuf
syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid-session information
INFO = 12;
// Asks the recipient to issue a call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}

Link to the protobuf definition.

Launching the SimpleAuth with Docker

The SimpleAuth is available as a Docker image from Docker Hub. To launch the SimpleAuth with Docker, you can use the following command:

docker run -it \
-p 51903:51903 \
-e ALLOWLIST=anonymous,1001 \
-e METHODS=INVITE,REGISTER,MESSAGE \
-e PATH_TO_AUTH=/path/to/auth.json \
-v /path/to/auth.json:/path/to/auth.json \
fonoster/routr-simpleauth

The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

Quick Test with gRPCurl

One easy way to interact with SimpleAuth for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the SimpleAuth.

grpcurl -plaintext \
-import-path /path/to/protos \
-proto processor.proto -d '{...}' \
localhost:51901 \
fonoster.routr.processor.v2beta1.Processor/ProcessMessage
- - +
Version: 2.0.0

SimpleAuth Service

+

The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.

+

Configuration Spec

+

The SimpleAuth provides the following environment variables for configuration:

+
    +
  • BIND_ADDR - The address where the service will listen for gRPC requests. Default: 0.0.0.0:51903
  • +
  • ALLOWLIST - A comma-separated list of Users allowed to bypass authentication
  • +
  • METHODS - A comma-separated list of SIP methods that require authentication (e.g., INVITE, REGISTER, MESSAGE). Required.
  • +
  • PATH_TO_AUTH - The path to a file containing the credentials for the users
  • +
+

Example of the authentication file:

+

Filename auth.json

+
[
{
"username": "1001",
"secret": "1234"
},
{
"username": "john",
"secret": "1234"
}
]
+

Communication and Protobuf Spec

+

The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid.

+

The following is the protobuf definition for the SimpleAuth service:

+

```protobuf
syntax = "proto3";

package fonoster.routr.processor.v2beta1;

import "common.proto";
import "sipmessage.proto";

// Processor service
service Processor {
// Process Message Request
rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
}

enum Method {
UNKNOWN = 0;
// Communicates user location (hostname, IP)
REGISTER = 1;
// Establishes a session
INVITE = 2;
// Transports Instant Messages
MESSAGE = 3;
// Publishes an event to the Server
PUBLISH = 4;
// Notifies the subscriber of a new event
NOTIFY = 5;
// Subscribes for Notification from the notifier
SUBSCRIBE = 6;
// Confirms an INVITE request
ACK = 7;
// Terminates a session
BYE = 8;
// Cancels establishing of a session
CANCEL = 9;
// Communicates information about the capabilities of calling and receiving SIP phones
OPTIONS = 10;
// Provisional Acknowledgement
PRACK = 11;
// Sends mid-session information
INFO = 12;
// Asks the recipient to issue a call transfer
REFER = 13;
// Modifies the state of a session
UPDATE = 14;
}

message NetInterface {
string host = 1;
int32 port = 2;
fonoster.routr.common.v2beta1.Transport transport = 3;
}

message MessageRequest {
// Same as the Call-Id header
string ref = 1;
string edge_port_ref = 2;
Method method = 3;
NetInterface sender = 4;
repeated NetInterface listening_points = 5;
repeated string external_addrs = 6;
repeated string localnets = 7;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
map<string, string> metadata = 9;
}

message MessageResponse {
NetInterface sender = 1;
fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
map<string, string> metadata = 3;
}
+

Link to the protobuf definition.

+

Launching the SimpleAuth with Docker

+

The SimpleAuth is available as a Docker image from Docker Hub. To launch the SimpleAuth with Docker, you can use the following command:

+
docker run -it \
-p 51903:51903 \
-e ALLOWLIST=anonymous,1001 \
-e METHODS=INVITE,REGISTER,MESSAGE \
-e PATH_TO_AUTH=/path/to/auth.json \
-v /path/to/auth.json:/path/to/auth.json \
fonoster/routr-simpleauth
+

The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

+

Quick Test with gRPCurl

+

One easy way to interact with SimpleAuth for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the SimpleAuth.

+
grpcurl -plaintext \
-import-path /path/to/protos \
-proto processor.proto -d '{...}' \
localhost:51901 \
fonoster.routr.processor.v2beta1.Processor/ProcessMessage
\ No newline at end of file diff --git a/docs/2.0.0/development/custom-data-with-the-apiserver/index.html b/docs/2.0.0/development/custom-data-with-the-apiserver/index.html index fd893edcd..b368348c8 100644 --- a/docs/2.0.0/development/custom-data-with-the-apiserver/index.html +++ b/docs/2.0.0/development/custom-data-with-the-apiserver/index.html @@ -1,22 +1,31 @@ - + - -Custom data with the APIServer | Routr Docs + +Custom data with the APIServer | Routr Docs - - - + + + -
-
Version: 2.0.0

Custom data with the APIServer

Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.

The APIServer, typically used for Routr Connect, consists of objects with an extended property to store custom data. This extended property is a JSON object you can use to store any data you want.

When to store custom data

Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system.

You might also need to store information a Processor requires, like the User-Agent of a device an Agent uses, and use that information to adjust the signaling process.

How to store custom data

To store custom data, add a property to the extended object. For instance, to add the external identifier of an Agent in your external system, do the following:

const request = {
name: "John Doe",
username: "jdoe",
privacy: Privacy.PRIVATE,
domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
enabled: true,
extended: {
"externalId": "123456789"
}
};

agents.createAgent(request)
.then(console.log)
.catch(console.error); // an error occurred

For additional examples of how to store custom data, see the Node SDK and search for "extended."

How to retrieve custom data

To retrieve custom data, read the extended property. For instance, to retrieve the external identifier of a user in your external system, do the following:

agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")
.then(agent => {
console.log(agent.extended.externalId);
})
.catch(console.error); // an error occurred
- - +
Version: 2.0.0

Custom data with the APIServer

+

Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.

+

The APIServer, typically used for Routr Connect, consists of objects with an extended property to store custom data. This extended property is a JSON object you can use to store any data you want.

+

When to store custom data

+

Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system.

+

You might also need to store information a Processor requires, like the User-Agent of a device an Agent uses, and use that information to adjust the signaling process.

+

How to store custom data

+

To store custom data, add a property to the extended object. For instance, to add the external identifier of an Agent in your external system, do the following:

+
const request = {
name: "John Doe",
username: "jdoe",
privacy: Privacy.PRIVATE,
domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
enabled: true,
extended: {
"externalId": "123456789"
}
};

agents.createAgent(request)
.then(console.log)
.catch(console.error); // an error occurred
+

For additional examples of how to store custom data, see the Node SDK and search for "extended."

+

How to retrieve custom data

+

To retrieve custom data, read the extended property. For instance, to retrieve the external identifier of a user in your external system, do the following:

+
agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")
.then(agent => {
console.log(agent.extended.externalId);
})
.catch(console.error); // an error occurred
\ No newline at end of file diff --git a/docs/2.0.0/development/development-mode-with-gitpod/index.html b/docs/2.0.0/development/development-mode-with-gitpod/index.html index 50dfd5463..1de8bca05 100644 --- a/docs/2.0.0/development/development-mode-with-gitpod/index.html +++ b/docs/2.0.0/development/development-mode-with-gitpod/index.html @@ -1,22 +1,49 @@ - + - -Development with Gitpod | Routr Docs + +Development with Gitpod | Routr Docs - - - + + + -
-
Version: 2.0.0

Development with Gitpod

Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.

To launch a Gitpod workspace, click the button below:

Open in Gitpod

This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode.

While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod.

First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:

https://gitpod.io/user/keys

Gitpod account keys

On Linux or macOS, you can find your public key by running the following command in your terminal:

cat ~/.ssh/id_rsa.pub

Or, if you are using Windows, you can find your public key using this command in your terminal:

cat %USERPROFILE%\.ssh\id_rsa.pub

If you don't have a public key, you can generate one by running the following command in your terminal:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."

https://gitpod.io/workspaces

Gitpod workspace

You want to be able to access port 5060 from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that.

To create the port forward, take the SSH connection string and add -L 5060:localhost:5060 to the end of the line. For example, your command might look like this:

ssh <workspace-ssh-connection> -L 5060:localhost:5060

Be sure to replace "workspace SSH connection" with your local connection.

Here is an example of what the command might look like:

ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 

This command forwards traffic from your local port 5060 to your Gitpod workspace's port 5060, allowing you to connect via SIP.

Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command.

This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:

https://github.com/fonoster/routr/blob/main/config/resources

Feel free to explore these files and make changes as needed.

- - +
Version: 2.0.0

Development with Gitpod

+

Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.

+

To launch a Gitpod workspace, click the button below:

+

Open in Gitpod

+

This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode.

+

While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod.

+

First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:

+

https://gitpod.io/user/keys

+

Gitpod account keys

+

On Linux or macOS, you can find your public key by running the following command in your terminal:

+
cat ~/.ssh/id_rsa.pub
+

Or, if you are using Windows, you can find your public key using this command in your terminal:

+
cat %USERPROFILE%\.ssh\id_rsa.pub
+

If you don't have a public key, you can generate one by running the following command in your terminal:

+
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
+

Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."

+

https://gitpod.io/workspaces

+

Gitpod workspace

+

You want to be able to access port 5060 from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that.

+

To create the port forward, take the SSH connection string and add -L 5060:localhost:5060 to the end of the line. For example, your command might look like this:

+
ssh <workspace-ssh-connection> -L 5060:localhost:5060
+

Be sure to replace "workspace SSH connection" with your local connection.

+

Here is an example of what the command might look like:

+
ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 
+

This command forwards traffic from your local port 5060 to your Gitpod workspace's port 5060, allowing you to connect via SIP.

+
+

Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command.

+
+

This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:

+

https://github.com/fonoster/routr/blob/main/config/resources

+

Feel free to explore these files and make changes as needed.

\ No newline at end of file diff --git a/docs/2.0.0/development/extending-the-ctl/index.html b/docs/2.0.0/development/extending-the-ctl/index.html index d05d2856b..56b8f44c2 100644 --- a/docs/2.0.0/development/extending-the-ctl/index.html +++ b/docs/2.0.0/development/extending-the-ctl/index.html @@ -1,22 +1,45 @@ - + - -Extending the Command-Line Tool | Routr Docs + +Extending the Command-Line Tool | Routr Docs - - - + + + -
-
Version: 2.0.0

Extending the Command-Line Tool

Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.

You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins.

Installing the Command-Line Tool

The CTL comes as an npm package. To install it, you run the following command:

npm install --location=global @routr/ctl

Using the Command-Line Tool

The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands.

Most commands adopt the {substantive} {verb} pattern. For instance, rctl agents get retrieves a list of agents.

If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins.

Creating a plugin

To create a new plugin, you start by running the following command:

npx oclif generate mycommand

The system will prompt you for some information about your plugin. For this example, let's choose mycommand as the name.

In your mycommand directory, you'll find the following structure:

[Directory structure omitted for brevity]

Looking at the src/commands/hello/index.ts file, you see the following code:

[Sample TypeScript code omitted for brevity]

This code defines a simple command that takes two arguments, person and from, and then prints a greeting to the console.

After you update your plugin, you install and test it by running the following command from within the plugin directory:

rctl plugins link . # Installing in development mode

For production mode installation of your plugin, you use the following command:

rctl plugins install .

If you have published your plugin to NPM, you can install it with this command:

rctl plugins install mycommand

To see your new command in action, you run the command with the --help flag and follow the instructions.

With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the Node.js SDK to interact with the server.

- - +
Version: 2.0.0

Extending the Command-Line Tool

+

Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.

+

You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins.

+

Installing the Command-Line Tool

+

The CTL comes as an npm package. To install it, you run the following command:

+
npm install --location=global @routr/ctl
+

Using the Command-Line Tool

+

The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands.

+

Most commands adopt the {substantive} {verb} pattern. For instance, rctl agents get retrieves a list of agents.

+

If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins.

+

Creating a plugin

+

To create a new plugin, you start by running the following command:

+
npx oclif generate mycommand
+

The system will prompt you for some information about your plugin. For this example, let's choose mycommand as the name.

+

In your mycommand directory, you'll find the following structure:

+

[Directory structure omitted for brevity]

+

Looking at the src/commands/hello/index.ts file, you see the following code:

+

[Sample TypeScript code omitted for brevity]

+

This code defines a simple command that takes two arguments, person and from, and then prints a greeting to the console.

+

After you update your plugin, you install and test it by running the following command from within the plugin directory:

+
rctl plugins link . # Installing in development mode
+

For production mode installation of your plugin, you use the following command:

+
rctl plugins install .
+

If you have published your plugin to NPM, you can install it with this command:

+
rctl plugins install mycommand
+

To see your new command in action, you run the command with the --help flag and follow the instructions.

+

With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the Node.js SDK to interact with the server.

\ No newline at end of file diff --git a/docs/2.0.0/development/introduction/index.html b/docs/2.0.0/development/introduction/index.html index af6855eb5..c729f863b 100644 --- a/docs/2.0.0/development/introduction/index.html +++ b/docs/2.0.0/development/introduction/index.html @@ -1,22 +1,35 @@ - + - -Introduction | Routr Docs + +Introduction | Routr Docs - - - + + + -
-
Version: 2.0.0

Introduction

Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.

Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool.

How to read this section

The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most.

Tooling and dependencies

The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:

  • Docker: We use Docker to build and run individual components
  • Docker Compose: We use Docker Compose to orchestrate the components
  • Helm: Helm helps us to deploy Routr in Kubernetes
  • Kubernetes: Kubernetes is the platform where we deploy Routr for large scale deployments
  • Kubectl: Kubectl is the command-line tool for Kubernetes
  • sngrep: A tool for monitoring SIP traffic (You could use Wireshark as well)
  • grpcurl: A command-line tool for interacting with gRPC servers

If you don't have a Kubernetes cluster, you can use Minikube or Docker Desktop with Kubernetes enabled.

- - +
Version: 2.0.0

Introduction

+

Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.

+

Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool.

+

How to read this section

+

The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most.

+

Tooling and dependencies

+

The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:

+
    +
  • Docker: We use Docker to build and run individual components
  • +
  • Docker Compose: We use Docker Compose to orchestrate the components
  • +
  • Helm: Helm helps us to deploy Routr in Kubernetes
  • +
  • Kubernetes: Kubernetes is the platform where we deploy Routr for large scale deployments
  • +
  • Kubectl: Kubectl is the command-line tool for Kubernetes
  • +
  • sngrep: A tool for monitoring SIP traffic (You could use Wireshark as well)
  • +
  • grpcurl: A command-line tool for interacting with gRPC servers
  • +
+

If you don't have a Kubernetes cluster, you can use Minikube or Docker Desktop with Kubernetes enabled.

\ No newline at end of file diff --git a/docs/2.0.0/development/metrics-events-logs-and-traces/index.html b/docs/2.0.0/development/metrics-events-logs-and-traces/index.html index 09ee820c8..a51f6059a 100644 --- a/docs/2.0.0/development/metrics-events-logs-and-traces/index.html +++ b/docs/2.0.0/development/metrics-events-logs-and-traces/index.html @@ -1,22 +1,20 @@ - + - -Everything about MELT | Routr Docs + +Everything about MELT | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/2.0.0/development/orchestration-with-docker/index.html b/docs/2.0.0/development/orchestration-with-docker/index.html index 55bf47d1d..69b57aee7 100644 --- a/docs/2.0.0/development/orchestration-with-docker/index.html +++ b/docs/2.0.0/development/orchestration-with-docker/index.html @@ -1,22 +1,20 @@ - + - -Orchestration with Docker | Routr Docs + +Orchestration with Docker | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/2.0.0/development/orchestration-with-kubernetes/index.html b/docs/2.0.0/development/orchestration-with-kubernetes/index.html index 0bf3898b5..231f8037f 100644 --- a/docs/2.0.0/development/orchestration-with-kubernetes/index.html +++ b/docs/2.0.0/development/orchestration-with-kubernetes/index.html @@ -1,22 +1,20 @@ - + - -Orchestration with Kubernetes | Routr Docs + +Orchestration with Kubernetes | Routr Docs - - - + + + -
-
- - +
Version: 2.0.0

Orchestration with Kubernetes

+

Coming soon.

\ No newline at end of file diff --git a/docs/2.0.0/development/quick-start/index.html b/docs/2.0.0/development/quick-start/index.html index 7017000a9..b5d8fddba 100644 --- a/docs/2.0.0/development/quick-start/index.html +++ b/docs/2.0.0/development/quick-start/index.html @@ -1,22 +1,49 @@ - + - -Quick Start | Routr Docs + +Quick Start | Routr Docs - - - + + + -
-
Version: 2.0.0

Quick Start

Before starting the development, you need to install the following tools:

  • NodeJS (>=16.14)
  • JDK (>=11)

For NodeJS, we recommend using nvm to manage your NodeJS versions.

Clone and Build the Project

To get started, first, clone the repository:

git clone https://github.com/fonoster/routr

The previous command will create a directory called routr with the project's source code.

Next, set the JAVA_HOME environment variable to the location of your JDK installation:

export JAVA_HOME=/path/to/jdk

Finally, build the project:

cd routr
npm run make

The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors.

Run the Project

To run all the components, you can use the following command:

npm run start

The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry.

As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart.

You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:

In one terminal:

npm run start:edgeport

Example output:

> start:edgeport
> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh

2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0
2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]
2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]
2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz

In a separate terminal:

npm run start:location

Example output:

> start:location
> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): mods/**/*
[nodemon] watching extensions: ts
[nodemon] starting `ts-node mods/location/src/runner.ts`
2023-09-05 12:41:38.733 [verbose]: (grpc-health-check) /node_modules/@fonoster/grpc-health-check/dist/add-health-to-server.js added healthcheck service {}
2023-09-05 12:41:38.735 [info]: (location) /mods/location/src/service.ts using memory as cache provider {}
2023-09-05 12:41:38.739 [info]: (common) /mods/common/dist/service.js starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}

Please see the scripts section of package.json for a complete list of available commands.

- - +
Version: 2.0.0

Quick Start

+

Before starting the development, you need to install the following tools:

+
    +
  • NodeJS (>=16.14)
  • +
  • JDK (>=11)
  • +
+

For NodeJS, we recommend using nvm to manage your NodeJS versions.

+

Clone and Build the Project

+

To get started, first, clone the repository:

+
git clone https://github.com/fonoster/routr
+

The previous command will create a directory called routr with the project's source code.

+

Next, set the JAVA_HOME environment variable to the location of your JDK installation:

+
export JAVA_HOME=/path/to/jdk
+

Finally, build the project:

+
cd routr
npm run make
+

The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors.

+

Run the Project

+

To run all the components, you can use the following command:

+
npm run start
+

The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry.

+

As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart.

+

You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:

+

In one terminal:

+
npm run start:edgeport
+

Example output:

+
> start:edgeport
> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh

2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0
2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]
2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]
2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz
+

In a separate terminal:

+
npm run start:location
+

Example output:

+
> start:location
> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): mods/**/*
[nodemon] watching extensions: ts
[nodemon] starting `ts-node mods/location/src/runner.ts`
2023-09-05 12:41:38.733 [verbose]: (grpc-health-check) /node_modules/@fonoster/grpc-health-check/dist/add-health-to-server.js added healthcheck service {}
2023-09-05 12:41:38.735 [info]: (location) /mods/location/src/service.ts using memory as cache provider {}
2023-09-05 12:41:38.739 [info]: (common) /mods/common/dist/service.js starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}
+

Please see the scripts section of package.json for a complete list of available commands.

\ No newline at end of file diff --git a/docs/2.0.0/development/testing-with-seet/index.html b/docs/2.0.0/development/testing-with-seet/index.html index 8e84a48af..9111d2bd3 100644 --- a/docs/2.0.0/development/testing-with-seet/index.html +++ b/docs/2.0.0/development/testing-with-seet/index.html @@ -1,22 +1,20 @@ - + - -Testing with SEET | Routr Docs + +Testing with SEET | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/2.0.0/faqs/index.html b/docs/2.0.0/faqs/index.html index 6ae4b3e5b..28650cc34 100644 --- a/docs/2.0.0/faqs/index.html +++ b/docs/2.0.0/faqs/index.html @@ -1,22 +1,36 @@ - + - -FAQs | Routr Docs + +FAQs | Routr Docs - - - + + + -
-
Version: 2.0.0

FAQs

What is Routr?

Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

What dependencies does Routr have?

The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache.

In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes.

How does Routr compare with other SIP servers

Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently.

For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one.

Is Routr a Media Server?

Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk.

This is useful when you need load balancing

Which language is the team using to build Routr?

The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS.

What license does Routr use?

We release Routr under the MIT license.

- - +
Version: 2.0.0

FAQs

+

What is Routr?

+

Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

+

What dependencies does Routr have?

+

The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache.

+

In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes.

+

How does Routr compare with other SIP servers

+

Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently.

+

For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one.

+

Is Routr a Media Server?

+

Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk.

+
+

This is useful when you need load balancing

+
+

Which language is the team using to build Routr?

+

The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS.

+

What license does Routr use?

+

We release Routr under the MIT license.

\ No newline at end of file diff --git a/docs/2.0.0/overview/architecture/index.html b/docs/2.0.0/overview/architecture/index.html index d0db1cb3b..c9e6520c2 100644 --- a/docs/2.0.0/overview/architecture/index.html +++ b/docs/2.0.0/overview/architecture/index.html @@ -1,22 +1,31 @@ - + - -Architecture | Routr Docs + +Architecture | Routr Docs - - - + + + -
-
Version: 2.0.0

Architecture

Routr&#39;s architecture diagram

Summary

Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled.

Specification

With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:

The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing.

The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more.

Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them.

- - +
Version: 2.0.0

Architecture

+

Routr&#39;s architecture diagram

+

Summary

+

Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled.

+

Specification

+

With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:

+ +

The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing.

+

The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more.

+

Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them.

\ No newline at end of file diff --git a/docs/2.0.0/overview/concepts/index.html b/docs/2.0.0/overview/concepts/index.html index 891b4d0b7..b3df109e1 100644 --- a/docs/2.0.0/overview/concepts/index.html +++ b/docs/2.0.0/overview/concepts/index.html @@ -1,22 +1,87 @@ - + - -Concepts | Routr Docs + +Concepts | Routr Docs - - - + + + -
-
Version: 2.0.0

Concepts

Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.

The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections.

EdgePort

The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages.

The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly.

Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr.

Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher

EdgePort diagram

One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as TCP,TLS, WS, or WSS.

Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality.

A minimal EdgePort configuration looks as follows:

# Example EdgePort configuration
kind: EdgePort
apiVersion: v2beta1
ref: edgeport-01
metadata:
region: default
spec:
processor:
addr: dispatcher:51901
methods:
- REGISTER
- INVITE
- ACK
- BYE
- CANCEL
transport:
- protocol: udp
port: 5060

Message Dispatcher

The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor.

The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor.

The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing.

The matchFunc is a javascript function that leverages the JSON representation of the SIPMessage protobuf.

This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor.

kind: MessageDispatcher
apiVersion: v2beta1
ref: message-dispatcher
spec:
bindAddr: 0.0.0.0:51901
processors:
- ref: im-processor
addr: im:51904
matchFunc: req => req.method === "MESSAGE"
methods:
- MESSAGE
- ref: connect-processor
addr: connect:51904
matchFunc: req => true
methods:
- REGISTER
- INVITE
- ACK
- BYE
- CANCEL

The following examples show typical matching functions:

Match all SIP Messages.

req => true

Match SIP Messages with a specific method.

req => req.method === "MESSAGE"

Match SIP Messages with a specific method and a specific header.

req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"

Match SIP Messages with a specific User-Agent header.

req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))

Location service

In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

Two balancing algorithms are available. The first is round-robin, and the second is least-sessions.

Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN.

To do this, create a Peer configuration for your Asterisk server similar to the following:

apiVersion: v2beta1
kind: Peer
ref: peer-01
metadata:
name: Asterisk (Media Server)
spec:
aor: sip:conference@sip.local
username: asterisk
credentialsRef: credentials-01
loadBalancing:
withSessionAffinity: true
algorithm: least-sessions

Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

Middlewares

Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc.

Some use cases for Middlewares include:

  • Authentication and Authorization
  • Rate limiting
  • Circuit breaking
  • Logging, Metrics, and Tracing
  • Request and response validation
  • Data transformation and normalization
  • CDRs generation

Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor.

Processors

Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the Alterations API to modify SIP messages.

The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.

const Processor = require("@routr/processor").default;
const { MessageRequest, Response } = require("@routr/processor");

new Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(
(req: MessageRequest, res: Response) => {
logger.verbose("got new request: ")
logger.verbose(JSON.stringify(req, null, " "))
res.sendOk()
}
)

Alterations

Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes.

The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:

const { Alterations } = require('@routr/processor')
const { pipe } = require("fp-ts/function");

function messageProcessing(req: MessageRequest, route: Route): MessageRequest {
const requestOut = pipe(
reqIn,
//example of an Alteration method with two arities
Alterations.addSelfVia(route),
Alterations.addSelfRecordRoute(route),
Alterations.addRouteToPeerEdgePort(route),
Alterations.addRouteToNextHop(route),
//example of an Alteration method with one arity
Alterations.addXEdgePortRef,
Alterations.decreaseMaxForwards
)

return requestOut
}

If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output.

Registry service

The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service.

Available configurations include the following:

PropertyDescriptionRequired
requesterAddrAddress of service to send requestsYes
apiAddrAddress of API serviceYes
registerIntervalInterval to send registration requestsYes
cacheCache configurationYes
methodsAcceptable SIP Methods (reserved for future use)No
edgePortsList of EdgePorts for outbound registrationsYes
edgePorts.addressAddress of EdgePortYes
edgePorts.regionRegion of EdgePort (reserved for future use)No

Here is an example of a Trunk configuration that requires registration:

kind: Registry
apiVersion: v2beta1
spec:
requesterAddr: requester:51909
apiAddr: apiserver:51907
registerInterval: 20
cache:
provider: memory
methods:
- INVITE
- MESSAGE
edgePorts:
- address: sip01.edgeport.net:5060
region: us-east1
- address: sip02.edgeport.net:6060

Requester

The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service.

- - +
Version: 2.0.0

Concepts

+

Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.

+

The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections.

+

EdgePort

+

The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages.

+

The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly.

+

Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr.

+

Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher

+EdgePort diagram +

One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as TCP,TLS, WS, or WSS.

+

Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality.

+

A minimal EdgePort configuration looks as follows:

+
# Example EdgePort configuration
kind: EdgePort
apiVersion: v2beta1
ref: edgeport-01
metadata:
region: default
spec:
processor:
addr: dispatcher:51901
methods:
- REGISTER
- INVITE
- ACK
- BYE
- CANCEL
transport:
- protocol: udp
port: 5060
+

Message Dispatcher

+

The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor.

+

The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor.

+

The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing.

+

The matchFunc is a javascript function that leverages the JSON representation of the SIPMessage protobuf.

+

This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor.

+
kind: MessageDispatcher
apiVersion: v2beta1
ref: message-dispatcher
spec:
bindAddr: 0.0.0.0:51901
processors:
- ref: im-processor
addr: im:51904
matchFunc: req => req.method === "MESSAGE"
methods:
- MESSAGE
- ref: connect-processor
addr: connect:51904
matchFunc: req => true
methods:
- REGISTER
- INVITE
- ACK
- BYE
- CANCEL
+

The following examples show typical matching functions:

+

Match all SIP Messages.

+
req => true
+

Match SIP Messages with a specific method.

+
req => req.method === "MESSAGE"
+

Match SIP Messages with a specific method and a specific header.

+
req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"
+

Match SIP Messages with a specific User-Agent header.

+
req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))
+

Location service

+

In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

+

Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

+

For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

+

Two balancing algorithms are available. The first is round-robin, and the second is least-sessions.

+

Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN.

+

To do this, create a Peer configuration for your Asterisk server similar to the following:

+
apiVersion: v2beta1
kind: Peer
ref: peer-01
metadata:
name: Asterisk (Media Server)
spec:
aor: sip:conference@sip.local
username: asterisk
credentialsRef: credentials-01
loadBalancing:
withSessionAffinity: true
algorithm: least-sessions
+

Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

+

Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

+

Middlewares

+

Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc.

+

Some use cases for Middlewares include:

+
    +
  • Authentication and Authorization
  • +
  • Rate limiting
  • +
  • Circuit breaking
  • +
  • Logging, Metrics, and Tracing
  • +
  • Request and response validation
  • +
  • Data transformation and normalization
  • +
  • CDRs generation
  • +
+

Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor.

+

Processors

+

Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the Alterations API to modify SIP messages.

+

The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.

+
const Processor = require("@routr/processor").default;
const { MessageRequest, Response } = require("@routr/processor");

new Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(
(req: MessageRequest, res: Response) => {
logger.verbose("got new request: ")
logger.verbose(JSON.stringify(req, null, " "))
res.sendOk()
}
)
+

Alterations

+

Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes.

+

The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:

+
const { Alterations } = require('@routr/processor')
const { pipe } = require("fp-ts/function");

function messageProcessing(req: MessageRequest, route: Route): MessageRequest {
const requestOut = pipe(
reqIn,
//example of an Alteration method with two arities
Alterations.addSelfVia(route),
Alterations.addSelfRecordRoute(route),
Alterations.addRouteToPeerEdgePort(route),
Alterations.addRouteToNextHop(route),
//example of an Alteration method with one arity
Alterations.addXEdgePortRef,
Alterations.decreaseMaxForwards
)

return requestOut
}
+

If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output.

+

Registry service

+

The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service.

+

Available configurations include the following:

+
PropertyDescriptionRequired
requesterAddrAddress of service to send requestsYes
apiAddrAddress of API serviceYes
registerIntervalInterval to send registration requestsYes
cacheCache configurationYes
methodsAcceptable SIP Methods (reserved for future use)No
edgePortsList of EdgePorts for outbound registrationsYes
edgePorts.addressAddress of EdgePortYes
edgePorts.regionRegion of EdgePort (reserved for future use)No
+

Here is an example of a Trunk configuration that requires registration:

+
kind: Registry
apiVersion: v2beta1
spec:
requesterAddr: requester:51909
apiAddr: apiserver:51907
registerInterval: 20
cache:
provider: memory
methods:
- INVITE
- MESSAGE
edgePorts:
- address: sip01.edgeport.net:5060
region: us-east1
- address: sip02.edgeport.net:6060
+

Requester

+

The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service.

\ No newline at end of file diff --git a/docs/2.0.0/overview/deploy-with-docker/index.html b/docs/2.0.0/overview/deploy-with-docker/index.html index ca783fe8d..d6ee6c3a0 100644 --- a/docs/2.0.0/overview/deploy-with-docker/index.html +++ b/docs/2.0.0/overview/deploy-with-docker/index.html @@ -1,22 +1,44 @@ - + - -Deploy with Docker | Routr Docs + +Deploy with Docker | Routr Docs - - - + + + -
-
Version: 2.0.0

Deploy with Docker

Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.

You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions here.

Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later.

Deploying Routr

First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

Filename: compose.yaml

version: "3"

services:
routr:
image: fonoster/routr-one:latest
environment:
EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
ports:
- 51908:51908
- 5060:5060/udp
volumes:
- shared:/var/lib/postgresql/data

volumes:
shared:

Then, start the server with:

# Be sure to replace with your IP address
DOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up

Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:

docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'

You should see something like this:

CONTAINER ID  IMAGE                                     STATUS
6c63fd573768 fonoster/routr-one:latest Up About a minute

If the status of your service is "Up," you are ready to go.

Finally, install the command-line tool and start building your SIP Network.

You can install the tool with npm as follows:

npm install --location=global @routr/ctl

Here is an example of creating an SIP Domain:

rctl domains create --insecure

The --insecure flag is required as we did not set up the TLS settings.

For additional examples, refer to the command-line documentation.

- - +
Version: 2.0.0

Deploy with Docker

+

Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.

+

You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions here.

+
+

Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later.

+
+

Deploying Routr

+

First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

+

Filename: compose.yaml

+
version: "3"

services:
routr:
image: fonoster/routr-one:latest
environment:
EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
ports:
- 51908:51908
- 5060:5060/udp
volumes:
- shared:/var/lib/postgresql/data

volumes:
shared:
+

Then, start the server with:

+
# Be sure to replace with your IP address
DOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up
+

Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:

+
docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'
+

You should see something like this:

+
CONTAINER ID  IMAGE                                     STATUS
6c63fd573768 fonoster/routr-one:latest Up About a minute
+

If the status of your service is "Up," you are ready to go.

+

Finally, install the command-line tool and start building your SIP Network.

+

You can install the tool with npm as follows:

+
npm install --location=global @routr/ctl
+

Here is an example of creating an SIP Domain:

+
rctl domains create --insecure
+
+

The --insecure flag is required as we did not set up the TLS settings.

+
+

For additional examples, refer to the command-line documentation.

\ No newline at end of file diff --git a/docs/2.0.0/overview/introduction/index.html b/docs/2.0.0/overview/introduction/index.html index 989b86881..a17d9ae9f 100644 --- a/docs/2.0.0/overview/introduction/index.html +++ b/docs/2.0.0/overview/introduction/index.html @@ -1,22 +1,32 @@ - + - -introduction | Routr Docs + +introduction | Routr Docs - - - + + + -
-
Version: 2.0.0

Community banner

Welcome

On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs.

What is Routr?

Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

Why Routr?

At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr.

We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow.

Who is Routr for?

Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community.

What is the difference between Routr and other SIP servers?

Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze.

We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality.

- - +
Version: 2.0.0

+

Community banner

+

Welcome

+

On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs.

+

What is Routr?

+

Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

+

Why Routr?

+

At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr.

+

We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow.

+

Who is Routr for?

+

Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community.

+

What is the difference between Routr and other SIP servers?

+

Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze.

+

We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality.

\ No newline at end of file diff --git a/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html b/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html index d3bedb3db..d5163ce10 100644 --- a/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html +++ b/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html @@ -1,22 +1,20 @@ - + - -Deploying to Civo with Helm | Routr Docs + +Deploying to Civo with Helm | Routr Docs - - - + + + -
-
- - +
\ No newline at end of file diff --git a/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html b/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html index 1641deaf2..c800dacb2 100644 --- a/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html +++ b/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html @@ -1,22 +1,20 @@ - + - -Ephemeral Agents in the Browser | Routr Docs + +Ephemeral Agents in the Browser | Routr Docs - - - + + + -
-
Version: 2.0.0

Ephemeral Agents in the Browser

Coming soon.

- - +
Version: 2.0.0

Ephemeral Agents in the Browser

+

Coming soon.

\ No newline at end of file diff --git a/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html b/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html index 3abb3f539..277229db0 100644 --- a/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html +++ b/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html @@ -1,22 +1,20 @@ - + - -Intercom System with Routr and Kubernetes | Routr Docs + +Intercom System with Routr and Kubernetes | Routr Docs - - - + + + -
-
Version: 2.0.0

Intercom System with Routr and Kubernetes

Coming soon.

- - +
Version: 2.0.0

Intercom System with Routr and Kubernetes

+

Coming soon.

\ No newline at end of file diff --git a/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html b/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html index dc002a78e..791138e13 100644 --- a/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html +++ b/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html @@ -1,22 +1,20 @@ - + - -Load-balancing Asterisk with Routr | Routr Docs + +Load-balancing Asterisk with Routr | Routr Docs - - - + + + -
-
Version: 2.0.0

Load-balancing Asterisk with Routr

Coming soon.

- - +
Version: 2.0.0

Load-balancing Asterisk with Routr

+

Coming soon.

\ No newline at end of file diff --git a/search/index.html b/search/index.html index 67538e905..4bedad314 100644 --- a/search/index.html +++ b/search/index.html @@ -2,21 +2,18 @@ - -Search the documentation | Routr Docs + +Search the documentation | Routr Docs - - - + + + -
-

Search the documentation

- - +

Search the documentation

\ No newline at end of file