diff --git a/404.html b/404.html index 1f3b1e8d1..d563d187d 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Zealot - - + +
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/js/0da88c94.9a3bdbee.js b/assets/js/0da88c94.a66d3756.js similarity index 99% rename from assets/js/0da88c94.9a3bdbee.js rename to assets/js/0da88c94.a66d3756.js index 71e34d0b8..8c6920fd7 100644 --- a/assets/js/0da88c94.9a3bdbee.js +++ b/assets/js/0da88c94.a66d3756.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[112],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.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 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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},u),{},{components:n})):a.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function k(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=f({queryString:n,groupId:a}),[d,k]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),k(e)}),[c,k,o]),tabValues:o}}var h=n(2389);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function v(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",g.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function b(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",g.tabList)},r.createElement(v,(0,a.Z)({},e,t)),r.createElement(b,(0,a.Z)({},e,t)))}function y(e){const t=(0,h.Z)();return r.createElement(w,(0,a.Z)({key:String(t)},e))}},2831:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={},s="Visual Studio Code Dev Container Setup",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/docs/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/next/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/devcontainer.md",tags:[],version:"current",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/next/category/local-development"},next:{title:"Source code",permalink:"/docs/next/contributing-guide/local-development/source-code"}},u={},d=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-setup"},"Visual Studio Code Dev Container Setup"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"The Visual Studio Code Dev Containers")," lets you use a Docker container as a full-featured development environment."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"system-requirements"},"System requirements"),(0,r.kt)("p",null,"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."),(0,r.kt)("h3",{id:"install-git"},"Install Git"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"Install")," it from offical website."),(0,r.kt)("h3",{id:"install-docker--docker-compose"},"Install Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),". (Docker Toolbox is not supported. Windows container images are not supported.)"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ and ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+. (The Ubuntu snap package is not supported.)")),(0,r.kt)("h3",{id:"install-visual-studio-code"},"Install Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."),(0,r.kt)("p",null,"Follow the platform-specific guides below:"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," for macOS."),(0,r.kt)("li",{parentName:"ol"},"Open the browser's download list and locate the downloaded app or archive."),(0,r.kt)("li",{parentName:"ol"},"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."),(0,r.kt)("li",{parentName:"ol"},"Drag ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," to the Applications folder, making it available in the macOS Launchpad."),(0,r.kt)("li",{parentName:"ol"},"Open VS Code from the Applications folder, by double clicking the icon."))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," for Windows."),(0,r.kt)("li",{parentName:"ol"},"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."),(0,r.kt)("li",{parentName:"ol"},"By default, VS Code is installed under ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code"),"."))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"Following the ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"offical Linux install guide"),"."))),(0,r.kt)("h3",{id:"install-remote-container-extension"},"Install Remote container extension"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"fetch-zealot-codesoace"},"Fetch Zealot Codesoace"),(0,r.kt)("p",null,"Zealot Codespace was in the ",(0,r.kt)("inlineCode",{parentName:"p"},".devcontailer")," folder of Zealot project, so you need clone the source code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Explan these files in Codespace:"),(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},"File"),(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},(0,r.kt)("inlineCode",{parentName:"td"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer config")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"Base Dockerfile, auto push multi registry servers after changes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"Speed up build time, depends on above image.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"All services of Zealot")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"Create user and role for Zealot")))),(0,r.kt)("h2",{id:"open-the-project-in-a-container"},"Open the project in a container"),(0,r.kt)("p",null,"Start Visual Studio Code, run the ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," command in ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," and select the Zealot folder."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"Click the ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," to review zealot codespace build real time logging messages."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"In host Docker containers:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"start-the-project"},"Start the project"),(0,r.kt)("p",null,"Press ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," to run all services."),(0,r.kt)("p",null,"Notice that the terminal prompt might look different than your normal terminal prompt."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"open-in-browser"},"Open in browser"),(0,r.kt)("p",null,"A while after run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev"),", select ",(0,r.kt)("strong",{parentName:"p"},"Ports")," to see all forwarded ports, ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," in quick way."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}f.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[112],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.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 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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},u),{},{components:n})):a.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function k(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=f({queryString:n,groupId:a}),[d,k]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),k(e)}),[c,k,o]),tabValues:o}}var h=n(2389);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function v(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",g.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function b(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",g.tabList)},r.createElement(v,(0,a.Z)({},e,t)),r.createElement(b,(0,a.Z)({},e,t)))}function y(e){const t=(0,h.Z)();return r.createElement(w,(0,a.Z)({key:String(t)},e))}},2831:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={},s="Visual Studio Code Dev Container Setup",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/docs/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/next/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/devcontainer.md",tags:[],version:"current",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/next/category/local-development"},next:{title:"Source code",permalink:"/docs/next/contributing-guide/local-development/source-code"}},u={},d=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-setup"},"Visual Studio Code Dev Container Setup"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"The Visual Studio Code Dev Containers")," lets you use a Docker container as a full-featured development environment."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"system-requirements"},"System requirements"),(0,r.kt)("p",null,"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."),(0,r.kt)("h3",{id:"install-git"},"Install Git"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"Install")," it from offical website."),(0,r.kt)("h3",{id:"install-docker--docker-compose"},"Install Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),". (Docker Toolbox is not supported. Windows container images are not supported.)"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ and ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+. (The Ubuntu snap package is not supported.)")),(0,r.kt)("h3",{id:"install-visual-studio-code"},"Install Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."),(0,r.kt)("p",null,"Follow the platform-specific guides below:"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," for macOS."),(0,r.kt)("li",{parentName:"ol"},"Open the browser's download list and locate the downloaded app or archive."),(0,r.kt)("li",{parentName:"ol"},"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."),(0,r.kt)("li",{parentName:"ol"},"Drag ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," to the Applications folder, making it available in the macOS Launchpad."),(0,r.kt)("li",{parentName:"ol"},"Open VS Code from the Applications folder, by double clicking the icon."))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," for Windows."),(0,r.kt)("li",{parentName:"ol"},"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."),(0,r.kt)("li",{parentName:"ol"},"By default, VS Code is installed under ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code"),"."))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"Following the ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"offical Linux install guide"),"."))),(0,r.kt)("h3",{id:"install-remote-container-extension"},"Install Remote container extension"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"fetch-zealot-codesoace"},"Fetch Zealot Codesoace"),(0,r.kt)("p",null,"Zealot Codespace was in the ",(0,r.kt)("inlineCode",{parentName:"p"},".devcontailer")," folder of Zealot project, so you need clone the source code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Explan these files in Codespace:"),(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},"File"),(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},(0,r.kt)("inlineCode",{parentName:"td"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer config")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"Base Dockerfile, auto push multi registry servers after changes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"Speed up build time, depends on above image.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"All services of Zealot")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"Create user and role for Zealot")))),(0,r.kt)("h2",{id:"open-the-project-in-a-container"},"Open the project in a container"),(0,r.kt)("p",null,"Start Visual Studio Code, run the ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," command in ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," and select the Zealot folder."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"Click the ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," to review zealot codespace build real time logging messages."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"In host Docker containers:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"start-the-project"},"Start the project"),(0,r.kt)("p",null,"Press ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," to run all services."),(0,r.kt)("p",null,"Notice that the terminal prompt might look different than your normal terminal prompt."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"open-in-browser"},"Open in browser"),(0,r.kt)("p",null,"A while after run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev"),", select ",(0,r.kt)("strong",{parentName:"p"},"Ports")," to see all forwarded ports, ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," in quick way."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}f.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file diff --git a/assets/js/14a24e11.1b5645a6.js b/assets/js/14a24e11.569eae0d.js similarity index 99% rename from assets/js/14a24e11.1b5645a6.js rename to assets/js/14a24e11.569eae0d.js index dd675bd05..5fc75710f 100644 --- a/assets/js/14a24e11.1b5645a6.js +++ b/assets/js/14a24e11.569eae0d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7400],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.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 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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},u),{},{components:n})):a.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function k(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=f({queryString:n,groupId:a}),[d,k]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),k(e)}),[c,k,o]),tabValues:o}}var h=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function b(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(b,(0,a.Z)({},e,t)))}function y(e){const t=(0,h.Z)();return r.createElement(w,(0,a.Z)({key:String(t)},e))}},6824:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={},s="Visual Studio Code Dev Container Setup",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-4.x/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/4.x/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",tags:[],version:"4.x",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/4.x/category/local-development"},next:{title:"Source code",permalink:"/docs/4.x/contributing-guide/local-development/source-code"}},u={},d=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-setup"},"Visual Studio Code Dev Container Setup"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"The Visual Studio Code Dev Containers")," lets you use a Docker container as a full-featured development environment."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"system-requirements"},"System requirements"),(0,r.kt)("p",null,"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."),(0,r.kt)("h3",{id:"install-git"},"Install Git"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"Install")," it from offical website."),(0,r.kt)("h3",{id:"install-docker--docker-compose"},"Install Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),". (Docker Toolbox is not supported. Windows container images are not supported.)"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ and ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+. (The Ubuntu snap package is not supported.)")),(0,r.kt)("h3",{id:"install-visual-studio-code"},"Install Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."),(0,r.kt)("p",null,"Follow the platform-specific guides below:"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," for macOS."),(0,r.kt)("li",{parentName:"ol"},"Open the browser's download list and locate the downloaded app or archive."),(0,r.kt)("li",{parentName:"ol"},"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."),(0,r.kt)("li",{parentName:"ol"},"Drag ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," to the Applications folder, making it available in the macOS Launchpad."),(0,r.kt)("li",{parentName:"ol"},"Open VS Code from the Applications folder, by double clicking the icon."))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," for Windows."),(0,r.kt)("li",{parentName:"ol"},"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."),(0,r.kt)("li",{parentName:"ol"},"By default, VS Code is installed under ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code"),"."))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"Following the ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"offical Linux install guide"),"."))),(0,r.kt)("h3",{id:"install-remote-container-extension"},"Install Remote container extension"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"fetch-zealot-codesoace"},"Fetch Zealot Codesoace"),(0,r.kt)("p",null,"Zealot Codespace was in the ",(0,r.kt)("inlineCode",{parentName:"p"},".devcontailer")," folder of Zealot project, so you need clone the source code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Explan these files in Codespace:"),(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},"File"),(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},(0,r.kt)("inlineCode",{parentName:"td"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer config")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"Base Dockerfile, auto push multi registry servers after changes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"Speed up build time, depends on above image.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"All services of Zealot")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"Create user and role for Zealot")))),(0,r.kt)("h2",{id:"open-the-project-in-a-container"},"Open the project in a container"),(0,r.kt)("p",null,"Start Visual Studio Code, run the ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," command in ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," and select the Zealot folder."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"Click the ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," to review zealot codespace build real time logging messages."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"In host Docker containers:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"start-the-project"},"Start the project"),(0,r.kt)("p",null,"Press ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," to run all services."),(0,r.kt)("p",null,"Notice that the terminal prompt might look different than your normal terminal prompt."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"open-in-browser"},"Open in browser"),(0,r.kt)("p",null,"A while after run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev"),", select ",(0,r.kt)("strong",{parentName:"p"},"Ports")," to see all forwarded ports, ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," in quick way."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}f.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7400],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.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 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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},u),{},{components:n})):a.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function k(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=f({queryString:n,groupId:a}),[d,k]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),k(e)}),[c,k,o]),tabValues:o}}var h=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function b(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(b,(0,a.Z)({},e,t)))}function y(e){const t=(0,h.Z)();return r.createElement(w,(0,a.Z)({key:String(t)},e))}},6824:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={},s="Visual Studio Code Dev Container Setup",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-4.x/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/4.x/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",tags:[],version:"4.x",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/4.x/category/local-development"},next:{title:"Source code",permalink:"/docs/4.x/contributing-guide/local-development/source-code"}},u={},d=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-setup"},"Visual Studio Code Dev Container Setup"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"The Visual Studio Code Dev Containers")," lets you use a Docker container as a full-featured development environment."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"system-requirements"},"System requirements"),(0,r.kt)("p",null,"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."),(0,r.kt)("h3",{id:"install-git"},"Install Git"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"Install")," it from offical website."),(0,r.kt)("h3",{id:"install-docker--docker-compose"},"Install Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),". (Docker Toolbox is not supported. Windows container images are not supported.)"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ and ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+. (The Ubuntu snap package is not supported.)")),(0,r.kt)("h3",{id:"install-visual-studio-code"},"Install Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."),(0,r.kt)("p",null,"Follow the platform-specific guides below:"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," for macOS."),(0,r.kt)("li",{parentName:"ol"},"Open the browser's download list and locate the downloaded app or archive."),(0,r.kt)("li",{parentName:"ol"},"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."),(0,r.kt)("li",{parentName:"ol"},"Drag ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," to the Applications folder, making it available in the macOS Launchpad."),(0,r.kt)("li",{parentName:"ol"},"Open VS Code from the Applications folder, by double clicking the icon."))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," for Windows."),(0,r.kt)("li",{parentName:"ol"},"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."),(0,r.kt)("li",{parentName:"ol"},"By default, VS Code is installed under ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code"),"."))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"Following the ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"offical Linux install guide"),"."))),(0,r.kt)("h3",{id:"install-remote-container-extension"},"Install Remote container extension"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"fetch-zealot-codesoace"},"Fetch Zealot Codesoace"),(0,r.kt)("p",null,"Zealot Codespace was in the ",(0,r.kt)("inlineCode",{parentName:"p"},".devcontailer")," folder of Zealot project, so you need clone the source code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Explan these files in Codespace:"),(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},"File"),(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},(0,r.kt)("inlineCode",{parentName:"td"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer config")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"Base Dockerfile, auto push multi registry servers after changes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"Speed up build time, depends on above image.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"All services of Zealot")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"Create user and role for Zealot")))),(0,r.kt)("h2",{id:"open-the-project-in-a-container"},"Open the project in a container"),(0,r.kt)("p",null,"Start Visual Studio Code, run the ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," command in ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," and select the Zealot folder."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"Click the ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," to review zealot codespace build real time logging messages."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"In host Docker containers:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"start-the-project"},"Start the project"),(0,r.kt)("p",null,"Press ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," to run all services."),(0,r.kt)("p",null,"Notice that the terminal prompt might look different than your normal terminal prompt."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"open-in-browser"},"Open in browser"),(0,r.kt)("p",null,"A while after run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev"),", select ",(0,r.kt)("strong",{parentName:"p"},"Ports")," to see all forwarded ports, ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," in quick way."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}f.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file diff --git a/assets/js/14b2f636.7324f40e.js b/assets/js/14b2f636.547b871b.js similarity index 99% rename from assets/js/14b2f636.7324f40e.js rename to assets/js/14b2f636.547b871b.js index d2417da2c..5f08ef4f9 100644 --- a/assets/js/14b2f636.7324f40e.js +++ b/assets/js/14b2f636.547b871b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5672],{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 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=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 i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.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,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));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]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,l[1]=s;for(var c=2;c{r.d(t,{Z:()=>l});var n=r(7294),a=r(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:r,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>x});var n=r(7462),a=r(7294),o=r(6010),l=r(2466),s=r(6550),i=r(1980),c=r(7392),u=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,o=d(e),[l,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,c]=f({queryString:r,groupId:n}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,u.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:n}),v=(()=>{const e=i??p;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&s(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),c(e),h(e)}),[c,h,o]),tabValues:o}}var v=r(2389);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:p}=(0,l.o5)(),d=e=>{const t=e.currentTarget,r=u.indexOf(t),n=c[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},c.map((e=>{let{value:t,label:r,attributes:l}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:d},l,{className:(0,o.Z)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=h(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",k.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},8717:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),o=r(941),l=r(4996),s=r(4866),i=r(5162);const c={},u="Reverse Proxies",p={unversionedId:"self-hosted/reverse-proxies",id:"version-5.0.0/self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.0.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/category/cloud-provider-guides"}},d={},m=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},h="wrapper";function v(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reverse-proxies"},"Reverse Proxies"),(0,a.kt)("p",null,"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."),(0,a.kt)(o.Z,{alt:"Architecture",sources:{light:(0,l.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,l.Z)("/img/5.0.0/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"prepare"},"Prepare"),(0,a.kt)("p",null,"The following data needs to be prepared to configure the reverse proxy:"),(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},"Name"),(0,a.kt)("th",{parentName:"tr",align:null},"Sample value"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Domain"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Reverse proxy service IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed",(0,a.kt)("br",null),"Change to 127.0.0.1 Reverse Proxy and zealot with one host.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot public port"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot internal port"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"No need modify")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt Email address"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."),(0,a.kt)("h3",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"),(0,a.kt)("h3",{id:"traefik-service"},"Traefik service"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," then edit the Docker Compose file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," or ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),", add key-value below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," and make sure Nomad version >= 1.3:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2"},"Caddy 2"),(0,a.kt)("p",null,"The configuration only needs to relate the ip part after ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("p",null,"The following is the general configuration, if not effects welcome to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"file a issue"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"And you need update max body size in ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}v.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5672],{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 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=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 i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.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,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));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]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,l[1]=s;for(var c=2;c{r.d(t,{Z:()=>l});var n=r(7294),a=r(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:r,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>x});var n=r(7462),a=r(7294),o=r(4334),l=r(2466),s=r(6550),i=r(1980),c=r(7392),u=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,o=d(e),[l,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,c]=f({queryString:r,groupId:n}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,u.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:n}),v=(()=>{const e=i??p;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&s(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),c(e),h(e)}),[c,h,o]),tabValues:o}}var v=r(2389);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:p}=(0,l.o5)(),d=e=>{const t=e.currentTarget,r=u.indexOf(t),n=c[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},c.map((e=>{let{value:t,label:r,attributes:l}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:d},l,{className:(0,o.Z)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=h(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",k.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},8717:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),o=r(941),l=r(4996),s=r(4866),i=r(5162);const c={},u="Reverse Proxies",p={unversionedId:"self-hosted/reverse-proxies",id:"version-5.0.0/self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.0.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/category/cloud-provider-guides"}},d={},m=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},h="wrapper";function v(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reverse-proxies"},"Reverse Proxies"),(0,a.kt)("p",null,"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."),(0,a.kt)(o.Z,{alt:"Architecture",sources:{light:(0,l.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,l.Z)("/img/5.0.0/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"prepare"},"Prepare"),(0,a.kt)("p",null,"The following data needs to be prepared to configure the reverse proxy:"),(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},"Name"),(0,a.kt)("th",{parentName:"tr",align:null},"Sample value"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Domain"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Reverse proxy service IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed",(0,a.kt)("br",null),"Change to 127.0.0.1 Reverse Proxy and zealot with one host.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot public port"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot internal port"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"No need modify")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt Email address"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."),(0,a.kt)("h3",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"),(0,a.kt)("h3",{id:"traefik-service"},"Traefik service"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," then edit the Docker Compose file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," or ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),", add key-value below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," and make sure Nomad version >= 1.3:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2"},"Caddy 2"),(0,a.kt)("p",null,"The configuration only needs to relate the ip part after ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("p",null,"The following is the general configuration, if not effects welcome to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"file a issue"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"And you need update max body size in ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}v.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/14eb3368.bf9cc31c.js b/assets/js/14eb3368.94edc1dc.js similarity index 95% rename from zh-Hans/assets/js/14eb3368.bf9cc31c.js rename to assets/js/14eb3368.94edc1dc.js index 28cffa313..d5c37a83b 100644 --- a/zh-Hans/assets/js/14eb3368.bf9cc31c.js +++ b/assets/js/14eb3368.94edc1dc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(7462),r=a(7294),i=a(6010),l=a(5281),s=a(3438),c=a(8596),o=a(9960),m=a(5999),d=a(4996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.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 h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.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},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},4228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(7294),r=a(1944),i=a(3438),l=a(4996),s=a(6010),c=a(9960),o=a(3919),m=a(5999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(4966),N=a(3120),Z=a(4364),k=a(1310),_=a(7955);const L={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:L.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(_.Z,{as:"h1",className:L.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:L.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},4966:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(7462),r=a(7294),i=a(5999),l=a(6010),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:i}=e;return r.createElement(s.Z,{className:(0,l.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&r.createElement("div",{className:"pagination-nav__sublabel"},n),r.createElement("div",{className:"pagination-nav__label"},a))}function o(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&r.createElement(c,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(c,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),r=a(6010),i=a(5999),l=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7294),r=a(6010),i=a(2263),l=a(9960),s=a(5999),c=a(143),o=a(5281),m=a(373),d=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.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 v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},7955:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(7462),r=a(7294),i=a(6010),l=a(5999),s=a(6668),c=a(9960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,s.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(c.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(7462),r=a(7294),i=a(4334),l=a(5281),s=a(3438),c=a(8596),o=a(9960),m=a(5999),d=a(4996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.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 h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.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},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},4228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(7294),r=a(1944),i=a(3438),l=a(4996),s=a(4334),c=a(9960),o=a(3919),m=a(5999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(4966),N=a(3120),Z=a(4364),k=a(1310),_=a(7955);const L={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:L.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(_.Z,{as:"h1",className:L.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:L.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},4966:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(7462),r=a(7294),i=a(5999),l=a(4334),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:i}=e;return r.createElement(s.Z,{className:(0,l.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&r.createElement("div",{className:"pagination-nav__sublabel"},n),r.createElement("div",{className:"pagination-nav__label"},a))}function o(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&r.createElement(c,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(c,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),r=a(4334),i=a(5999),l=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7294),r=a(4334),i=a(2263),l=a(9960),s=a(5999),c=a(143),o=a(5281),m=a(373),d=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.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 v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},7955:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(7462),r=a(7294),i=a(4334),l=a(5999),s=a(6668),c=a(9960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,s.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(c.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/17896441.6c096025.js b/assets/js/17896441.d30cc80e.js similarity index 97% rename from zh-Hans/assets/js/17896441.6c096025.js rename to assets/js/17896441.d30cc80e.js index 42495ee99..161b48536 100644 --- a/zh-Hans/assets/js/17896441.6c096025.js +++ b/assets/js/17896441.d30cc80e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7918],{1310:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7462),l=a(7294),r=a(6010),o=a(5281),s=a(3438),c=a(8596),i=a(9960),d=a(5999),m=a(4996);function u(e){return l.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),l.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 b={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function p(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.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},l.createElement(u,{className:b.breadcrumbHomeIcon})))}const E={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function h(e){let{children:t,href:a,isLast:n}=e;const r="breadcrumbs__link";return n?l.createElement("span",{className:r,itemProp:"name"},t):a?l.createElement(i.Z,{className:r,href:a,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:r},t)}function v(e){let{children:t,active:a,index:o,addMicrodata:s}=e;return l.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,r.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,l.createElement("meta",{itemProp:"position",content:String(o+1)}))}function g(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,r.Z)(o.k.docs.docBreadcrumbs,E.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(p,null),e.map(((t,a)=>{const n=a===e.length-1;return l.createElement(v,{key:a,active:n,index:a,addMicrodata:!!t.href},l.createElement(h,{href:t.href,isLast:n},t.label))})))):null}},230:(e,t,a)=>{a.r(t),a.d(t,{default:()=>X});var n=a(7294),l=a(1944),r=a(902);const o=n.createContext(null);function s(e){let{children:t,content:a}=e;const l=function(e){return(0,n.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(a);return n.createElement(o.Provider,{value:l},t)}function c(){const e=(0,n.useContext)(o);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:a}=c();return n.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:a.image??t.image})}var d=a(6010),m=a(7524),u=a(4966);function b(){const{metadata:e}=c();return n.createElement(u.Z,{previous:e.previous,next:e.next})}var p=a(3120),E=a(4364),h=a(5281),v=a(5999);function g(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:n.createElement("b",null,n.createElement("time",{dateTime:new Date(1e3*t).toISOString()},a))}}," on {date}")}function f(e){let{lastUpdatedBy:t}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:n.createElement("b",null,t)}}," by {user}")}function _(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a,lastUpdatedBy:l}=e;return n.createElement("span",{className:h.k.common.lastUpdated},n.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&a?n.createElement(g,{lastUpdatedAt:t,formattedLastUpdatedAt:a}):"",byUser:l?n.createElement(f,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var Z=a(7462);const N={iconEdit:"iconEdit_Z9Sw"};function k(e){let{className:t,...a}=e;return n.createElement("svg",(0,Z.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,d.Z)(N.iconEdit,t),"aria-hidden":"true"},a),n.createElement("g",null,n.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 L(e){let{editUrl:t}=e;return n.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:h.k.common.editThisPage},n.createElement(k,null),n.createElement(v.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}var C=a(9960);const T={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:a,count:l}=e;return n.createElement(C.Z,{href:t,className:(0,d.Z)(T.tag,l?T.tagWithCount:T.tagRegular)},a,l&&n.createElement("span",null,l))}const w={tags:"tags_jXut",tag:"tag_QGVx"};function x(e){let{tags:t}=e;return n.createElement(n.Fragment,null,n.createElement("b",null,n.createElement(v.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),n.createElement("ul",{className:(0,d.Z)(w.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return n.createElement("li",{key:a,className:w.tag},n.createElement(U,{label:t,permalink:a}))}))))}const y={lastUpdated:"lastUpdated_vwxv"};function A(e){return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},n.createElement("div",{className:"col"},n.createElement(x,e)))}function M(e){let{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},n.createElement("div",{className:"col"},t&&n.createElement(L,{editUrl:t})),n.createElement("div",{className:(0,d.Z)("col",y.lastUpdated)},(a||l)&&n.createElement(_,{lastUpdatedAt:a,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function B(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:a,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:o}=e,s=o.length>0,i=!!(t||a||r);return s||i?n.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&n.createElement(A,{tags:o}),i&&n.createElement(M,{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var I=a(6043),V=a(3743);const H={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function P(e){let{collapsed:t,...a}=e;return n.createElement("button",(0,Z.Z)({type:"button"},a,{className:(0,d.Z)("clean-btn",H.tocCollapsibleButton,!t&&H.tocCollapsibleButtonExpanded,a.className)}),n.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const D={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function S(e){let{toc:t,className:a,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:o,toggleCollapsed:s}=(0,I.u)({initialState:!0});return n.createElement("div",{className:(0,d.Z)(D.tocCollapsible,!o&&D.tocCollapsibleExpanded,a)},n.createElement(P,{collapsed:o,onClick:s}),n.createElement(I.z,{lazy:!0,className:D.tocCollapsibleContent,collapsed:o},n.createElement(V.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const z={tocMobile:"tocMobile_ITEo"};function F(){const{toc:e,frontMatter:t}=c();return n.createElement(S,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,z.tocMobile)})}var R=a(9407);function O(){const{toc:e,frontMatter:t}=c();return n.createElement(R.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var j=a(7955),G=a(1506);function W(e){let{children:t}=e;const a=function(){const{metadata:e,frontMatter:t,contentTitle:a}=c();return t.hide_title||void 0!==a?null:e.title}();return n.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},a&&n.createElement("header",null,n.createElement(j.Z,{as:"h1"},a)),n.createElement(G.Z,null,t))}var q=a(1310);const J={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Q(e){let{children:t}=e;const a=function(){const{frontMatter:e,toc:t}=c(),a=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?n.createElement(F,null):void 0,desktop:!r||"desktop"!==a&&"ssr"!==a?void 0:n.createElement(O,null)}}();return n.createElement("div",{className:"row"},n.createElement("div",{className:(0,d.Z)("col",!a.hidden&&J.docItemCol)},n.createElement(p.Z,null),n.createElement("div",{className:J.docItemContainer},n.createElement("article",null,n.createElement(q.Z,null),n.createElement(E.Z,null),a.mobile,n.createElement(W,null,t),n.createElement(B,null)),n.createElement(b,null))),a.desktop&&n.createElement("div",{className:"col col--3"},a.desktop))}function X(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,a=e.content;return n.createElement(s,{content:e.content},n.createElement(l.FG,{className:t},n.createElement(i,null),n.createElement(Q,null,n.createElement(a,null))))}},4966:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7462),l=a(7294),r=a(5999),o=a(6010),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:r}=e;return l.createElement(s.Z,{className:(0,o.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&l.createElement("div",{className:"pagination-nav__sublabel"},n),l.createElement("div",{className:"pagination-nav__label"},a))}function i(e){const{previous:t,next:a}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,r.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&l.createElement(c,(0,n.Z)({},t,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&l.createElement(c,(0,n.Z)({},a,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),l=a(6010),r=a(5999),o=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,l.Z)(t,o.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>h});var n=a(7294),l=a(6010),r=a(2263),o=a(9960),s=a(5999),c=a(143),i=a(5281),d=a(373),m=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function b(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function p(e){let{versionLabel:t,to:a,onClick:l}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(o.Z,{to:a,onClick:l},n.createElement(s.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(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:o}}=(0,r.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:E}=(0,c.Jo)(s),h=u??(v=E).docs.find((e=>e.id===v.mainDocId));var v;return n.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(b,{siteTitle:o,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(p,{versionLabel:E.label,to:h.path,onClick:()=>m(E.name)})))}function h(e){let{className:t}=e;const a=(0,m.E)();return a.banner?n.createElement(E,{className:t,versionMetadata:a}):null}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7918],{1310:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7462),l=a(7294),r=a(4334),o=a(5281),s=a(3438),c=a(8596),i=a(9960),d=a(5999),m=a(4996);function u(e){return l.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),l.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 b={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function p(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.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},l.createElement(u,{className:b.breadcrumbHomeIcon})))}const E={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function h(e){let{children:t,href:a,isLast:n}=e;const r="breadcrumbs__link";return n?l.createElement("span",{className:r,itemProp:"name"},t):a?l.createElement(i.Z,{className:r,href:a,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:r},t)}function v(e){let{children:t,active:a,index:o,addMicrodata:s}=e;return l.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,r.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,l.createElement("meta",{itemProp:"position",content:String(o+1)}))}function g(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,r.Z)(o.k.docs.docBreadcrumbs,E.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(p,null),e.map(((t,a)=>{const n=a===e.length-1;return l.createElement(v,{key:a,active:n,index:a,addMicrodata:!!t.href},l.createElement(h,{href:t.href,isLast:n},t.label))})))):null}},230:(e,t,a)=>{a.r(t),a.d(t,{default:()=>X});var n=a(7294),l=a(1944),r=a(902);const o=n.createContext(null);function s(e){let{children:t,content:a}=e;const l=function(e){return(0,n.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(a);return n.createElement(o.Provider,{value:l},t)}function c(){const e=(0,n.useContext)(o);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:a}=c();return n.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:a.image??t.image})}var d=a(4334),m=a(7524),u=a(4966);function b(){const{metadata:e}=c();return n.createElement(u.Z,{previous:e.previous,next:e.next})}var p=a(3120),E=a(4364),h=a(5281),v=a(5999);function g(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:n.createElement("b",null,n.createElement("time",{dateTime:new Date(1e3*t).toISOString()},a))}}," on {date}")}function f(e){let{lastUpdatedBy:t}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:n.createElement("b",null,t)}}," by {user}")}function _(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a,lastUpdatedBy:l}=e;return n.createElement("span",{className:h.k.common.lastUpdated},n.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&a?n.createElement(g,{lastUpdatedAt:t,formattedLastUpdatedAt:a}):"",byUser:l?n.createElement(f,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var Z=a(7462);const N={iconEdit:"iconEdit_Z9Sw"};function k(e){let{className:t,...a}=e;return n.createElement("svg",(0,Z.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,d.Z)(N.iconEdit,t),"aria-hidden":"true"},a),n.createElement("g",null,n.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 L(e){let{editUrl:t}=e;return n.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:h.k.common.editThisPage},n.createElement(k,null),n.createElement(v.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}var C=a(9960);const T={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:a,count:l}=e;return n.createElement(C.Z,{href:t,className:(0,d.Z)(T.tag,l?T.tagWithCount:T.tagRegular)},a,l&&n.createElement("span",null,l))}const w={tags:"tags_jXut",tag:"tag_QGVx"};function x(e){let{tags:t}=e;return n.createElement(n.Fragment,null,n.createElement("b",null,n.createElement(v.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),n.createElement("ul",{className:(0,d.Z)(w.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return n.createElement("li",{key:a,className:w.tag},n.createElement(U,{label:t,permalink:a}))}))))}const y={lastUpdated:"lastUpdated_vwxv"};function A(e){return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},n.createElement("div",{className:"col"},n.createElement(x,e)))}function M(e){let{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},n.createElement("div",{className:"col"},t&&n.createElement(L,{editUrl:t})),n.createElement("div",{className:(0,d.Z)("col",y.lastUpdated)},(a||l)&&n.createElement(_,{lastUpdatedAt:a,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function B(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:a,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:o}=e,s=o.length>0,i=!!(t||a||r);return s||i?n.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&n.createElement(A,{tags:o}),i&&n.createElement(M,{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var I=a(6043),V=a(3743);const H={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function P(e){let{collapsed:t,...a}=e;return n.createElement("button",(0,Z.Z)({type:"button"},a,{className:(0,d.Z)("clean-btn",H.tocCollapsibleButton,!t&&H.tocCollapsibleButtonExpanded,a.className)}),n.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const D={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function S(e){let{toc:t,className:a,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:o,toggleCollapsed:s}=(0,I.u)({initialState:!0});return n.createElement("div",{className:(0,d.Z)(D.tocCollapsible,!o&&D.tocCollapsibleExpanded,a)},n.createElement(P,{collapsed:o,onClick:s}),n.createElement(I.z,{lazy:!0,className:D.tocCollapsibleContent,collapsed:o},n.createElement(V.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const z={tocMobile:"tocMobile_ITEo"};function F(){const{toc:e,frontMatter:t}=c();return n.createElement(S,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,z.tocMobile)})}var R=a(9407);function O(){const{toc:e,frontMatter:t}=c();return n.createElement(R.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var j=a(7955),G=a(1506);function W(e){let{children:t}=e;const a=function(){const{metadata:e,frontMatter:t,contentTitle:a}=c();return t.hide_title||void 0!==a?null:e.title}();return n.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},a&&n.createElement("header",null,n.createElement(j.Z,{as:"h1"},a)),n.createElement(G.Z,null,t))}var q=a(1310);const J={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Q(e){let{children:t}=e;const a=function(){const{frontMatter:e,toc:t}=c(),a=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?n.createElement(F,null):void 0,desktop:!r||"desktop"!==a&&"ssr"!==a?void 0:n.createElement(O,null)}}();return n.createElement("div",{className:"row"},n.createElement("div",{className:(0,d.Z)("col",!a.hidden&&J.docItemCol)},n.createElement(p.Z,null),n.createElement("div",{className:J.docItemContainer},n.createElement("article",null,n.createElement(q.Z,null),n.createElement(E.Z,null),a.mobile,n.createElement(W,null,t),n.createElement(B,null)),n.createElement(b,null))),a.desktop&&n.createElement("div",{className:"col col--3"},a.desktop))}function X(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,a=e.content;return n.createElement(s,{content:e.content},n.createElement(l.FG,{className:t},n.createElement(i,null),n.createElement(Q,null,n.createElement(a,null))))}},4966:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7462),l=a(7294),r=a(5999),o=a(4334),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:r}=e;return l.createElement(s.Z,{className:(0,o.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&l.createElement("div",{className:"pagination-nav__sublabel"},n),l.createElement("div",{className:"pagination-nav__label"},a))}function i(e){const{previous:t,next:a}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,r.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&l.createElement(c,(0,n.Z)({},t,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&l.createElement(c,(0,n.Z)({},a,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),l=a(4334),r=a(5999),o=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,l.Z)(t,o.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>h});var n=a(7294),l=a(4334),r=a(2263),o=a(9960),s=a(5999),c=a(143),i=a(5281),d=a(373),m=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function b(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function p(e){let{versionLabel:t,to:a,onClick:l}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(o.Z,{to:a,onClick:l},n.createElement(s.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(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:o}}=(0,r.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:E}=(0,c.Jo)(s),h=u??(v=E).docs.find((e=>e.id===v.mainDocId));var v;return n.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(b,{siteTitle:o,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(p,{versionLabel:E.label,to:h.path,onClick:()=>m(E.name)})))}function h(e){let{className:t}=e;const a=(0,m.E)();return a.banner?n.createElement(E,{className:t,versionMetadata:a}):null}}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/1be78505.7062d58b.js b/assets/js/1be78505.1dba3c15.js similarity index 99% rename from zh-Hans/assets/js/1be78505.7062d58b.js rename to assets/js/1be78505.1dba3c15.js index 6561ad8e5..65827e5fe 100644 --- a/zh-Hans/assets/js/1be78505.7062d58b.js +++ b/assets/js/1be78505.1dba3c15.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>fe});var a=n(7294),l=n(6010),o=n(1944),r=n(5281),c=n(3320),i=n(3438),s=n(4477),d=n(1116),m=n(7961),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,l]=(0,a.useState)(!1),o=(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&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var g=n(1442),f=n(6550),_=n(7524),k=n(6668),v=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,l.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),Z=n(902);const x=Symbol("EmptyContext"),B=a.createContext(x);function w(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(B.Provider,{value:o},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:o,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)(),g=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),f=(0,i._F)(t,o),_=(0,L.Mg)(h,o),{collapsed:v,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!f&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new Z.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!v),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,Z.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:f,collapsed:v,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":v},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":f}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!v:void 0,href:b?g??"#":g},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:v},a.createElement(j,{items:m,tabIndex:v?-1:0,onItemClick:n,activePath:o,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,P.Z)(m);return a.createElement("li",{className:(0,l.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,l.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 z={menuHtmlItem:"menuHtmlItem_M9Kj"};function V(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[z.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function U(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(V,(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(U,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),G={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:o}=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,l.Z)("menu thin-scrollbar",G.menu,c&&G.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,l.Z)(q,c&&O,r&&X)},c&&a.createElement(v.Z,{tabIndex:-1,className:J}),a.createElement(Y,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:o}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const o=(0,te.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const le=a.memo(ae);function oe(e){const t=(0,_.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),l&&a.createElement(le,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:o}=e;const{pathname:c}=(0,f.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,g.n)()&&s(!0),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.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,l.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(oe,{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 o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(me.docMainContainer,(t||!o)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.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)(),[l,o]=(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:l,setHiddenSidebarContainer:o}),a.createElement(ue,{hiddenSidebarContainer:l},t)))}var he=n(4972),Ee=n(197);function ge(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(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function fe(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(ge,e),a.createElement(o.FG,{className:(0,l.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),l=n(5999),o=n(1944),r=n(7961);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.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(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.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(l.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 +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>fe});var a=n(7294),l=n(4334),o=n(1944),r=n(5281),c=n(3320),i=n(3438),s=n(4477),d=n(1116),m=n(7961),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,l]=(0,a.useState)(!1),o=(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&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var g=n(1442),f=n(6550),_=n(7524),k=n(6668),v=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,l.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),Z=n(902);const x=Symbol("EmptyContext"),B=a.createContext(x);function w(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(B.Provider,{value:o},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:o,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)(),g=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),f=(0,i._F)(t,o),_=(0,L.Mg)(h,o),{collapsed:v,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!f&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new Z.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!v),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,Z.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:f,collapsed:v,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":v},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":f}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!v:void 0,href:b?g??"#":g},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:v},a.createElement(j,{items:m,tabIndex:v?-1:0,onItemClick:n,activePath:o,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,P.Z)(m);return a.createElement("li",{className:(0,l.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,l.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 z={menuHtmlItem:"menuHtmlItem_M9Kj"};function V(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[z.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function U(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(V,(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(U,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),G={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:o}=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,l.Z)("menu thin-scrollbar",G.menu,c&&G.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,l.Z)(q,c&&O,r&&X)},c&&a.createElement(v.Z,{tabIndex:-1,className:J}),a.createElement(Y,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:o}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const o=(0,te.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const le=a.memo(ae);function oe(e){const t=(0,_.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),l&&a.createElement(le,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:o}=e;const{pathname:c}=(0,f.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,g.n)()&&s(!0),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.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,l.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(oe,{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 o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(me.docMainContainer,(t||!o)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.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)(),[l,o]=(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:l,setHiddenSidebarContainer:o}),a.createElement(ue,{hiddenSidebarContainer:l},t)))}var he=n(4972),Ee=n(197);function ge(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(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function fe(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(ge,e),a.createElement(o.FG,{className:(0,l.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),l=n(5999),o=n(1944),r=n(7961);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.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(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.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(l.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/1f391b9e.3825bb4d.js b/assets/js/1f391b9e.9181abc6.js similarity index 93% rename from assets/js/1f391b9e.3825bb4d.js rename to assets/js/1f391b9e.9181abc6.js index 5debc4782..72962e7ea 100644 --- a/assets/js/1f391b9e.3825bb4d.js +++ b/assets/js/1f391b9e.9181abc6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3085],{4247:(e,t,a)=>{a.r(t),a.d(t,{default:()=>d});var l=a(7294),n=a(6010),c=a(1944),r=a(5281),m=a(7961),o=a(1506),s=a(9407);const i={mdxPageWrapper:"mdxPageWrapper_j9I6"};function d(e){const{content:t}=e,{metadata:{title:a,description:d,frontMatter:p}}=t,{wrapperClassName:_,hide_table_of_contents:g}=p;return l.createElement(c.FG,{className:(0,n.Z)(_??r.k.wrapper.mdxPages,r.k.page.mdxPage)},l.createElement(c.d,{title:a,description:d}),l.createElement(m.Z,null,l.createElement("main",{className:"container container--fluid margin-vert--lg"},l.createElement("div",{className:(0,n.Z)("row",i.mdxPageWrapper)},l.createElement("div",{className:(0,n.Z)("col",!g&&"col--8")},l.createElement("article",null,l.createElement(o.Z,null,l.createElement(t,null)))),!g&&t.toc.length>0&&l.createElement("div",{className:"col col--2"},l.createElement(s.Z,{toc:t.toc,minHeadingLevel:p.toc_min_heading_level,maxHeadingLevel:p.toc_max_heading_level}))))))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3085],{4247:(e,t,a)=>{a.r(t),a.d(t,{default:()=>d});var l=a(7294),n=a(4334),c=a(1944),r=a(5281),m=a(7961),o=a(1506),s=a(9407);const i={mdxPageWrapper:"mdxPageWrapper_j9I6"};function d(e){const{content:t}=e,{metadata:{title:a,description:d,frontMatter:p}}=t,{wrapperClassName:_,hide_table_of_contents:g}=p;return l.createElement(c.FG,{className:(0,n.Z)(_??r.k.wrapper.mdxPages,r.k.page.mdxPage)},l.createElement(c.d,{title:a,description:d}),l.createElement(m.Z,null,l.createElement("main",{className:"container container--fluid margin-vert--lg"},l.createElement("div",{className:(0,n.Z)("row",i.mdxPageWrapper)},l.createElement("div",{className:(0,n.Z)("col",!g&&"col--8")},l.createElement("article",null,l.createElement(o.Z,null,l.createElement(t,null)))),!g&&t.toc.length>0&&l.createElement("div",{className:"col col--2"},l.createElement(s.Z,{toc:t.toc,minHeadingLevel:p.toc_min_heading_level,maxHeadingLevel:p.toc_max_heading_level}))))))}}}]); \ No newline at end of file diff --git a/assets/js/2c0f0ab1.c834e30f.js b/assets/js/2c0f0ab1.f614bdae.js similarity index 99% rename from assets/js/2c0f0ab1.c834e30f.js rename to assets/js/2c0f0ab1.f614bdae.js index a4b646ab9..21d3958f3 100644 --- a/assets/js/2c0f0ab1.c834e30f.js +++ b/assets/js/2c0f0ab1.f614bdae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1440],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>m});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),u=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},c=function(e){var a=u(e.components);return n.createElement(o.Provider,{value:a},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},b=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(t),b=l,m=d["".concat(o,".").concat(b)]||d[b]||p[b]||r;return t?n.createElement(m,s(s({ref:a},c),{},{components:t})):n.createElement(m,s({ref:a},c))}));function m(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=b;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[d]="string"==typeof e?e:l,s[1]=i;for(var u=2;u{t.d(a,{Z:()=>s});var n=t(7294),l=t(6010);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:a,hidden:t,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.Z)(r.tabItem,s),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),l=t(7294),r=t(6010),s=t(2466),i=t(6550),o=t(1980),u=t(7392),c=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:l}}=e;return{value:a,label:t,attributes:n,default:l}}))}function p(e){const{values:a,children:t}=e;return(0,l.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,u.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function b(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),r=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,o._X)(r),(0,l.useCallback)((e=>{if(!r)return;const a=new URLSearchParams(n.location.search);a.set(r,e),n.replace({...n.location,search:a.toString()})}),[r,n])]}function g(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!b({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:r}))),[o,u]=m({queryString:t,groupId:n}),[d,g]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,r]=(0,c.Nk)(t);return[n,(0,l.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:n}),v=(()=>{const e=o??d;return b({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!b({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var v=t(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:a,block:t,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const a=e.currentTarget,t=c.indexOf(a),n=u[t].value;n!==i&&(d(a),o(n))},b=e=>{let a=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;a=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;a=c[t]??c[c.length-1];break}}a?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},a)},u.map((e=>{let{value:a,label:t,attributes:s}=e;return l.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>c.push(e),onKeyDown:b,onClick:p},s,{className:(0,r.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":i===a})}),t??a)})))}function k(e){let{lazy:a,children:t,selectedValue:n}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,a)=>(0,l.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function y(e){const a=g(e);return l.createElement("div",{className:(0,r.Z)("tabs-container",h.tabList)},l.createElement(f,(0,n.Z)({},e,a)),l.createElement(k,(0,n.Z)({},e,a)))}function N(e){const a=(0,v.Z)();return l.createElement(y,(0,n.Z)({key:String(a)},e))}},8958:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=t(7462),l=(t(7294),t(3905)),r=t(4866),s=t(5162);const i={sidebar_label:"Source code"},o="Source code",u={unversionedId:"contributing-guide/local-development/source-code",id:"version-5.0.0/contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}],p={toc:d},b="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(b,(0,n.Z)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"source-code"},"Source code"),(0,l.kt)("p",null,"The following is a tutorial on local deployment development for different operating systems."),(0,l.kt)("h2",{id:"prepare-dependencies"},"Prepare dependencies"),(0,l.kt)("h3",{id:"macos"},"macOS"),(0,l.kt)("h4",{id:"install-homebrew"},"Install homebrew"),(0,l.kt)("p",null,"First you need to install Xcode Command tools:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,l.kt)("p",null,"Then install Homebrew, the package management tool for macOS"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,l.kt)("h4",{id:"install-dependencies"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"yarn"},"yarn"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,l.kt)("h4",{id:"system-dependencies"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,l.kt)("h4",{id:"install-dependencies-1"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-1"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"node"},"node"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,l.kt)("h4",{id:"system-dependencies-1"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,l.kt)("p",null,"Needs install ",(0,l.kt)("inlineCode",{parentName:"p"},"gcompat")," if use ",(0,l.kt)("inlineCode",{parentName:"p"},"arm"),' architecture. or an exception will throws such like "',(0,l.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'".'),(0,l.kt)("h4",{id:"install-dependencies-2"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-2"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h2",{id:"install-ruby"},"Install Ruby"),(0,l.kt)("p",null,"Can be installed by either asdf, rvm as ruby version manager."),(0,l.kt)(r.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,l.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,l.kt)("p",null,"Following the ",(0,l.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"offical install guide")," then:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,l.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,l.kt)("h2",{id:"fetch-source-code"},"Fetch source code"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,l.kt)("h2",{id:"initialize-zealot"},"Initialize Zealot"),(0,l.kt)("p",null,"All the following steps need to be performed in the zealot root directory."),(0,l.kt)("h3",{id:"bundler"},"bundler"),(0,l.kt)("p",null,"Install Ruby gems"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,l.kt)("h3",{id:"yarn-1"},"yarn"),(0,l.kt)("p",null,"Install javascript packages:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,l.kt)("h3",{id:"initialize-database"},"Initialize database"),(0,l.kt)("p",null,"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,l.kt)("p",null,"Configuring the connection database can be done via ",(0,l.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"environment variables")," or by changing the ",(0,l.kt)("inlineCode",{parentName:"p"},"config/database.yml")," file."),(0,l.kt)("h3",{id:"initialize-default-account-and-demo-data"},"Initialize default account and demo data"),(0,l.kt)("p",null,"Initialize administrator account and sample application"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,l.kt)("h3",{id:"launch-services"},"Launch services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,l.kt)("p",null,"Open brower ",(0,l.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[1440],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>m});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),u=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},c=function(e){var a=u(e.components);return n.createElement(o.Provider,{value:a},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},b=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(t),b=l,m=d["".concat(o,".").concat(b)]||d[b]||p[b]||r;return t?n.createElement(m,s(s({ref:a},c),{},{components:t})):n.createElement(m,s({ref:a},c))}));function m(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=b;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[d]="string"==typeof e?e:l,s[1]=i;for(var u=2;u{t.d(a,{Z:()=>s});var n=t(7294),l=t(4334);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:a,hidden:t,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.Z)(r.tabItem,s),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),l=t(7294),r=t(4334),s=t(2466),i=t(6550),o=t(1980),u=t(7392),c=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:l}}=e;return{value:a,label:t,attributes:n,default:l}}))}function p(e){const{values:a,children:t}=e;return(0,l.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,u.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function b(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),r=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,o._X)(r),(0,l.useCallback)((e=>{if(!r)return;const a=new URLSearchParams(n.location.search);a.set(r,e),n.replace({...n.location,search:a.toString()})}),[r,n])]}function g(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!b({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:r}))),[o,u]=m({queryString:t,groupId:n}),[d,g]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,r]=(0,c.Nk)(t);return[n,(0,l.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:n}),v=(()=>{const e=o??d;return b({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!b({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var v=t(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:a,block:t,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const a=e.currentTarget,t=c.indexOf(a),n=u[t].value;n!==i&&(d(a),o(n))},b=e=>{let a=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;a=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;a=c[t]??c[c.length-1];break}}a?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},a)},u.map((e=>{let{value:a,label:t,attributes:s}=e;return l.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>c.push(e),onKeyDown:b,onClick:p},s,{className:(0,r.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":i===a})}),t??a)})))}function k(e){let{lazy:a,children:t,selectedValue:n}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,a)=>(0,l.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function y(e){const a=g(e);return l.createElement("div",{className:(0,r.Z)("tabs-container",h.tabList)},l.createElement(f,(0,n.Z)({},e,a)),l.createElement(k,(0,n.Z)({},e,a)))}function N(e){const a=(0,v.Z)();return l.createElement(y,(0,n.Z)({key:String(a)},e))}},8958:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=t(7462),l=(t(7294),t(3905)),r=t(4866),s=t(5162);const i={sidebar_label:"Source code"},o="Source code",u={unversionedId:"contributing-guide/local-development/source-code",id:"version-5.0.0/contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}],p={toc:d},b="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(b,(0,n.Z)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"source-code"},"Source code"),(0,l.kt)("p",null,"The following is a tutorial on local deployment development for different operating systems."),(0,l.kt)("h2",{id:"prepare-dependencies"},"Prepare dependencies"),(0,l.kt)("h3",{id:"macos"},"macOS"),(0,l.kt)("h4",{id:"install-homebrew"},"Install homebrew"),(0,l.kt)("p",null,"First you need to install Xcode Command tools:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,l.kt)("p",null,"Then install Homebrew, the package management tool for macOS"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,l.kt)("h4",{id:"install-dependencies"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"yarn"},"yarn"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,l.kt)("h4",{id:"system-dependencies"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,l.kt)("h4",{id:"install-dependencies-1"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-1"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"node"},"node"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,l.kt)("h4",{id:"system-dependencies-1"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,l.kt)("p",null,"Needs install ",(0,l.kt)("inlineCode",{parentName:"p"},"gcompat")," if use ",(0,l.kt)("inlineCode",{parentName:"p"},"arm"),' architecture. or an exception will throws such like "',(0,l.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'".'),(0,l.kt)("h4",{id:"install-dependencies-2"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-2"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h2",{id:"install-ruby"},"Install Ruby"),(0,l.kt)("p",null,"Can be installed by either asdf, rvm as ruby version manager."),(0,l.kt)(r.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,l.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,l.kt)("p",null,"Following the ",(0,l.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"offical install guide")," then:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,l.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,l.kt)("h2",{id:"fetch-source-code"},"Fetch source code"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,l.kt)("h2",{id:"initialize-zealot"},"Initialize Zealot"),(0,l.kt)("p",null,"All the following steps need to be performed in the zealot root directory."),(0,l.kt)("h3",{id:"bundler"},"bundler"),(0,l.kt)("p",null,"Install Ruby gems"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,l.kt)("h3",{id:"yarn-1"},"yarn"),(0,l.kt)("p",null,"Install javascript packages:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,l.kt)("h3",{id:"initialize-database"},"Initialize database"),(0,l.kt)("p",null,"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,l.kt)("p",null,"Configuring the connection database can be done via ",(0,l.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"environment variables")," or by changing the ",(0,l.kt)("inlineCode",{parentName:"p"},"config/database.yml")," file."),(0,l.kt)("h3",{id:"initialize-default-account-and-demo-data"},"Initialize default account and demo data"),(0,l.kt)("p",null,"Initialize administrator account and sample application"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,l.kt)("h3",{id:"launch-services"},"Launch services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,l.kt)("p",null,"Open brower ",(0,l.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43ef865f.53fe59f9.js b/assets/js/43ef865f.e2c235a5.js similarity index 98% rename from assets/js/43ef865f.53fe59f9.js rename to assets/js/43ef865f.e2c235a5.js index d6c53a7f4..2d8dc4f9b 100644 --- a/assets/js/43ef865f.53fe59f9.js +++ b/assets/js/43ef865f.e2c235a5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2855],{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=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 s=r.createContext({}),u=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=u(e.components);return r.createElement(s.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,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[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 s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(7294),a=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[l,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:r}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==i&&(d(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:r}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},a.createElement(h,(0,r.Z)({},e,t)),a.createElement(g,(0,r.Z)({},e,t)))}function E(e){const t=(0,v.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},7067:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Android"},s="Zealot Android SDK",u={unversionedId:"developer-guide/sdk/android",id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/docs/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/next/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/android.md",tags:[],version:"current",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/next/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/next/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"Using ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," to install\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"In ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," file of main app project add:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"permission"},"Permission"),(0,a.kt)("p",null,"Zealot needs internet permission"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"usages"},"Usages"),(0,a.kt)("p",null,"Add the start code to the ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," method block of your ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," file:"),(0,a.kt)(o.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(l.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2855],{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=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 s=r.createContext({}),u=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=u(e.components);return r.createElement(s.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,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[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 s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(7294),a=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[l,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:r}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==i&&(d(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:r}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},a.createElement(h,(0,r.Z)({},e,t)),a.createElement(g,(0,r.Z)({},e,t)))}function E(e){const t=(0,v.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},7067:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Android"},s="Zealot Android SDK",u={unversionedId:"developer-guide/sdk/android",id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/docs/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/next/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/android.md",tags:[],version:"current",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/next/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/next/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"Using ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," to install\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"In ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," file of main app project add:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"permission"},"Permission"),(0,a.kt)("p",null,"Zealot needs internet permission"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"usages"},"Usages"),(0,a.kt)("p",null,"Add the start code to the ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," method block of your ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," file:"),(0,a.kt)(o.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(l.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/45256cfe.0e54193f.js b/assets/js/45256cfe.0f610341.js similarity index 98% rename from assets/js/45256cfe.0e54193f.js rename to assets/js/45256cfe.0f610341.js index 82c9cb4ae..a365641af 100644 --- a/assets/js/45256cfe.0e54193f.js +++ b/assets/js/45256cfe.0f610341.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3803],{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=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 s=r.createContext({}),u=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=u(e.components);return r.createElement(s.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,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[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 s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(7294),a=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[l,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:r}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:r}),b=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{b&&i(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),v(e)}),[u,v,o]),tabValues:o}}var b=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==i&&(d(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:r}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=v(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},a.createElement(h,(0,r.Z)({},e,t)),a.createElement(g,(0,r.Z)({},e,t)))}function E(e){const t=(0,b.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},7413:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Android"},s="Zealot Android SDK",u={unversionedId:"developer-guide/sdk/android",id:"version-5.0.0/developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"Using ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," to install\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"In ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," file of main app project add:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"permission"},"Permission"),(0,a.kt)("p",null,"Zealot needs internet permission"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"usages"},"Usages"),(0,a.kt)("p",null,"Add the start code to the ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," method block of your ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," file:"),(0,a.kt)(o.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(l.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3803],{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=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 s=r.createContext({}),u=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=u(e.components);return r.createElement(s.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,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[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 s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(7294),a=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[l,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:r}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:r}),b=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{b&&i(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),v(e)}),[u,v,o]),tabValues:o}}var b=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==i&&(d(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:r}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=v(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},a.createElement(h,(0,r.Z)({},e,t)),a.createElement(g,(0,r.Z)({},e,t)))}function E(e){const t=(0,b.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},7413:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Android"},s="Zealot Android SDK",u={unversionedId:"developer-guide/sdk/android",id:"version-5.0.0/developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"Using ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," to install\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"In ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," file of main app project add:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"permission"},"Permission"),(0,a.kt)("p",null,"Zealot needs internet permission"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"usages"},"Usages"),(0,a.kt)("p",null,"Add the start code to the ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," method block of your ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," file:"),(0,a.kt)(o.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(l.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/477073af.48334569.js b/assets/js/477073af.76e7fbc5.js similarity index 99% rename from assets/js/477073af.48334569.js rename to assets/js/477073af.76e7fbc5.js index 033341f40..702a579d9 100644 --- a/assets/js/477073af.48334569.js +++ b/assets/js/477073af.76e7fbc5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3385],{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 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=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 i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.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,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));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]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,l[1]=s;for(var c=2;c{r.d(t,{Z:()=>l});var n=r(7294),a=r(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:r,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>x});var n=r(7462),a=r(7294),o=r(6010),l=r(2466),s=r(6550),i=r(1980),c=r(7392),u=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,o=d(e),[l,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,c]=f({queryString:r,groupId:n}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,u.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:n}),v=(()=>{const e=i??p;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&s(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),c(e),h(e)}),[c,h,o]),tabValues:o}}var v=r(2389);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:p}=(0,l.o5)(),d=e=>{const t=e.currentTarget,r=u.indexOf(t),n=c[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},c.map((e=>{let{value:t,label:r,attributes:l}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:d},l,{className:(0,o.Z)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=h(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",k.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},6292:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),o=r(941),l=r(4996),s=r(4866),i=r(5162);const c={},u="Reverse Proxies",p={unversionedId:"self-hosted/reverse-proxies",id:"self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/docs/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/next/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/self-hosted/reverse-proxies.mdx",tags:[],version:"current",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/next/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/next/category/cloud-provider-guides"}},d={},m=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},h="wrapper";function v(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reverse-proxies"},"Reverse Proxies"),(0,a.kt)("p",null,"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."),(0,a.kt)(o.Z,{alt:"Architecture",sources:{light:(0,l.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,l.Z)("/img/5.0.0/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"prepare"},"Prepare"),(0,a.kt)("p",null,"The following data needs to be prepared to configure the reverse proxy:"),(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},"Name"),(0,a.kt)("th",{parentName:"tr",align:null},"Sample value"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Domain"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Reverse proxy service IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed",(0,a.kt)("br",null),"Change to 127.0.0.1 Reverse Proxy and zealot with one host.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot public port"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot internal port"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"No need modify")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt Email address"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."),(0,a.kt)("h3",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"),(0,a.kt)("h3",{id:"traefik-service"},"Traefik service"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," then edit the Docker Compose file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," or ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),", add key-value below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," and make sure Nomad version >= 1.3:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2"},"Caddy 2"),(0,a.kt)("p",null,"The configuration only needs to relate the ip part after ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("p",null,"The following is the general configuration, if not effects welcome to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"file a issue"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"And you need update max body size in ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}v.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3385],{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 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=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 i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.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,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));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]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,l[1]=s;for(var c=2;c{r.d(t,{Z:()=>l});var n=r(7294),a=r(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:r,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>x});var n=r(7462),a=r(7294),o=r(4334),l=r(2466),s=r(6550),i=r(1980),c=r(7392),u=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,o=d(e),[l,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,c]=f({queryString:r,groupId:n}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,u.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:n}),v=(()=>{const e=i??p;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&s(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),c(e),h(e)}),[c,h,o]),tabValues:o}}var v=r(2389);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:p}=(0,l.o5)(),d=e=>{const t=e.currentTarget,r=u.indexOf(t),n=c[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},c.map((e=>{let{value:t,label:r,attributes:l}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:d},l,{className:(0,o.Z)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=h(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",k.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},6292:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),o=r(941),l=r(4996),s=r(4866),i=r(5162);const c={},u="Reverse Proxies",p={unversionedId:"self-hosted/reverse-proxies",id:"self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/docs/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/next/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/self-hosted/reverse-proxies.mdx",tags:[],version:"current",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/next/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/next/category/cloud-provider-guides"}},d={},m=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},h="wrapper";function v(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reverse-proxies"},"Reverse Proxies"),(0,a.kt)("p",null,"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."),(0,a.kt)(o.Z,{alt:"Architecture",sources:{light:(0,l.Z)("/img/5.0.0/reverse-proxies-light.png"),dark:(0,l.Z)("/img/5.0.0/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"prepare"},"Prepare"),(0,a.kt)("p",null,"The following data needs to be prepared to configure the reverse proxy:"),(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},"Name"),(0,a.kt)("th",{parentName:"tr",align:null},"Sample value"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Domain"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Reverse proxy service IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed",(0,a.kt)("br",null),"Change to 127.0.0.1 Reverse Proxy and zealot with one host.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot public port"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot internal port"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"No need modify")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt Email address"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."),(0,a.kt)("h3",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"),(0,a.kt)("h3",{id:"traefik-service"},"Traefik service"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," then edit the Docker Compose file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," or ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),", add key-value below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," and make sure Nomad version >= 1.3:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2"},"Caddy 2"),(0,a.kt)("p",null,"The configuration only needs to relate the ip part after ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("p",null,"The following is the general configuration, if not effects welcome to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"file a issue"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"And you need update max body size in ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}v.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/48295ea8.cb1c8c4c.js b/assets/js/48295ea8.6a19fa76.js similarity index 98% rename from assets/js/48295ea8.cb1c8c4c.js rename to assets/js/48295ea8.6a19fa76.js index aa42efcc5..c79fcbb09 100644 --- a/assets/js/48295ea8.cb1c8c4c.js +++ b/assets/js/48295ea8.6a19fa76.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[614],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(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,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var v=n(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",h.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",h.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},6293:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},s="Zealot iOS SDK",u={unversionedId:"developer-guide/sdk/ios",id:"version-5.0.0/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/category/sdks"},next:{title:"Android",permalink:"/docs/developer-guide/sdk/android"}},c={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"Adding below code into ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"Install it\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"usages"},"Usages"),(0,r.kt)("h3",{id:"import-header"},"Import header"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Add the code in your ",(0,r.kt)("inlineCode",{parentName:"li"},"AppDelegate"),"\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"// Objective-C\n#import \n")))),(0,r.kt)("h3",{id:"configure"},"Configure"),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Add the following code in ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," method block\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[614],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(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,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var v=n(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",h.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",h.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},6293:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},s="Zealot iOS SDK",u={unversionedId:"developer-guide/sdk/ios",id:"version-5.0.0/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/category/sdks"},next:{title:"Android",permalink:"/docs/developer-guide/sdk/android"}},c={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"Adding below code into ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"Install it\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"usages"},"Usages"),(0,r.kt)("h3",{id:"import-header"},"Import header"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Add the code in your ",(0,r.kt)("inlineCode",{parentName:"li"},"AppDelegate"),"\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"// Objective-C\n#import \n")))),(0,r.kt)("h3",{id:"configure"},"Configure"),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Add the following code in ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," method block\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bf92ea9.cddeeba1.js b/assets/js/4bf92ea9.24fd38a5.js similarity index 99% rename from assets/js/4bf92ea9.cddeeba1.js rename to assets/js/4bf92ea9.24fd38a5.js index b91904a63..16c85bead 100644 --- a/assets/js/4bf92ea9.cddeeba1.js +++ b/assets/js/4bf92ea9.24fd38a5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2957],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>m});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),u=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},c=function(e){var a=u(e.components);return n.createElement(o.Provider,{value:a},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},b=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(t),b=l,m=d["".concat(o,".").concat(b)]||d[b]||p[b]||r;return t?n.createElement(m,s(s({ref:a},c),{},{components:t})):n.createElement(m,s({ref:a},c))}));function m(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=b;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[d]="string"==typeof e?e:l,s[1]=i;for(var u=2;u{t.d(a,{Z:()=>s});var n=t(7294),l=t(6010);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:a,hidden:t,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.Z)(r.tabItem,s),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),l=t(7294),r=t(6010),s=t(2466),i=t(6550),o=t(1980),u=t(7392),c=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:l}}=e;return{value:a,label:t,attributes:n,default:l}}))}function p(e){const{values:a,children:t}=e;return(0,l.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,u.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function b(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),r=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,o._X)(r),(0,l.useCallback)((e=>{if(!r)return;const a=new URLSearchParams(n.location.search);a.set(r,e),n.replace({...n.location,search:a.toString()})}),[r,n])]}function g(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!b({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:r}))),[o,u]=m({queryString:t,groupId:n}),[d,g]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,r]=(0,c.Nk)(t);return[n,(0,l.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:n}),h=(()=>{const e=o??d;return b({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!b({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var h=t(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:a,block:t,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const a=e.currentTarget,t=c.indexOf(a),n=u[t].value;n!==i&&(d(a),o(n))},b=e=>{let a=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;a=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;a=c[t]??c[c.length-1];break}}a?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},a)},u.map((e=>{let{value:a,label:t,attributes:s}=e;return l.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>c.push(e),onKeyDown:b,onClick:p},s,{className:(0,r.Z)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":i===a})}),t??a)})))}function k(e){let{lazy:a,children:t,selectedValue:n}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,a)=>(0,l.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function y(e){const a=g(e);return l.createElement("div",{className:(0,r.Z)("tabs-container",v.tabList)},l.createElement(f,(0,n.Z)({},e,a)),l.createElement(k,(0,n.Z)({},e,a)))}function N(e){const a=(0,h.Z)();return l.createElement(y,(0,n.Z)({key:String(a)},e))}},282:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=t(7462),l=(t(7294),t(3905)),r=t(4866),s=t(5162);const i={sidebar_label:"Source code"},o="Source code",u={unversionedId:"contributing-guide/local-development/source-code",id:"contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/docs/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/next/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/source-code.md",tags:[],version:"current",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/next/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}],p={toc:d},b="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(b,(0,n.Z)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"source-code"},"Source code"),(0,l.kt)("p",null,"The following is a tutorial on local deployment development for different operating systems."),(0,l.kt)("h2",{id:"prepare-dependencies"},"Prepare dependencies"),(0,l.kt)("h3",{id:"macos"},"macOS"),(0,l.kt)("h4",{id:"install-homebrew"},"Install homebrew"),(0,l.kt)("p",null,"First you need to install Xcode Command tools:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,l.kt)("p",null,"Then install Homebrew, the package management tool for macOS"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,l.kt)("h4",{id:"install-dependencies"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"yarn"},"yarn"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,l.kt)("h4",{id:"system-dependencies"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,l.kt)("h4",{id:"install-dependencies-1"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-1"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"node"},"node"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,l.kt)("h4",{id:"system-dependencies-1"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,l.kt)("p",null,"Needs install ",(0,l.kt)("inlineCode",{parentName:"p"},"gcompat")," if use ",(0,l.kt)("inlineCode",{parentName:"p"},"arm"),' architecture. or an exception will throws such like "',(0,l.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'".'),(0,l.kt)("h4",{id:"install-dependencies-2"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-2"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h2",{id:"install-ruby"},"Install Ruby"),(0,l.kt)("p",null,"Can be installed by either asdf, rvm as ruby version manager."),(0,l.kt)(r.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,l.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,l.kt)("p",null,"Following the ",(0,l.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"offical install guide")," then:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,l.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,l.kt)("h2",{id:"fetch-source-code"},"Fetch source code"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,l.kt)("h2",{id:"initialize-zealot"},"Initialize Zealot"),(0,l.kt)("p",null,"All the following steps need to be performed in the zealot root directory."),(0,l.kt)("h3",{id:"bundler"},"bundler"),(0,l.kt)("p",null,"Install Ruby gems"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,l.kt)("h3",{id:"yarn-1"},"yarn"),(0,l.kt)("p",null,"Install javascript packages:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,l.kt)("h3",{id:"initialize-database"},"Initialize database"),(0,l.kt)("p",null,"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,l.kt)("p",null,"Configuring the connection database can be done via ",(0,l.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"environment variables")," or by changing the ",(0,l.kt)("inlineCode",{parentName:"p"},"config/database.yml")," file."),(0,l.kt)("h3",{id:"initialize-default-account-and-demo-data"},"Initialize default account and demo data"),(0,l.kt)("p",null,"Initialize administrator account and sample application"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,l.kt)("h3",{id:"launch-services"},"Launch services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,l.kt)("p",null,"Open brower ",(0,l.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2957],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>m});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),u=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},c=function(e){var a=u(e.components);return n.createElement(o.Provider,{value:a},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},b=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(t),b=l,m=d["".concat(o,".").concat(b)]||d[b]||p[b]||r;return t?n.createElement(m,s(s({ref:a},c),{},{components:t})):n.createElement(m,s({ref:a},c))}));function m(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=b;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[d]="string"==typeof e?e:l,s[1]=i;for(var u=2;u{t.d(a,{Z:()=>s});var n=t(7294),l=t(4334);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:a,hidden:t,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.Z)(r.tabItem,s),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),l=t(7294),r=t(4334),s=t(2466),i=t(6550),o=t(1980),u=t(7392),c=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:l}}=e;return{value:a,label:t,attributes:n,default:l}}))}function p(e){const{values:a,children:t}=e;return(0,l.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,u.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function b(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),r=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,o._X)(r),(0,l.useCallback)((e=>{if(!r)return;const a=new URLSearchParams(n.location.search);a.set(r,e),n.replace({...n.location,search:a.toString()})}),[r,n])]}function g(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!b({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:r}))),[o,u]=m({queryString:t,groupId:n}),[d,g]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,r]=(0,c.Nk)(t);return[n,(0,l.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:n}),h=(()=>{const e=o??d;return b({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!b({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var h=t(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:a,block:t,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const a=e.currentTarget,t=c.indexOf(a),n=u[t].value;n!==i&&(d(a),o(n))},b=e=>{let a=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;a=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;a=c[t]??c[c.length-1];break}}a?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},a)},u.map((e=>{let{value:a,label:t,attributes:s}=e;return l.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>c.push(e),onKeyDown:b,onClick:p},s,{className:(0,r.Z)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":i===a})}),t??a)})))}function k(e){let{lazy:a,children:t,selectedValue:n}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,a)=>(0,l.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function y(e){const a=g(e);return l.createElement("div",{className:(0,r.Z)("tabs-container",v.tabList)},l.createElement(f,(0,n.Z)({},e,a)),l.createElement(k,(0,n.Z)({},e,a)))}function N(e){const a=(0,h.Z)();return l.createElement(y,(0,n.Z)({key:String(a)},e))}},282:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=t(7462),l=(t(7294),t(3905)),r=t(4866),s=t(5162);const i={sidebar_label:"Source code"},o="Source code",u={unversionedId:"contributing-guide/local-development/source-code",id:"contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/docs/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/next/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/source-code.md",tags:[],version:"current",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/next/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}],p={toc:d},b="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(b,(0,n.Z)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"source-code"},"Source code"),(0,l.kt)("p",null,"The following is a tutorial on local deployment development for different operating systems."),(0,l.kt)("h2",{id:"prepare-dependencies"},"Prepare dependencies"),(0,l.kt)("h3",{id:"macos"},"macOS"),(0,l.kt)("h4",{id:"install-homebrew"},"Install homebrew"),(0,l.kt)("p",null,"First you need to install Xcode Command tools:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,l.kt)("p",null,"Then install Homebrew, the package management tool for macOS"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,l.kt)("h4",{id:"install-dependencies"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"yarn"},"yarn"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,l.kt)("h4",{id:"system-dependencies"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,l.kt)("h4",{id:"install-dependencies-1"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-1"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"node"},"node"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,l.kt)("h4",{id:"system-dependencies-1"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,l.kt)("p",null,"Needs install ",(0,l.kt)("inlineCode",{parentName:"p"},"gcompat")," if use ",(0,l.kt)("inlineCode",{parentName:"p"},"arm"),' architecture. or an exception will throws such like "',(0,l.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'".'),(0,l.kt)("h4",{id:"install-dependencies-2"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-2"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h2",{id:"install-ruby"},"Install Ruby"),(0,l.kt)("p",null,"Can be installed by either asdf, rvm as ruby version manager."),(0,l.kt)(r.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,l.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,l.kt)("p",null,"Following the ",(0,l.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"offical install guide")," then:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,l.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,l.kt)("h2",{id:"fetch-source-code"},"Fetch source code"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,l.kt)("h2",{id:"initialize-zealot"},"Initialize Zealot"),(0,l.kt)("p",null,"All the following steps need to be performed in the zealot root directory."),(0,l.kt)("h3",{id:"bundler"},"bundler"),(0,l.kt)("p",null,"Install Ruby gems"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,l.kt)("h3",{id:"yarn-1"},"yarn"),(0,l.kt)("p",null,"Install javascript packages:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,l.kt)("h3",{id:"initialize-database"},"Initialize database"),(0,l.kt)("p",null,"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,l.kt)("p",null,"Configuring the connection database can be done via ",(0,l.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"environment variables")," or by changing the ",(0,l.kt)("inlineCode",{parentName:"p"},"config/database.yml")," file."),(0,l.kt)("h3",{id:"initialize-default-account-and-demo-data"},"Initialize default account and demo data"),(0,l.kt)("p",null,"Initialize administrator account and sample application"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,l.kt)("h3",{id:"launch-services"},"Launch services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,l.kt)("p",null,"Open brower ",(0,l.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6097.b1a64e58.js b/assets/js/6097.3cff0a9f.js similarity index 59% rename from assets/js/6097.b1a64e58.js rename to assets/js/6097.3cff0a9f.js index dcb224d20..9613d046d 100644 --- a/assets/js/6097.b1a64e58.js +++ b/assets/js/6097.3cff0a9f.js @@ -1 +1 @@ -(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6097],{3905:(e,t,n)=>{"use strict";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 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 c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=o.createContext({}),s=function(e){var t=o.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 o.createElement(i.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),p=r,f=m["".concat(i,".").concat(p)]||m[p]||d[p]||a;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 a=n.length,c=new Array(a);c[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var s=2;s{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(6010),c=n(5999),l=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:m}}=(0,l.L)();if("h1"===t||!n)return r.createElement(t,(0,o.Z)({},u,{id:void 0}));const d=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(t,(0,o.Z)({},u,{className:(0,a.Z)("anchor",m?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n}),u.children,r.createElement(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},1506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ye});var o=n(7294),r=n(3905),a=n(7462),c=n(5742);var l=n(2389),i=n(6010),s=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,s.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const h=/title=(?["'])(?.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function v(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function b(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return v(["js","jsBlock"],t);case"jsx":case"tsx":return v(["js","jsBlock","jsx"],t);case"html":return v(["js","jsBlock","html"],t);case"python":case"py":case"bash":return v(["bash"],t);case"markdown":case"md":return v(["html","jsx","bash"],t);default:return v(Object.keys(y),t)}}(o,r),l=n.split("\n"),i=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${p},`:u[t]?i[u[t]].start=p:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,i.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,i.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var L=n(902);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function B(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=w);const r=(0,L.zX)(t),a=(0,L.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const x={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 T={Prism:n(7410).Z,theme:x};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 Z(){return Z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Z.apply(this,arguments)}var j=/\r\n|\r|\n/,_=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)},H=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function S(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var A=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),O(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=Z({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=Z({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),O(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=Z({},S(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?Z({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),O(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),O(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=Z({},S(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?Z({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),O(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],i=[l];c>-1;){for(;(a=o[c]++)<r[c];){var s=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],s=m):(u=H(u,m.type),m.alias&&(u=H(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(j),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)_(l),i.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(s),o.push(0),r.push(s.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return _(l),i}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const I=A,z={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function P(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,i.Z)(n,r&&z.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",s,r?o.createElement(o.Fragment,null,o.createElement("span",{className:z.codeLineNumber}),o.createElement("span",{className:z.codeLineContent},u)):u,o.createElement("br",null))}var M=n(5999);function D(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 W(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const R={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function V(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.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 o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(a.removeAllRanges(),a.addRange(c)),r&&r.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,M.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,R.copyButton,r&&R.copyButtonCopied),onClick:l},o.createElement("span",{className:R.copyButtonIcons,"aria-hidden":"true"},o.createElement(D,{className:R.copyButtonIcon}),o.createElement(W,{className:R.copyButtonSuccessIcon})))}function $(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 q={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function F(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,M.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,r&&q.wordWrapButtonEnabled),"aria-label":a,title:a},o.createElement($,{className:q.wordWrapButtonIcon,"aria-hidden":"true"}))}function U(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:s}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=s??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return B(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),v=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=b(t,{metastring:r,language:f,magicComments:p}),L=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,i.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},v&&o.createElement("div",{className:N.codeBlockTitle},v),o.createElement("div",{className:N.codeBlockContent},o.createElement(I,(0,a.Z)({},T,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,i.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,i.Z)(N.codeBlockLines,L&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(P,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:L})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(F,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(V,{className:N.codeButton,code:C}))))}function G(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?U:C;return o.createElement(i,(0,a.Z)({key:String(r)},n),c)}var Y=n(9960);var Q=n(6043);const X={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function J(e){return!!e&&("SUMMARY"===e.tagName||J(e.parentElement))}function K(e,t){return!!e&&(e===t||K(e.parentElement,t))}function ee(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),s=(0,o.useRef)(null),{collapsed:u,setCollapsed:m}=(0,Q.u)({initialState:!r.open}),[d,p]=(0,o.useState)(r.open),f=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,a.Z)({},r,{ref:s,open:d,"data-collapsed":u,className:(0,i.Z)(X.details,c&&X.isBrowser,r.className),onMouseDown:e=>{J(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;J(t)&&K(t,s.current)&&(e.preventDefault(),u?(m(!1),p(!0)):m(!0))}}),f,o.createElement(Q.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{m(e),p(!e)}},o.createElement("div",{className:X.collapsibleContent},n)))}const te={details:"details_b_Ee"},ne="alert alert--info";function oe(e){let{...t}=e;return o.createElement(ee,(0,a.Z)({},t,{className:(0,i.Z)(ne,te.details,t.className)}))}var re=n(7955);function ae(e){return o.createElement(re.Z,e)}const ce={containsTaskList:"containsTaskList_mC6p"};function le(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&ce.containsTaskList)}const ie={img:"img_ev3q"};const se="admonition_LlT9",ue="admonitionHeading_tbUL",me="admonitionIcon_kALy",de="admonitionContent_S0QG";const pe={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},fe={secondary:"note",important:"info",success:"tip",warning:"danger"};function he(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const ge={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.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 o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(G,e)},a:function(e){return o.createElement(Y.Z,e)},pre:function(e){return o.createElement(G,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(oe,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:le(e.className)}))},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,i.Z)(t,ie.img))}));var t},h1:e=>o.createElement(ae,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ae,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ae,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ae,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ae,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ae,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=he(e),c=function(e){const t=fe[e]??e,n=pe[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),pe.info)}(n),l=r??c.label,{iconComponent:s}=c,u=a??o.createElement(s,null);return o.createElement("div",{className:(0,i.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,se)},o.createElement("div",{className:ue},o.createElement("span",{className:me},u),l),o.createElement("div",{className:de},t))},mermaid:n(1875).Z};function ye(e){let{children:t}=e;return o.createElement(r.Zo,{components:ge},t)}},9407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(6010),c=n(3743);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},i="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function u(e){let{className:t,...n}=e;return r.createElement("div",{className:(0,a.Z)(l.tableOfContents,"thin-scrollbar",t)},r.createElement(c.Z,(0,o.Z)({},n,{linkClassName:i,linkActiveClassName:s})))}},3743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(7462),r=n(7294),a=n(6668);function c(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const o=n.slice(2,e.level);e.parentIndex=Math.max(...o),n[e.level]=t}));const o=[];return t.forEach((e=>{const{parentIndex:n,...r}=e;n>=0?t[n].children.push(r):o.push(r)})),o}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:o});return function(e){return e.level>=n&&e.level<=o}(e)?[{...e,children:t}]:t}))}function i(e){const t=e.getBoundingClientRect();return t.top===t.bottom?i(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const o=e.find((e=>i(e).top>=n));if(o){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(i(o))?o:e[e.indexOf(o)-1]??null}return e[e.length-1]??null}function u(){const e=(0,r.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.L)();return(0,r.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,r.useRef)(void 0),n=u();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:o,linkActiveClassName:r,minHeadingLevel:a,maxHeadingLevel:c}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(o),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const o=[];for(let r=t;r<=n;r+=1)o.push(`h${r}.anchor`);return Array.from(document.querySelectorAll(o.join()))}({minHeadingLevel:a,maxHeadingLevel:c}),i=s(l,{anchorTopOffset:n.current}),u=e.find((e=>i&&i.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(r),e.classList.add(r),t.current=e):e.classList.remove(r)}(e,e===u)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function d(e){let{toc:t,className:n,linkClassName:o,isChild:a}=e;return t.length?r.createElement("ul",{className:a?void 0:n},t.map((e=>r.createElement("li",{key:e.id},r.createElement("a",{href:`#${e.id}`,className:o??void 0,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(d,{isChild:!0,toc:e.children,className:n,linkClassName:o}))))):null}const p=r.memo(d);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:u,maxHeadingLevel:d,...f}=e;const h=(0,a.L)(),g=u??h.tableOfContents.minHeadingLevel,y=d??h.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return(0,r.useMemo)((()=>l({toc:c(t),minHeadingLevel:n,maxHeadingLevel:o})),[t,n,o])}({toc:t,minHeadingLevel:g,maxHeadingLevel:y});return m((0,r.useMemo)((()=>{if(i&&s)return{linkClassName:i,linkActiveClassName:s,minHeadingLevel:g,maxHeadingLevel:y}}),[i,s,g,y])),r.createElement(p,(0,o.Z)({toc:v,className:n,linkClassName:i},f))}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file +(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6097],{3905:(e,t,n)=>{"use strict";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 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 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){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 l(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 i=o.createContext({}),s=function(e){var t=o.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 o.createElement(i.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),p=r,f=m["".concat(i,".").concat(p)]||m[p]||d[p]||a;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 a=n.length,c=new Array(a);c[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var s=2;s<a;s++)c[s]=n[s];return o.createElement.apply(null,c)}return o.createElement.apply(null,n)}p.displayName="MDXCreateElement"},7955:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(4334),c=n(5999),l=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:m}}=(0,l.L)();if("h1"===t||!n)return r.createElement(t,(0,o.Z)({},u,{id:void 0}));const d=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(t,(0,o.Z)({},u,{className:(0,a.Z)("anchor",m?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n}),u.children,r.createElement(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},1506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ve});var o=n(7294),r=n(3905),a=n(7462),c=n(5742);var l=n(2389),i=n(4334),s=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,s.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const h=/title=(?<quote>["'])(?<title>.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function v(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function b(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return v(["js","jsBlock"],t);case"jsx":case"tsx":return v(["js","jsBlock","jsx"],t);case"html":return v(["js","jsBlock","html"],t);case"python":case"py":case"bash":return v(["bash"],t);case"markdown":case"md":return v(["html","jsx","bash"],t);default:return v(Object.keys(y),t)}}(o,r),l=n.split("\n"),i=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${p},`:u[t]?i[u[t]].start=p:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,i.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,i.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var L=n(902);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function B(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=w);const r=(0,L.zX)(t),a=(0,L.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const x={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 T={Prism:n(7410).Z,theme:x};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 Z(){return Z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Z.apply(this,arguments)}var j=/\r\n|\r|\n/,_=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)},H=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function S(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var A=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),O(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=Z({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=Z({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),O(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=Z({},S(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?Z({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),O(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),O(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=Z({},S(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?Z({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),O(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],i=[l];c>-1;){for(;(a=o[c]++)<r[c];){var s=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],s=m):(u=H(u,m.type),m.alias&&(u=H(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(j),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)_(l),i.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(s),o.push(0),r.push(s.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return _(l),i}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const I=A,z={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function P(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,i.Z)(n,r&&z.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",s,r?o.createElement(o.Fragment,null,o.createElement("span",{className:z.codeLineNumber}),o.createElement("span",{className:z.codeLineContent},u)):u,o.createElement("br",null))}var M=n(5999);function D(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 W(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const R={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function V(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.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 o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(a.removeAllRanges(),a.addRange(c)),r&&r.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,M.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,R.copyButton,r&&R.copyButtonCopied),onClick:l},o.createElement("span",{className:R.copyButtonIcons,"aria-hidden":"true"},o.createElement(D,{className:R.copyButtonIcon}),o.createElement(W,{className:R.copyButtonSuccessIcon})))}function $(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 q={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function F(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,M.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,r&&q.wordWrapButtonEnabled),"aria-label":a,title:a},o.createElement($,{className:q.wordWrapButtonIcon,"aria-hidden":"true"}))}function U(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:s}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=s??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return B(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),v=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=b(t,{metastring:r,language:f,magicComments:p}),L=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,i.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},v&&o.createElement("div",{className:N.codeBlockTitle},v),o.createElement("div",{className:N.codeBlockContent},o.createElement(I,(0,a.Z)({},T,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,i.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,i.Z)(N.codeBlockLines,L&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(P,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:L})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(F,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(V,{className:N.codeButton,code:C}))))}function G(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?U:C;return o.createElement(i,(0,a.Z)({key:String(r)},n),c)}var Y=n(9960);var Q=n(7459),X=n(6043);const J={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function K(e){return!!e&&("SUMMARY"===e.tagName||K(e.parentElement))}function ee(e,t){return!!e&&(e===t||ee(e.parentElement,t))}function te(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),i=(0,o.useRef)(null),{collapsed:s,setCollapsed:u}=(0,X.u)({initialState:!r.open}),[m,d]=(0,o.useState)(r.open),p=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,a.Z)({},r,{ref:i,open:m,"data-collapsed":s,className:(0,Q.Z)(J.details,c&&J.isBrowser,r.className),onMouseDown:e=>{K(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;K(t)&&ee(t,i.current)&&(e.preventDefault(),s?(u(!1),d(!0)):u(!0))}}),p,o.createElement(X.z,{lazy:!1,collapsed:s,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{u(e),d(!e)}},o.createElement("div",{className:J.collapsibleContent},n)))}const ne={details:"details_b_Ee"},oe="alert alert--info";function re(e){let{...t}=e;return o.createElement(te,(0,a.Z)({},t,{className:(0,i.Z)(oe,ne.details,t.className)}))}var ae=n(7955);function ce(e){return o.createElement(ae.Z,e)}const le={containsTaskList:"containsTaskList_mC6p"};function ie(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&le.containsTaskList)}const se={img:"img_ev3q"};const ue="admonition_LlT9",me="admonitionHeading_tbUL",de="admonitionIcon_kALy",pe="admonitionContent_S0QG";const fe={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},he={secondary:"note",important:"info",success:"tip",warning:"danger"};function ge(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const ye={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.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 o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(G,e)},a:function(e){return o.createElement(Y.Z,e)},pre:function(e){return o.createElement(G,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(re,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:ie(e.className)}))},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,i.Z)(t,se.img))}));var t},h1:e=>o.createElement(ce,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ce,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ce,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ce,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ce,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ce,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=ge(e),c=function(e){const t=he[e]??e,n=fe[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),fe.info)}(n),l=r??c.label,{iconComponent:s}=c,u=a??o.createElement(s,null);return o.createElement("div",{className:(0,i.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,ue)},o.createElement("div",{className:me},o.createElement("span",{className:de},u),l),o.createElement("div",{className:pe},t))},mermaid:n(1875).Z};function ve(e){let{children:t}=e;return o.createElement(r.Zo,{components:ye},t)}},9407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(4334),c=n(3743);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},i="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function u(e){let{className:t,...n}=e;return r.createElement("div",{className:(0,a.Z)(l.tableOfContents,"thin-scrollbar",t)},r.createElement(c.Z,(0,o.Z)({},n,{linkClassName:i,linkActiveClassName:s})))}},3743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(7462),r=n(7294),a=n(6668);function c(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const o=n.slice(2,e.level);e.parentIndex=Math.max(...o),n[e.level]=t}));const o=[];return t.forEach((e=>{const{parentIndex:n,...r}=e;n>=0?t[n].children.push(r):o.push(r)})),o}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:o});return function(e){return e.level>=n&&e.level<=o}(e)?[{...e,children:t}]:t}))}function i(e){const t=e.getBoundingClientRect();return t.top===t.bottom?i(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const o=e.find((e=>i(e).top>=n));if(o){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(i(o))?o:e[e.indexOf(o)-1]??null}return e[e.length-1]??null}function u(){const e=(0,r.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.L)();return(0,r.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,r.useRef)(void 0),n=u();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:o,linkActiveClassName:r,minHeadingLevel:a,maxHeadingLevel:c}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(o),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const o=[];for(let r=t;r<=n;r+=1)o.push(`h${r}.anchor`);return Array.from(document.querySelectorAll(o.join()))}({minHeadingLevel:a,maxHeadingLevel:c}),i=s(l,{anchorTopOffset:n.current}),u=e.find((e=>i&&i.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(r),e.classList.add(r),t.current=e):e.classList.remove(r)}(e,e===u)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function d(e){let{toc:t,className:n,linkClassName:o,isChild:a}=e;return t.length?r.createElement("ul",{className:a?void 0:n},t.map((e=>r.createElement("li",{key:e.id},r.createElement("a",{href:`#${e.id}`,className:o??void 0,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(d,{isChild:!0,toc:e.children,className:n,linkClassName:o}))))):null}const p=r.memo(d);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:u,maxHeadingLevel:d,...f}=e;const h=(0,a.L)(),g=u??h.tableOfContents.minHeadingLevel,y=d??h.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return(0,r.useMemo)((()=>l({toc:c(t),minHeadingLevel:n,maxHeadingLevel:o})),[t,n,o])}({toc:t,minHeadingLevel:g,maxHeadingLevel:y});return m((0,r.useMemo)((()=>{if(i&&s)return{linkClassName:i,linkActiveClassName:s,minHeadingLevel:g,maxHeadingLevel:y}}),[i,s,g,y])),r.createElement(p,(0,o.Z)({toc:v,className:n,linkClassName:i},f))}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/84706228.55624ef5.js b/assets/js/84706228.5bdc0935.js similarity index 98% rename from assets/js/84706228.55624ef5.js rename to assets/js/84706228.5bdc0935.js index 0809564b5..35c89509f 100644 --- a/assets/js/84706228.55624ef5.js +++ b/assets/js/84706228.5bdc0935.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4943],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(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,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var v=n(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",h.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",h.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},7886:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},s="Zealot iOS SDK",u={unversionedId:"developer-guide/sdk/ios",id:"version-4.x/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-4.x/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/4.x/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/ios.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/4.x/category/sdks"},next:{title:"Android",permalink:"/docs/4.x/developer-guide/sdk/android"}},c={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"Adding below code into ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"Install it\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"usages"},"Usages"),(0,r.kt)("h3",{id:"import-header"},"Import header"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Add the code in your ",(0,r.kt)("inlineCode",{parentName:"li"},"AppDelegate"),"\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"// Objective-C\n#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("h3",{id:"configure"},"Configure"),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Add the following code in ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," method block\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4943],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(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,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var v=n(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",h.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",h.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},7886:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},s="Zealot iOS SDK",u={unversionedId:"developer-guide/sdk/ios",id:"version-4.x/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/versioned_docs/version-4.x/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/4.x/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/ios.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/4.x/category/sdks"},next:{title:"Android",permalink:"/docs/4.x/developer-guide/sdk/android"}},c={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"Adding below code into ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"Install it\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"usages"},"Usages"),(0,r.kt)("h3",{id:"import-header"},"Import header"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Add the code in your ",(0,r.kt)("inlineCode",{parentName:"li"},"AppDelegate"),"\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"// Objective-C\n#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("h3",{id:"configure"},"Configure"),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Add the following code in ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," method block\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8f9c93ae.a05c5661.js b/assets/js/8f9c93ae.5c0a7830.js similarity index 99% rename from assets/js/8f9c93ae.a05c5661.js rename to assets/js/8f9c93ae.5c0a7830.js index 967f80774..fdd9ea481 100644 --- a/assets/js/8f9c93ae.a05c5661.js +++ b/assets/js/8f9c93ae.5c0a7830.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4885],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[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):l(l({},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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},u),{},{components:n})):a.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function k(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=f({queryString:n,groupId:a}),[d,k]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),k(e)}),[c,k,o]),tabValues:o}}var h=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function b(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(b,(0,a.Z)({},e,t)))}function y(e){const t=(0,h.Z)();return r.createElement(w,(0,a.Z)({key:String(t)},e))}},277:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={},s="Visual Studio Code Dev Container Setup",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-5.0.0/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.0.0",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/category/local-development"},next:{title:"Source code",permalink:"/docs/contributing-guide/local-development/source-code"}},u={},d=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-setup"},"Visual Studio Code Dev Container Setup"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"The Visual Studio Code Dev Containers")," lets you use a Docker container as a full-featured development environment."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"system-requirements"},"System requirements"),(0,r.kt)("p",null,"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."),(0,r.kt)("h3",{id:"install-git"},"Install Git"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"Install")," it from offical website."),(0,r.kt)("h3",{id:"install-docker--docker-compose"},"Install Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),". (Docker Toolbox is not supported. Windows container images are not supported.)"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ and ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+. (The Ubuntu snap package is not supported.)")),(0,r.kt)("h3",{id:"install-visual-studio-code"},"Install Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."),(0,r.kt)("p",null,"Follow the platform-specific guides below:"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," for macOS."),(0,r.kt)("li",{parentName:"ol"},"Open the browser's download list and locate the downloaded app or archive."),(0,r.kt)("li",{parentName:"ol"},"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."),(0,r.kt)("li",{parentName:"ol"},"Drag ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," to the Applications folder, making it available in the macOS Launchpad."),(0,r.kt)("li",{parentName:"ol"},"Open VS Code from the Applications folder, by double clicking the icon."))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," for Windows."),(0,r.kt)("li",{parentName:"ol"},"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."),(0,r.kt)("li",{parentName:"ol"},"By default, VS Code is installed under ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code"),"."))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"Following the ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"offical Linux install guide"),"."))),(0,r.kt)("h3",{id:"install-remote-container-extension"},"Install Remote container extension"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"fetch-zealot-codesoace"},"Fetch Zealot Codesoace"),(0,r.kt)("p",null,"Zealot Codespace was in the ",(0,r.kt)("inlineCode",{parentName:"p"},".devcontailer")," folder of Zealot project, so you need clone the source code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Explan these files in Codespace:"),(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},"File"),(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},(0,r.kt)("inlineCode",{parentName:"td"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer config")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"Base Dockerfile, auto push multi registry servers after changes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"Speed up build time, depends on above image.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"All services of Zealot")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"Create user and role for Zealot")))),(0,r.kt)("h2",{id:"open-the-project-in-a-container"},"Open the project in a container"),(0,r.kt)("p",null,"Start Visual Studio Code, run the ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," command in ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," and select the Zealot folder."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"Click the ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," to review zealot codespace build real time logging messages."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"In host Docker containers:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"start-the-project"},"Start the project"),(0,r.kt)("p",null,"Press ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," to run all services."),(0,r.kt)("p",null,"Notice that the terminal prompt might look different than your normal terminal prompt."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"open-in-browser"},"Open in browser"),(0,r.kt)("p",null,"A while after run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev"),", select ",(0,r.kt)("strong",{parentName:"p"},"Ports")," to see all forwarded ports, ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," in quick way."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}f.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4885],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[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):l(l({},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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},u),{},{components:n})):a.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function k(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=f({queryString:n,groupId:a}),[d,k]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),k(e)}),[c,k,o]),tabValues:o}}var h=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function b(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(b,(0,a.Z)({},e,t)))}function y(e){const t=(0,h.Z)();return r.createElement(w,(0,a.Z)({key:String(t)},e))}},277:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={},s="Visual Studio Code Dev Container Setup",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-5.0.0/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container Setup",description:"The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.",source:"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/docs/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.0.0",frontMatter:{},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/docs/category/local-development"},next:{title:"Source code",permalink:"/docs/contributing-guide/local-development/source-code"}},u={},d=[{value:"System requirements",id:"system-requirements",level:2},{value:"Install Git",id:"install-git",level:3},{value:"Install Docker & docker-compose",id:"install-docker--docker-compose",level:3},{value:"Install Visual Studio Code",id:"install-visual-studio-code",level:3},{value:"Install Remote container extension",id:"install-remote-container-extension",level:3},{value:"Fetch Zealot Codesoace",id:"fetch-zealot-codesoace",level:2},{value:"Open the project in a container",id:"open-the-project-in-a-container",level:2},{value:"Start the project",id:"start-the-project",level:2},{value:"Open in browser",id:"open-in-browser",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-setup"},"Visual Studio Code Dev Container Setup"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"The Visual Studio Code Dev Containers")," lets you use a Docker container as a full-featured development environment."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"system-requirements"},"System requirements"),(0,r.kt)("p",null,"Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose."),(0,r.kt)("h3",{id:"install-git"},"Install Git"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"Install")," it from offical website."),(0,r.kt)("h3",{id:"install-docker--docker-compose"},"Install Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),". (Docker Toolbox is not supported. Windows container images are not supported.)"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+."),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ and ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+. (The Ubuntu snap package is not supported.)")),(0,r.kt)("h3",{id:"install-visual-studio-code"},"Install Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems."),(0,r.kt)("p",null,"Follow the platform-specific guides below:"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," for macOS."),(0,r.kt)("li",{parentName:"ol"},"Open the browser's download list and locate the downloaded app or archive."),(0,r.kt)("li",{parentName:"ol"},"If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari."),(0,r.kt)("li",{parentName:"ol"},"Drag ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," to the Applications folder, making it available in the macOS Launchpad."),(0,r.kt)("li",{parentName:"ol"},"Open VS Code from the Applications folder, by double clicking the icon."))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," for Windows."),(0,r.kt)("li",{parentName:"ol"},"Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute."),(0,r.kt)("li",{parentName:"ol"},"By default, VS Code is installed under ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code"),"."))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"Following the ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"offical Linux install guide"),"."))),(0,r.kt)("h3",{id:"install-remote-container-extension"},"Install Remote container extension"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"fetch-zealot-codesoace"},"Fetch Zealot Codesoace"),(0,r.kt)("p",null,"Zealot Codespace was in the ",(0,r.kt)("inlineCode",{parentName:"p"},".devcontailer")," folder of Zealot project, so you need clone the source code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Explan these files in Codespace:"),(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},"File"),(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},(0,r.kt)("inlineCode",{parentName:"td"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer config")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"Base Dockerfile, auto push multi registry servers after changes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"Speed up build time, depends on above image.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"All services of Zealot")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"Create user and role for Zealot")))),(0,r.kt)("h2",{id:"open-the-project-in-a-container"},"Open the project in a container"),(0,r.kt)("p",null,"Start Visual Studio Code, run the ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," command in ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," and select the Zealot folder."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"Click the ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," to review zealot codespace build real time logging messages."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"In host Docker containers:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"start-the-project"},"Start the project"),(0,r.kt)("p",null,"Press ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," to open the integrated terminal in Visual Studio Code if it isn't already open. then run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," to run all services."),(0,r.kt)("p",null,"Notice that the terminal prompt might look different than your normal terminal prompt."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"open-in-browser"},"Open in browser"),(0,r.kt)("p",null,"A while after run ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev"),", select ",(0,r.kt)("strong",{parentName:"p"},"Ports")," to see all forwarded ports, ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," in quick way."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}f.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file diff --git a/assets/js/aecd11f5.f551f28f.js b/assets/js/aecd11f5.7c614ceb.js similarity index 98% rename from assets/js/aecd11f5.f551f28f.js rename to assets/js/aecd11f5.7c614ceb.js index 8d157b5f2..07a6d3b9d 100644 --- a/assets/js/aecd11f5.f551f28f.js +++ b/assets/js/aecd11f5.7c614ceb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4429],{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 s=r.createContext({}),u=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=u(e.components);return r.createElement(s.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,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[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 s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(7294),a=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>x});var r=n(7462),a=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[l,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:r}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:r}),b=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{b&&i(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),v(e)}),[u,v,o]),tabValues:o}}var b=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==i&&(d(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:r}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=v(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},a.createElement(h,(0,r.Z)({},e,t)),a.createElement(g,(0,r.Z)({},e,t)))}function x(e){const t=(0,b.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},5736:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Android"},s="Zealot Android SDK",u={unversionedId:"developer-guide/sdk/android",id:"version-4.x/developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-4.x/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/4.x/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/android.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/4.x/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/4.x/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"Using ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," to install\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"In ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," file of main app project add:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"permission"},"Permission"),(0,a.kt)("p",null,"Zealot needs internet permission"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'<uses-permission android:name="android.permission.INTERNET" />\n')),(0,a.kt)("h2",{id:"usages"},"Usages"),(0,a.kt)("p",null,"Add the start code to the ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," method block of your ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," file:"),(0,a.kt)(o.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(l.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4429],{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 s=r.createContext({}),u=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=u(e.components);return r.createElement(s.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,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[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 s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(7294),a=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>x});var r=n(7462),a=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[l,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:r}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:r}),b=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{b&&i(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),v(e)}),[u,v,o]),tabValues:o}}var b=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==i&&(d(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:r}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=v(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},a.createElement(h,(0,r.Z)({},e,t)),a.createElement(g,(0,r.Z)({},e,t)))}function x(e){const t=(0,b.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},5736:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Android"},s="Zealot Android SDK",u={unversionedId:"developer-guide/sdk/android",id:"version-4.x/developer-guide/sdk/android",title:"Zealot Android SDK",description:"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.",source:"@site/versioned_docs/version-4.x/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/docs/4.x/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/android.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/docs/4.x/developer-guide/sdk/ios"},next:{title:"Fastlane plugins",permalink:"/docs/4.x/developer-guide/fastlane"}},c={},d=[{value:"Install",id:"install",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"Permission",id:"permission",level:2},{value:"Usages",id:"usages",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java."),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"Using ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," to install\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"In ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," file of main app project add:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"permission"},"Permission"),(0,a.kt)("p",null,"Zealot needs internet permission"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'<uses-permission android:name="android.permission.INTERNET" />\n')),(0,a.kt)("h2",{id:"usages"},"Usages"),(0,a.kt)("p",null,"Add the start code to the ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," method block of your ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," file:"),(0,a.kt)(o.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(l.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// Single channel\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// Multi-channel, such as beta, adhoc versions\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c02123b5.349ea0f7.js b/assets/js/c02123b5.97a642ab.js similarity index 99% rename from assets/js/c02123b5.349ea0f7.js rename to assets/js/c02123b5.97a642ab.js index 413f1cc0c..4e453c5b2 100644 --- a/assets/js/c02123b5.349ea0f7.js +++ b/assets/js/c02123b5.97a642ab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3877],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>m});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?r(Object(t),!0).forEach((function(a){l(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function i(e,a){if(null==e)return{};var t,n,l=function(e,a){if(null==e)return{};var t,n,l={},r=Object.keys(e);for(n=0;n<r.length;n++)t=r[n],a.indexOf(t)>=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)t=r[n],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),u=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},c=function(e){var a=u(e.components);return n.createElement(o.Provider,{value:a},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},b=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(t),b=l,m=d["".concat(o,".").concat(b)]||d[b]||p[b]||r;return t?n.createElement(m,s(s({ref:a},c),{},{components:t})):n.createElement(m,s({ref:a},c))}));function m(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=b;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[d]="string"==typeof e?e:l,s[1]=i;for(var u=2;u<r;u++)s[u]=t[u];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}b.displayName="MDXCreateElement"},5162:(e,a,t)=>{t.d(a,{Z:()=>s});var n=t(7294),l=t(6010);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:a,hidden:t,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.Z)(r.tabItem,s),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),l=t(7294),r=t(6010),s=t(2466),i=t(6550),o=t(1980),u=t(7392),c=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:l}}=e;return{value:a,label:t,attributes:n,default:l}}))}function p(e){const{values:a,children:t}=e;return(0,l.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,u.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[a,t])}function b(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),r=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,o._X)(r),(0,l.useCallback)((e=>{if(!r)return;const a=new URLSearchParams(n.location.search);a.set(r,e),n.replace({...n.location,search:a.toString()})}),[r,n])]}function g(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(a){if(!b({value:a,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:r}))),[o,u]=m({queryString:t,groupId:n}),[d,g]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,r]=(0,c.Nk)(t);return[n,(0,l.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:n}),v=(()=>{const e=o??d;return b({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!b({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var v=t(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:a,block:t,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const a=e.currentTarget,t=c.indexOf(a),n=u[t].value;n!==i&&(d(a),o(n))},b=e=>{let a=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;a=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;a=c[t]??c[c.length-1];break}}a?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},a)},u.map((e=>{let{value:a,label:t,attributes:s}=e;return l.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>c.push(e),onKeyDown:b,onClick:p},s,{className:(0,r.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":i===a})}),t??a)})))}function k(e){let{lazy:a,children:t,selectedValue:n}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,a)=>(0,l.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function y(e){const a=g(e);return l.createElement("div",{className:(0,r.Z)("tabs-container",h.tabList)},l.createElement(f,(0,n.Z)({},e,a)),l.createElement(k,(0,n.Z)({},e,a)))}function N(e){const a=(0,v.Z)();return l.createElement(y,(0,n.Z)({key:String(a)},e))}},4881:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=t(7462),l=(t(7294),t(3905)),r=t(4866),s=t(5162);const i={sidebar_label:"Source code"},o="Source code",u={unversionedId:"contributing-guide/local-development/source-code",id:"version-4.x/contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/4.x/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/4.x/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}],p={toc:d},b="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(b,(0,n.Z)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"source-code"},"Source code"),(0,l.kt)("p",null,"The following is a tutorial on local deployment development for different operating systems."),(0,l.kt)("h2",{id:"prepare-dependencies"},"Prepare dependencies"),(0,l.kt)("h3",{id:"macos"},"macOS"),(0,l.kt)("h4",{id:"install-homebrew"},"Install homebrew"),(0,l.kt)("p",null,"First you need to install Xcode Command tools:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,l.kt)("p",null,"Then install Homebrew, the package management tool for macOS"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,l.kt)("h4",{id:"install-dependencies"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"yarn"},"yarn"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,l.kt)("h4",{id:"system-dependencies"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,l.kt)("h4",{id:"install-dependencies-1"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-1"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"node"},"node"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,l.kt)("h4",{id:"system-dependencies-1"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,l.kt)("p",null,"Needs install ",(0,l.kt)("inlineCode",{parentName:"p"},"gcompat")," if use ",(0,l.kt)("inlineCode",{parentName:"p"},"arm"),' architecture. or an exception will throws such like "',(0,l.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'".'),(0,l.kt)("h4",{id:"install-dependencies-2"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-2"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h2",{id:"install-ruby"},"Install Ruby"),(0,l.kt)("p",null,"Can be installed by either asdf, rvm as ruby version manager."),(0,l.kt)(r.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,l.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,l.kt)("p",null,"Following the ",(0,l.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"offical install guide")," then:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,l.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,l.kt)("h2",{id:"fetch-source-code"},"Fetch source code"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,l.kt)("h2",{id:"initialize-zealot"},"Initialize Zealot"),(0,l.kt)("p",null,"All the following steps need to be performed in the zealot root directory."),(0,l.kt)("h3",{id:"bundler"},"bundler"),(0,l.kt)("p",null,"Install Ruby gems"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,l.kt)("h3",{id:"yarn-1"},"yarn"),(0,l.kt)("p",null,"Install javascript packages:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,l.kt)("h3",{id:"initialize-database"},"Initialize database"),(0,l.kt)("p",null,"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,l.kt)("p",null,"Configuring the connection database can be done via ",(0,l.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"environment variables")," or by changing the ",(0,l.kt)("inlineCode",{parentName:"p"},"config/database.yml")," file."),(0,l.kt)("h3",{id:"initialize-default-account-and-demo-data"},"Initialize default account and demo data"),(0,l.kt)("p",null,"Initialize administrator account and sample application"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,l.kt)("h3",{id:"launch-services"},"Launch services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,l.kt)("p",null,"Open brower ",(0,l.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3877],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>m});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?r(Object(t),!0).forEach((function(a){l(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function i(e,a){if(null==e)return{};var t,n,l=function(e,a){if(null==e)return{};var t,n,l={},r=Object.keys(e);for(n=0;n<r.length;n++)t=r[n],a.indexOf(t)>=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)t=r[n],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),u=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},c=function(e){var a=u(e.components);return n.createElement(o.Provider,{value:a},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},b=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(t),b=l,m=d["".concat(o,".").concat(b)]||d[b]||p[b]||r;return t?n.createElement(m,s(s({ref:a},c),{},{components:t})):n.createElement(m,s({ref:a},c))}));function m(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=b;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[d]="string"==typeof e?e:l,s[1]=i;for(var u=2;u<r;u++)s[u]=t[u];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}b.displayName="MDXCreateElement"},5162:(e,a,t)=>{t.d(a,{Z:()=>s});var n=t(7294),l=t(4334);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:a,hidden:t,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.Z)(r.tabItem,s),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),l=t(7294),r=t(4334),s=t(2466),i=t(6550),o=t(1980),u=t(7392),c=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:l}}=e;return{value:a,label:t,attributes:n,default:l}}))}function p(e){const{values:a,children:t}=e;return(0,l.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,u.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[a,t])}function b(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function m(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),r=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,o._X)(r),(0,l.useCallback)((e=>{if(!r)return;const a=new URLSearchParams(n.location.search);a.set(r,e),n.replace({...n.location,search:a.toString()})}),[r,n])]}function g(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(a){if(!b({value:a,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:r}))),[o,u]=m({queryString:t,groupId:n}),[d,g]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,r]=(0,c.Nk)(t);return[n,(0,l.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:n}),v=(()=>{const e=o??d;return b({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!b({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var v=t(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:a,block:t,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const a=e.currentTarget,t=c.indexOf(a),n=u[t].value;n!==i&&(d(a),o(n))},b=e=>{let a=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;a=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;a=c[t]??c[c.length-1];break}}a?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":t},a)},u.map((e=>{let{value:a,label:t,attributes:s}=e;return l.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>c.push(e),onKeyDown:b,onClick:p},s,{className:(0,r.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":i===a})}),t??a)})))}function k(e){let{lazy:a,children:t,selectedValue:n}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,a)=>(0,l.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function y(e){const a=g(e);return l.createElement("div",{className:(0,r.Z)("tabs-container",h.tabList)},l.createElement(f,(0,n.Z)({},e,a)),l.createElement(k,(0,n.Z)({},e,a)))}function N(e){const a=(0,v.Z)();return l.createElement(y,(0,n.Z)({key:String(a)},e))}},4881:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=t(7462),l=(t(7294),t(3905)),r=t(4866),s=t(5162);const i={sidebar_label:"Source code"},o="Source code",u={unversionedId:"contributing-guide/local-development/source-code",id:"version-4.x/contributing-guide/local-development/source-code",title:"Source code",description:"The following is a tutorial on local deployment development for different operating systems.",source:"@site/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/docs/4.x/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Source code"},sidebar:"contributingGuide",previous:{title:"Visual Studio Code Dev Container Setup",permalink:"/docs/4.x/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"Prepare dependencies",id:"prepare-dependencies",level:2},{value:"macOS",id:"macos",level:3},{value:"Install homebrew",id:"install-homebrew",level:4},{value:"Install dependencies",id:"install-dependencies",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services",level:4},{value:"yarn",id:"yarn",level:4},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"System dependencies",id:"system-dependencies",level:4},{value:"Install dependencies",id:"install-dependencies-1",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"System dependencies",id:"system-dependencies-1",level:4},{value:"Install dependencies",id:"install-dependencies-2",level:4},{value:"Setup Database and cache services",id:"setup-database-and-cache-services-2",level:4},{value:"Install Ruby",id:"install-ruby",level:2},{value:"Fetch source code",id:"fetch-source-code",level:2},{value:"Initialize Zealot",id:"initialize-zealot",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-1",level:3},{value:"Initialize database",id:"initialize-database",level:3},{value:"Initialize default account and demo data",id:"initialize-default-account-and-demo-data",level:3},{value:"Launch services",id:"launch-services",level:3}],p={toc:d},b="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(b,(0,n.Z)({},p,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"source-code"},"Source code"),(0,l.kt)("p",null,"The following is a tutorial on local deployment development for different operating systems."),(0,l.kt)("h2",{id:"prepare-dependencies"},"Prepare dependencies"),(0,l.kt)("h3",{id:"macos"},"macOS"),(0,l.kt)("h4",{id:"install-homebrew"},"Install homebrew"),(0,l.kt)("p",null,"First you need to install Xcode Command tools:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,l.kt)("p",null,"Then install Homebrew, the package management tool for macOS"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,l.kt)("h4",{id:"install-dependencies"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"yarn"},"yarn"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,l.kt)("h4",{id:"system-dependencies"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,l.kt)("h4",{id:"install-dependencies-1"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-1"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h4",{id:"node"},"node"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,l.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,l.kt)("h4",{id:"system-dependencies-1"},"System dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,l.kt)("p",null,"Needs install ",(0,l.kt)("inlineCode",{parentName:"p"},"gcompat")," if use ",(0,l.kt)("inlineCode",{parentName:"p"},"arm"),' architecture. or an exception will throws such like "',(0,l.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'".'),(0,l.kt)("h4",{id:"install-dependencies-2"},"Install dependencies"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql\n")),(0,l.kt)("h4",{id:"setup-database-and-cache-services-2"},"Setup Database and cache services"),(0,l.kt)("p",null,"Run postgresql and redis services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,l.kt)("p",null,"You also need to create a default username in Postgresql\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,l.kt)("h2",{id:"install-ruby"},"Install Ruby"),(0,l.kt)("p",null,"Can be installed by either asdf, rvm as ruby version manager."),(0,l.kt)(r.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,l.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,l.kt)("p",null,"Following the ",(0,l.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"offical install guide")," then:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable Ruby 3.2.0 YJIT need install rust 1.58+\n# Optinal install:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# Required:\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,l.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,l.kt)("h2",{id:"fetch-source-code"},"Fetch source code"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,l.kt)("h2",{id:"initialize-zealot"},"Initialize Zealot"),(0,l.kt)("p",null,"All the following steps need to be performed in the zealot root directory."),(0,l.kt)("h3",{id:"bundler"},"bundler"),(0,l.kt)("p",null,"Install Ruby gems"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,l.kt)("h3",{id:"yarn-1"},"yarn"),(0,l.kt)("p",null,"Install javascript packages:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,l.kt)("h3",{id:"initialize-database"},"Initialize database"),(0,l.kt)("p",null,"Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,l.kt)("p",null,"Configuring the connection database can be done via ",(0,l.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"environment variables")," or by changing the ",(0,l.kt)("inlineCode",{parentName:"p"},"config/database.yml")," file."),(0,l.kt)("h3",{id:"initialize-default-account-and-demo-data"},"Initialize default account and demo data"),(0,l.kt)("p",null,"Initialize administrator account and sample application"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,l.kt)("h3",{id:"launch-services"},"Launch services"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,l.kt)("p",null,"Open brower ",(0,l.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.ce8f06be.js b/assets/js/c4f5d8e4.83acb6e2.js similarity index 84% rename from assets/js/c4f5d8e4.ce8f06be.js rename to assets/js/c4f5d8e4.83acb6e2.js index 6a6726e3b..a7df33ae0 100644 --- a/assets/js/c4f5d8e4.ce8f06be.js +++ b/assets/js/c4f5d8e4.83acb6e2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4195],{5154:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1041.277,height:554.141,viewBox:"0 0 1041.277 554.141","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Powered by Rails"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 24"},n.createElement("g",{"data-name":"Group 23",transform:"translate(-.011 -.035)"},n.createElement("path",{fill:"#f2f2f2",d:"M961.48 438.21q-1.74 3.75-3.47 7.4-2.7 5.67-5.33 11.12c-.78 1.61-1.56 3.19-2.32 4.77-8.6 17.57-16.63 33.11-23.45 45.89a73.21 73.21 0 0 1-63.81 38.7l-151.65 1.65h-1.6l-13 .14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107 1.16-95.51 1-11.11.12-69 .75h-.08l-44.75.48h-.48l-141.5 1.53-42.33.46a87.991 87.991 0 0 1-10.79-.54c-1.22-.14-2.44-.3-3.65-.49a87.38 87.38 0 0 1-51.29-27.54c-18.21-20.03-31.46-43.4-40.36-68.76q-1.93-5.49-3.6-11.12c-30.81-104.15 6.75-238.52 74.35-328.44q4.25-5.64 8.64-11l.07-.08c20.79-25.52 44.1-46.84 68.93-62 44-26.91 92.75-34.49 140.7-11.9 40.57 19.12 78.45 28.11 115.17 30.55 3.71.24 7.42.42 11.11.53 84.23 2.65 163.17-27.7 255.87-47.29 3.69-.78 7.39-1.55 11.12-2.28C763 .54 836.36-6.4 923.6 8.19a189.089 189.089 0 0 1 26.76 6.4q5.77 1.86 11.12 4c41.64 16.94 64.35 48.24 74 87.46q1.37 5.46 2.37 11.11c17.11 94.34-33 228.16-76.37 321.05Z","data-name":"Path 299"}),n.createElement("path",{d:"M497.02 445.61a95.21 95.21 0 0 1-1.87 11.12h93.7v-11.12Zm-78.25 62.81 11.11-.09v-27.47c-3.81-.17-7.52-.34-11.11-.52Zm-232.92-62.81v11.12h198.5v-11.12Zm849.68-339.52h-74V18.6q-5.35-2.17-11.12-4v91.49H696.87V13.67c-3.73.73-7.43 1.5-11.12 2.28v90.14H429.88V63.24c-3.69-.11-7.4-.29-11.11-.53v43.38H162.9v-62c-24.83 15.16-48.14 36.48-68.93 62h-.07v.08q-4.4 5.4-8.64 11h8.64v328.44h-83q1.66 5.63 3.6 11.12h79.39v93.62a87 87 0 0 0 12.2 2.79c1.21.19 2.43.35 3.65.49a87.991 87.991 0 0 0 10.79.54l42.33-.46v-97h255.91v94.21l11.11-.12v-94.07h255.87v91.36l11.12-.12v-91.24h253.49v4.77c.76-1.58 1.54-3.16 2.32-4.77q2.63-5.45 5.33-11.12 1.73-3.64 3.47-7.4v-321h76.42q-1.01-5.69-2.37-11.12ZM162.9 445.61V117.17h255.87v328.44Zm267 0V117.17h255.85v328.44Zm520.48 0H696.87V117.17h253.49Z","data-name":"Path 300",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 301"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 302",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 303"}),n.createElement("path",{d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 304",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M298.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 305"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 137",d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{"data-name":"Rectangle 138",opacity:.1,d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 139",d:"M678.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{d:"M298.09 483.65v4.97l-47.17 1.26v-6.23Z","data-name":"Path 306",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M381.35 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 307"}),n.createElement("path",{d:"M185.85 308.41v181.2h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95Z","data-name":"Path 308",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M194.59 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 309"}),n.createElement("path",{d:"M726.09 483.65v6.41l-47.17-1.26v-5.15Z","data-name":"Path 310",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95l-191.69-5.1a4 4 0 0 1-3.85-3.95v-168.2a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.99 3.95Z","data-name":"Path 311"}),n.createElement("path",{d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95v-181.2a4 4 0 0 1 4 3.95Z","data-name":"Path 312",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M775.59 319.15h-177.5V467.4l177.5 4Z","data-name":"Path 313"}),n.createElement("path",{fill:"#65617d",d:"M583.85 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1a4 4 0 0 1-4-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 314"}),n.createElement("path",{fill:"#4267b2",d:"M397.09 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 315"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5 4.4-.02.98-.01Z","data-name":"Path 316",opacity:.1}),n.createElement("circle",{cx:51.33,cy:51.33,r:51.33,fill:"#fbbebe","data-name":"Ellipse 111",transform:"translate(435.93 246.82)"}),n.createElement("path",{fill:"#fbbebe",d:"M538.6 377.16s-99.5 12-90 0c3.44-4.34 4.39-17.2 4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41 77-8.5c-4 13.13-2.69 31.57.35 48.88.89 5.05 1.92 10 3 14.7a344.66 344.66 0 0 0 9.65 33.92Z","data-name":"Path 317"}),n.createElement("path",{fill:"#ff6584",d:"M506.13 373.09c11.51-2.13 23.7-6 34.53-1.54 2.85 1.17 5.47 2.88 8.39 3.86s6.12 1.22 9.16 1.91c10.68 2.42 19.34 10.55 24.9 20s8.44 20.14 11.26 30.72l6.9 25.83c6 22.45 12 45.09 13.39 68.3a2437.506 2437.506 0 0 1-250.84 1.43c5.44-10.34 11-21.31 10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34 6.57-13.39 9.64-20.22 8.75-19.52 1.94-45.79 17.32-60.65 6.92-6.68 17-9.21 26.63-8.89 12.28.41 24.85 4.24 37 6.11 15.56 2.36 30.26 3.76 45.94.88Z","data-name":"Path 318"}),n.createElement("path",{d:"m637.03 484.26-.1 1.43v.1l-.17 2.3-1.33 18.51-1.61 22.3-.46 6.28-1 13.44v.17l-107 1-175.59 1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53 10.53 0 0 1 11.42-10.17c4.72.4 10.85.89 18.18 1.41l3 .22c42.33 2.94 120.56 6.74 199.5 2 1.66-.09 3.33-.19 5-.31 12.24-.77 24.47-1.76 36.58-3a10.53 10.53 0 0 1 11.6 11.23Z","data-name":"Path 319",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M349.74 552.53v-.84l175.62-1.91 107-1h.3v-.17l1-13.44.43-6 1.64-22.61 1.29-17.9v-.44a10.617 10.617 0 0 0-.11-2.47.3.3 0 0 0 0-.1 10.391 10.391 0 0 0-2-4.64 10.54 10.54 0 0 0-9.42-4 937.419 937.419 0 0 1-36.58 3c-1.67.12-3.34.22-5 .31-78.94 4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54 10.54 0 0 0-11.24 8.53 11 11 0 0 0-.18 1.64l-.68 22.16-.93 28.07-.44 14.36v1.12Z","data-name":"Path 320"}),n.createElement("path",{d:"m637.33 491.27-1.23 15.33-1.83 22.85-.46 5.72-1 12.81-.06.64v.17l-.15 1.48.11-1.48h-.29l-107 1-175.65 1.9v-.28l.49-14.36 1-28.06.64-18.65a6.36 6.36 0 0 1 3.06-5.25 6.25 6.25 0 0 1 3.78-.9c2.1.17 4.68.37 7.69.59 4.89.36 10.92.78 17.94 1.22 13 .82 29.31 1.7 48 2.42 52 2 122.2 2.67 188.88-3.17 3-.26 6.1-.55 9.13-.84a6.26 6.26 0 0 1 3.48.66 5.159 5.159 0 0 1 .86.54 6.14 6.14 0 0 1 2 2.46 3.564 3.564 0 0 1 .25.61 6.279 6.279 0 0 1 .36 2.59Z","data-name":"Path 321",opacity:.1}),n.createElement("path",{d:"M298.1 504.96v3.19a6.13 6.13 0 0 1-3.5 5.54l-40.1.77a6.12 6.12 0 0 1-3.57-5.57v-3Z","data-name":"Path 322",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 323"}),n.createElement("path",{d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 324",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m300.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 325"}),n.createElement("path",{d:"M679.22 506.96v3.19a6.13 6.13 0 0 0 3.5 5.54l40.1.77a6.12 6.12 0 0 0 3.57-5.57v-3Z","data-name":"Path 326",opacity:.1}),n.createElement("path",{d:"m678.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 327",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m676.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 328"}),n.createElement("path",{fill:"#3f3d56",d:"M454.79 313.88c.08 7-3.16 13.6-5.91 20.07a163.491 163.491 0 0 0-12.66 74.71c.73 11 2.58 22 .73 32.9s-8.43 21.77-19 24.9c17.53 10.45 41.26 9.35 57.76-2.66 8.79-6.4 15.34-15.33 21.75-24.11a97.86 97.86 0 0 1-13.31 44.75 103.43 103.43 0 0 0 73.51-40.82c4.31-5.81 8.06-12.19 9.72-19.23 3.09-13-1.22-26.51-4.51-39.5a266.055 266.055 0 0 1-6.17-33c-.43-3.56-.78-7.22.1-10.7 1-4.07 3.67-7.51 5.64-11.22 5.6-10.54 5.73-23.3 2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47 1.48-16.14 8.32-22 15.34-4.59 5.46-15.81 15.71-16.6 22.86-.72 6.59 5.1 17.63 6.09 24.58 1.3 9 2.22 6 7.3 11.52 3.21 3.42 5.28 7.37 5.34 12.16Z","data-name":"Path 329"})))))}},6081:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1088,height:687.962,viewBox:"0 0 1088 687.962","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Easy to Use"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 12"},n.createElement("g",{"data-name":"Group 11"},n.createElement("path",{fill:"#3f3d56",d:"M961.81 454.442c-5.27 45.15-16.22 81.4-31.25 110.31-20 38.52-54.21 54.04-84.77 70.28a193.275 193.275 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.282 657.282 0 0 0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07 5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12 52.29-235.46 134.74-296.47 155.97-115.41 369.76-110.57 523.43 7.88 102.36 78.9 198.2 198.31 179.02 362.74Z","data-name":"Path 83"}),n.createElement("path",{fill:"#f2f2f2",d:"M930.56 564.752c-20 38.52-47.21 64.04-77.77 80.28a193.272 193.272 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.3 657.3 0 0 0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25 1.72c-100.17 7.36-253.82-6.43-321.42-143.29L326 177.962l62.95 161.619 20.09 51.59 55.37-75.98L493 275.962l130.2 149.27 36.8-81.27 254.78 207.919 14.21 11.59Z","data-name":"Path 84"}),n.createElement("path",{d:"m302 282.962 26-57 36 83-31-60Z","data-name":"Path 85",opacity:.1}),n.createElement("path",{d:"M554.5 647.802q-14.97-.675-29.97-.67l-115.49-255.96Z","data-name":"Path 86",opacity:.1}),n.createElement("path",{d:"M464.411 315.191 493 292.962l130 150-132-128Z","data-name":"Path 87",opacity:.1}),n.createElement("path",{d:"M852.79 645.032a193.265 193.265 0 0 1-27.46 11.94L623.2 425.232Z","data-name":"Path 88",opacity:.1}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 11",transform:"translate(479 98.962)"}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 12",transform:"translate(396 201.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 13",transform:"translate(600 220.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 14",transform:"translate(180 265.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 15",transform:"translate(612 96.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 16",transform:"translate(736 192.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 17",transform:"translate(858 344.962)"}),n.createElement("path",{fill:"#f2f2f2",d:"M306 121.222h-2.76v-2.76h-1.48v2.76H299v1.478h2.76v2.759h1.48V122.7H306Z","data-name":"Path 89"}),n.createElement("path",{fill:"#f2f2f2",d:"M848 424.222h-2.76v-2.76h-1.48v2.76H841v1.478h2.76v2.759h1.48V425.7H848Z","data-name":"Path 90"}),n.createElement("path",{fill:"#3f3d56",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 91"}),n.createElement("path",{d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 92",opacity:.1}),n.createElement("ellipse",{cx:544,cy:30,fill:"#3f3d56","data-name":"Ellipse 18",rx:544,ry:30,transform:"translate(0 583.962)"}),n.createElement("path",{fill:"#ff6584",d:"M568 571.962c0 33.137-14.775 24-33 24s-33 9.137-33-24 33-96 33-96 33 62.863 33 96Z","data-name":"Path 93"}),n.createElement("path",{d:"M550 584.641c0 15.062-6.716 10.909-15 10.909s-15 4.153-15-10.909 15-43.636 15-43.636 15 28.576 15 43.636Z","data-name":"Path 94",opacity:.1}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 97",rx:9,transform:"translate(489 604.962)"}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 98",rx:9,transform:"translate(489 586.962)"}),n.createElement("path",{fill:"#3f3d56",d:"M137 490.528c0 55.343 34.719 100.126 77.626 100.126","data-name":"Path 95"}),n.createElement("path",{fill:"#6c63ff",d:"M214.626 590.654c0-55.965 38.745-101.251 86.626-101.251","data-name":"Path 96"}),n.createElement("path",{fill:"#6c63ff",d:"M165.125 495.545c0 52.57 22.14 95.109 49.5 95.109","data-name":"Path 97"}),n.createElement("path",{fill:"#3f3d56",d:"M214.626 590.654c0-71.511 44.783-129.377 100.126-129.377","data-name":"Path 98"}),n.createElement("path",{fill:"#a8a8a8",d:"M198.3 591.36s11.009-.339 14.326-2.7 16.934-5.183 17.757-1.395 16.544 18.844 4.115 18.945-28.879-1.936-32.19-3.953-4.008-10.897-4.008-10.897Z","data-name":"Path 99"}),n.createElement("path",{d:"M234.716 604.89c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7 8.879 4.009 10.9 19.761 4.053 32.19 3.953c3.588-.029 4.827-1.305 4.759-3.2-.498 1.142-1.867 1.855-4.537 1.877Z","data-name":"Path 100",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M721.429 527.062c0 38.029 23.857 68.8 53.341 68.8","data-name":"Path 101"}),n.createElement("path",{fill:"#6c63ff",d:"M774.769 595.863c0-38.456 26.623-69.575 59.525-69.575","data-name":"Path 102"}),n.createElement("path",{fill:"#6c63ff",d:"M740.755 530.509c0 36.124 15.213 65.354 34.014 65.354","data-name":"Path 103"}),n.createElement("path",{fill:"#3f3d56",d:"M774.769 595.863c0-49.139 30.773-88.9 68.8-88.9","data-name":"Path 104"}),n.createElement("path",{fill:"#a8a8a8",d:"M763.548 596.348s7.565-.233 9.844-1.856 11.636-3.562 12.2-.958 11.368 12.949 2.828 13.018-19.844-1.33-22.119-2.716-2.753-7.488-2.753-7.488Z","data-name":"Path 105"}),n.createElement("path",{d:"M788.574 605.645c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479 6.1 2.755 7.487 13.579 2.785 22.119 2.716c2.465-.02 3.317-.9 3.27-2.2-.343.788-1.283 1.278-3.118 1.293Z","data-name":"Path 106",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M893.813 618.699s11.36-1.729 14.5-4.591 16.89-7.488 18.217-3.667 19.494 17.447 6.633 19.107-30.153 1.609-33.835-.065-5.515-10.784-5.515-10.784Z","data-name":"Path 107"}),n.createElement("path",{d:"M933.228 628.154c-12.86 1.659-30.153 1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833 9.109 5.516 10.783 20.975 1.725 33.835.065c3.712-.479 4.836-1.956 4.529-3.906-.375 1.246-1.703 2.156-4.466 2.512Z","data-name":"Path 108",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M614.26 617.881s9.587-1.459 12.237-3.875 14.255-6.32 15.374-3.095 16.452 14.725 5.6 16.125-25.448 1.358-28.555-.055-4.656-9.1-4.656-9.1Z","data-name":"Path 109"}),n.createElement("path",{d:"M647.524 625.856c-10.853 1.4-25.448 1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547 7.687 4.655 9.1 17.7 1.456 28.555.055c3.133-.4 4.081-1.651 3.822-3.3-.314 1.057-1.435 1.825-3.767 2.125Z","data-name":"Path 110",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M122.389 613.09s7.463-1.136 9.527-3.016 11.1-4.92 11.969-2.409 12.808 11.463 4.358 12.553-19.811 1.057-22.23-.043-3.624-7.085-3.624-7.085Z","data-name":"Path 111"}),n.createElement("path",{d:"M148.285 619.302c-8.449 1.09-19.811 1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2 5.984 3.624 7.085 13.781 1.133 22.23.043c2.439-.315 3.177-1.285 2.976-2.566-.246.818-1.119 1.416-2.934 1.65Z","data-name":"Path 112",opacity:.2}),n.createElement("path",{d:"M383.7 601.318c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.118-36.793 93.694-36.793 93.08 6.573 93.08 36.793Z","data-name":"Path 113",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M383.7 593.881c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.114-36.8 93.69-36.8 93.084 6.576 93.084 36.8Z","data-name":"Path 114"})))))}},5720:(e,t,a)=>{a.d(t,{Z:()=>B});var l,n,c,r,h,i,d,m,s,f,o,p,E,v,Z,u,y,g,M,P,x,w,b,O,q,N=a(7294);function S(){return S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},S.apply(this,arguments)}const B=e=>{let{title:t,titleId:a,...B}=e;return N.createElement("svg",S({xmlns:"http://www.w3.org/2000/svg",width:1129,height:663,viewBox:"0 0 1129 663","aria-labelledby":a},B),void 0===t?N.createElement("title",{id:a},"Focus on What Matters"):t?N.createElement("title",{id:a},t):null,l||(l=N.createElement("circle",{cx:321,cy:321,r:321,fill:"#f2f2f2"})),n||(n=N.createElement("ellipse",{cx:559,cy:635.5,fill:"#3f3d56",rx:514,ry:27.5})),c||(c=N.createElement("ellipse",{cx:558,cy:627,opacity:.2,rx:460,ry:22})),r||(r=N.createElement("path",{fill:"#3f3d56",d:"M131 152.5h840v50H131z"})),h||(h=N.createElement("path",{fill:"#3f3d56",d:"M131 606.8c0 5.8 2.3 11.3 6.4 15.3 4 4.1 9.5 6.4 15.3 6.4h796.6c5.8 0 11.3-2.3 15.3-6.4 4.1-4 6.4-9.5 6.4-15.3V175.5H131Z"})),i||(i=N.createElement("path",{fill:"#3f3d56",d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z"})),d||(d=N.createElement("path",{d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z",opacity:.2})),m||(m=N.createElement("circle",{cx:181,cy:147.5,r:13,fill:"#3f3d56"})),s||(s=N.createElement("circle",{cx:217,cy:147.5,r:13,fill:"#3f3d56"})),f||(f=N.createElement("circle",{cx:253,cy:147.5,r:13,fill:"#3f3d56"})),o||(o=N.createElement("rect",{width:337,height:386,x:168,y:213.5,fill:"#606060",rx:5.3})),p||(p=N.createElement("rect",{width:284,height:22,x:603,y:272.5,fill:"#243B49",rx:5.5})),E||(E=N.createElement("rect",{width:416,height:15,x:537,y:351.5,fill:"#203D49",rx:5.5})),v||(v=N.createElement("rect",{width:416,height:15,x:537,y:396.5,fill:"#263C49",rx:5.5})),Z||(Z=N.createElement("rect",{width:416,height:15,x:537,y:440.5,fill:"#26394D",rx:5.5})),u||(u=N.createElement("rect",{width:416,height:15,x:537,y:484.5,fill:"#233A4D",rx:5.5})),y||(y=N.createElement("rect",{width:88,height:26,x:865,y:552.5,fill:"#213450",rx:7})),g||(g=N.createElement("path",{fill:"#3f3d56",d:"M1053.1 506.1a30.1 30.1 0 0 0 4-15.3c0-13.8-8.5-25-19.1-25s-19.1 11.2-19.1 25a30.1 30.1 0 0 0 4 15.3 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 30.1 30.1 0 0 0-4 15.3c0 13.8 8.5 25 19.1 25s19.1-11.2 19.1-25a30.1 30.1 0 0 0-4-15.3 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5Z"})),M||(M=N.createElement("ellipse",{cx:1038,cy:460.3,fill:"#3f3d56",rx:19.1,ry:25})),P||(P=N.createElement("ellipse",{cx:1038,cy:429.8,fill:"#3f3d56",rx:19.1,ry:25})),x||(x=N.createElement("path",{fill:"#3E77CC",fillRule:"evenodd",d:"M1110.4 220.8c2.6-3.3 5-6.8 7.1-10.5l-50.1-8.2 54.2.4c10.5-22.9 11.1-49.1 1.7-72.4l-72.8 37.7 67.1-49.3c-17.2-29.5-49.4-46.9-83.5-45.2-34 1.7-64.3 22.2-78.5 53.2-14.2 31.1-10 67.4 11 94.3-4.1 5.2-7.5 10.8-10.4 16.7l65.1 33.8-69.4-23.3c-9.9 29.2-4.4 61.5 14.7 85.8-29.5 37.5-25.2 91.3 9.8 123.6 35.1 32.4 89 32.4 124.1 0 35-32.3 39.3-86.1 9.8-123.6 26.1-33.2 26.1-79.8 0-113Z"})),w||(w=N.createElement("path",{d:"M946.2 277.4a91 91 0 0 0 19.6 56.5 91.4 91.4 0 1 0 143.7 0c12.2-15.6-163.3-66.8-163.3-56.5Z",opacity:.1})),b||(b=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),O||(O=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),q||(q=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})))}},3261:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var l=a(7294),n=a(6010),c=a(9960),r=a(2263),h=a(7961),i=a(7462);const d={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var m=a(5999);const s=[{title:l.createElement(m.Z,null,"Easy to Use"),Svg:a(6081).Z,description:l.createElement(m.Z,null,"Zealot was designed from the ground up to be easily installed and running quickly.")},{title:l.createElement(m.Z,null,"Focus on What Matters"),Svg:a(5720).Z,description:l.createElement(m.Z,null,"Zealot lets you focus on your app, and we'll do the chores. Go ahead and upload your apps.")},{title:l.createElement(m.Z,null,"Open Source 100%"),Svg:a(5154).Z,description:l.createElement(m.Z,null,"Zealot is an open source project, Everyone could easy self hosted on own servers.")}];function f(e){let{Svg:t,title:a,description:c}=e;return l.createElement("div",{className:(0,n.Z)("col col--4")},l.createElement("div",{className:"text--center"},l.createElement(t,{className:d.featureSvg,role:"img"})),l.createElement("div",{className:"text--center padding-horiz--md"},l.createElement("h3",null,a),l.createElement("p",null,c)))}function o(){return l.createElement("section",{className:d.features},l.createElement("div",{className:"container"},l.createElement("div",{className:"row"},s.map(((e,t)=>l.createElement(f,(0,i.Z)({key:t},e)))))))}const p={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function E(){const{siteConfig:e}=(0,r.Z)();return l.createElement("header",{className:(0,n.Z)("hero hero--primary",p.heroBanner)},l.createElement("div",{className:"container"},l.createElement("h1",{className:"hero__title"},l.createElement(m.Z,{id:"homepage.header.title",description:"The title for homepage"},"Zealot")),l.createElement("p",{className:"hero__subtitle"},l.createElement(m.Z,{id:"homepage.header.subtitle",description:"The subtitle for homepage"},"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.")),l.createElement("div",{className:p.buttons},l.createElement(c.Z,{className:"button button--secondary button--lg",to:"/docs/user-guide/"},l.createElement(m.Z,null,"Getting started")))))}function v(){const{siteConfig:e}=(0,r.Z)();return l.createElement(h.Z,{title:(0,m.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"}),description:(0,m.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"})},l.createElement(E,null),l.createElement("main",null,l.createElement(o,null)))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4195],{5154:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1041.277,height:554.141,viewBox:"0 0 1041.277 554.141","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Powered by Rails"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 24"},n.createElement("g",{"data-name":"Group 23",transform:"translate(-.011 -.035)"},n.createElement("path",{fill:"#f2f2f2",d:"M961.48 438.21q-1.74 3.75-3.47 7.4-2.7 5.67-5.33 11.12c-.78 1.61-1.56 3.19-2.32 4.77-8.6 17.57-16.63 33.11-23.45 45.89a73.21 73.21 0 0 1-63.81 38.7l-151.65 1.65h-1.6l-13 .14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107 1.16-95.51 1-11.11.12-69 .75h-.08l-44.75.48h-.48l-141.5 1.53-42.33.46a87.991 87.991 0 0 1-10.79-.54c-1.22-.14-2.44-.3-3.65-.49a87.38 87.38 0 0 1-51.29-27.54c-18.21-20.03-31.46-43.4-40.36-68.76q-1.93-5.49-3.6-11.12c-30.81-104.15 6.75-238.52 74.35-328.44q4.25-5.64 8.64-11l.07-.08c20.79-25.52 44.1-46.84 68.93-62 44-26.91 92.75-34.49 140.7-11.9 40.57 19.12 78.45 28.11 115.17 30.55 3.71.24 7.42.42 11.11.53 84.23 2.65 163.17-27.7 255.87-47.29 3.69-.78 7.39-1.55 11.12-2.28C763 .54 836.36-6.4 923.6 8.19a189.089 189.089 0 0 1 26.76 6.4q5.77 1.86 11.12 4c41.64 16.94 64.35 48.24 74 87.46q1.37 5.46 2.37 11.11c17.11 94.34-33 228.16-76.37 321.05Z","data-name":"Path 299"}),n.createElement("path",{d:"M497.02 445.61a95.21 95.21 0 0 1-1.87 11.12h93.7v-11.12Zm-78.25 62.81 11.11-.09v-27.47c-3.81-.17-7.52-.34-11.11-.52Zm-232.92-62.81v11.12h198.5v-11.12Zm849.68-339.52h-74V18.6q-5.35-2.17-11.12-4v91.49H696.87V13.67c-3.73.73-7.43 1.5-11.12 2.28v90.14H429.88V63.24c-3.69-.11-7.4-.29-11.11-.53v43.38H162.9v-62c-24.83 15.16-48.14 36.48-68.93 62h-.07v.08q-4.4 5.4-8.64 11h8.64v328.44h-83q1.66 5.63 3.6 11.12h79.39v93.62a87 87 0 0 0 12.2 2.79c1.21.19 2.43.35 3.65.49a87.991 87.991 0 0 0 10.79.54l42.33-.46v-97h255.91v94.21l11.11-.12v-94.07h255.87v91.36l11.12-.12v-91.24h253.49v4.77c.76-1.58 1.54-3.16 2.32-4.77q2.63-5.45 5.33-11.12 1.73-3.64 3.47-7.4v-321h76.42q-1.01-5.69-2.37-11.12ZM162.9 445.61V117.17h255.87v328.44Zm267 0V117.17h255.85v328.44Zm520.48 0H696.87V117.17h253.49Z","data-name":"Path 300",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 301"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 302",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 303"}),n.createElement("path",{d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 304",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M298.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 305"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 137",d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{"data-name":"Rectangle 138",opacity:.1,d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 139",d:"M678.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{d:"M298.09 483.65v4.97l-47.17 1.26v-6.23Z","data-name":"Path 306",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M381.35 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 307"}),n.createElement("path",{d:"M185.85 308.41v181.2h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95Z","data-name":"Path 308",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M194.59 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 309"}),n.createElement("path",{d:"M726.09 483.65v6.41l-47.17-1.26v-5.15Z","data-name":"Path 310",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95l-191.69-5.1a4 4 0 0 1-3.85-3.95v-168.2a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.99 3.95Z","data-name":"Path 311"}),n.createElement("path",{d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95v-181.2a4 4 0 0 1 4 3.95Z","data-name":"Path 312",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M775.59 319.15h-177.5V467.4l177.5 4Z","data-name":"Path 313"}),n.createElement("path",{fill:"#65617d",d:"M583.85 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1a4 4 0 0 1-4-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 314"}),n.createElement("path",{fill:"#4267b2",d:"M397.09 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 315"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5 4.4-.02.98-.01Z","data-name":"Path 316",opacity:.1}),n.createElement("circle",{cx:51.33,cy:51.33,r:51.33,fill:"#fbbebe","data-name":"Ellipse 111",transform:"translate(435.93 246.82)"}),n.createElement("path",{fill:"#fbbebe",d:"M538.6 377.16s-99.5 12-90 0c3.44-4.34 4.39-17.2 4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41 77-8.5c-4 13.13-2.69 31.57.35 48.88.89 5.05 1.92 10 3 14.7a344.66 344.66 0 0 0 9.65 33.92Z","data-name":"Path 317"}),n.createElement("path",{fill:"#ff6584",d:"M506.13 373.09c11.51-2.13 23.7-6 34.53-1.54 2.85 1.17 5.47 2.88 8.39 3.86s6.12 1.22 9.16 1.91c10.68 2.42 19.34 10.55 24.9 20s8.44 20.14 11.26 30.72l6.9 25.83c6 22.45 12 45.09 13.39 68.3a2437.506 2437.506 0 0 1-250.84 1.43c5.44-10.34 11-21.31 10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34 6.57-13.39 9.64-20.22 8.75-19.52 1.94-45.79 17.32-60.65 6.92-6.68 17-9.21 26.63-8.89 12.28.41 24.85 4.24 37 6.11 15.56 2.36 30.26 3.76 45.94.88Z","data-name":"Path 318"}),n.createElement("path",{d:"m637.03 484.26-.1 1.43v.1l-.17 2.3-1.33 18.51-1.61 22.3-.46 6.28-1 13.44v.17l-107 1-175.59 1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53 10.53 0 0 1 11.42-10.17c4.72.4 10.85.89 18.18 1.41l3 .22c42.33 2.94 120.56 6.74 199.5 2 1.66-.09 3.33-.19 5-.31 12.24-.77 24.47-1.76 36.58-3a10.53 10.53 0 0 1 11.6 11.23Z","data-name":"Path 319",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M349.74 552.53v-.84l175.62-1.91 107-1h.3v-.17l1-13.44.43-6 1.64-22.61 1.29-17.9v-.44a10.617 10.617 0 0 0-.11-2.47.3.3 0 0 0 0-.1 10.391 10.391 0 0 0-2-4.64 10.54 10.54 0 0 0-9.42-4 937.419 937.419 0 0 1-36.58 3c-1.67.12-3.34.22-5 .31-78.94 4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54 10.54 0 0 0-11.24 8.53 11 11 0 0 0-.18 1.64l-.68 22.16-.93 28.07-.44 14.36v1.12Z","data-name":"Path 320"}),n.createElement("path",{d:"m637.33 491.27-1.23 15.33-1.83 22.85-.46 5.72-1 12.81-.06.64v.17l-.15 1.48.11-1.48h-.29l-107 1-175.65 1.9v-.28l.49-14.36 1-28.06.64-18.65a6.36 6.36 0 0 1 3.06-5.25 6.25 6.25 0 0 1 3.78-.9c2.1.17 4.68.37 7.69.59 4.89.36 10.92.78 17.94 1.22 13 .82 29.31 1.7 48 2.42 52 2 122.2 2.67 188.88-3.17 3-.26 6.1-.55 9.13-.84a6.26 6.26 0 0 1 3.48.66 5.159 5.159 0 0 1 .86.54 6.14 6.14 0 0 1 2 2.46 3.564 3.564 0 0 1 .25.61 6.279 6.279 0 0 1 .36 2.59Z","data-name":"Path 321",opacity:.1}),n.createElement("path",{d:"M298.1 504.96v3.19a6.13 6.13 0 0 1-3.5 5.54l-40.1.77a6.12 6.12 0 0 1-3.57-5.57v-3Z","data-name":"Path 322",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 323"}),n.createElement("path",{d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 324",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m300.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 325"}),n.createElement("path",{d:"M679.22 506.96v3.19a6.13 6.13 0 0 0 3.5 5.54l40.1.77a6.12 6.12 0 0 0 3.57-5.57v-3Z","data-name":"Path 326",opacity:.1}),n.createElement("path",{d:"m678.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 327",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m676.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 328"}),n.createElement("path",{fill:"#3f3d56",d:"M454.79 313.88c.08 7-3.16 13.6-5.91 20.07a163.491 163.491 0 0 0-12.66 74.71c.73 11 2.58 22 .73 32.9s-8.43 21.77-19 24.9c17.53 10.45 41.26 9.35 57.76-2.66 8.79-6.4 15.34-15.33 21.75-24.11a97.86 97.86 0 0 1-13.31 44.75 103.43 103.43 0 0 0 73.51-40.82c4.31-5.81 8.06-12.19 9.72-19.23 3.09-13-1.22-26.51-4.51-39.5a266.055 266.055 0 0 1-6.17-33c-.43-3.56-.78-7.22.1-10.7 1-4.07 3.67-7.51 5.64-11.22 5.6-10.54 5.73-23.3 2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47 1.48-16.14 8.32-22 15.34-4.59 5.46-15.81 15.71-16.6 22.86-.72 6.59 5.1 17.63 6.09 24.58 1.3 9 2.22 6 7.3 11.52 3.21 3.42 5.28 7.37 5.34 12.16Z","data-name":"Path 329"})))))}},6081:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1088,height:687.962,viewBox:"0 0 1088 687.962","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Easy to Use"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 12"},n.createElement("g",{"data-name":"Group 11"},n.createElement("path",{fill:"#3f3d56",d:"M961.81 454.442c-5.27 45.15-16.22 81.4-31.25 110.31-20 38.52-54.21 54.04-84.77 70.28a193.275 193.275 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.282 657.282 0 0 0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07 5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12 52.29-235.46 134.74-296.47 155.97-115.41 369.76-110.57 523.43 7.88 102.36 78.9 198.2 198.31 179.02 362.74Z","data-name":"Path 83"}),n.createElement("path",{fill:"#f2f2f2",d:"M930.56 564.752c-20 38.52-47.21 64.04-77.77 80.28a193.272 193.272 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.3 657.3 0 0 0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25 1.72c-100.17 7.36-253.82-6.43-321.42-143.29L326 177.962l62.95 161.619 20.09 51.59 55.37-75.98L493 275.962l130.2 149.27 36.8-81.27 254.78 207.919 14.21 11.59Z","data-name":"Path 84"}),n.createElement("path",{d:"m302 282.962 26-57 36 83-31-60Z","data-name":"Path 85",opacity:.1}),n.createElement("path",{d:"M554.5 647.802q-14.97-.675-29.97-.67l-115.49-255.96Z","data-name":"Path 86",opacity:.1}),n.createElement("path",{d:"M464.411 315.191 493 292.962l130 150-132-128Z","data-name":"Path 87",opacity:.1}),n.createElement("path",{d:"M852.79 645.032a193.265 193.265 0 0 1-27.46 11.94L623.2 425.232Z","data-name":"Path 88",opacity:.1}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 11",transform:"translate(479 98.962)"}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 12",transform:"translate(396 201.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 13",transform:"translate(600 220.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 14",transform:"translate(180 265.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 15",transform:"translate(612 96.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 16",transform:"translate(736 192.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 17",transform:"translate(858 344.962)"}),n.createElement("path",{fill:"#f2f2f2",d:"M306 121.222h-2.76v-2.76h-1.48v2.76H299v1.478h2.76v2.759h1.48V122.7H306Z","data-name":"Path 89"}),n.createElement("path",{fill:"#f2f2f2",d:"M848 424.222h-2.76v-2.76h-1.48v2.76H841v1.478h2.76v2.759h1.48V425.7H848Z","data-name":"Path 90"}),n.createElement("path",{fill:"#3f3d56",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 91"}),n.createElement("path",{d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 92",opacity:.1}),n.createElement("ellipse",{cx:544,cy:30,fill:"#3f3d56","data-name":"Ellipse 18",rx:544,ry:30,transform:"translate(0 583.962)"}),n.createElement("path",{fill:"#ff6584",d:"M568 571.962c0 33.137-14.775 24-33 24s-33 9.137-33-24 33-96 33-96 33 62.863 33 96Z","data-name":"Path 93"}),n.createElement("path",{d:"M550 584.641c0 15.062-6.716 10.909-15 10.909s-15 4.153-15-10.909 15-43.636 15-43.636 15 28.576 15 43.636Z","data-name":"Path 94",opacity:.1}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 97",rx:9,transform:"translate(489 604.962)"}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 98",rx:9,transform:"translate(489 586.962)"}),n.createElement("path",{fill:"#3f3d56",d:"M137 490.528c0 55.343 34.719 100.126 77.626 100.126","data-name":"Path 95"}),n.createElement("path",{fill:"#6c63ff",d:"M214.626 590.654c0-55.965 38.745-101.251 86.626-101.251","data-name":"Path 96"}),n.createElement("path",{fill:"#6c63ff",d:"M165.125 495.545c0 52.57 22.14 95.109 49.5 95.109","data-name":"Path 97"}),n.createElement("path",{fill:"#3f3d56",d:"M214.626 590.654c0-71.511 44.783-129.377 100.126-129.377","data-name":"Path 98"}),n.createElement("path",{fill:"#a8a8a8",d:"M198.3 591.36s11.009-.339 14.326-2.7 16.934-5.183 17.757-1.395 16.544 18.844 4.115 18.945-28.879-1.936-32.19-3.953-4.008-10.897-4.008-10.897Z","data-name":"Path 99"}),n.createElement("path",{d:"M234.716 604.89c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7 8.879 4.009 10.9 19.761 4.053 32.19 3.953c3.588-.029 4.827-1.305 4.759-3.2-.498 1.142-1.867 1.855-4.537 1.877Z","data-name":"Path 100",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M721.429 527.062c0 38.029 23.857 68.8 53.341 68.8","data-name":"Path 101"}),n.createElement("path",{fill:"#6c63ff",d:"M774.769 595.863c0-38.456 26.623-69.575 59.525-69.575","data-name":"Path 102"}),n.createElement("path",{fill:"#6c63ff",d:"M740.755 530.509c0 36.124 15.213 65.354 34.014 65.354","data-name":"Path 103"}),n.createElement("path",{fill:"#3f3d56",d:"M774.769 595.863c0-49.139 30.773-88.9 68.8-88.9","data-name":"Path 104"}),n.createElement("path",{fill:"#a8a8a8",d:"M763.548 596.348s7.565-.233 9.844-1.856 11.636-3.562 12.2-.958 11.368 12.949 2.828 13.018-19.844-1.33-22.119-2.716-2.753-7.488-2.753-7.488Z","data-name":"Path 105"}),n.createElement("path",{d:"M788.574 605.645c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479 6.1 2.755 7.487 13.579 2.785 22.119 2.716c2.465-.02 3.317-.9 3.27-2.2-.343.788-1.283 1.278-3.118 1.293Z","data-name":"Path 106",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M893.813 618.699s11.36-1.729 14.5-4.591 16.89-7.488 18.217-3.667 19.494 17.447 6.633 19.107-30.153 1.609-33.835-.065-5.515-10.784-5.515-10.784Z","data-name":"Path 107"}),n.createElement("path",{d:"M933.228 628.154c-12.86 1.659-30.153 1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833 9.109 5.516 10.783 20.975 1.725 33.835.065c3.712-.479 4.836-1.956 4.529-3.906-.375 1.246-1.703 2.156-4.466 2.512Z","data-name":"Path 108",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M614.26 617.881s9.587-1.459 12.237-3.875 14.255-6.32 15.374-3.095 16.452 14.725 5.6 16.125-25.448 1.358-28.555-.055-4.656-9.1-4.656-9.1Z","data-name":"Path 109"}),n.createElement("path",{d:"M647.524 625.856c-10.853 1.4-25.448 1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547 7.687 4.655 9.1 17.7 1.456 28.555.055c3.133-.4 4.081-1.651 3.822-3.3-.314 1.057-1.435 1.825-3.767 2.125Z","data-name":"Path 110",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M122.389 613.09s7.463-1.136 9.527-3.016 11.1-4.92 11.969-2.409 12.808 11.463 4.358 12.553-19.811 1.057-22.23-.043-3.624-7.085-3.624-7.085Z","data-name":"Path 111"}),n.createElement("path",{d:"M148.285 619.302c-8.449 1.09-19.811 1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2 5.984 3.624 7.085 13.781 1.133 22.23.043c2.439-.315 3.177-1.285 2.976-2.566-.246.818-1.119 1.416-2.934 1.65Z","data-name":"Path 112",opacity:.2}),n.createElement("path",{d:"M383.7 601.318c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.118-36.793 93.694-36.793 93.08 6.573 93.08 36.793Z","data-name":"Path 113",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M383.7 593.881c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.114-36.8 93.69-36.8 93.084 6.576 93.084 36.8Z","data-name":"Path 114"})))))}},5720:(e,t,a)=>{a.d(t,{Z:()=>B});var l,n,c,r,i,h,d,m,f,s,o,p,E,v,u,y,Z,g,M,P,x,b,w,O,q,N=a(7294);function S(){return S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},S.apply(this,arguments)}const B=e=>{let{title:t,titleId:a,...B}=e;return N.createElement("svg",S({xmlns:"http://www.w3.org/2000/svg",width:1129,height:663,viewBox:"0 0 1129 663","aria-labelledby":a},B),void 0===t?N.createElement("title",{id:a},"Focus on What Matters"):t?N.createElement("title",{id:a},t):null,l||(l=N.createElement("circle",{cx:321,cy:321,r:321,fill:"#f2f2f2"})),n||(n=N.createElement("ellipse",{cx:559,cy:635.5,fill:"#3f3d56",rx:514,ry:27.5})),c||(c=N.createElement("ellipse",{cx:558,cy:627,opacity:.2,rx:460,ry:22})),r||(r=N.createElement("path",{fill:"#3f3d56",d:"M131 152.5h840v50H131z"})),i||(i=N.createElement("path",{fill:"#3f3d56",d:"M131 606.8c0 5.8 2.3 11.3 6.4 15.3 4 4.1 9.5 6.4 15.3 6.4h796.6c5.8 0 11.3-2.3 15.3-6.4 4.1-4 6.4-9.5 6.4-15.3V175.5H131Z"})),h||(h=N.createElement("path",{fill:"#3f3d56",d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z"})),d||(d=N.createElement("path",{d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z",opacity:.2})),m||(m=N.createElement("circle",{cx:181,cy:147.5,r:13,fill:"#3f3d56"})),f||(f=N.createElement("circle",{cx:217,cy:147.5,r:13,fill:"#3f3d56"})),s||(s=N.createElement("circle",{cx:253,cy:147.5,r:13,fill:"#3f3d56"})),o||(o=N.createElement("rect",{width:337,height:386,x:168,y:213.5,fill:"#606060",rx:5.3})),p||(p=N.createElement("rect",{width:284,height:22,x:603,y:272.5,fill:"#243B49",rx:5.5})),E||(E=N.createElement("rect",{width:416,height:15,x:537,y:351.5,fill:"#203D49",rx:5.5})),v||(v=N.createElement("rect",{width:416,height:15,x:537,y:396.5,fill:"#263C49",rx:5.5})),u||(u=N.createElement("rect",{width:416,height:15,x:537,y:440.5,fill:"#26394D",rx:5.5})),y||(y=N.createElement("rect",{width:416,height:15,x:537,y:484.5,fill:"#233A4D",rx:5.5})),Z||(Z=N.createElement("rect",{width:88,height:26,x:865,y:552.5,fill:"#213450",rx:7})),g||(g=N.createElement("path",{fill:"#3f3d56",d:"M1053.1 506.1a30.1 30.1 0 0 0 4-15.3c0-13.8-8.5-25-19.1-25s-19.1 11.2-19.1 25a30.1 30.1 0 0 0 4 15.3 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 30.1 30.1 0 0 0-4 15.3c0 13.8 8.5 25 19.1 25s19.1-11.2 19.1-25a30.1 30.1 0 0 0-4-15.3 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5Z"})),M||(M=N.createElement("ellipse",{cx:1038,cy:460.3,fill:"#3f3d56",rx:19.1,ry:25})),P||(P=N.createElement("ellipse",{cx:1038,cy:429.8,fill:"#3f3d56",rx:19.1,ry:25})),x||(x=N.createElement("path",{fill:"#3E77CC",fillRule:"evenodd",d:"M1110.4 220.8c2.6-3.3 5-6.8 7.1-10.5l-50.1-8.2 54.2.4c10.5-22.9 11.1-49.1 1.7-72.4l-72.8 37.7 67.1-49.3c-17.2-29.5-49.4-46.9-83.5-45.2-34 1.7-64.3 22.2-78.5 53.2-14.2 31.1-10 67.4 11 94.3-4.1 5.2-7.5 10.8-10.4 16.7l65.1 33.8-69.4-23.3c-9.9 29.2-4.4 61.5 14.7 85.8-29.5 37.5-25.2 91.3 9.8 123.6 35.1 32.4 89 32.4 124.1 0 35-32.3 39.3-86.1 9.8-123.6 26.1-33.2 26.1-79.8 0-113Z"})),b||(b=N.createElement("path",{d:"M946.2 277.4a91 91 0 0 0 19.6 56.5 91.4 91.4 0 1 0 143.7 0c12.2-15.6-163.3-66.8-163.3-56.5Z",opacity:.1})),w||(w=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),O||(O=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),q||(q=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})))}},5402:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294);function n(e){var t,a,l="";if("string"==typeof e||"number"==typeof e)l+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(a=n(e[t]))&&(l&&(l+=" "),l+=a);else for(t in e)e[t]&&(l&&(l+=" "),l+=t);return l}const c=function(){for(var e,t,a=0,l="";a<arguments.length;)(e=arguments[a++])&&(t=n(e))&&(l&&(l+=" "),l+=t);return l};var r=a(9960),i=a(2263),h=a(7961),d=a(7462);const m={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var f=a(5999);const s=[{title:l.createElement(f.Z,null,"Easy to Use"),Svg:a(6081).Z,description:l.createElement(f.Z,null,"Zealot was designed from the ground up to be easily installed and running quickly.")},{title:l.createElement(f.Z,null,"Focus on What Matters"),Svg:a(5720).Z,description:l.createElement(f.Z,null,"Zealot lets you focus on your app, and we'll do the chores. Go ahead and upload your apps.")},{title:l.createElement(f.Z,null,"Open Source 100%"),Svg:a(5154).Z,description:l.createElement(f.Z,null,"Zealot is an open source project, Everyone could easy self hosted on own servers.")}];function o(e){let{Svg:t,title:a,description:n}=e;return l.createElement("div",{className:c("col col--4")},l.createElement("div",{className:"text--center"},l.createElement(t,{className:m.featureSvg,role:"img"})),l.createElement("div",{className:"text--center padding-horiz--md"},l.createElement("h3",null,a),l.createElement("p",null,n)))}function p(){return l.createElement("section",{className:m.features},l.createElement("div",{className:"container"},l.createElement("div",{className:"row"},s.map(((e,t)=>l.createElement(o,(0,d.Z)({key:t},e)))))))}const E={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function v(){const{siteConfig:e}=(0,i.Z)();return l.createElement("header",{className:c("hero hero--primary",E.heroBanner)},l.createElement("div",{className:"container"},l.createElement("h1",{className:"hero__title"},l.createElement(f.Z,{id:"homepage.header.title",description:"The title for homepage"},"Zealot")),l.createElement("p",{className:"hero__subtitle"},l.createElement(f.Z,{id:"homepage.header.subtitle",description:"The subtitle for homepage"},"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.")),l.createElement("div",{className:E.buttons},l.createElement(r.Z,{className:"button button--secondary button--lg",to:"/docs/user-guide/"},l.createElement(f.Z,null,"Getting started")))))}function u(){const{siteConfig:e}=(0,i.Z)();return l.createElement(h.Z,{title:(0,f.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"}),description:(0,f.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"})},l.createElement(v,null),l.createElement("main",null,l.createElement(p,null)))}}}]); \ No newline at end of file diff --git a/assets/js/c5b0ab6a.cdca54cd.js b/assets/js/c5b0ab6a.707dcd75.js similarity index 98% rename from assets/js/c5b0ab6a.cdca54cd.js rename to assets/js/c5b0ab6a.707dcd75.js index 602577299..372fa6e9c 100644 --- a/assets/js/c5b0ab6a.cdca54cd.js +++ b/assets/js/c5b0ab6a.707dcd75.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9396],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(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,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var h=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,h.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},2428:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},s="Zealot iOS SDK",u={unversionedId:"developer-guide/sdk/ios",id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/docs/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/next/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/ios.md",tags:[],version:"current",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/next/category/sdks"},next:{title:"Android",permalink:"/docs/next/developer-guide/sdk/android"}},c={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"Adding below code into ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"Install it\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"usages"},"Usages"),(0,r.kt)("h3",{id:"import-header"},"Import header"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Add the code in your ",(0,r.kt)("inlineCode",{parentName:"li"},"AppDelegate"),"\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"// Objective-C\n#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("h3",{id:"configure"},"Configure"),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Add the following code in ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," method block\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9396],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(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,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),u=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,u]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),h=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),b(e)}),[u,b,o]),tabValues:o}}var h=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(y,(0,a.Z)({},e,t)))}function w(e){const t=(0,h.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},2428:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},s="Zealot iOS SDK",u={unversionedId:"developer-guide/sdk/ios",id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"The iOS component provides a service to check for new versions and installations for Zealot,",source:"@site/docs/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/docs/next/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/ios.md",tags:[],version:"current",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/docs/next/category/sdks"},next:{title:"Android",permalink:"/docs/next/developer-guide/sdk/android"}},c={},d=[{value:"Install",id:"install",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"Usages",id:"usages",level:2},{value:"Import header",id:"import-header",level:3},{value:"Configure",id:"configure",level:3}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"The iOS component provides a service to check for new versions and installations for Zealot,\nsupporting Swift and Objective-C."),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"Adding below code into ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"Install it\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"usages"},"Usages"),(0,r.kt)("h3",{id:"import-header"},"Import header"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Add the code in your ",(0,r.kt)("inlineCode",{parentName:"li"},"AppDelegate"),"\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"// Objective-C\n#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("h3",{id:"configure"},"Configure"),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Add the following code in ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," method block\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// Single channel\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// Multi-channel, such as beta, adhoc versions\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// Active it\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// Single channel\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// Multi-channel, such as beta, adhoc versions\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// Active it\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f8a75f5e.0a58249a.js b/assets/js/f8a75f5e.21e0c5a4.js similarity index 99% rename from assets/js/f8a75f5e.0a58249a.js rename to assets/js/f8a75f5e.21e0c5a4.js index feb854c6f..61948a3e9 100644 --- a/assets/js/f8a75f5e.0a58249a.js +++ b/assets/js/f8a75f5e.21e0c5a4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5787],{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 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 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):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.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,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));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]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,l[1]=s;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},5162:(e,t,r)=>{r.d(t,{Z:()=>l});var n=r(7294),a=r(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:r,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>x});var n=r(7462),a=r(7294),o=r(6010),l=r(2466),s=r(6550),i=r(1980),c=r(7392),u=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,o=d(e),[l,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,c]=f({queryString:r,groupId:n}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,u.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:n}),v=(()=>{const e=i??p;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&s(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),c(e),h(e)}),[c,h,o]),tabValues:o}}var v=r(2389);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:p}=(0,l.o5)(),d=e=>{const t=e.currentTarget,r=u.indexOf(t),n=c[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},c.map((e=>{let{value:t,label:r,attributes:l}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:d},l,{className:(0,o.Z)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=h(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",k.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},6536:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),o=r(941),l=r(4996),s=r(4866),i=r(5162);const c={},u="Reverse Proxies",p={unversionedId:"self-hosted/reverse-proxies",id:"version-4.x/self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/4.x/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",tags:[],version:"4.x",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/4.x/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/4.x/category/cloud-provider-guides"}},d={},m=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},h="wrapper";function v(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reverse-proxies"},"Reverse Proxies"),(0,a.kt)("p",null,"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."),(0,a.kt)(o.Z,{alt:"Architecture",sources:{light:(0,l.Z)("/img/reverse-proxies-light.png"),dark:(0,l.Z)("/img/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"prepare"},"Prepare"),(0,a.kt)("p",null,"The following data needs to be prepared to configure the reverse proxy:"),(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},"Name"),(0,a.kt)("th",{parentName:"tr",align:null},"Sample value"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Domain"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Reverse proxy service IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed",(0,a.kt)("br",null),"Change to 127.0.0.1 Reverse Proxy and zealot with one host.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot public port"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot internal port"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"No need modify")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt Email address"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."),(0,a.kt)("h3",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"),(0,a.kt)("h3",{id:"traefik-service"},"Traefik service"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," then edit the Docker Compose file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," or ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),", add key-value below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," and make sure Nomad version >= 1.3:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2"},"Caddy 2"),(0,a.kt)("p",null,"The configuration only needs to relate the ip part after ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("p",null,"The following is the general configuration, if not effects welcome to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"file a issue"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"And you need update max body size in ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}v.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5787],{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 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 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):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.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,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));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]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,l[1]=s;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},5162:(e,t,r)=>{r.d(t,{Z:()=>l});var n=r(7294),a=r(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:r,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(o.tabItem,l),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>x});var n=r(7462),a=r(7294),o=r(4334),l=r(2466),s=r(6550),i=r(1980),c=r(7392),u=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(o),(0,a.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function h(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,o=d(e),[l,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,c]=f({queryString:r,groupId:n}),[p,h]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,u.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:n}),v=(()=>{const e=i??p;return m({value:e,tabValues:o})?e:null})();(0,a.useLayoutEffect)((()=>{v&&s(v)}),[v]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),c(e),h(e)}),[c,h,o]),tabValues:o}}var v=r(2389);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:p}=(0,l.o5)(),d=e=>{const t=e.currentTarget,r=u.indexOf(t),n=c[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":r},t)},c.map((e=>{let{value:t,label:r,attributes:l}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:d},l,{className:(0,o.Z)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=h(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",k.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},6536:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),o=r(941),l=r(4996),s=r(4866),i=r(5162);const c={},u="Reverse Proxies",p={unversionedId:"self-hosted/reverse-proxies",id:"version-4.x/self-hosted/reverse-proxies",title:"Reverse Proxies",description:"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,",source:"@site/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/docs/4.x/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",tags:[],version:"4.x",frontMatter:{},sidebar:"selfHosted",previous:{title:"Source code",permalink:"/docs/4.x/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/docs/4.x/category/cloud-provider-guides"}},d={},m=[{value:"Prepare",id:"prepare",level:2},{value:"Traefik",id:"traefik",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Traefik service",id:"traefik-service",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2",id:"caddy-2",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},h="wrapper";function v(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reverse-proxies"},"Reverse Proxies"),(0,a.kt)("p",null,"To facilitate the unified management and distribution of SSL certificates, service expansion and access to off-the-shelf gateway services,\nwe provides several configurations for configuring reverse proxy services to the gateway."),(0,a.kt)(o.Z,{alt:"Architecture",sources:{light:(0,l.Z)("/img/reverse-proxies-light.png"),dark:(0,l.Z)("/img/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"prepare"},"Prepare"),(0,a.kt)("p",null,"The following data needs to be prepared to configure the reverse proxy:"),(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},"Name"),(0,a.kt)("th",{parentName:"tr",align:null},"Sample value"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Domain"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Reverse proxy service IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP address"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed",(0,a.kt)("br",null),"Change to 127.0.0.1 Reverse Proxy and zealot with one host.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot public port"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"Reverse Proxy can be accessed")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot internal port"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"No need modify")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt Email address"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," is an open source reverse proxy and load balancing tool,\nwhich provides a variety of Providers can achieve access to the reverse proxy and configure the SSL."),(0,a.kt)("h3",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"Regardless of the type of Provider used the core configuration items are the same and constitute the reverse proxy service configuration consists of three main components: discovery port number,\nrouting rules (including access port number, domain name binding and SSL)"),(0,a.kt)("h3",{id:"traefik-service"},"Traefik service"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," then edit the Docker Compose file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # Comment port, no need to public\n # ports:\n # - "8901:80"\n network:\n # Change the network what traefik service is\n - traefik-services\n\nnetworks:\n # Change the network what traefik service is\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine,\ncross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options."),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," or ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),", add key-value below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"Enable ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," and make sure Nomad version >= 1.3:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2"},"Caddy 2"),(0,a.kt)("p",null,"The configuration only needs to relate the ip part after ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# Use Let's Encrypt service\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("p",null,"The following is the general configuration, if not effects welcome to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"file a issue"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # Optional: http2 may needs install extension\n listen [::]:443 ssl http2;\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # Optional\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"And you need update max body size in ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," block. Recommended is 200MB, if it's a game,\n50% more can be played to make a surplus according to the actual file size."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}v.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.48eff89e.js b/assets/js/main.48eff89e.js deleted file mode 100644 index 338e2e1d5..000000000 --- a/assets/js/main.48eff89e.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.48eff89e.js.LICENSE.txt */ -(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[179],{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),s=n(6887);const l={"002e3694":[()=>n.e(3335).then(n.bind(n,5112)),"@site/versioned_docs/version-4.x/user-guide/debug-files/upload.md",5112],"011dea14":[()=>n.e(2546).then(n.bind(n,8923)),"@site/versioned_docs/version-4.x/user-guide/webhooks/wecom.md",8923],"09ee1501":[()=>n.e(9578).then(n.bind(n,4701)),"@site/docs/self-hosted/deployment/requirements.md",4701],"0a799d0e":[()=>n.e(8823).then(n.bind(n,6130)),"@site/docs/user-guide/dashboard.md",6130],"0b1f21de":[()=>n.e(1988).then(n.bind(n,7090)),"@site/docs/user-guide/administrator/monitoring/logging.mdx",7090],"0da88c94":[()=>Promise.all([n.e(532),n.e(112)]).then(n.bind(n,2831)),"@site/docs/contributing-guide/local-development/devcontainer.md",2831],"0e2cdf96":[()=>n.e(648).then(n.bind(n,5770)),"@site/docs/developer-guide/fastlane/zealot_sync_devices.md",5770],"0e6c8da6":[()=>n.e(2256).then(n.bind(n,7369)),"@site/docs/self-hosted/deployment/fly.md",7369],"0efaccc0":[()=>n.e(7372).then(n.bind(n,3485)),"@site/versioned_docs/version-5.0.0/user-guide/toolkits/fetch-udid.mdx",3485],"10830de6":[()=>n.e(8995).then(n.bind(n,8572)),"@site/docs/user-guide/webhooks/slack.md",8572],"10daa3a4":[()=>n.e(58).then(n.bind(n,4382)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/fly.md",4382],"1129db35":[()=>n.e(4070).then(n.bind(n,6792)),"@site/docs/user-guide/administrator/monitoring/system-info.mdx",6792],"14094f46":[()=>n.e(8422).then(n.t.bind(n,9807,19)),"~docs/default/category-docs-4-x-userguide-category-monitoring-186.json",9807],"14a24e11":[()=>Promise.all([n.e(532),n.e(7400)]).then(n.bind(n,6824)),"@site/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",6824],"14b2f636":[()=>Promise.all([n.e(532),n.e(5672)]).then(n.bind(n,8717)),"@site/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",8717],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],"14fae669":[()=>n.e(2197).then(n.bind(n,990)),"@site/docs/user-guide/toolkits/teardown.mdx",990],17896441:[()=>Promise.all([n.e(532),n.e(6097),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"1948baf2":[()=>n.e(5208).then(n.bind(n,2357)),"@site/versioned_docs/version-5.0.0/user-guide/credits.md",2357],"1addd124":[()=>n.e(5979).then(n.t.bind(n,8943,19)),"~docs/default/category-docs-selfhosted-category-deployment-bab.json",8943],"1b734938":[()=>n.e(4684).then(n.bind(n,4952)),"@site/versioned_docs/version-4.x/user-guide/administrator/backup.md",4952],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1caa3b90":[()=>n.e(4029).then(n.t.bind(n,973,19)),"~docs/default/category-docs-selfhosted-category-configuration-a96.json",973],"1cb76857":[()=>n.e(8735).then(n.bind(n,9195)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/dingtalk.md",9195],"1e930e9c":[()=>n.e(5566).then(n.bind(n,8862)),"@site/docs/user-guide/apps/create.mdx",8862],"1efa993c":[()=>n.e(1010).then(n.t.bind(n,9848,19)),"~docs/default/category-docs-userguide-category-debug-files-a9a.json",9848],"1f391b9e":[()=>Promise.all([n.e(532),n.e(6097),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"2020b7aa":[()=>n.e(7143).then(n.bind(n,7091)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_sync_devices.md",7091],"20ab3326":[()=>n.e(5696).then(n.t.bind(n,1809,19)),"~docs/default/category-docsnext-userguide-category-apps-a41.json",1809],"20b08819":[()=>n.e(2387).then(n.bind(n,3964)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_version_check.md",3964],"21b281f9":[()=>n.e(3523).then(n.bind(n,7481)),"@site/versioned_docs/version-4.x/self-hosted/deployment/requirements.md",7481],"220930de":[()=>n.e(1461).then(n.bind(n,3524)),"@site/versioned_docs/version-4.x/self-hosted/storage.md",3524],"226ba89c":[()=>n.e(689).then(n.t.bind(n,5173,19)),"~docs/default/category-docsnext-selfhosted-category-configuration-d39.json",5173],"247783bb":[()=>n.e(9334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"25301e6f":[()=>n.e(8843).then(n.bind(n,7781)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/logging.md",7781],"2593a83b":[()=>n.e(4643).then(n.bind(n,5009)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/third-party-authentication.md",5009],27385049:[()=>n.e(4910).then(n.bind(n,4445)),"@site/docs/user-guide/administrator/apple-team.mdx",4445],"286cd782":[()=>n.e(6782).then(n.bind(n,4256)),"@site/versioned_docs/version-5.0.0/user-guide/apps/create.mdx",4256],"2b8fdfa9":[()=>n.e(5281).then(n.bind(n,5728)),"@site/versioned_docs/version-4.x/self-hosted/deployment/docker.md",5728],"2c0f0ab1":[()=>Promise.all([n.e(532),n.e(1440)]).then(n.bind(n,8958)),"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",8958],"2dc3018f":[()=>n.e(9852).then(n.bind(n,4830)),"@site/versioned_docs/version-4.x/user-guide/webhooks/discord.md",4830],"30a84665":[()=>n.e(957).then(n.bind(n,8738)),"@site/versioned_docs/version-4.x/self-hosted/deployment/fly.md",8738],"31dae65f":[()=>n.e(4750).then(n.bind(n,9967)),"@site/versioned_docs/version-4.x/developer-guide/index.md",9967],"35a60b9c":[()=>n.e(8138).then(n.bind(n,4668)),"@site/versioned_docs/version-4.x/user-guide/apps/create.md",4668],"35a98222":[()=>n.e(8719).then(n.bind(n,6816)),"@site/versioned_docs/version-4.x/self-hosted/deployment/source-code.md",6816],"367ed454":[()=>n.e(5862).then(n.t.bind(n,2801,19)),"~docs/default/category-docsnext-contributingguide-category-local-development-1dc.json",2801],"36bff928":[()=>n.e(4203).then(n.bind(n,1565)),"@site/versioned_docs/version-5.0.0/self-hosted/storage.md",1565],"37ca8f58":[()=>n.e(8336).then(n.bind(n,9470)),"@site/docs/self-hosted/deployment/source-code.md",9470],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],39534802:[()=>n.e(9512).then(n.t.bind(n,7649,19)),"~docs/default/category-docs-4-x-selfhosted-category-configuration-1a5.json",7649],"39b02d66":[()=>n.e(2923).then(n.bind(n,4950)),"@site/docs/user-guide/administrator/settings.mdx",4950],"3dd373c6":[()=>n.e(8253).then(n.t.bind(n,6423,19)),"~docs/default/category-docs-4-x-userguide-category-debug-files-74f.json",6423],"3ee87be9":[()=>n.e(9120).then(n.bind(n,9953)),"@site/versioned_docs/version-4.x/user-guide/qa.md",9953],"41f50648":[()=>n.e(2813).then(n.bind(n,9366)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/docker.md",9366],"433a7c95":[()=>n.e(315).then(n.bind(n,2806)),"@site/docs/user-guide/apps/detail.mdx",2806],"437849bc":[()=>n.e(8846).then(n.t.bind(n,5120,19)),"~docs/default/category-docs-selfhosted-category-cloud-provider-guides-fb8.json",5120],"43ef865f":[()=>Promise.all([n.e(532),n.e(2855)]).then(n.bind(n,7067)),"@site/docs/developer-guide/sdk/android.md",7067],"45256cfe":[()=>Promise.all([n.e(532),n.e(3803)]).then(n.bind(n,7413)),"@site/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",7413],"454f6929":[()=>n.e(266).then(n.bind(n,7293)),"@site/docs/user-guide/apps/index.mdx",7293],"45923ef2":[()=>n.e(1570).then(n.bind(n,834)),"@site/docs/user-guide/webhooks.md",834],"45ab56fc":[()=>n.e(6219).then(n.bind(n,6575)),"@site/docs/developer-guide/api.md",6575],"475cf40c":[()=>n.e(9873).then(n.bind(n,4284)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/database-analytics.mdx",4284],"477073af":[()=>Promise.all([n.e(532),n.e(3385)]).then(n.bind(n,6292)),"@site/docs/self-hosted/reverse-proxies.mdx",6292],"48295ea8":[()=>Promise.all([n.e(532),n.e(614)]).then(n.bind(n,6293)),"@site/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",6293],"49206f6f":[()=>n.e(3855).then(n.bind(n,5700)),"@site/versioned_docs/version-5.0.0/contributing-guide/index.md",5700],49510311:[()=>n.e(9455).then(n.bind(n,3323)),"@site/versioned_docs/version-5.0.0/user-guide/toolkits/teardown.mdx",3323],"4b3973b8":[()=>n.e(6926).then(n.bind(n,9945)),"@site/docs/user-guide/webhooks/feishu.md",9945],"4bf92ea9":[()=>Promise.all([n.e(532),n.e(2957)]).then(n.bind(n,282)),"@site/docs/contributing-guide/local-development/source-code.md",282],"4c432e95":[()=>n.e(1175).then(n.bind(n,5359)),"@site/versioned_docs/version-4.x/user-guide/dashboard.md",5359],"4cad2fe6":[()=>n.e(5729).then(n.bind(n,6282)),"@site/versioned_docs/version-4.x/user-guide/credits.md",6282],"4d44c677":[()=>n.e(564).then(n.bind(n,4862)),"@site/versioned_docs/version-4.x/user-guide/changelog.md",4862],51763432:[()=>n.e(3099).then(n.t.bind(n,1368,19)),"~docs/default/category-docs-4-x-selfhosted-category-cloud-provider-guides-f1d.json",1368],"5191259b":[()=>n.e(2018).then(n.t.bind(n,4025,19)),"~docs/default/category-docs-userguide-category-monitoring-cf9.json",4025],"52d3380a":[()=>n.e(1261).then(n.bind(n,5134)),"@site/versioned_docs/version-4.x/user-guide/toolkits/fetch-udid.mdx",5134],"52f780b0":[()=>n.e(1489).then(n.bind(n,9693)),"@site/versioned_docs/version-4.x/self-hosted/deployment/docker/step-by-step.md",9693],"55db4623":[()=>n.e(7133).then(n.bind(n,1931)),"@site/versioned_docs/version-4.x/self-hosted/configuration/environment-variables.md",1931],"566ccdfa":[()=>n.e(2710).then(n.bind(n,1986)),"@site/docs/self-hosted/configuration/third-party-authentication.md",1986],"568a2802":[()=>n.e(1521).then(n.bind(n,361)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/feishu.md",361],"56af2409":[()=>n.e(3130).then(n.bind(n,816)),"@site/docs/self-hosted/configuration/schedule-jobs.md",816],"56f1fb64":[()=>n.e(9218).then(n.bind(n,4518)),"@site/versioned_docs/version-5.0.0/user-guide/dashboard.md",4518],58234510:[()=>n.e(7313).then(n.bind(n,2614)),"@site/docs/user-guide/administrator/permissions.md",2614],"58e8de69":[()=>n.e(6212).then(n.bind(n,1215)),"@site/versioned_docs/version-5.0.0/user-guide/apps/detail.mdx",1215],"5a3653dd":[()=>n.e(6832).then(n.t.bind(n,3939,19)),"~docs/default/category-docs-userguide-category-apps-877.json",3939],"5a522f46":[()=>n.e(8738).then(n.bind(n,4890)),"@site/versioned_docs/version-4.x/self-hosted/deployment/architecture.mdx",4890],"5c74b3a7":[()=>n.e(3670).then(n.bind(n,5386)),"@site/docs/user-guide/toolkits/fetch-udid.mdx",5386],"5da52b15":[()=>n.e(2918).then(n.bind(n,3211)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/background-jobs.md",3211],"5df973a0":[()=>n.e(8763).then(n.bind(n,4809)),"@site/docs/self-hosted/storage.md",4809],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ec84ac2":[()=>n.e(9516).then(n.bind(n,2482)),"@site/versioned_docs/version-4.x/user-guide/administrator/apple-team.mdx",2482],"5f153871":[()=>n.e(7069).then(n.bind(n,2171)),"@site/docs/self-hosted/index.md",2171],"5f8b303a":[()=>n.e(6868).then(n.bind(n,5219)),"@site/versioned_docs/version-4.x/user-guide/index.mdx",5219],"600ac4e1":[()=>n.e(6215).then(n.bind(n,3414)),"@site/docs/contributing-guide/index.md",3414],"60fb9086":[()=>n.e(1257).then(n.bind(n,8611)),"@site/docs/user-guide/debug-files/upload.mdx",8611],"61175dc6":[()=>n.e(7525).then(n.bind(n,6437)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/review.mdx",6437],"616acc84":[()=>n.e(9940).then(n.bind(n,3721)),"@site/versioned_docs/version-4.x/developer-guide/api/apps.md",3721],"6573317f":[()=>n.e(3307).then(n.bind(n,4204)),"@site/docs/user-guide/debug-files/index.mdx",4204],"674c5fcf":[()=>n.e(5920).then(n.bind(n,5808)),"@site/versioned_docs/version-5.0.0/user-guide/best_practices.md",5808],"6768319c":[()=>n.e(6159).then(n.bind(n,7629)),"@site/versioned_docs/version-5.0.0/developer-guide/api.md",7629],"687041db":[()=>n.e(336).then(n.bind(n,2881)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane.md",2881],"699a8fef":[()=>n.e(3954).then(n.bind(n,8118)),"@site/versioned_docs/version-4.x/user-guide/administrator/permissions.md",8118],"69bb3584":[()=>n.e(4234).then(n.bind(n,5049)),"@site/versioned_docs/version-4.x/self-hosted/configuration/third-party-authentication.md",5049],"6a4aefb0":[()=>n.e(9346).then(n.t.bind(n,9777,19)),"~docs/default/category-docs-4-x-userguide-category-apps-0b2.json",9777],"6c0d6c9a":[()=>n.e(5148).then(n.bind(n,7252)),"@site/versioned_docs/version-4.x/developer-guide/api.md",7252],"6cdd9503":[()=>n.e(5111).then(n.t.bind(n,4047,19)),"~docs/default/category-docs-4-x-userguide-category-toolkits-f2e.json",4047],"708d50e3":[()=>n.e(5272).then(n.bind(n,5715)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/discord.md",5715],"71b71564":[()=>n.e(6186).then(n.bind(n,7962)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/render.md",7962],"72b5199f":[()=>n.e(6567).then(n.bind(n,7440)),"@site/versioned_docs/version-4.x/contributing-guide/index.md",7440],"7386cd72":[()=>n.e(5902).then(n.t.bind(n,8141,19)),"~docs/default/category-docs-contributingguide-category-local-development-477.json",8141],"7737c9f3":[()=>n.e(96).then(n.bind(n,2766)),"@site/docs/user-guide/index.mdx",2766],77590075:[()=>n.e(4765).then(n.bind(n,2851)),"@site/versioned_docs/version-5.0.0/developer-guide/index.md",2851],"784c299a":[()=>n.e(5351).then(n.bind(n,8903)),"@site/docs/self-hosted/deployment/render.md",8903],"78cdd3ae":[()=>n.e(7965).then(n.t.bind(n,2427,19)),"~docs/default/category-docsnext-userguide-category-administrator-31b.json",2427],"799ffaed":[()=>n.e(8493).then(n.bind(n,4113)),"@site/versioned_docs/version-4.x/self-hosted/deployment/kubernetes.md",4113],"79fb26a6":[()=>n.e(6716).then(n.bind(n,3162)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/logging.mdx",3162],"7ab8d5f3":[()=>n.e(4769).then(n.bind(n,7346)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/environment-variables.md",7346],"7d49456b":[()=>n.e(5945).then(n.bind(n,216)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/permissions.md",216],"7e370ea7":[()=>n.e(7595).then(n.t.bind(n,1638,19)),"~docs/default/category-docs-developerguide-category-sdks-4f3.json",1638],84706228:[()=>Promise.all([n.e(532),n.e(4943)]).then(n.bind(n,7886)),"@site/versioned_docs/version-4.x/developer-guide/sdk/ios.md",7886],"848dab9f":[()=>n.e(2647).then(n.bind(n,9933)),"@site/docs/developer-guide/index.md",9933],"84e62756":[()=>n.e(826).then(n.bind(n,3686)),"@site/docs/self-hosted/deployment/docker.md",3686],"889fb5f5":[()=>n.e(7321).then(n.bind(n,5170)),"@site/versioned_docs/version-4.x/self-hosted/configuration/schedule-jobs.md",5170],"88e80bd0":[()=>n.e(6665).then(n.bind(n,8248)),"@site/docs/user-guide/administrator/monitoring/background-jobs.mdx",8248],"88f9ce8f":[()=>n.e(387).then(n.bind(n,5143)),"@site/docs/user-guide/webhooks/wecom.md",5143],"897621f7":[()=>n.e(4974).then(n.bind(n,933)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/kubernetes.md",933],"8992496f":[()=>n.e(8772).then(n.bind(n,8830)),"@site/versioned_docs/version-4.x/user-guide/best_practices.md",8830],"8aa13b20":[()=>n.e(6197).then(n.bind(n,8691)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/system-info.md",8691],"8ac0e0b2":[()=>n.e(469).then(n.bind(n,343)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/source-code.md",343],"8bf7b385":[()=>n.e(4067).then(n.t.bind(n,1949,19)),"~docs/default/category-docsnext-userguide-category-debug-files-13b.json",1949],"8cddcc36":[()=>n.e(1653).then(n.bind(n,3432)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/index.mdx",3432],"8f9c93ae":[()=>Promise.all([n.e(532),n.e(4885)]).then(n.bind(n,277)),"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",277],"90050cbc":[()=>n.e(7236).then(n.bind(n,7173)),"@site/versioned_docs/version-5.0.0/user-guide/apps/upload.mdx",7173],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93688e09":[()=>n.e(3820).then(n.bind(n,482)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/docker/step-by-step.md",482],"99e3e97f":[()=>n.e(7157).then(n.bind(n,9733)),"@site/docs/user-guide/best_practices.md",9733],"9c3aeab1":[()=>n.e(2011).then(n.t.bind(n,5734,19)),"~docs/default/category-docs-4-x-userguide-category-administrator-4f8.json",5734],"9d2c8d89":[()=>n.e(2820).then(n.bind(n,2874)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/architecture.mdx",2874],"9da9701d":[()=>n.e(5783).then(n.bind(n,4438)),"@site/docs/user-guide/administrator/backup.mdx",4438],"9e3eaffa":[()=>n.e(5728).then(n.bind(n,444)),"@site/versioned_docs/version-4.x/user-guide/webhooks/dingtalk.md",444],a087da7b:[()=>n.e(7042).then(n.bind(n,7453)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/schedule-jobs.md",7453],a1f04802:[()=>n.e(411).then(n.bind(n,4973)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot.md",4973],a7227298:[()=>n.e(3844).then(n.bind(n,2114)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/slack.md",2114],a7434565:[()=>n.e(7645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a8003ee7:[()=>n.e(2530).then(n.bind(n,5618)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/apple-team.mdx",5618],a86b8a96:[()=>n.e(572).then(n.bind(n,9339)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/upload.mdx",9339],a949db22:[()=>n.e(483).then(n.bind(n,8064)),"@site/versioned_docs/version-4.x/user-guide/administrator/project-settings.md",8064],aaab4dd5:[()=>n.e(9656).then(n.bind(n,7825)),"@site/docs/developer-guide/api/debug_files.md",7825],aaf543f1:[()=>n.e(2143).then(n.bind(n,3789)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/railway.md",3789],aaf82ead:[()=>n.e(884).then(n.bind(n,5807)),"@site/docs/user-guide/debug-files/review.mdx",5807],ab71d4e1:[()=>n.e(9710).then(n.t.bind(n,4191,19)),"~docs/default/category-docsnext-selfhosted-category-deployment-fed.json",4191],aceb8a36:[()=>n.e(81).then(n.t.bind(n,1956,19)),"~docs/default/category-docs-userguide-category-toolkits-2ac.json",1956],ad4ca79f:[()=>n.e(2966).then(n.bind(n,5022)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_sync_devices.md",5022],adf2c0d2:[()=>n.e(4596).then(n.bind(n,9726)),"@site/docs/developer-guide/fastlane.md",9726],aecd11f5:[()=>Promise.all([n.e(532),n.e(4429)]).then(n.bind(n,5736)),"@site/versioned_docs/version-4.x/developer-guide/sdk/android.md",5736],aef75111:[()=>n.e(3084).then(n.bind(n,3245)),"@site/versioned_docs/version-5.0.0/user-guide/index.mdx",3245],b272fba4:[()=>n.e(5803).then(n.bind(n,6974)),"@site/versioned_docs/version-4.x/self-hosted/deployment/railway.md",6974],b4e44ac6:[()=>n.e(9184).then(n.bind(n,853)),"@site/docs/self-hosted/deployment/kubernetes.md",853],b56911e0:[()=>n.e(2621).then(n.bind(n,5463)),"@site/versioned_docs/version-5.0.0/developer-guide/api/debug_files.md",5463],b5e1e414:[()=>n.e(9100).then(n.bind(n,3533)),"@site/versioned_docs/version-4.x/user-guide/webhooks/slack.md",3533],b7ca75af:[()=>n.e(6295).then(n.bind(n,6384)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_debug_file.md",6384],b8b76bfb:[()=>n.e(8901).then(n.bind(n,1733)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/nomad.md",1733],b9de103e:[()=>n.e(3171).then(n.t.bind(n,5295,19)),"~docs/default/category-docs-4-x-selfhosted-category-deployment-eef.json",5295],bbec0ea8:[()=>n.e(4011).then(n.bind(n,5217)),"@site/versioned_docs/version-4.x/user-guide/toolkits/teardown.md",5217],bc9a5c2d:[()=>n.e(8958).then(n.bind(n,7988)),"@site/docs/developer-guide/fastlane/zealot_version_check.md",7988],bc9d66cc:[()=>n.e(2438).then(n.bind(n,8858)),"@site/versioned_docs/version-5.0.0/self-hosted/index.md",8858],bdc68495:[()=>n.e(3618).then(n.t.bind(n,4040,19)),"~docs/default/category-docs-userguide-category-administrator-395.json",4040],bdd7b463:[()=>n.e(5309).then(n.t.bind(n,9898,19)),"~docs/default/category-docsnext-userguide-category-monitoring-339.json",9898],bf0a73a8:[()=>n.e(2209).then(n.bind(n,5872)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/backup.mdx",5872],bf6ff0a4:[()=>n.e(1120).then(n.bind(n,2516)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/database-analytics.md",2516],c01945e0:[()=>n.e(5705).then(n.bind(n,6210)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot.md",6210],c02123b5:[()=>Promise.all([n.e(532),n.e(3877)]).then(n.bind(n,4881)),"@site/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",4881],c0aa555d:[()=>n.e(4985).then(n.bind(n,713)),"@site/versioned_docs/version-4.x/user-guide/webhooks/feishu.md",713],c3e055b8:[()=>n.e(7681).then(n.bind(n,7332)),"@site/versioned_docs/version-5.0.0/developer-guide/api/apps.md",7332],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c53e755e:[()=>n.e(7322).then(n.bind(n,69)),"@site/docs/user-guide/changelog.md",69],c5b0ab6a:[()=>Promise.all([n.e(532),n.e(9396)]).then(n.bind(n,2428)),"@site/docs/developer-guide/sdk/ios.md",2428],c8054fdf:[()=>n.e(443).then(n.t.bind(n,7120,19)),"~docs/default/category-docsnext-userguide-category-toolkits-eb7.json",7120],c94f5806:[()=>n.e(1394).then(n.bind(n,4957)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/settings.mdx",4957],c9b278a8:[()=>n.e(9181).then(n.t.bind(n,5e3,19)),"~docs/default/version-5-0-0-metadata-prop-0b8.json",5e3],c9fa300e:[()=>n.e(7466).then(n.bind(n,8594)),"@site/versioned_docs/version-4.x/developer-guide/fastlane.md",8594],cae0f04b:[()=>n.e(5709).then(n.t.bind(n,4166,19)),"~docs/default/version-4-x-metadata-prop-21f.json",4166],cd085125:[()=>n.e(1649).then(n.bind(n,1337)),"@site/docs/user-guide/administrator/monitoring/database-analytics.mdx",1337],cd4eb1ed:[()=>n.e(5260).then(n.t.bind(n,5812,19)),"~docs/default/category-docs-4-x-contributingguide-category-local-development-9ee.json",5812],d02aa106:[()=>n.e(4590).then(n.bind(n,9186)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/project-settings.md",9186],d1dd54d0:[()=>n.e(1591).then(n.bind(n,2479)),"@site/docs/developer-guide/fastlane/zealot_debug_file.md",2479],d4be948d:[()=>n.e(5610).then(n.bind(n,2502)),"@site/docs/self-hosted/deployment/architecture.mdx",2502],d59c50f6:[()=>n.e(4587).then(n.t.bind(n,3534,19)),"~docs/default/category-docsnext-selfhosted-category-cloud-provider-guides-cdc.json",3534],da03b20b:[()=>n.e(4771).then(n.bind(n,1211)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/background-jobs.mdx",1211],db37eded:[()=>n.e(7702).then(n.bind(n,1774)),"@site/versioned_docs/version-5.0.0/user-guide/qa.md",1774],dd05d4e3:[()=>n.e(4604).then(n.bind(n,7148)),"@site/docs/self-hosted/deployment/nomad.md",7148],ddf401e0:[()=>n.e(6984).then(n.bind(n,9021)),"@site/versioned_docs/version-4.x/self-hosted/deployment/render.md",9021],e40683f4:[()=>n.e(9014).then(n.bind(n,5610)),"@site/versioned_docs/version-4.x/user-guide/webhooks.md",5610],e532b6bb:[()=>n.e(5545).then(n.bind(n,5262)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/system-info.mdx",5262],e6546d07:[()=>n.e(9611).then(n.bind(n,7499)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/requirements.md",7499],e7a8c7f9:[()=>n.e(777).then(n.bind(n,6719)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_version_check.md",6719],e92f4833:[()=>n.e(4159).then(n.bind(n,5760)),"@site/docs/user-guide/qa.md",5760],ea003b3f:[()=>n.e(7787).then(n.bind(n,8730)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_debug_file.md",8730],eb2d718d:[()=>n.e(475).then(n.bind(n,3617)),"@site/docs/user-guide/credits.md",3617],ede4b0bb:[()=>n.e(7070).then(n.bind(n,9841)),"@site/docs/developer-guide/fastlane/zealot.md",9841],ef294a35:[()=>n.e(1643).then(n.t.bind(n,4995,19)),"~docs/default/category-docsnext-developerguide-category-sdks-aef.json",4995],ef513ce2:[()=>n.e(4802).then(n.bind(n,5864)),"@site/versioned_docs/version-4.x/self-hosted/deployment/nomad.md",5864],f02d2d32:[()=>n.e(7276).then(n.bind(n,4858)),"@site/docs/developer-guide/api/apps.md",4858],f0954aa2:[()=>n.e(7779).then(n.bind(n,3092)),"@site/versioned_docs/version-5.0.0/user-guide/changelog.md",3092],f3108074:[()=>n.e(6118).then(n.bind(n,3173)),"@site/docs/user-guide/webhooks/dingtalk.md",3173],f6a4c755:[()=>n.e(6787).then(n.bind(n,3990)),"@site/versioned_docs/version-5.0.0/user-guide/apps/index.mdx",3990],f8a75f5e:[()=>Promise.all([n.e(532),n.e(5787)]).then(n.bind(n,6536)),"@site/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",6536],f8e38d3d:[()=>n.e(2107).then(n.bind(n,2511)),"@site/docs/self-hosted/deployment/railway.md",2511],f906dd81:[()=>n.e(9154).then(n.bind(n,2918)),"@site/docs/user-guide/apps/upload.mdx",2918],f90fa3e0:[()=>n.e(3630).then(n.bind(n,5733)),"@site/docs/self-hosted/configuration/environment-variables.md",5733],f944a33e:[()=>n.e(5218).then(n.bind(n,3936)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/wecom.md",3936],f9b37612:[()=>n.e(1627).then(n.bind(n,4269)),"@site/versioned_docs/version-4.x/developer-guide/api/debug_files.md",4269],fa199c0f:[()=>n.e(8575).then(n.bind(n,3966)),"@site/docs/self-hosted/deployment/docker/step-by-step.md",3966],fb7a7e13:[()=>n.e(9019).then(n.bind(n,8716)),"@site/versioned_docs/version-4.x/self-hosted/index.md",8716],fe140d6b:[()=>n.e(9966).then(n.bind(n,4092)),"@site/docs/user-guide/webhooks/discord.md",4092],fe4d1fcf:[()=>n.e(260).then(n.bind(n,4504)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks.md",4504],fe6331dc:[()=>n.e(2242).then(n.t.bind(n,5978,19)),"~docs/default/category-docs-4-x-developerguide-category-sdks-75e.json",5978]};function d(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 c=n(9670),u=n(226);function p(e,t){if("*"===e)return i()({loading:d,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(u.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const a=s[`${e}-${t}`],p={},f=[],g=[],m=(0,c.Z)(a);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),g.push(r[2]))})),i().Map({loading:d,loader:p,modules:f,webpack:()=>g,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 s=n.split(".");s.slice(0,-1).forEach((e=>{a=a[e]})),a[s[s.length-1]]=o}));const s=i.__comp;delete i.__comp;const l=i.__context;return delete i.__context,r.createElement(u.z,{value:l},r.createElement(s,(0,o.Z)({},i,n)))}})}const f=[{path:"/markdown-page",component:p("/markdown-page","9d5"),exact:!0},{path:"/docs/4.x",component:p("/docs/4.x","c9e"),routes:[{path:"/docs/4.x/category/administrator",component:p("/docs/4.x/category/administrator","103"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/apps",component:p("/docs/4.x/category/apps","04a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/cloud-provider-guides",component:p("/docs/4.x/category/cloud-provider-guides","f84"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/configuration",component:p("/docs/4.x/category/configuration","bbc"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/debug-files",component:p("/docs/4.x/category/debug-files","dd6"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/deployment",component:p("/docs/4.x/category/deployment","469"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/local-development",component:p("/docs/4.x/category/local-development","600"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/category/monitoring",component:p("/docs/4.x/category/monitoring","0aa"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/sdks",component:p("/docs/4.x/category/sdks","f90"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/category/toolkits",component:p("/docs/4.x/category/toolkits","eeb"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/contributing-guide/",component:p("/docs/4.x/contributing-guide/","595"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/contributing-guide/local-development/devcontainer",component:p("/docs/4.x/contributing-guide/local-development/devcontainer","8a7"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/contributing-guide/local-development/source-code",component:p("/docs/4.x/contributing-guide/local-development/source-code","9c2"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/developer-guide/",component:p("/docs/4.x/developer-guide/","ce0"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api",component:p("/docs/4.x/developer-guide/api","074"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api/apps",component:p("/docs/4.x/developer-guide/api/apps","213"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api/debug_files",component:p("/docs/4.x/developer-guide/api/debug_files","632"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane",component:p("/docs/4.x/developer-guide/fastlane","9ff"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot",component:p("/docs/4.x/developer-guide/fastlane/zealot","191"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_debug_file",component:p("/docs/4.x/developer-guide/fastlane/zealot_debug_file","187"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_sync_devices",component:p("/docs/4.x/developer-guide/fastlane/zealot_sync_devices","609"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_version_check",component:p("/docs/4.x/developer-guide/fastlane/zealot_version_check","8f5"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/sdk/android",component:p("/docs/4.x/developer-guide/sdk/android","dd8"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/sdk/ios",component:p("/docs/4.x/developer-guide/sdk/ios","d34"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/self-hosted/",component:p("/docs/4.x/self-hosted/","472"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/environment-variables",component:p("/docs/4.x/self-hosted/configuration/environment-variables","78e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/schedule-jobs",component:p("/docs/4.x/self-hosted/configuration/schedule-jobs","db7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/third-party-authentication",component:p("/docs/4.x/self-hosted/configuration/third-party-authentication","8f0"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/architecture",component:p("/docs/4.x/self-hosted/deployment/architecture","575"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/docker",component:p("/docs/4.x/self-hosted/deployment/docker","a96"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/docker/step-by-step",component:p("/docs/4.x/self-hosted/deployment/docker/step-by-step","f5a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/fly",component:p("/docs/4.x/self-hosted/deployment/fly","777"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/kubernetes",component:p("/docs/4.x/self-hosted/deployment/kubernetes","80b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/nomad",component:p("/docs/4.x/self-hosted/deployment/nomad","4be"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/railway",component:p("/docs/4.x/self-hosted/deployment/railway","6d9"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/render",component:p("/docs/4.x/self-hosted/deployment/render","23a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/requirements",component:p("/docs/4.x/self-hosted/deployment/requirements","9ee"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/source-code",component:p("/docs/4.x/self-hosted/deployment/source-code","2e3"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/reverse-proxies",component:p("/docs/4.x/self-hosted/reverse-proxies","c94"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/storage",component:p("/docs/4.x/self-hosted/storage","d32"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/user-guide/",component:p("/docs/4.x/user-guide/","814"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/apple-team",component:p("/docs/4.x/user-guide/administrator/apple-team","a72"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/backup",component:p("/docs/4.x/user-guide/administrator/backup","846"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/background-jobs",component:p("/docs/4.x/user-guide/administrator/monitoring/background-jobs","7ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/database-analytics",component:p("/docs/4.x/user-guide/administrator/monitoring/database-analytics","671"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/logging",component:p("/docs/4.x/user-guide/administrator/monitoring/logging","578"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/system-info",component:p("/docs/4.x/user-guide/administrator/monitoring/system-info","b65"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/permissions",component:p("/docs/4.x/user-guide/administrator/permissions","adb"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/project-settings",component:p("/docs/4.x/user-guide/administrator/project-settings","3b3"),exact:!0},{path:"/docs/4.x/user-guide/apps/create",component:p("/docs/4.x/user-guide/apps/create","af8"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/best_practices",component:p("/docs/4.x/user-guide/best_practices","fd7"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/changelog",component:p("/docs/4.x/user-guide/changelog","88f"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/credits",component:p("/docs/4.x/user-guide/credits","2b3"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/dashboard",component:p("/docs/4.x/user-guide/dashboard","70e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/debug-files/upload",component:p("/docs/4.x/user-guide/debug-files/upload","03e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/qa",component:p("/docs/4.x/user-guide/qa","67e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/toolkits/fetch-udid",component:p("/docs/4.x/user-guide/toolkits/fetch-udid","b2a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/toolkits/teardown",component:p("/docs/4.x/user-guide/toolkits/teardown","8c8"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks",component:p("/docs/4.x/user-guide/webhooks","322"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/dingtalk",component:p("/docs/4.x/user-guide/webhooks/dingtalk","54a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/discord",component:p("/docs/4.x/user-guide/webhooks/discord","e9c"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/feishu",component:p("/docs/4.x/user-guide/webhooks/feishu","670"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/slack",component:p("/docs/4.x/user-guide/webhooks/slack","815"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/wecom",component:p("/docs/4.x/user-guide/webhooks/wecom","8ae"),exact:!0,sidebar:"userGuide"}]},{path:"/docs/next",component:p("/docs/next","1c1"),routes:[{path:"/docs/next/category/administrator",component:p("/docs/next/category/administrator","380"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/apps",component:p("/docs/next/category/apps","102"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/cloud-provider-guides",component:p("/docs/next/category/cloud-provider-guides","df8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/configuration",component:p("/docs/next/category/configuration","1f8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/debug-files",component:p("/docs/next/category/debug-files","bf7"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/deployment",component:p("/docs/next/category/deployment","de4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/local-development",component:p("/docs/next/category/local-development","b0d"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/category/monitoring",component:p("/docs/next/category/monitoring","f5c"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/sdks",component:p("/docs/next/category/sdks","34d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/category/toolkits",component:p("/docs/next/category/toolkits","00e"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/contributing-guide/",component:p("/docs/next/contributing-guide/","414"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/contributing-guide/local-development/devcontainer",component:p("/docs/next/contributing-guide/local-development/devcontainer","499"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/contributing-guide/local-development/source-code",component:p("/docs/next/contributing-guide/local-development/source-code","475"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/developer-guide/",component:p("/docs/next/developer-guide/","796"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api",component:p("/docs/next/developer-guide/api","2d3"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api/apps",component:p("/docs/next/developer-guide/api/apps","ac7"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api/debug_files",component:p("/docs/next/developer-guide/api/debug_files","aa9"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane",component:p("/docs/next/developer-guide/fastlane","50f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot",component:p("/docs/next/developer-guide/fastlane/zealot","ce6"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_debug_file",component:p("/docs/next/developer-guide/fastlane/zealot_debug_file","79f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_sync_devices",component:p("/docs/next/developer-guide/fastlane/zealot_sync_devices","bde"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_version_check",component:p("/docs/next/developer-guide/fastlane/zealot_version_check","95a"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/sdk/android",component:p("/docs/next/developer-guide/sdk/android","815"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/sdk/ios",component:p("/docs/next/developer-guide/sdk/ios","1eb"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/self-hosted/",component:p("/docs/next/self-hosted/","4a8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/environment-variables",component:p("/docs/next/self-hosted/configuration/environment-variables","d1d"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/schedule-jobs",component:p("/docs/next/self-hosted/configuration/schedule-jobs","396"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/third-party-authentication",component:p("/docs/next/self-hosted/configuration/third-party-authentication","4ed"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/architecture",component:p("/docs/next/self-hosted/deployment/architecture","820"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/docker",component:p("/docs/next/self-hosted/deployment/docker","bab"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/docker/step-by-step",component:p("/docs/next/self-hosted/deployment/docker/step-by-step","b7c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/fly",component:p("/docs/next/self-hosted/deployment/fly","35b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/kubernetes",component:p("/docs/next/self-hosted/deployment/kubernetes","db7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/nomad",component:p("/docs/next/self-hosted/deployment/nomad","022"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/railway",component:p("/docs/next/self-hosted/deployment/railway","042"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/render",component:p("/docs/next/self-hosted/deployment/render","a27"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/requirements",component:p("/docs/next/self-hosted/deployment/requirements","274"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/source-code",component:p("/docs/next/self-hosted/deployment/source-code","d47"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/reverse-proxies",component:p("/docs/next/self-hosted/reverse-proxies","f22"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/storage",component:p("/docs/next/self-hosted/storage","e44"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/user-guide/",component:p("/docs/next/user-guide/","3eb"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/apple-team",component:p("/docs/next/user-guide/administrator/apple-team","71d"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/backup",component:p("/docs/next/user-guide/administrator/backup","1c6"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/background-jobs",component:p("/docs/next/user-guide/administrator/monitoring/background-jobs","24f"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/database-analytics",component:p("/docs/next/user-guide/administrator/monitoring/database-analytics","708"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/logging",component:p("/docs/next/user-guide/administrator/monitoring/logging","621"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/system-info",component:p("/docs/next/user-guide/administrator/monitoring/system-info","68b"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/permissions",component:p("/docs/next/user-guide/administrator/permissions","347"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/settings",component:p("/docs/next/user-guide/administrator/settings","75a"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/",component:p("/docs/next/user-guide/apps/","0f2"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/create",component:p("/docs/next/user-guide/apps/create","679"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/detail",component:p("/docs/next/user-guide/apps/detail","a89"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/upload",component:p("/docs/next/user-guide/apps/upload","e60"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/best_practices",component:p("/docs/next/user-guide/best_practices","5ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/changelog",component:p("/docs/next/user-guide/changelog","b74"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/credits",component:p("/docs/next/user-guide/credits","535"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/dashboard",component:p("/docs/next/user-guide/dashboard","a36"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/",component:p("/docs/next/user-guide/debug-files/","727"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/review",component:p("/docs/next/user-guide/debug-files/review","e27"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/upload",component:p("/docs/next/user-guide/debug-files/upload","f76"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/qa",component:p("/docs/next/user-guide/qa","fd5"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/toolkits/fetch-udid",component:p("/docs/next/user-guide/toolkits/fetch-udid","cf3"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/toolkits/teardown",component:p("/docs/next/user-guide/toolkits/teardown","98d"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks",component:p("/docs/next/user-guide/webhooks","795"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/dingtalk",component:p("/docs/next/user-guide/webhooks/dingtalk","b50"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/discord",component:p("/docs/next/user-guide/webhooks/discord","e4a"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/feishu",component:p("/docs/next/user-guide/webhooks/feishu","066"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/slack",component:p("/docs/next/user-guide/webhooks/slack","484"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/wecom",component:p("/docs/next/user-guide/webhooks/wecom","241"),exact:!0,sidebar:"userGuide"}]},{path:"/docs",component:p("/docs","b73"),routes:[{path:"/docs/category/administrator",component:p("/docs/category/administrator","614"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/apps",component:p("/docs/category/apps","e5b"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/cloud-provider-guides",component:p("/docs/category/cloud-provider-guides","15e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/configuration",component:p("/docs/category/configuration","28b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/debug-files",component:p("/docs/category/debug-files","a8f"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/deployment",component:p("/docs/category/deployment","cf3"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/local-development",component:p("/docs/category/local-development","411"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/category/monitoring",component:p("/docs/category/monitoring","1ad"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/sdks",component:p("/docs/category/sdks","28f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/category/toolkits",component:p("/docs/category/toolkits","f3f"),exact:!0,sidebar:"userGuide"},{path:"/docs/contributing-guide/",component:p("/docs/contributing-guide/","1c7"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/contributing-guide/local-development/devcontainer",component:p("/docs/contributing-guide/local-development/devcontainer","6bc"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/contributing-guide/local-development/source-code",component:p("/docs/contributing-guide/local-development/source-code","20c"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/developer-guide/",component:p("/docs/developer-guide/","efd"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api",component:p("/docs/developer-guide/api","479"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api/apps",component:p("/docs/developer-guide/api/apps","b42"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api/debug_files",component:p("/docs/developer-guide/api/debug_files","e16"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane",component:p("/docs/developer-guide/fastlane","1a0"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot",component:p("/docs/developer-guide/fastlane/zealot","e1d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_debug_file",component:p("/docs/developer-guide/fastlane/zealot_debug_file","d03"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_sync_devices",component:p("/docs/developer-guide/fastlane/zealot_sync_devices","b34"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_version_check",component:p("/docs/developer-guide/fastlane/zealot_version_check","1b7"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/sdk/android",component:p("/docs/developer-guide/sdk/android","3a2"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/sdk/ios",component:p("/docs/developer-guide/sdk/ios","c33"),exact:!0,sidebar:"developerGuide"},{path:"/docs/self-hosted/",component:p("/docs/self-hosted/","666"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/environment-variables",component:p("/docs/self-hosted/configuration/environment-variables","d7d"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/schedule-jobs",component:p("/docs/self-hosted/configuration/schedule-jobs","a57"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/third-party-authentication",component:p("/docs/self-hosted/configuration/third-party-authentication","7f5"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/architecture",component:p("/docs/self-hosted/deployment/architecture","e1c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/docker",component:p("/docs/self-hosted/deployment/docker","a75"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/docker/step-by-step",component:p("/docs/self-hosted/deployment/docker/step-by-step","bf4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/fly",component:p("/docs/self-hosted/deployment/fly","ed1"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/kubernetes",component:p("/docs/self-hosted/deployment/kubernetes","e83"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/nomad",component:p("/docs/self-hosted/deployment/nomad","15f"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/railway",component:p("/docs/self-hosted/deployment/railway","df1"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/render",component:p("/docs/self-hosted/deployment/render","766"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/requirements",component:p("/docs/self-hosted/deployment/requirements","8ec"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/source-code",component:p("/docs/self-hosted/deployment/source-code","0d9"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/reverse-proxies",component:p("/docs/self-hosted/reverse-proxies","42c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/storage",component:p("/docs/self-hosted/storage","ca7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/user-guide/",component:p("/docs/user-guide/","853"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/apple-team",component:p("/docs/user-guide/administrator/apple-team","f62"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/backup",component:p("/docs/user-guide/administrator/backup","240"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/background-jobs",component:p("/docs/user-guide/administrator/monitoring/background-jobs","a44"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/database-analytics",component:p("/docs/user-guide/administrator/monitoring/database-analytics","d89"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/logging",component:p("/docs/user-guide/administrator/monitoring/logging","8d8"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/system-info",component:p("/docs/user-guide/administrator/monitoring/system-info","71b"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/permissions",component:p("/docs/user-guide/administrator/permissions","0d3"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/project-settings",component:p("/docs/user-guide/administrator/project-settings","737"),exact:!0},{path:"/docs/user-guide/administrator/settings",component:p("/docs/user-guide/administrator/settings","ca5"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/",component:p("/docs/user-guide/apps/","621"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/create",component:p("/docs/user-guide/apps/create","bfc"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/detail",component:p("/docs/user-guide/apps/detail","9a6"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/upload",component:p("/docs/user-guide/apps/upload","1b1"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/best_practices",component:p("/docs/user-guide/best_practices","91c"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/changelog",component:p("/docs/user-guide/changelog","b06"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/credits",component:p("/docs/user-guide/credits","7f0"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/dashboard",component:p("/docs/user-guide/dashboard","aaf"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/",component:p("/docs/user-guide/debug-files/","70a"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/review",component:p("/docs/user-guide/debug-files/review","dbc"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/upload",component:p("/docs/user-guide/debug-files/upload","601"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/qa",component:p("/docs/user-guide/qa","569"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/toolkits/fetch-udid",component:p("/docs/user-guide/toolkits/fetch-udid","ac3"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/toolkits/teardown",component:p("/docs/user-guide/toolkits/teardown","f07"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks",component:p("/docs/user-guide/webhooks","6ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/dingtalk",component:p("/docs/user-guide/webhooks/dingtalk","44c"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/discord",component:p("/docs/user-guide/webhooks/discord","2e3"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/feishu",component:p("/docs/user-guide/webhooks/feishu","96d"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/slack",component:p("/docs/user-guide/webhooks/slack","5cf"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/wecom",component:p("/docs/user-guide/webhooks/wecom","f9b"),exact:!0,sidebar:"userGuide"}]},{path:"/",component:p("/","fc2"),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),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var d=n(723),c=n(6550),u=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),g=n(5742),m=n(2263),h=n(4996),b=n(6668),v=n(1944),y=n(4711),x=n(9727),w=n(3320),k=n(8780),_=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,m.Z)(),n=(0,y.l)();return r.createElement(g.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 S(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),o=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.Z)(),{pathname:r}=(0,c.TH)();return e+(0,k.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:o;return r.createElement(g.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function C(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(g.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:x.h})),n&&r.createElement(v.d,{image:n}),r.createElement(S,null),r.createElement(E,null),r.createElement(_.Z,{tag:w.HX,locale:e}),r.createElement(g.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,u.f)(d.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),N=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=l.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const O=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 I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(d.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.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}),I(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(O,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const M=R,D="__docusaurus-base-url-issue-banner-container",G="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${F}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${F}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${G}" 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 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 j(){const{siteConfig:{baseUrl:e}}=(0,m.Z)();return(0,r.useLayoutEffect)((()=>{window[F]=!1}),[]),r.createElement(r.Fragment,null,!s.Z.canUseDOM&&r.createElement(g.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:D}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(j,null):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:a}}=(0,m.Z)(),i=(0,h.Z)(e),{htmlLang:s,direction:l}=a[o];return r.createElement(g.Z,null,r.createElement("html",{lang:s,dir:l}),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 U=n(4763),Z=n(2389);function V(){const e=(0,Z.Z)();return r.createElement(g.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function q(){const e=(0,u.H)(d.Z),t=(0,c.TH)();return r.createElement(U.Z,null,r.createElement(N.M,null,r.createElement(L.t,null,r.createElement(p,null,r.createElement(H,null),r.createElement(C,null),r.createElement($,null),r.createElement(M,{location:A(t)},e)),r.createElement(V,null))))}var W=n(6887);const Y=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 K=n(9670);const X=new Set,Q=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Q.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,u.f)(d.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,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Q.has(e))(e)&&(Q.add(e),I(e))},te=Object.freeze(ee);if(s.Z.canUseDOM){window.docusaurus=te;const e=o.hydrate;I(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(a.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>u});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next \ud83d\udea7","isLast":false,"path":"/docs/next","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/next/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/next/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/next/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/next/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/next/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/next/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/next/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/next/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/next/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/next/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/next/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/next/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/next/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/next/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/next/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/next/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/next/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/next/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/next/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/next/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/next/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/next/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/next/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/next/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/next/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/next/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/next/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/next/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/next/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/next/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/next/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/next/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/next/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/next/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/next/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/next/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/next/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/docs/next/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/next/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/next/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/next/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/next/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/next/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/next/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/next/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/next/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/next/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/next/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/next/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/next/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/next/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/next/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/next/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/next/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/next/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/next/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/next/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/next/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/next/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/next/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/next/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/next/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/next/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/next/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/next/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/next/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/next/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/next/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/next/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/next/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/next/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/next/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/next/contributing-guide/","label":"Getting Started"}}}},{"name":"5.0.0","label":"5.0.0","isLast":true,"path":"/docs","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/docs/user-guide/administrator/project-settings"},{"id":"user-guide/administrator/settings","path":"/docs/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/contributing-guide/","label":"Getting Started"}}}},{"name":"4.x","label":"4.x","isLast":false,"path":"/docs/4.x","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/4.x/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/4.x/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/4.x/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/4.x/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/4.x/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/4.x/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/4.x/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/4.x/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/4.x/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/4.x/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/4.x/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/4.x/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/4.x/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/4.x/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/4.x/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/4.x/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/4.x/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/4.x/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/4.x/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/4.x/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/4.x/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/4.x/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/4.x/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/4.x/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/4.x/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/4.x/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/4.x/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/4.x/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/4.x/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/4.x/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/4.x/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/4.x/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/4.x/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/4.x/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/4.x/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/4.x/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/4.x/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/docs/4.x/user-guide/administrator/project-settings"},{"id":"user-guide/apps/create","path":"/docs/4.x/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/4.x/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/4.x/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/4.x/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/4.x/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/4.x/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/4.x/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/4.x/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/4.x/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/4.x/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/4.x/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/4.x/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/4.x/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/4.x/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/4.x/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/4.x/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/4.x/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/4.x/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/4.x/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/4.x/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/4.x/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/4.x/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/4.x/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/4.x/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/4.x/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/4.x/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/4.x/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/4.x/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/4.x/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/4.x/contributing-guide/","label":"Getting Started"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en","zh-Hans"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var s=n(7529);const l=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-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"}}}'),d={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},c=r.createContext(d);function u(e){let{children:t}=e;return r.createElement(c.Provider,{value:d},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),s=n(7961);function l(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(d,{error:t}))}function d(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 c(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(c,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??u)(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),s=n(2263),l=n(3919),d=n(412);const c=o.createContext({collectLink:()=>{}});var u=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,s.Z)(),{withBaseUrl:w}=(0,u.C)(),k=(0,o.useContext)(c),_=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>_.current));const E=p||f;const S=(0,l.Z)(E),C=E?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;T&&S&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:x}));const L=(0,o.useRef)(!1),N=n?a.OL:a.rU,P=d.Z.canUseIntersectionObserver,O=(0,o.useRef)(),I=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,o.useEffect)((()=>(!P&&S&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&O.current&&O.current.disconnect()})),[O,T,P,S]);const R=T?.startsWith("#")??!1,M=!T||!S||R;return M||h||k.collectLink(T),M?o.createElement("a",(0,r.Z)({ref:_,href:T},E&&!S&&{target:"_blank",rel:"noopener noreferrer"},v)):o.createElement(N,(0,r.Z)({},v,{onMouseEnter:I,onTouchStart:I,innerRef:e=>{_.current=e,P&&e&&S&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),O.current.observe(e))},to:T},n&&{isActive:m,activeClassName:g}))}const f=o.forwardRef(p)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});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 s(e,t){let{message:n,id:r}=e;return o(i({message:n,id:r}),t)}function l(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 s=i({message:t,id:n});return r.createElement(r.Fragment,null,o(s,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:()=>s});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 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)}},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 s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=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:()=>m,gA:()=>p,_r:()=>c,Jo:()=>h,zh:()=>u,yW:()=>g,gB:()=>f});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 s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(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 d={},c=()=>i("docusaurus-plugin-content-docs")??d,u=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 p(e){void 0===e&&(e={});const t=c(),{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 f(e){return u(e).versions}function g(e){const t=u(e);return s(t)}function m(e){const t=u(e),{pathname:n}=(0,r.TH)();return l(t,n)}function h(e){const t=u(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},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(1472)(`./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"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ut});var r=n(7294),o=n(6010),a=n(4763),i=n(1944),s=n(7462),l=n(6550),d=n(5999),c=n(5936);const u="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(u);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,d.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 m(e){const t=e.children??g,{containerRef:n,onClick:o}=f();return r.createElement("div",{ref:n,role:"region","aria-label":g},r.createElement("a",(0,s.Z)({},e,{href:`#${u}`,onClick:o}),t))}var h=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(m,{className:v.skipToContent})}var x=n(6668),w=n(9689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:i,...l}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const _={closeButton:"closeButton_CVFx"};function E(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,d.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",_.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const S={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,o.Z)(S.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.L)(),{isActive:t,close:n}=(0,w.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),N=n(2466);var P=n(902),O=n(3102);const I=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,O.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(I.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(I);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,O.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:M(a)})),[o,a,t])}function G(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:i}=D();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 z=n(2949),F=n(2389);function B(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function j(e){return r.createElement("svg",(0,s.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 H(e){let{className:t,buttonClassName:n,value:a,onChange:i}=e;const s=(0,F.Z)(),l=(0,d.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,d.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,d.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,!s&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===a?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(B,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(j,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})))}const U=r.memo(H),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.L)().navbar.style,o=(0,x.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:i}=(0,z.I)();return o?null:r.createElement(U,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:i})}var q=n(1327);function W(){return r.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,d.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 K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:i,html:l,isDropdownLink:d,prependBaseUrlToHref:c,...u}=e;const p=(0,Q.Z)(o),f=(0,Q.Z)(t),g=(0,Q.Z)(a,{forcePrependBaseUrl:!0}),m=i&&a&&!(0,J.Z)(a),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(te.Z,d&&{width:12,height:12}))};return a?r.createElement(X.Z,(0,s.Z)({href:c?g:a},u,h)):r.createElement(X.Z,(0,s.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},u,h))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const i=r.createElement(ne,(0,s.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,s.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,s.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),se=n(8596),le=n(2263);function de(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:i,...l}=e;const d=(0,r.useRef)(null),[c,u]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{d.current&&!d.current.contains(e.target)&&u(!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)}}),[d]),r.createElement("div",{ref:d,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.Z)("navbar__link",a)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!c))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ee,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function ue(e){let{items:t,className:n,position:a,onClick:i,...d}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),u=de(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!u});return(0,r.useEffect)((()=>{u&&g(!u)}),[c,u,g]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},d,{onClick:e=>{e.preventDefault(),f()}}),d.children??d.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(Ee,(0,s.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?ue:ce;return r.createElement(o,n)}var fe=n(4711);function ge(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,s.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 me="iconLanguage_nlXk";var he=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,be.searchBox)},t)}var ye=n(143),xe=n(3438);var we=n(373);const ke=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:c,localeConfigs:u}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:g}=(0,l.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}`;return{label:u[e].label,lang:u[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...o],h=t?(0,d.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):u[i].label;return r.createElement(pe,(0,s.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(ge,{className:me}),h),items:m}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(he.Z,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return r.createElement(s,{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,ye.Iw)(o),l=(0,xe.vY)(t,o);return null===l?null:r.createElement(ae,(0,s.Z)({exact:!0},a,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:i}=(0,ye.Iw)(o),l=(0,xe.oz)(t,o).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,s.Z)({exact:!0},a,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const i=(0,xe.lO)(o)[0],l=t??i.label,d=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(ae,(0,s.Z)({},a,{label:l,to:d}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:i,...c}=e;const{search:u,hash:p}=(0,l.TH)(),f=(0,ye.Iw)(n),g=(0,ye.gB)(n),{savePreferredVersionName:m}=(0,we.J)(n),h=[...a,...g.map((e=>{const t=f.alternateDocVersions[e.name]??ke(e);return{label:e.label,to:`${t.path}${u}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...i],b=(0,xe.lO)(n)[0],v=t&&h.length>1?(0,d.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:ke(b).path;return h.length<=1?r.createElement(ae,(0,s.Z)({},c,{mobile:t,label:v,to:y,isActive:o?()=>!1:void 0})):r.createElement(pe,(0,s.Z)({},c,{mobile:t,label:v,to:y,items:h,isActive:o?()=>!1:void 0}))}};function Ee(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 Se(){const e=(0,L.e)(),t=(0,x.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ee,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ce(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(d.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 Te(){const e=0===(0,x.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(Ce,{onClick:()=>t.hide()}),t.content)}function Ae(){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(G,{header:r.createElement(K,null),primaryMenu:r.createElement(Se,null),secondaryMenu:r.createElement(Te,null)}):null}const Le={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Pe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.L)(),i=(0,L.e)(),{navbarRef:s,isNavbarVisible:l}=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,N.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 s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,d=window.innerHeight;s&&i>=s?n(!1):i+d<l&&n(!0)})),(0,c.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:s,"aria-label":(0,d.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Le.navbarHideable,!l&&Le.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown})},t,r.createElement(Ne,{onClick:i.toggle}),r.createElement(Ae,null))}var Oe=n(8780);const Ie={errorBoundaryError:"errorBoundaryError_a6uf"};function Re(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(d.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 Me(e){let{error:t}=e;const n=(0,Oe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Ie.errorBoundaryError},n)}class De extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ge="right";function ze(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,s.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 Fe(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,d.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(ze,null))}const Be={colorModeToggle:"colorModeToggle_DEke"};function je(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(De,{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(Ee,e)))))}function $e(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 He(){const e=(0,L.e)(),t=(0,x.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??Ge)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement($e,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Fe,null),r.createElement(W,null),r.createElement(je,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(je,{items:o}),r.createElement(V,{className:Be.colorModeToggle}),!a&&r.createElement(ve,null,r.createElement(he.Z,null)))})}function Ue(){return r.createElement(Pe,null,r.createElement(He,null))}function Ze(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:i,...l}=t,d=(0,Q.Z)(n),c=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,s.Z)({className:"footer__link-item"},o?{href:i?c:o}:{to:d},l),a,o&&!(0,J.Z)(o)&&r.createElement(te.Z,null))}function Ve(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(Ze,{item:t}))}function qe(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(Ve,{key:t,item:e})))))}function We(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(qe,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function Xe(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(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(We,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(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 at(){const{footer:e}=(0,x.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(ot,{style:a,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:o&&r.createElement(nt,{logo:o}),copyright:t&&r.createElement(rt,{copyright:t})})}const it=r.memo(at),st=(0,P.Qc)([z.S,w.pl,N.OC,we.L5,i.VC,function(e){let{children:t}=e;return r.createElement(O.n2,null,r.createElement(L.M,null,r.createElement(R,null,t)))}]);function lt(e){let{children:t}=e;return r.createElement(st,null,t)}function dt(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(d.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(Re,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Me,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function ut(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:d}=e;return(0,b.t)(),r.createElement(lt,null,r.createElement(i.d,{title:l,description:d}),r.createElement(y,null),r.createElement(A,null),r.createElement(Ue,null),r.createElement("div",{id:u,className:(0,o.Z)(h.k.wrapper.main,ct.mainWrapper,s)},r.createElement(a.Z,{fallback:e=>r.createElement(dt,e)},t)),!n&&r.createElement(it,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),o=n(7294),a=n(9960),i=n(4996),s=n(2263),l=n(6668),d=n(941);function c(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)},s=o.createElement(d.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},s):s}function u(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:d}}=(0,l.L)(),{imageClassName:u,titleClassName:p,...f}=e,g=(0,i.Z)(d?.href||"/"),m=n?"":t,h=d?.alt??m;return o.createElement(a.Z,(0,r.Z)({to:g},f,d?.target&&{target:d.target}),d&&o.createElement(c,{logo:d,alt:h,imageClassName:u}),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:()=>d});var r=n(7462),o=n(7294),a=n(6010),i=n(2389),s=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function d(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:d,className:c,alt:u,...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:d[e],alt:u,className:(0,a.Z)(l.themedImage,l[`themedImage--${e}`],c)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>h});var r=n(7462),o=n(7294),a=n(412),i=n(1442);const s="ease-in-out";function l(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 d={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?d:c;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??s}`,height:`${t}px`}}function l(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return u(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=d.height,e.style.overflow=d.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!a.Z.canUseDOM)return e?d:c}function g(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:l}=e;const d=(0,o.useRef)(null);return p({collapsibleRef:d,collapsed:n,animation:a}),o.createElement(t,{ref:d,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(d.current,n),i?.(n))},className:s},r)}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,o.useState)(!t),[s,l]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&l(t)}),[a,t]),a?o.createElement(g,(0,r.Z)({},n,{collapsed:s})):null}function h(e){let{lazy:t,...n}=e;const r=t?m:g;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>f});var r=n(7294),o=n(2389),a=n(12),i=n(902),s=n(6668);const l=(0,a.WA)("docusaurus.announcement.dismiss"),d=(0,a.WA)("docusaurus.announcement.id"),c=()=>"true"===l.get(),u=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const i=(0,r.useCallback)((()=>{u(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=d.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;d.set(t),r&&u(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function g(){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:()=>h,S:()=>m});var r=n(7294),o=n(412),a=n(902),i=n(12),s=n(6668);const l=r.createContext(void 0),d="theme",c=(0,i.WA)(d),u={light:"light",dark:"dark"},p=e=>e===u.dark?u.dark:u.light,f=e=>o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),g=e=>{c.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,a]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&g(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?u.dark:u.light:e),c.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!==d)return;const t=c.get();null!==t&&i(p(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===u.dark},setLightTheme(){i(u.light)},setDarkTheme(){i(u.dark)}})),[o,i])}();return r.createElement(l.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(l);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:()=>h});var r=n(7294),o=n(143),a=n(9935),i=n(6668),s=n(3438),l=n(902),d=n(12);const c=e=>`docs-preferred-version-${e}`,u={save:(e,t,n)=>{(0,d.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,d.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,d.WA)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=u.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(u.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){u.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return r.createElement(f.Provider,{value:n},t)}function h(e){let{children:t}=e;return s.cE?r.createElement(m,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=b(),{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])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),i=r.createContext(a);function s(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 l(){const e=(0,r.useContext)(i);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>i});var r=n(7294),o=n(902);const a=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(a.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>u,e:()=>p});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),s=n(6668),l=n(902);const d=r.createContext(void 0);function c(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,d]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return d(!1),!1}));const c=(0,r.useCallback)((()=>{d((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&d(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function u(e){let{children:t}=e;const n=c();return r.createElement(d.Provider,{value:n},t)}function p(){const e=r.useContext(d);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,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 s(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const i=(0,r.useContext)(a);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),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)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>d});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return o.Z.canUseDOM?window.innerWidth>i?a.desktop:a.mobile:a.ssr}const l=!1;function d(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?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})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>S,Wl:()=>g,_F:()=>v,cE:()=>p,hI:()=>E,jA:()=>m,lO:()=>w,oz:()=>k,s1:()=>x,vY:()=>_,xz:()=>f});var r=n(7294),o=n(6550),a=n(8790),i=n(143),s=n(373),l=n(4477),d=n(1116),c=n(7392),u=n(8596);const p=!!i._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function g(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=g(t);if(e)return e}}}function m(){const{pathname:e}=(0,o.TH)(),t=(0,d.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||b(e.items,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,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 x(){const e=(0,d.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([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 _(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- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),i=t.routes,s=i.find((e=>(0,o.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,d=l?n.docsSidebars[l]:void 0;return{docElement:(0,a.H)(i),sidebarName:l,sidebarItems:d}}function S(e){return e.filter((e=>"category"!==e.type||!!g(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>s,_X:()=>l});var r=n(7294),o=n(6550),a=n(1688),i=n(902);function s(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 l(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)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>c,VC:()=>f});var r=n(7294),o=n(6010),a=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),d=n(2263);function c(e){let{title:t,description:n,keywords:o,image:i,children:s}=e;const c=function(e){const{siteConfig:t}=(0,d.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:u}=(0,l.C)(),p=i?u(i,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),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}),s)}const u=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(u),s=(0,o.Z)(i,t);return r.createElement(u.Provider,{value:s},r.createElement(a.Z,null,r.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),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:()=>d,Ql:()=>l,i6:()=>s,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 s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function d(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});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 s(){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:()=>f,OC:()=>l,RF:()=>u,o5:()=>p});var r=n(7294),o=n(412),a=n(2389),i=n(902);const s=r.createContext(void 0);function l(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(s.Provider,{value:n},t)}function d(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function u(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(c()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();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=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function f(){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:()=>r,os:()=>o});n(2263);const r="default";function o(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>u,WA:()=>c});var r=n(7294),o=n(1688);const a="localStorage";function i(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 s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const d={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(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=s(t?.persistence);return null===n?d:{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),i({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),i({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),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?d:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,o.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},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:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),d=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=s===i?e:e.replace(`/${s}/`,"/"),u=d.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${u}`}}}},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}},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:()=>x,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("/")||[],s=e&&o(e),l=t&&o(t),d=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var u=0,p=i.length;p>=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),u++):u&&(a(i,p),u--)}if(!d)for(;u--;u)i.unshift("..");!d||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function u(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(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 g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var m=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),m||(0,s.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,d=i.forceRefresh,x=void 0!==d&&d,w=i.getUserConfirmation,k=void 0===w?h:w,_=i.keyLength,E=void 0===_?6:_,S=e.basename?u(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 S&&(a=c(a,S)),f(a,r,n)}function T(){return Math.random().toString(36).substr(2,E)}var A=g();function L(e){(0,r.Z)(j,e),j.length=n.length,A.notifyListeners(j.location,j.action)}function N(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||I(C(e.state))}function P(){I(C(y()))}var O=!1;function I(e){if(O)O=!1,L();else{A.confirmTransitionTo(e,"POP",k,(function(t){t?L({action:"POP",location:e}):function(e){var t=j.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(O=!0,G(o))}(e)}))}}var R=C(y()),M=[R.key];function D(e){return S+p(e)}function G(e){n.go(e)}var z=0;function F(e){1===(z+=e)&&1===e?(window.addEventListener(b,N),a&&window.addEventListener(v,P)):0===z&&(window.removeEventListener(b,N),a&&window.removeEventListener(v,P))}var B=!1;var j={length:n.length,action:"POP",location:R,createHref:D,push:function(e,t){var r="PUSH",a=f(e,t,T(),j.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=D(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=M.indexOf(j.location.key),d=M.slice(0,l+1);d.push(a.key),M=d,L({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,T(),j.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=D(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=M.indexOf(j.location.key);-1!==l&&(M[l]=a.key),L({action:r,location:a})}else window.location.replace(t)}}))},go:G,goBack:function(){G(-1)},goForward:function(){G(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return B||(F(1),B=!0),function(){return B&&(B=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return j}var w="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:l},slash:{encodePath:l,decodePath:l}};function _(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 S(e){window.location.replace(_(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),m||(0,s.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?h:o,i=n.hashType,d=void 0===i?"slash":i,b=e.basename?u(l(e.basename)):"",v=k[d],y=v.encodePath,x=v.decodePath;function C(){var e=x(E());return b&&(e=c(e,b)),f(e)}var T=g();function A(e){(0,r.Z)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var L=!1,N=null;function P(){var e,t,n=E(),r=y(n);if(n!==r)S(r);else{var o=C(),i=B.location;if(!L&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(N===p(o))return;N=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=B.location,n=M.lastIndexOf(p(t));-1===n&&(n=0);var r=M.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(L=!0,D(o))}(e)}))}}(o)}}var O=E(),I=y(O);O!==I&&S(I);var R=C(),M=[p(R)];function D(e){t.go(e)}var G=0;function z(e){1===(G+=e)&&1===e?window.addEventListener(w,P):0===G&&window.removeEventListener(w,P)}var F=!1;var B={length:t.length,action:"POP",location:R,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=_(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(E()!==o){N=t,function(e){window.location.hash=e}(o);var a=M.lastIndexOf(p(B.location)),i=M.slice(0,a+1);i.push(t),M=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);E()!==o&&(N=t,S(o));var a=M.indexOf(p(B.location));-1!==a&&(M[a]=t),A({action:n,location:r})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return F||(z(1),F=!0),function(){return F&&(F=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-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,d=void 0===l?6:l,c=g();function u(e){(0,r.Z)(x,e),x.length=x.entries.length,c.notifyListeners(x.location,x.action)}function m(){return Math.random().toString(36).substr(2,d)}var h=T(s,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?m():e.key||m())})),v=p;function y(e){var t=T(x.index+e,0,x.entries.length-1),r=x.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?u({action:"POP",location:r,index:t}):u()}))}var x={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,m(),x.location);c.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),u({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),x.location);c.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,u({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),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return x}},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},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 d=Object.defineProperty,c=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=c(n);u&&(i=i.concat(u(n)));for(var s=l(t),m=l(n),h=0;h<i.length;++h){var b=i[h];if(!(a[b]||r&&r[b]||m&&m[b]||s&&s[b])){var v=p(n,b);try{d(t,b,v)}catch(y){}}}}return t}},1143: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 d=[n,r,o,a,i,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return d[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},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),d=a.querySelector(r.barSelector),c=r.speed,u=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(d,i(e,c,u)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*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");c(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),d=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),d!=document.body&&c(d,"nprogress-custom-parent"),d.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(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 d(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;d(n,t)||(e.className=r.substring(1))}function u(e,t){var n,r=p(e);d(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,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l<arguments.length;l++){for(var d in a=Object(arguments[l]))n.call(a,d)&&(s[d]=a[d]);if(t){i=t(a);for(var c=0;c<i.length;c++)r.call(a,i[c])&&(s[i[c]]=a[i[c]])}}return s}},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 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 d=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===d&&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],d=r.util.type(l);"Object"!==d||a[i(l)]?"Array"!==d||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};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 s;return l(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,s,c,u){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var g=0;g<f.length;++g){if(u&&u.cause==p+","+g)return;var m=f[g],h=m.inside,b=!!m.lookbehind,v=!!m.greedy,y=m.alias;if(v&&!m.pattern.global){var x=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,x+"g")}for(var w=m.pattern||m,k=s.next,_=c;k!==t.tail&&!(u&&_>=u.reach);_+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var S,C=1;if(v){if(!(S=a(w,_,e,b))||S.index>=e.length)break;var T=S.index,A=S.index+S[0].length,L=_;for(L+=k.value.length;T>=L;)L+=(k=k.next).value.length;if(_=L-=k.value.length,k.value instanceof o)continue;for(var N=k;N!==t.tail&&(L<A||"string"==typeof N.value);N=N.next)C++,L+=N.value.length;C--,E=e.slice(_,L),S.index-=_}else if(!(S=a(w,0,E,b)))continue;T=S.index;var P=S[0],O=E.slice(0,T),I=E.slice(T+P.length),R=_+E.length;u&&R>u.reach&&(u.reach=R);var M=k.prev;if(O&&(M=l(t,M,O),_+=O.length),d(t,M,C),k=l(t,M,new o(p,h?r.tokenize(P,h):P,y,P)),I&&l(t,k,I),C>1){var D={cause:p+","+g,reach:R};i(e,t,n,k.prev,_,D),u&&D.reach>u.reach&&(u.reach=D.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 d(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}(),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 s=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),l="language-"+(s=(/[a-z][\w-]*/i.exec(s)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,l]:i.alias.push(l):i.alias=[l]}}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],d=/language-(.+)/.exec(a);if(d){n=d[1];break}}var c,u=e.languages[n];if(u)t.content=e.highlight((c=t.content,c.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n);var r=s[t];return r||e}))),u,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"),s={amp:"&",lt:"<",gt:">",quot:'"'},l=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(u(["definition-mutation","punctuation"])&&"("===c(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=c(0);"variable"===i.type&&(f(i,"variable-input"),o.push(i.content))}n=a+1}if(u(["punctuation","property-query"])&&"{"===c(0).content&&(n++,f(c(0),"property-mutation"),o.length>0)){var s=p(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l<s;l++){var d=t[l];"variable"===d.type&&o.indexOf(d.content)>=0&&f(d,"variable-input")}}}}function c(e){return t[n+e]}function u(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function 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)}})),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 s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(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 d(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,l(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,i)}return new e.Token("interpolation",a,r.alias,t)}function c(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),i=0,c={},u=l(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=s(i++,r)););return c[n]=o,n})).join(""),n,r),p=Object.keys(c);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,s=a.indexOf(o);if(-1!==s){++i;var l=a.substring(0,s),u=d(c[o]),f=a.substring(s+o.length),g=[];if(l&&g.push(l),g.push(u),f){var m=[f];e(m),g.push.apply(g,m)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(u),new e.Token(r,u,"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 u={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 u&&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 s=i[1];if(3===i.length&&"string"!=typeof s&&"embedded-code"===s.type){var l=p(s),d=s.alias,u=Array.isArray(d)?d[0]:d,f=e.languages[u];if(!f)continue;i[1]=c(l,f,u)}}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(""):""},s=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 l=i(o);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(l+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=i(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}o.content&&"string"!=typeof o.content&&s(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(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,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 d=s[l];if("string"==typeof d||d.content&&"string"==typeof d.content){var c=a[o],u=n.tokenStack[c],p="string"==typeof d?d:d.content,f=t(r,c),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(u,n.grammar),"language-"+r,u),b=p.substring(g+f.length),v=[];m&&v.push.apply(v,i([m])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof d?s.splice.apply(s,[l,1].concat(v)):d.content=v}}else d.content&&i(d.content)}return s}(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},485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},4677:()=>{Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},3436:()=>{!function(e){var t=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:t}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:t}},punctuation:/[{};]/}}(Prism)},9385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},874:()=>{Prism.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:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},1472:(e,t,n)=>{var r={"./prism-groovy":485,"./prism-hcl":4677,"./prism-java":2503,"./prism-kotlin":2334,"./prism-nginx":3436,"./prism-ruby":9385,"./prism-swift":874,"./prism-toml":9930};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=1472},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 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}},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 s=new Set,l={};function d(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)s.add(t[e])}var u=!("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,g={},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 b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function x(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(m,e)||!f.call(g,e)&&(p.test(e)?m[e]=!0:(g[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 h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,_=60106,E=60107,S=60108,C=60114,T=60109,A=60110,L=60112,N=60113,P=60120,O=60115,I=60116,R=60121,M=60128,D=60129,G=60130,z=60131;if("function"==typeof Symbol&&Symbol.for){var F=Symbol.for;k=F("react.element"),_=F("react.portal"),E=F("react.fragment"),S=F("react.strict_mode"),C=F("react.profiler"),T=F("react.provider"),A=F("react.context"),L=F("react.forward_ref"),N=F("react.suspense"),P=F("react.suspense_list"),O=F("react.memo"),I=F("react.lazy"),R=F("react.block"),F("react.scope"),M=F("react.opaque.id"),D=F("react.debug_trace_mode"),G=F("react.offscreen"),z=F("react.legacy_hidden")}var B,j="function"==typeof Symbol&&Symbol.iterator;function $(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=j&&e[j]||e["@@iterator"])?e:null}function H(e){if(void 0===B)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);B=t&&t[1]||""}return"\n"+B+e}var U=!1;function Z(e,t){if(!e||U)return"";U=!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(l){var r=l}Reflect.construct(e,[],t)}else{try{t.call()}catch(l){r=l}e.call(t.prototype)}else{try{throw Error()}catch(l){r=l}e()}}catch(l){if(l&&r&&"string"==typeof l.stack){for(var o=l.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])return"\n"+o[i].replace(" at new "," at ")}while(1<=i&&0<=s);break}}}finally{U=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?H(e):""}function V(e){switch(e.tag){case 5:return H(e.type);case 16:return H("Lazy");case 13:return H("Suspense");case 19:return H("SuspenseList");case 0:case 2:case 15:return e=Z(e.type,!1);case 11:return e=Z(e.type.render,!1);case 22:return e=Z(e.type._render,!1);case 1:return e=Z(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case E:return"Fragment";case _:return"Portal";case C:return"Profiler";case S:return"StrictMode";case N: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 O:return q(e.type);case R:return q(e._render);case I:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var 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 X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return 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)&&x(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&&Q(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 se(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return o({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function le(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 de(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var ue={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 ge,me,he=(me=function(e,t){if(e.namespaceURI!==ue.svg||"innerHTML"in e)e.innerHTML=t;else{for((ge=ge||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ge.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 me(e,t)}))}:me);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 xe(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 we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=xe(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 _e(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 Se(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 Ne(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 Oe(e,t){return e(t)}function Ie(e,t,n,r,o){return e(t,n,r,o)}function Re(){}var Me=Oe,De=!1,Ge=!1;function ze(){null===Te&&null===Ae||(Re(),Pe())}function Fe(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 Be=!1;if(u)try{var je={};Object.defineProperty(je,"passive",{get:function(){Be=!0}}),window.addEventListener("test",je,je),window.removeEventListener("test",je,je)}catch(me){Be=!1}function $e(e,t,n,r,o,a,i,s,l){var d=Array.prototype.slice.call(arguments,3);try{t.apply(n,d)}catch(c){this.onError(c)}}var He=!1,Ue=null,Ze=!1,Ve=null,qe={onError:function(e){He=!0,Ue=e}};function We(e,t,n,r,o,a,i,s,l){He=!1,Ue=null,$e.apply(qe,arguments)}function Ye(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 Ke(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(i(188))}function Qe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(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 Xe(o),e;if(a===r)return Xe(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=a;break}if(l===r){s=!0,r=o,n=a;break}l=l.sibling}if(!s){for(l=a.child;l;){if(l===n){s=!0,n=a,r=o;break}if(l===r){s=!0,r=a,n=o;break}l=l.sibling}if(!s)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,st=null,lt=null,dt=new Map,ct=new Map,ut=[],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 gt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":st=null;break;case"mouseover":case"mouseout":lt=null;break;case"pointerover":case"pointerout":dt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function mt(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 ht(e){var t=to(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ke(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=Qt(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=Qt(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!==st&&bt(st)&&(st=null),null!==lt&&bt(lt)&&(lt=null),dt.forEach(vt),ct.forEach(vt)}function xt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,yt)))}function wt(e){function t(t){return xt(t,e)}if(0<at.length){xt(at[0],e);for(var n=1;n<at.length;n++){var r=at[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&xt(it,e),null!==st&&xt(st,e),null!==lt&&xt(lt,e),dt.forEach(t),ct.forEach(t),n=0;n<ut.length;n++)(r=ut[n]).blockedOn===e&&(r.blockedOn=null);for(;0<ut.length&&null===(n=ut[0]).blockedOn;)ht(n),null===n.blockedOn&&ut.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 _t={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},Et={},St={};function Ct(e){if(Et[e])return Et[e];if(!_t[e])return e;var t,n=_t[e];for(t in n)if(n.hasOwnProperty(t)&&t in St)return Et[e]=n[t];return e}u&&(St=document.createElement("div").style,"AnimationEvent"in window||(delete _t.animationend.animation,delete _t.animationiteration.animation,delete _t.animationstart.animation),"TransitionEvent"in window||delete _t.transitionend.transition);var Tt=Ct("animationend"),At=Ct("animationiteration"),Lt=Ct("animationstart"),Nt=Ct("transitionend"),Pt=new Map,Ot=new Map,It=["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",Nt,"transitionEnd","waiting","waiting"];function Rt(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)),Ot.set(r,t),Pt.set(r,o),d(o,[r])}}(0,a.unstable_now)();var Mt=8;function Dt(e){if(0!=(1&e))return Mt=15,1;if(0!=(2&e))return Mt=14,2;if(0!=(4&e))return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):0!=(32&e)?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):0!=(256&e)?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):0!=(4096&e)?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):0!=(134217728&e)?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):0!=(1073741824&e)?(Mt=1,1073741824):(Mt=8,e)}function Gt(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var r=0,o=0,a=e.expiredLanes,i=e.suspendedLanes,s=e.pingedLanes;if(0!==a)r=a,o=Mt=15;else if(0!==(a=134217727&n)){var l=a&~i;0!==l?(r=Dt(l),o=Mt):0!==(s&=a)&&(r=Dt(s),o=Mt)}else 0!==(a=n&~i)?(r=Dt(a),o=Mt):0!==s&&(r=Dt(s),o=Mt);if(0===r)return 0;if(r=n&((0>(r=31-Ht(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&i)){if(Dt(t),o<=Mt)return t;Mt=o}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-Ht(t)),r|=e[n],t&=~o;return r}function zt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function Ft(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Bt(24&~t))?Ft(10,t):e;case 10:return 0===(e=Bt(192&~t))?Ft(8,t):e;case 8:return 0===(e=Bt(3584&~t))&&(0===(e=Bt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Bt(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function Bt(e){return e&-e}function jt(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-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ut(e)/Zt|0)|0},Ut=Math.log,Zt=Math.LN2;var Vt=a.unstable_UserBlockingPriority,qt=a.unstable_runWithPriority,Wt=!0;function Yt(e,t,n,r){De||Re();var o=Xt,a=De;De=!0;try{Ie(o,e,t,n,r)}finally{(De=a)||ze()}}function Kt(e,t,n,r){qt(Vt,Xt.bind(null,e,t,n,r))}function Xt(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=Qt(e,t,n,r);if(null===a)o&>(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=mt(it,e,t,n,r,o),!0;case"dragenter":return st=mt(st,e,t,n,r,o),!0;case"mouseover":return lt=mt(lt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return dt.set(a,mt(dt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,ct.set(a,mt(ct.get(a)||null,e,t,n,r,o)),!0}return!1}(a,e,t,n,r))return;gt(e,r)}Rr(e,t,r,null,n)}}}function Qt(e,t,n,r){var o=Se(r);if(null!==(o=to(o))){var a=Ye(o);if(null===a)o=null;else{var i=a.tag;if(13===i){if(null!==(o=Ke(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 Rr(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 sn(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 ln,dn,cn,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(un),fn=o({},un,{view:0,detail:0}),gn=sn(fn),mn=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!==cn&&(cn&&"mousemove"===e.type?(ln=e.screenX-cn.screenX,dn=e.screenY-cn.screenY):dn=ln=0,cn=e),ln)},movementY:function(e){return"movementY"in e?e.movementY:dn}}),hn=sn(mn),bn=sn(o({},mn,{dataTransfer:0})),vn=sn(o({},fn,{relatedTarget:0})),yn=sn(o({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),xn=o({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=sn(xn),kn=sn(o({},un,{data:0})),_n={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"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function Tn(){return Cn}var An=o({},fn,{key:function(e){if(e.key){var t=_n[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=sn(An),Nn=sn(o({},mn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Pn=sn(o({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),On=sn(o({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),In=o({},mn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Rn=sn(In),Mn=[9,13,27,32],Dn=u&&"CompositionEvent"in window,Gn=null;u&&"documentMode"in document&&(Gn=document.documentMode);var zn=u&&"TextEvent"in window&&!Gn,Fn=u&&(!Dn||Gn&&8<Gn&&11>=Gn),Bn=String.fromCharCode(32),jn=!1;function $n(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var Zn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Zn[e.type]:"textarea"===t}function qn(e,t,n,r){Ne(r),0<(t=Dr(t,"onChange")).length&&(n=new pn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,Yn=null;function Kn(e){Ar(e,0)}function Xn(e){if(X(ro(e)))return e}function Qn(e,t){if("change"===e)return t}var Jn=!1;if(u){var er;if(u){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),Yn=Wn=null)}function or(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,Se(e)),e=Kn,De)e(t);else{De=!0;try{Oe(e,t)}finally{De=!1,ze()}}}}function ar(e,t,n){"focusin"===e?(rr(),Yn=n,(Wn=t).attachEvent("onpropertychange",or)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function sr(e,t){if("click"===e)return Xn(t)}function lr(e,t){if("input"===e||"change"===e)return Xn(t)}var dr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},cr=Object.prototype.hasOwnProperty;function ur(e,t){if(dr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!dr(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 gr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?gr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function mr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function hr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=u&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,xr=null,wr=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wr||null==vr||vr!==Q(r)||("selectionStart"in(r=vr)&&hr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},xr&&ur(xr,r)||(xr=r,0<(r=Dr(yr,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}Rt("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),Rt("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),Rt(It,2);for(var _r="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Er=0;Er<_r.length;Er++)Ot.set(_r[Er],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),d("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),d("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),d("onBeforeInput",["compositionend","keypress","textInput","paste"]),d("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),d("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),d("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Sr="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(Sr));function Tr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,s,l,d){if(We.apply(this,arguments),He){if(!He)throw Error(i(198));var c=Ue;He=!1,Ue=null,Ze||(Ze=!0,Ve=c)}}(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 s=r[i],l=s.instance,d=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Tr(o,s,d),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,d=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Tr(o,s,d),a=l}}}if(Ze)throw e=Ve,Ze=!1,Ve=null,e}function Lr(e,t){var n=ao(t),r=e+"__bubble";n.has(r)||(Ir(t,e,2,!1),n.add(r))}var Nr="_reactListening"+Math.random().toString(36).slice(2);function Pr(e){e[Nr]||(e[Nr]=!0,s.forEach((function(t){Cr.has(t)||Or(t,!1,e,null),Or(t,!0,e,null)})))}function Or(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),s=e+"__"+(t?"capture":"bubble");i.has(s)||(t&&(o|=4),Ir(a,e,o,t),i.add(s))}function Ir(e,t,n,r){var o=Ot.get(t);switch(void 0===o?2:o){case 0:o=Yt;break;case 1:o=Kt;break;default:o=Xt}n=o.bind(null,t,n,e),o=void 0,!Be||"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 Rr(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=to(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}!function(e,t,n){if(Ge)return e(t,n);Ge=!0;try{return Me(e,t,n)}finally{Ge=!1,ze()}}((function(){var r=a,o=Se(n),i=[];e:{var s=Pt.get(e);if(void 0!==s){var l=pn,d=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":l=Ln;break;case"focusin":d="focus",l=vn;break;case"focusout":d="blur",l=vn;break;case"beforeblur":case"afterblur":l=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":l=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=Pn;break;case Tt:case At:case Lt:l=yn;break;case Nt:l=On;break;case"scroll":l=gn;break;case"wheel":l=Rn;break;case"copy":case"cut":case"paste":l=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=Nn}var c=0!=(4&t),u=!c&&"scroll"===e,p=c?null!==s?s+"Capture":null:s;c=[];for(var f,g=r;null!==g;){var m=(f=g).stateNode;if(5===f.tag&&null!==m&&(f=m,null!==p&&(null!=(m=Fe(g,p))&&c.push(Mr(g,m,f)))),u)break;g=g.return}0<c.length&&(s=new l(s,d,null,n,o),i.push({event:s,listeners:c}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(d=n.relatedTarget||n.fromElement)||!to(d)&&!d[Jr])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(d=(d=n.relatedTarget||n.toElement)?to(d):null)&&(d!==(u=Ye(d))||5!==d.tag&&6!==d.tag)&&(d=null)):(l=null,d=r),l!==d)){if(c=hn,m="onMouseLeave",p="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(c=Nn,m="onPointerLeave",p="onPointerEnter",g="pointer"),u=null==l?s:ro(l),f=null==d?s:ro(d),(s=new c(m,g+"leave",l,n,o)).target=u,s.relatedTarget=f,m=null,to(o)===r&&((c=new c(p,g+"enter",d,n,o)).target=f,c.relatedTarget=u,m=c),u=m,l&&d)e:{for(p=d,g=0,f=c=l;f;f=Gr(f))g++;for(f=0,m=p;m;m=Gr(m))f++;for(;0<g-f;)c=Gr(c),g--;for(;0<f-g;)p=Gr(p),f--;for(;g--;){if(c===p||null!==p&&c===p.alternate)break e;c=Gr(c),p=Gr(p)}c=null}else c=null;null!==l&&zr(i,s,l,c,!1),null!==d&&null!==u&&zr(i,u,d,c,!0)}if("select"===(l=(s=r?ro(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var h=Qn;else if(Vn(s))if(Jn)h=lr;else{h=ir;var b=ar}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(h=sr);switch(h&&(h=h(e,r))?qn(i,h,n,o):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&oe(s,"number",s.value)),b=r?ro(r):window,e){case"focusin":(Vn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,xr=null);break;case"focusout":xr=yr=vr=null;break;case"mousedown":wr=!0;break;case"contextmenu":case"mouseup":case"dragend":wr=!1,kr(i,n,o);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(i,n,o)}var v;if(Dn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Un?$n(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Fn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=nn()):(en="value"in(Jt=o)?Jt.value:Jt.textContent,Un=!0)),0<(b=Dr(r,y)).length&&(y=new kn(y,e,null,n,o),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=zn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(jn=!0,Bn);case"textInput":return(e=t.data)===Bn&&jn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!Dn&&$n(e,t)?(e=nn(),tn=en=Jt=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 Fn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Dr(r,"onBeforeInput")).length&&(o=new kn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=v))}Ar(i,t)}))}function Mr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Dr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Fe(e,n))&&r.unshift(Mr(e,a,o)),null!=(a=Fe(e,t))&&r.push(Mr(e,a,o))),e=e.return}return r}function Gr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function zr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,d=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==d&&(s=d,o?null!=(l=Fe(n,a))&&i.unshift(Mr(n,l,s)):o||null!=(l=Fe(n,a))&&i.push(Mr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function Fr(){}var Br=null,jr=null;function $r(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Hr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Ur="function"==typeof setTimeout?setTimeout:void 0,Zr="function"==typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function 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 Yr=0;var Kr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Kr,Qr="__reactProps$"+Kr,Jr="__reactContainer$"+Kr,eo="__reactEvents$"+Kr;function to(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wr(e);null!==e;){if(n=e[Xr])return n;e=Wr(e)}return t}n=(e=n).parentNode}return null}function no(e){return!(e=e[Xr]||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[Qr]||null}function ao(e){var t=e[eo];return void 0===t&&(t=e[eo]=new Set),t}var io=[],so=-1;function lo(e){return{current:e}}function co(e){0>so||(e.current=io[so],io[so]=null,so--)}function uo(e,t){so++,io[so]=e.current,e.current=t}var po={},fo=lo(po),go=lo(!1),mo=po;function ho(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(go),co(fo)}function yo(e,t,n){if(fo.current!==po)throw Error(i(168));uo(fo,t),uo(go,n)}function xo(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,q(t)||"Unknown",a));return o({},n,r)}function wo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||po,mo=fo.current,uo(fo,e),uo(go,go.current),!0}function ko(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=xo(e,t,mo),r.__reactInternalMemoizedMergedChildContext=e,co(go),co(fo),uo(fo,e)):co(go),uo(go,n)}var _o=null,Eo=null,So=a.unstable_runWithPriority,Co=a.unstable_scheduleCallback,To=a.unstable_cancelCallback,Ao=a.unstable_shouldYield,Lo=a.unstable_requestPaint,No=a.unstable_now,Po=a.unstable_getCurrentPriorityLevel,Oo=a.unstable_ImmediatePriority,Io=a.unstable_UserBlockingPriority,Ro=a.unstable_NormalPriority,Mo=a.unstable_LowPriority,Do=a.unstable_IdlePriority,Go={},zo=void 0!==Lo?Lo:function(){},Fo=null,Bo=null,jo=!1,$o=No(),Ho=1e4>$o?No:function(){return No()-$o};function Uo(){switch(Po()){case Oo:return 99;case Io:return 98;case Ro:return 97;case Mo:return 96;case Do:return 95;default:throw Error(i(332))}}function Zo(e){switch(e){case 99:return Oo;case 98:return Io;case 97:return Ro;case 96:return Mo;case 95:return Do;default:throw Error(i(332))}}function Vo(e,t){return e=Zo(e),So(e,t)}function qo(e,t,n){return e=Zo(e),Co(e,t,n)}function Wo(){if(null!==Bo){var e=Bo;Bo=null,To(e)}Yo()}function Yo(){if(!jo&&null!==Fo){jo=!0;var e=0;try{var t=Fo;Vo(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fo=null}catch(n){throw null!==Fo&&(Fo=Fo.slice(e+1)),Co(Oo,Wo),n}finally{jo=!1}}}var Ko=w.ReactCurrentBatchConfig;function Xo(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 Qo=lo(null),Jo=null,ea=null,ta=null;function na(){ta=ea=Jo=null}function ra(e){var t=Qo.current;co(Qo),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)&&(Di=!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 sa=!1;function la(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function da(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 ca(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function ua(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;sa=!1;var i=a.firstBaseUpdate,s=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var d=l,c=d.next;d.next=null,null===s?i=c:s.next=c,s=d;var u=e.alternate;if(null!==u){var p=(u=u.updateQueue).lastBaseUpdate;p!==s&&(null===p?u.firstBaseUpdate=c:p.next=c,u.lastBaseUpdate=d)}}if(null!==i){for(p=a.baseState,s=0,u=c=d=null;;){l=i.lane;var f=i.eventTime;if((r&l)===l){null!==u&&(u=u.next={eventTime:f,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var g=e,m=i;switch(l=t,f=n,m.tag){case 1:if("function"==typeof(g=m.payload)){p=g.call(f,p,l);break e}p=g;break e;case 3:g.flags=-4097&g.flags|64;case 0:if(null==(l="function"==typeof(g=m.payload)?g.call(f,p,l):g))break e;p=o({},p,l);break e;case 2:sa=!0}}null!==i.callback&&(e.flags|=32,null===(l=a.effects)?a.effects=[i]:l.push(i))}else f={eventTime:f,lane:l,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===u?(c=u=f,d=p):u=u.next=f,s|=l;if(null===(i=i.next)){if(null===(l=a.shared.pending))break;i=l.next,l.next=null,a.lastBaseUpdate=l,a.shared.pending=null}}null===u&&(d=p),a.baseState=d,a.firstBaseUpdate=c,a.lastBaseUpdate=u,js|=s,e.lanes=s,e.memoizedState=p}}function ga(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 ma=(new r.Component).refs;function ha(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)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.payload=t,null!=n&&(a.callback=n),ua(e,a),gl(e,o,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),ua(e,a),gl(e,o,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=pl(),r=fl(e),o=ca(n,r);o.tag=2,null!=t&&(o.callback=t),ua(e,o),gl(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||(!ur(n,r)||!ur(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)?mo:fo.current,a=(r=null!=(r=t.contextTypes))?ho(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 xa(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 wa(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=ma,la(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=ia(a):(a=bo(t)?mo:fo.current,o.context=ho(e,a)),fa(e,n,o,r),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(ha(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 _a(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===ma&&(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 Sa(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=Vl(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 s(t){return e&&null===t.alternate&&(t.flags=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Kl(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function d(e,t,n,r){return null!==t&&t.elementType===n.type?((r=o(t,n.props)).ref=_a(e,t,n),r.return=e,r):((r=ql(n.type,n.key,n.props,null,e.mode,r)).ref=_a(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xl(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function u(e,t,n,r,a){return null===t||7!==t.tag?((t=Wl(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=Kl(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=ql(t.type,t.key,t.props,null,e.mode,n)).ref=_a(e,null,t),n.return=e,n;case _:return(t=Xl(t,e.mode,n)).return=e,t}if(ka(t)||$(t))return(t=Wl(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:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?n.type===E?u(e,t,n.props.children,r,o):d(e,t,n,r):null;case _:return n.key===o?c(e,t,n,r):null}if(ka(n)||$(n))return null!==o?null:u(e,t,n,r,null);Ea(e,n)}return null}function g(e,t,n,r,o){if("string"==typeof r||"number"==typeof r)return l(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?u(t,e,r.props.children,o,r.key):d(t,e,r,o);case _:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o)}if(ka(r)||$(r))return u(t,e=e.get(n)||null,r,o,null);Ea(t,r)}return null}function m(o,i,s,l){for(var d=null,c=null,u=i,m=i=0,h=null;null!==u&&m<s.length;m++){u.index>m?(h=u,u=null):h=u.sibling;var b=f(o,u,s[m],l);if(null===b){null===u&&(u=h);break}e&&u&&null===b.alternate&&t(o,u),i=a(b,i,m),null===c?d=b:c.sibling=b,c=b,u=h}if(m===s.length)return n(o,u),d;if(null===u){for(;m<s.length;m++)null!==(u=p(o,s[m],l))&&(i=a(u,i,m),null===c?d=u:c.sibling=u,c=u);return d}for(u=r(o,u);m<s.length;m++)null!==(h=g(u,o,m,s[m],l))&&(e&&null!==h.alternate&&u.delete(null===h.key?m:h.key),i=a(h,i,m),null===c?d=h:c.sibling=h,c=h);return e&&u.forEach((function(e){return t(o,e)})),d}function h(o,s,l,d){var c=$(l);if("function"!=typeof c)throw Error(i(150));if(null==(l=c.call(l)))throw Error(i(151));for(var u=c=null,m=s,h=s=0,b=null,v=l.next();null!==m&&!v.done;h++,v=l.next()){m.index>h?(b=m,m=null):b=m.sibling;var y=f(o,m,v.value,d);if(null===y){null===m&&(m=b);break}e&&m&&null===y.alternate&&t(o,m),s=a(y,s,h),null===u?c=y:u.sibling=y,u=y,m=b}if(v.done)return n(o,m),c;if(null===m){for(;!v.done;h++,v=l.next())null!==(v=p(o,v.value,d))&&(s=a(v,s,h),null===u?c=v:u.sibling=v,u=v);return c}for(m=r(o,m);!v.done;h++,v=l.next())null!==(v=g(m,o,h,v.value,d))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),s=a(v,s,h),null===u?c=v:u.sibling=v,u=v);return e&&m.forEach((function(e){return t(o,e)})),c}return function(e,r,a,l){var d="object"==typeof a&&null!==a&&a.type===E&&null===a.key;d&&(a=a.props.children);var c="object"==typeof a&&null!==a;if(c)switch(a.$$typeof){case k:e:{for(c=a.key,d=r;null!==d;){if(d.key===c){if(7===d.tag){if(a.type===E){n(e,d.sibling),(r=o(d,a.props.children)).return=e,e=r;break e}}else if(d.elementType===a.type){n(e,d.sibling),(r=o(d,a.props)).ref=_a(e,d,a),r.return=e,e=r;break e}n(e,d);break}t(e,d),d=d.sibling}a.type===E?((r=Wl(a.props.children,e.mode,l,a.key)).return=e,e=r):((l=ql(a.type,a.key,a.props,null,e.mode,l)).ref=_a(e,r,a),l.return=e,e=l)}return s(e);case _:e:{for(d=a.key;null!==r;){if(r.key===d){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=Xl(a,e.mode,l)).return=e,e=r}return s(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=Kl(a,e.mode,l)).return=e,e=r),s(e);if(ka(a))return m(e,r,a,l);if($(a))return h(e,r,a,l);if(c&&Ea(e,a),void 0===a&&!d)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,q(e.type)||"Component"))}return n(e,r)}}var Ca=Sa(!0),Ta=Sa(!1),Aa={},La=lo(Aa),Na=lo(Aa),Pa=lo(Aa);function Oa(e){if(e===Aa)throw Error(i(174));return e}function Ia(e,t){switch(uo(Pa,t),uo(Na,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 Ra(){co(La),co(Na),co(Pa)}function Ma(e){Oa(Pa.current);var t=Oa(La.current),n=fe(t,e.type);t!==n&&(uo(Na,e),uo(La,n))}function Da(e){Na.current===e&&(co(La),co(Na))}var Ga=lo(0);function za(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 Fa=null,Ba=null,ja=!1;function $a(e,t){var n=Ul(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 Ha(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 Ua(e){if(ja){var t=Ba;if(t){var n=t;if(!Ha(e,t)){if(!(t=qr(n.nextSibling))||!Ha(e,t))return e.flags=-1025&e.flags|2,ja=!1,void(Fa=e);$a(Fa,n)}Fa=e,Ba=qr(t.firstChild)}else e.flags=-1025&e.flags|2,ja=!1,Fa=e}}function Za(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Fa=e}function Va(e){if(e!==Fa)return!1;if(!ja)return Za(e),ja=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Hr(t,e.memoizedProps))for(t=Ba;t;)$a(e,t),t=qr(t.nextSibling);if(Za(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){Ba=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Ba=null}}else Ba=Fa?qr(e.stateNode.nextSibling):null;return!0}function qa(){Ba=Fa=null,ja=!1}var Wa=[];function Ya(){for(var e=0;e<Wa.length;e++)Wa[e]._workInProgressVersionPrimary=null;Wa.length=0}var Ka=w.ReactCurrentDispatcher,Xa=w.ReactCurrentBatchConfig,Qa=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(!dr(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,o,a){if(Qa=a,Ja=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Ka.current=null===e||null===e.memoizedState?Oi:Ii,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,Ka.current=Ri,e=n(r,o)}while(ri)}if(Ka.current=Pi,t=null!==ei&&null!==ei.next,Qa=0,ti=ei=Ja=null,ni=!1,t)throw Error(i(300));return e}function si(){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 li(){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 di(e,t){return"function"==typeof t?t(e):t}function ci(e){var t=li(),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 s=o.next;o.next=a.next,a.next=s}r.baseQueue=o=a,n.pending=null}if(null!==o){o=o.next,r=r.baseState;var l=s=a=null,d=o;do{var c=d.lane;if((Qa&c)===c)null!==l&&(l=l.next={lane:0,action:d.action,eagerReducer:d.eagerReducer,eagerState:d.eagerState,next:null}),r=d.eagerReducer===e?d.eagerState:e(r,d.action);else{var u={lane:c,action:d.action,eagerReducer:d.eagerReducer,eagerState:d.eagerState,next:null};null===l?(s=l=u,a=r):l=l.next=u,Ja.lanes|=c,js|=c}d=d.next}while(null!==d&&d!==o);null===l?a=r:l.next=s,dr(r,t.memoizedState)||(Di=!0),t.memoizedState=r,t.baseState=a,t.baseQueue=l,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function ui(e){var t=li(),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 s=o=o.next;do{a=e(a,s.action),s=s.next}while(s!==o);dr(a,t.memoizedState)||(Di=!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=(Qa&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=Is;if(null===o)throw Error(i(349));var a=t._getVersion,s=a(t._source),l=Ka.current,d=l.useState((function(){return pi(o,t,n)})),c=d[1],u=d[0];d=ti;var p=e.memoizedState,f=p.refs,g=f.getSnapshot,m=p.source;p=p.subscribe;var h=Ja;return e.memoizedState={refs:f,source:t,subscribe:r},l.useEffect((function(){f.getSnapshot=n,f.setSnapshot=c;var e=a(t._source);if(!dr(s,e)){e=n(t._source),dr(u,e)||(c(e),e=fl(h),o.mutableReadLanes|=e&o.pendingLanes),e=o.mutableReadLanes,o.entangledLanes|=e;for(var r=o.entanglements,i=e;0<i;){var l=31-Ht(i),d=1<<l;r[l]|=e,i&=~d}}}),[n,t,r]),l.useEffect((function(){return r(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var r=fl(h);o.mutableReadLanes|=r&o.pendingLanes}catch(a){n((function(){throw a}))}}))}),[t,r]),dr(g,n)&&dr(m,t)&&dr(p,r)||((e={pending:null,dispatch:null,lastRenderedReducer:di,lastRenderedState:u}).dispatch=c=Ni.bind(null,Ja,e),d.queue=e,d.baseQueue=null,u=pi(o,t,n),d.memoizedState=d.baseState=u),u}function gi(e,t,n){return fi(li(),e,t,n)}function mi(e){var t=si();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:di,lastRenderedState:e}).dispatch=Ni.bind(null,Ja,e),[t.memoizedState,e]}function hi(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},si().memoizedState=e}function vi(){return li().memoizedState}function yi(e,t,n,r){var o=si();Ja.flags|=e,o.memoizedState=hi(1|t,n,void 0,void 0===r?null:r)}function xi(e,t,n,r){var o=li();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 hi(t,n,a,r)}Ja.flags|=e,o.memoizedState=hi(1|t,n,a,r)}function wi(e,t){return yi(516,4,e,t)}function ki(e,t){return xi(516,4,e,t)}function _i(e,t){return xi(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 Si(e,t,n){return n=null!=n?n.concat([e]):null,xi(4,2,Ei.bind(null,t,e),n)}function Ci(){}function Ti(e,t){var n=li();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=li();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=Uo();Vo(98>n?98:n,(function(){e(!0)})),Vo(97<n?97:n,(function(){var n=Xa.transition;Xa.transition=1;try{e(!1),t()}finally{Xa.transition=n}}))}function Ni(e,t,n){var r=pl(),o=fl(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 s=t.lastRenderedState,l=i(s,n);if(a.eagerReducer=i,a.eagerState=l,dr(l,s))return}catch(d){}gl(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},Oi={readContext:ia,useCallback:function(e,t){return si().memoizedState=[e,void 0===t?null:t],e},useContext:ia,useEffect:wi,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=si();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=si();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=Ni.bind(null,Ja,e),[r.memoizedState,e]},useRef:bi,useState:mi,useDebugValue:Ci,useDeferredValue:function(e){var t=mi(e),n=t[0],r=t[1];return wi((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=mi(!1),t=e[0];return bi(e=Li.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=si();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fi(r,e,t,n)},useOpaqueIdentifier:function(){if(ja){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Yr++).toString(36))),Error(i(355))})),n=mi(t)[1];return 0==(2&Ja.mode)&&(Ja.flags|=516,hi(5,(function(){n("r:"+(Yr++).toString(36))}),void 0,null)),t}return mi(t="r:"+(Yr++).toString(36)),t},unstable_isNewReconciler:!1},Ii={readContext:ia,useCallback:Ti,useContext:ia,useEffect:ki,useImperativeHandle:Si,useLayoutEffect:_i,useMemo:Ai,useReducer:ci,useRef:vi,useState:function(){return ci(di)},useDebugValue:Ci,useDeferredValue:function(e){var t=ci(di),n=t[0],r=t[1];return ki((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=ci(di)[0];return[vi().current,e]},useMutableSource:gi,useOpaqueIdentifier:function(){return ci(di)[0]},unstable_isNewReconciler:!1},Ri={readContext:ia,useCallback:Ti,useContext:ia,useEffect:ki,useImperativeHandle:Si,useLayoutEffect:_i,useMemo:Ai,useReducer:ui,useRef:vi,useState:function(){return ui(di)},useDebugValue:Ci,useDeferredValue:function(e){var t=ui(di),n=t[0],r=t[1];return ki((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=ui(di)[0];return[vi().current,e]},useMutableSource:gi,useOpaqueIdentifier:function(){return ui(di)[0]},unstable_isNewReconciler:!1},Mi=w.ReactCurrentOwner,Di=!1;function Gi(e,t,n,r){t.child=null===e?Ta(t,null,n,r):Ca(t,e.child,n,r)}function zi(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||Di?(t.flags|=1,Gi(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,as(e,t,o))}function Fi(e,t,n,r,o,a){if(null===e){var i=n.type;return"function"!=typeof i||Zl(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=ql(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,Bi(e,t,i,r,o,a))}return i=e.child,0==(o&a)&&(o=i.memoizedProps,(n=null!==(n=n.compare)?n:ur)(o,r)&&e.ref===t.ref)?as(e,t,a):(t.flags|=1,(e=Vl(i,r)).ref=t.ref,e.return=t,t.child=e)}function Bi(e,t,n,r,o,a){if(null!==e&&ur(e.memoizedProps,r)&&e.ref===t.ref){if(Di=!1,0==(a&o))return t.lanes=e.lanes,as(e,t,a);0!=(16384&e.flags)&&(Di=!0)}return Hi(e,t,n,r,a)}function ji(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},kl(t,n);else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},kl(t,e),null;t.memoizedState={baseLanes:0},kl(t,null!==a?a.baseLanes:n)}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,kl(t,r);return Gi(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 Hi(e,t,n,r,o){var a=bo(n)?mo:fo.current;return a=ho(t,a),aa(t,o),n=ii(e,t,n,r,a,o),null===e||Di?(t.flags|=1,Gi(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,as(e,t,o))}function Ui(e,t,n,r,o){if(bo(n)){var a=!0;wo(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),wa(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,d=n.contextType;"object"==typeof d&&null!==d?d=ia(d):d=ho(t,d=bo(n)?mo:fo.current);var c=n.getDerivedStateFromProps,u="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate;u||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==d)&&xa(t,i,r,d),sa=!1;var p=t.memoizedState;i.state=p,fa(t,r,i,o),l=t.memoizedState,s!==r||p!==l||go.current||sa?("function"==typeof c&&(ha(t,n,c,r),l=t.memoizedState),(s=sa||va(t,n,s,r,p,l,d))?(u||"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=l),i.props=r,i.state=l,i.context=d,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,da(e,t),s=t.memoizedProps,d=t.type===t.elementType?s:Xo(t.type,s),i.props=d,u=t.pendingProps,p=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=ia(l):l=ho(t,l=bo(n)?mo:fo.current);var f=n.getDerivedStateFromProps;(c="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==u||p!==l)&&xa(t,i,r,l),sa=!1,p=t.memoizedState,i.state=p,fa(t,r,i,o);var g=t.memoizedState;s!==u||p!==g||go.current||sa?("function"==typeof f&&(ha(t,n,f,r),g=t.memoizedState),(d=sa||va(t,n,d,r,p,g,l))?(c||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("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|=256),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=l,r=d):("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|=256),r=!1)}return Zi(e,t,n,r,a,o)}function Zi(e,t,n,r,o,a){$i(e,t);var i=0!=(64&t.flags);if(!r&&!i)return o&&ko(t,n,!1),as(e,t,a);r=t.stateNode,Mi.current=t;var s=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,s,a)):Gi(e,t,s,a),t.memoizedState=r.state,o&&ko(t,n,!0),t.child}function Vi(e){var t=e.stateNode;t.pendingContext?yo(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yo(0,t.context,!1),Ia(e,t.containerInfo)}var qi,Wi,Yi,Ki,Xi={dehydrated:null,retryLane:0};function Qi(e,t,n){var r,o=t.pendingProps,a=Ga.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(Ga,1&a),null===e?(void 0!==o.fallback&&Ua(t),e=o.children,a=o.fallback,i?(e=Ji(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,e):"number"==typeof o.unstable_expectedLoadTime?(e=Ji(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,t.lanes=33554432,e):((n=Yl({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(o=ts(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=Xi,o):(n=es(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=Yl(t,o,0,null),n=Wl(n,o,r,null),a.return=e,n.return=e,a.sibling=n,e.child=a,n}function es(e,t,n,r){var o=e.child;return e=o.sibling,n=Vl(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 ts(e,t,n,r,o){var a=t.mode,i=e.child;e=i.sibling;var s={mode:"hidden",children:n};return 0==(2&a)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=s,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Vl(i,s),null!==e?r=Vl(e,r):(r=Wl(r,a,o,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function ns(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),oa(e.return,t)}function rs(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 os(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Gi(e,t,r.children,n),0!=(2&(r=Ga.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&&ns(e,n);else if(19===e.tag)ns(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(Ga,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===za(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),rs(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===za(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}rs(t,!0,n,null,a,t.lastEffect);break;case"together":rs(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function as(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),js|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Vl(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Vl(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function is(e,t){if(!ja)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 ss(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 Ra(),co(go),co(fo),Ya(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Va(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Wi(t),null;case 5:Da(t);var a=Oa(Pa.current);if(n=t.type,null!==e&&null!=t.stateNode)Yi(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=Oa(La.current),Va(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[Xr]=t,r[Qr]=s,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<Sr.length;e++)Lr(Sr[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,s),Lr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!s.multiple},Lr("invalid",r);break;case"textarea":le(r,s),Lr("invalid",r)}for(var d in _e(n,s),e=null,s)s.hasOwnProperty(d)&&(a=s[d],"children"===d?"string"==typeof a?r.textContent!==a&&(e=["children",a]):"number"==typeof a&&r.textContent!==""+a&&(e=["children",""+a]):l.hasOwnProperty(d)&&null!=a&&"onScroll"===d&&Lr("scroll",r));switch(n){case"input":K(r),re(r,s,!0);break;case"textarea":K(r),ce(r);break;case"select":case"option":break;default:"function"==typeof s.onClick&&(r.onclick=Fr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(d=9===a.nodeType?a:a.ownerDocument,e===ue.html&&(e=pe(n)),e===ue.html?"script"===n?((e=d.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=d.createElement(n,{is:r.is}):(e=d.createElement(n),"select"===n&&(d=e,r.multiple?d.multiple=!0:r.size&&(d.size=r.size))):e=d.createElementNS(e,n),e[Xr]=t,e[Qr]=r,qi(e,t,!1,!1),t.stateNode=e,d=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<Sr.length;a++)Lr(Sr[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":le(e,r),a=se(e,r),Lr("invalid",e);break;default:a=r}_e(n,a);var c=a;for(s in c)if(c.hasOwnProperty(s)){var u=c[s];"style"===s?we(e,u):"dangerouslySetInnerHTML"===s?null!=(u=u?u.__html:void 0)&&he(e,u):"children"===s?"string"==typeof u?("textarea"!==n||""!==u)&&be(e,u):"number"==typeof u&&be(e,""+u):"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&"autoFocus"!==s&&(l.hasOwnProperty(s)?null!=u&&"onScroll"===s&&Lr("scroll",e):null!=u&&x(e,s,u,d))}switch(n){case"input":K(e),re(e,r,!1);break;case"textarea":K(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(s=r.value)?ie(e,!!r.multiple,s,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=Fr)}$r(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Ki(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Oa(Pa.current),Oa(La.current),Va(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return co(Ga),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Va(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Ga.current)?0===zs&&(zs=3):(0!==zs&&3!==zs||(zs=4),null===Is||0==(134217727&js)&&0==(134217727&$s)||vl(Is,Ms))),(r||n)&&(t.flags|=4),null);case 4:return Ra(),Wi(t),null===e&&Pr(t.stateNode.containerInfo),null;case 10:return ra(t),null;case 19:if(co(Ga),null===(r=t.memoizedState))return null;if(s=0!=(64&t.flags),null===(d=r.rendering))if(s)is(r,!1);else{if(0!==zs||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(d=za(e))){for(t.flags|=64,is(r,!1),null!==(s=d.updateQueue)&&(t.updateQueue=s,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(s=n).flags&=2,s.nextEffect=null,s.firstEffect=null,s.lastEffect=null,null===(d=s.alternate)?(s.childLanes=0,s.lanes=e,s.child=null,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=d.childLanes,s.lanes=d.lanes,s.child=d.child,s.memoizedProps=d.memoizedProps,s.memoizedState=d.memoizedState,s.updateQueue=d.updateQueue,s.type=d.type,e=d.dependencies,s.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return uo(Ga,1&Ga.current|2),t.child}e=e.sibling}null!==r.tail&&Ho()>Vs&&(t.flags|=64,s=!0,is(r,!1),t.lanes=33554432)}else{if(!s)if(null!==(e=za(d))){if(t.flags|=64,s=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),is(r,!0),null===r.tail&&"hidden"===r.tailMode&&!d.alternate&&!ja)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*Ho()-r.renderingStartTime>Vs&&1073741824!==n&&(t.flags|=64,s=!0,is(r,!1),t.lanes=33554432);r.isBackwards?(d.sibling=t.child,t.child=d):(null!==(n=r.last)?n.sibling=d:t.child=d,r.last=d)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=Ho(),n.sibling=null,t=Ga.current,uo(Ga,s?1&t|2:1&t),n):null;case 23:case 24:return _l(),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 ls(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(Ra(),co(go),co(fo),Ya(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Da(e),null;case 13:return co(Ga),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return co(Ga),null;case 4:return Ra(),null;case 10:return ra(e),null;case 23:case 24:return _l(),null;default:return null}}function ds(e,t){try{var n="",r=t;do{n+=V(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 cs(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Wi=function(){},Yi=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Oa(La.current);var i,s=null;switch(n){case"input":a=J(e,a),r=J(e,r),s=[];break;case"option":a=ae(e,a),r=ae(e,r),s=[];break;case"select":a=o({},a,{value:void 0}),r=o({},r,{value:void 0}),s=[];break;case"textarea":a=se(e,a),r=se(e,r),s=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Fr)}for(u in _e(n,r),n=null,a)if(!r.hasOwnProperty(u)&&a.hasOwnProperty(u)&&null!=a[u])if("style"===u){var d=a[u];for(i in d)d.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(l.hasOwnProperty(u)?s||(s=[]):(s=s||[]).push(u,null));for(u in r){var c=r[u];if(d=null!=a?a[u]:void 0,r.hasOwnProperty(u)&&c!==d&&(null!=c||null!=d))if("style"===u)if(d){for(i in d)!d.hasOwnProperty(i)||c&&c.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in c)c.hasOwnProperty(i)&&d[i]!==c[i]&&(n||(n={}),n[i]=c[i])}else n||(s||(s=[]),s.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,d=d?d.__html:void 0,null!=c&&d!==c&&(s=s||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(s=s||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(l.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&Lr("scroll",e),s||d===c||(s=[])):"object"==typeof c&&null!==c&&c.$$typeof===M?c.toString():(s=s||[]).push(u,c))}n&&(s=s||[]).push("style",n);var u=s;(t.updateQueue=u)&&(t.flags|=4)}},Ki=function(e,t,n,r){n!==r&&(t.flags|=4)};var us="function"==typeof WeakMap?WeakMap:Map;function ps(e,t,n){(n=ca(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ks||(Ks=!0,Xs=r),cs(0,t)},n}function fs(e,t,n){(n=ca(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return cs(0,t),r(o)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Qs?Qs=new Set([this]):Qs.add(this),cs(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var gs="function"==typeof WeakSet?WeakSet:Set;function ms(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){Bl(e,n)}else t.current=null}function hs(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:Xo(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(i(163))}function bs(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)&&(Gl(n,e),Dl(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:Xo(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&ga(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}ga(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&&wt(n)))))}throw Error(i(163))}function vs(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=xe("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 ys(e,t){if(Eo&&"function"==typeof Eo.onCommitFiberUnmount)try{Eo.onCommitFiberUnmount(_o,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))Gl(t,n);else{r=t;try{o()}catch(a){Bl(r,a)}}n=n.next}while(n!==e)}break;case 1:if(ms(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(a){Bl(t,a)}break;case 5:ms(t);break;case 4:Ss(e,t)}}function xs(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 ws(e){return 5===e.tag||3===e.tag||4===e.tag}function ks(e){e:{for(var t=e.return;null!==t;){if(ws(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||ws(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?_s(e,n,t):Es(e,n,t)}function _s(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=Fr));else if(4!==r&&null!==(e=e.child))for(_s(e,t,n),e=e.sibling;null!==e;)_s(e,t,n),e=e.sibling}function Es(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(Es(e,t,n),e=e.sibling;null!==e;)Es(e,t,n),e=e.sibling}function Ss(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 s=e,l=o,d=l;;)if(ys(s,d),null!==d.child&&4!==d.tag)d.child.return=d,d=d.child;else{if(d===l)break e;for(;null===d.sibling;){if(null===d.return||d.return===l)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}r?(s=n,l=o.stateNode,8===s.nodeType?s.parentNode.removeChild(l):s.removeChild(l)):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(ys(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 Cs(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[Qr]=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 s=a[o],l=a[o+1];"style"===s?we(n,l):"dangerouslySetInnerHTML"===s?he(n,l):"children"===s?be(n,l):x(n,s,l,t)}switch(e){case"input":ne(n,r);break;case"textarea":de(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,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Zs=Ho(),vs(t.child,!0)),void Ts(t);case 19:return void Ts(t);case 23:case 24:return void vs(t,null!==t.memoizedState)}throw Error(i(163))}function Ts(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new gs),t.forEach((function(t){var r=$l.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function As(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ls=Math.ceil,Ns=w.ReactCurrentDispatcher,Ps=w.ReactCurrentOwner,Os=0,Is=null,Rs=null,Ms=0,Ds=0,Gs=lo(0),zs=0,Fs=null,Bs=0,js=0,$s=0,Hs=0,Us=null,Zs=0,Vs=1/0;function qs(){Vs=Ho()+500}var Ws,Ys=null,Ks=!1,Xs=null,Qs=null,Js=!1,el=null,tl=90,nl=[],rl=[],ol=null,al=0,il=null,sl=-1,ll=0,dl=0,cl=null,ul=!1;function pl(){return 0!=(48&Os)?Ho():-1!==sl?sl:sl=Ho()}function fl(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Uo()?1:2;if(0===ll&&(ll=Bs),0!==Ko.transition){0!==dl&&(dl=null!==Us?Us.pendingLanes:0),e=ll;var t=4186112&~dl;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Uo(),0!=(4&Os)&&98===e?e=Ft(12,ll):e=Ft(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),ll),e}function gl(e,t,n){if(50<al)throw al=0,il=null,Error(i(185));if(null===(e=ml(e,t)))return null;$t(e,t,n),e===Is&&($s|=t,4===zs&&vl(e,Ms));var r=Uo();1===t?0!=(8&Os)&&0==(48&Os)?yl(e):(hl(e,n),0===Os&&(qs(),Wo())):(0==(4&Os)||98!==r&&99!==r||(null===ol?ol=new Set([e]):ol.add(e)),hl(e,n)),Us=e}function ml(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 hl(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,o=e.pingedLanes,a=e.expirationTimes,s=e.pendingLanes;0<s;){var l=31-Ht(s),d=1<<l,c=a[l];if(-1===c){if(0==(d&r)||0!=(d&o)){c=t,Dt(d);var u=Mt;a[l]=10<=u?c+250:6<=u?c+5e3:-1}}else c<=t&&(e.expiredLanes|=d);s&=~d}if(r=Gt(e,e===Is?Ms:0),t=Mt,0===r)null!==n&&(n!==Go&&To(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Go&&To(n)}15===t?(n=yl.bind(null,e),null===Fo?(Fo=[n],Bo=Co(Oo,Yo)):Fo.push(n),n=Go):14===t?n=qo(99,yl.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=qo(n,bl.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bl(e){if(sl=-1,dl=ll=0,0!=(48&Os))throw Error(i(327));var t=e.callbackNode;if(Ml()&&e.callbackNode!==t)return null;var n=Gt(e,e===Is?Ms:0);if(0===n)return null;var r=n,o=Os;Os|=16;var a=Cl();for(Is===e&&Ms===r||(qs(),El(e,r));;)try{Ll();break}catch(l){Sl(e,l)}if(na(),Ns.current=a,Os=o,null!==Rs?r=0:(Is=null,Ms=0,r=zs),0!=(Bs&$s))El(e,0);else if(0!==r){if(2===r&&(Os|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=zt(e))&&(r=Tl(e,n))),1===r)throw t=Fs,El(e,0),vl(e,n),hl(e,Ho()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Ol(e);break;case 3:if(vl(e,n),(62914560&n)===n&&10<(r=Zs+500-Ho())){if(0!==Gt(e,0))break;if(((o=e.suspendedLanes)&n)!==n){pl(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=Ur(Ol.bind(null,e),r);break}Ol(e);break;case 4:if(vl(e,n),(4186112&n)===n)break;for(r=e.eventTimes,o=-1;0<n;){var s=31-Ht(n);a=1<<s,(s=r[s])>o&&(o=s),n&=~a}if(n=o,10<(n=(120>(n=Ho()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ls(n/1960))-n)){e.timeoutHandle=Ur(Ol.bind(null,e),n);break}Ol(e);break;default:throw Error(i(329))}}return hl(e,Ho()),e.callbackNode===t?bl.bind(null,e):null}function vl(e,t){for(t&=~Hs,t&=~$s,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),r=1<<n;e[n]=-1,t&=~r}}function yl(e){if(0!=(48&Os))throw Error(i(327));if(Ml(),e===Is&&0!=(e.expiredLanes&Ms)){var t=Ms,n=Tl(e,t);0!=(Bs&$s)&&(n=Tl(e,t=Gt(e,t)))}else n=Tl(e,t=Gt(e,0));if(0!==e.tag&&2===n&&(Os|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=zt(e))&&(n=Tl(e,t))),1===n)throw n=Fs,El(e,0),vl(e,t),hl(e,Ho()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ol(e),hl(e,Ho()),null}function xl(e,t){var n=Os;Os|=1;try{return e(t)}finally{0===(Os=n)&&(qs(),Wo())}}function wl(e,t){var n=Os;Os&=-2,Os|=8;try{return e(t)}finally{0===(Os=n)&&(qs(),Wo())}}function kl(e,t){uo(Gs,Ds),Ds|=t,Bs|=t}function _l(){Ds=Gs.current,co(Gs)}function El(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Zr(n)),null!==Rs)for(n=Rs.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&vo();break;case 3:Ra(),co(go),co(fo),Ya();break;case 5:Da(r);break;case 4:Ra();break;case 13:case 19:co(Ga);break;case 10:ra(r);break;case 23:case 24:_l()}n=n.return}Is=e,Rs=Vl(e.current,null),Ms=Ds=Bs=t,zs=0,Fs=null,Hs=$s=js=0}function Sl(e,t){for(;;){var n=Rs;try{if(na(),Ka.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(Qa=0,ti=ei=Ja=null,ri=!1,Ps.current=null,null===n||null===n.return){zs=1,Fs=t,Rs=null;break}e:{var a=e,i=n.return,s=n,l=t;if(t=Ms,s.flags|=2048,s.firstEffect=s.lastEffect=null,null!==l&&"object"==typeof l&&"function"==typeof l.then){var d=l;if(0==(2&s.mode)){var c=s.alternate;c?(s.updateQueue=c.updateQueue,s.memoizedState=c.memoizedState,s.lanes=c.lanes):(s.updateQueue=null,s.memoizedState=null)}var u=0!=(1&Ga.current),p=i;do{var f;if(f=13===p.tag){var g=p.memoizedState;if(null!==g)f=null!==g.dehydrated;else{var m=p.memoizedProps;f=void 0!==m.fallback&&(!0!==m.unstable_avoidThisFallback||!u)}}if(f){var h=p.updateQueue;if(null===h){var b=new Set;b.add(d),p.updateQueue=b}else h.add(d);if(0==(2&p.mode)){if(p.flags|=64,s.flags|=16384,s.flags&=-2981,1===s.tag)if(null===s.alternate)s.tag=17;else{var v=ca(-1,1);v.tag=2,ua(s,v)}s.lanes|=1;break e}l=void 0,s=t;var y=a.pingCache;if(null===y?(y=a.pingCache=new us,l=new Set,y.set(d,l)):void 0===(l=y.get(d))&&(l=new Set,y.set(d,l)),!l.has(s)){l.add(s);var x=jl.bind(null,a,d,s);d.then(x,x)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);l=Error((q(s.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!==zs&&(zs=2),l=ds(l,s),p=i;do{switch(p.tag){case 3:a=l,p.flags|=4096,t&=-t,p.lanes|=t,pa(p,ps(0,a,t));break e;case 1:a=l;var w=p.type,k=p.stateNode;if(0==(64&p.flags)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Qs||!Qs.has(k)))){p.flags|=4096,t&=-t,p.lanes|=t,pa(p,fs(p,a,t));break e}}p=p.return}while(null!==p)}Pl(n)}catch(_){t=_,Rs===n&&null!==n&&(Rs=n=n.return);continue}break}}function Cl(){var e=Ns.current;return Ns.current=Pi,null===e?Pi:e}function Tl(e,t){var n=Os;Os|=16;var r=Cl();for(Is===e&&Ms===t||El(e,t);;)try{Al();break}catch(o){Sl(e,o)}if(na(),Os=n,Ns.current=r,null!==Rs)throw Error(i(261));return Is=null,Ms=0,zs}function Al(){for(;null!==Rs;)Nl(Rs)}function Ll(){for(;null!==Rs&&!Ao();)Nl(Rs)}function Nl(e){var t=Ws(e.alternate,e,Ds);e.memoizedProps=e.pendingProps,null===t?Pl(e):Rs=t,Ps.current=null}function Pl(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ss(n,t,Ds)))return void(Rs=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ds)||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=ls(t)))return n.flags&=2047,void(Rs=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Rs=t);Rs=t=e}while(null!==t);0===zs&&(zs=5)}function Ol(e){var t=Uo();return Vo(99,Il.bind(null,e,t)),null}function Il(e,t){do{Ml()}while(null!==el);if(0!=(48&Os))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 s=e.eventTimes,l=e.expirationTimes;0<a;){var d=31-Ht(a),c=1<<d;o[d]=0,s[d]=-1,l[d]=-1,a&=~c}if(null!==ol&&0==(24&r)&&ol.has(e)&&ol.delete(e),e===Is&&(Rs=Is=null,Ms=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(o=Os,Os|=32,Ps.current=null,Br=Wt,hr(s=mr())){if("selectionStart"in s)l={start:s.selectionStart,end:s.selectionEnd};else e:if(l=(l=s.ownerDocument)&&l.defaultView||window,(c=l.getSelection&&l.getSelection())&&0!==c.rangeCount){l=c.anchorNode,a=c.anchorOffset,d=c.focusNode,c=c.focusOffset;try{l.nodeType,d.nodeType}catch(C){l=null;break e}var u=0,p=-1,f=-1,g=0,m=0,h=s,b=null;t:for(;;){for(var v;h!==l||0!==a&&3!==h.nodeType||(p=u+a),h!==d||0!==c&&3!==h.nodeType||(f=u+c),3===h.nodeType&&(u+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===s)break t;if(b===l&&++g===a&&(p=u),b===d&&++m===c&&(f=u),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}l=-1===p||-1===f?null:{start:p,end:f}}else l=null;l=l||{start:0,end:0}}else l=null;jr={focusedElem:s,selectionRange:l},Wt=!1,cl=null,ul=!1,Ys=r;do{try{Rl()}catch(C){if(null===Ys)throw Error(i(330));Bl(Ys,C),Ys=Ys.nextEffect}}while(null!==Ys);cl=null,Ys=r;do{try{for(s=e;null!==Ys;){var y=Ys.flags;if(16&y&&be(Ys.stateNode,""),128&y){var x=Ys.alternate;if(null!==x){var w=x.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:ks(Ys),Ys.flags&=-3;break;case 6:ks(Ys),Ys.flags&=-3,Cs(Ys.alternate,Ys);break;case 1024:Ys.flags&=-1025;break;case 1028:Ys.flags&=-1025,Cs(Ys.alternate,Ys);break;case 4:Cs(Ys.alternate,Ys);break;case 8:Ss(s,l=Ys);var k=l.alternate;xs(l),null!==k&&xs(k)}Ys=Ys.nextEffect}}catch(C){if(null===Ys)throw Error(i(330));Bl(Ys,C),Ys=Ys.nextEffect}}while(null!==Ys);if(w=jr,x=mr(),y=w.focusedElem,s=w.selectionRange,x!==y&&y&&y.ownerDocument&&gr(y.ownerDocument.documentElement,y)){null!==s&&hr(y)&&(x=s.start,void 0===(w=s.end)&&(w=x),"selectionStart"in y?(y.selectionStart=x,y.selectionEnd=Math.min(w,y.value.length)):(w=(x=y.ownerDocument||document)&&x.defaultView||window).getSelection&&(w=w.getSelection(),l=y.textContent.length,k=Math.min(s.start,l),s=void 0===s.end?k:Math.min(s.end,l),!w.extend&&k>s&&(l=s,s=k,k=l),l=fr(y,k),a=fr(y,s),l&&a&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==a.node||w.focusOffset!==a.offset)&&((x=x.createRange()).setStart(l.node,l.offset),w.removeAllRanges(),k>s?(w.addRange(x),w.extend(a.node,a.offset)):(x.setEnd(a.node,a.offset),w.addRange(x))))),x=[];for(w=y;w=w.parentNode;)1===w.nodeType&&x.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<x.length;y++)(w=x[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Wt=!!Br,jr=Br=null,e.current=n,Ys=r;do{try{for(y=e;null!==Ys;){var _=Ys.flags;if(36&_&&bs(y,Ys.alternate,Ys),128&_){x=void 0;var E=Ys.ref;if(null!==E){var S=Ys.stateNode;Ys.tag,x=S,"function"==typeof E?E(x):E.current=x}}Ys=Ys.nextEffect}}catch(C){if(null===Ys)throw Error(i(330));Bl(Ys,C),Ys=Ys.nextEffect}}while(null!==Ys);Ys=null,zo(),Os=o}else e.current=n;if(Js)Js=!1,el=e,tl=t;else for(Ys=r;null!==Ys;)t=Ys.nextEffect,Ys.nextEffect=null,8&Ys.flags&&((_=Ys).sibling=null,_.stateNode=null),Ys=t;if(0===(r=e.pendingLanes)&&(Qs=null),1===r?e===il?al++:(al=0,il=e):al=0,n=n.stateNode,Eo&&"function"==typeof Eo.onCommitFiberRoot)try{Eo.onCommitFiberRoot(_o,n,void 0,64==(64&n.current.flags))}catch(C){}if(hl(e,Ho()),Ks)throw Ks=!1,e=Xs,Xs=null,e;return 0!=(8&Os)||Wo(),null}function Rl(){for(;null!==Ys;){var e=Ys.alternate;ul||null===cl||(0!=(8&Ys.flags)?Je(Ys,cl)&&(ul=!0):13===Ys.tag&&As(e,Ys)&&Je(Ys,cl)&&(ul=!0));var t=Ys.flags;0!=(256&t)&&hs(e,Ys),0==(512&t)||Js||(Js=!0,qo(97,(function(){return Ml(),null}))),Ys=Ys.nextEffect}}function Ml(){if(90!==tl){var e=97<tl?97:tl;return tl=90,Vo(e,zl)}return!1}function Dl(e,t){nl.push(t,e),Js||(Js=!0,qo(97,(function(){return Ml(),null})))}function Gl(e,t){rl.push(t,e),Js||(Js=!0,qo(97,(function(){return Ml(),null})))}function zl(){if(null===el)return!1;var e=el;if(el=null,0!=(48&Os))throw Error(i(331));var t=Os;Os|=32;var n=rl;rl=[];for(var r=0;r<n.length;r+=2){var o=n[r],a=n[r+1],s=o.destroy;if(o.destroy=void 0,"function"==typeof s)try{s()}catch(d){if(null===a)throw Error(i(330));Bl(a,d)}}for(n=nl,nl=[],r=0;r<n.length;r+=2){o=n[r],a=n[r+1];try{var l=o.create;o.destroy=l()}catch(d){if(null===a)throw Error(i(330));Bl(a,d)}}for(l=e.current.firstEffect;null!==l;)e=l.nextEffect,l.nextEffect=null,8&l.flags&&(l.sibling=null,l.stateNode=null),l=e;return Os=t,Wo(),!0}function Fl(e,t,n){ua(e,t=ps(0,t=ds(n,t),1)),t=pl(),null!==(e=ml(e,1))&&($t(e,1,t),hl(e,t))}function Bl(e,t){if(3===e.tag)Fl(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Fl(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Qs||!Qs.has(r))){var o=fs(n,e=ds(t,e),1);if(ua(n,o),o=pl(),null!==(n=ml(n,1)))$t(n,1,o),hl(n,o);else if("function"==typeof r.componentDidCatch&&(null===Qs||!Qs.has(r)))try{r.componentDidCatch(t,e)}catch(a){}break}}n=n.return}}function jl(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=pl(),e.pingedLanes|=e.suspendedLanes&n,Is===e&&(Ms&n)===n&&(4===zs||3===zs&&(62914560&Ms)===Ms&&500>Ho()-Zs?El(e,0):Hs|=n),hl(e,t)}function $l(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===Uo()?1:2:(0===ll&&(ll=Bs),0===(t=Bt(62914560&~ll))&&(t=4194304))),n=pl(),null!==(e=ml(e,t))&&($t(e,t,n),hl(e,n))}function Hl(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 Ul(e,t,n,r){return new Hl(e,t,n,r)}function Zl(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vl(e,t){var n=e.alternate;return null===n?((n=Ul(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 ql(e,t,n,r,o,a){var s=2;if(r=e,"function"==typeof e)Zl(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case E:return Wl(n.children,o,a,t);case D:s=8,o|=16;break;case S:s=8,o|=1;break;case C:return(e=Ul(12,n,t,8|o)).elementType=C,e.type=C,e.lanes=a,e;case N:return(e=Ul(13,n,t,o)).type=N,e.elementType=N,e.lanes=a,e;case P:return(e=Ul(19,n,t,o)).elementType=P,e.lanes=a,e;case G:return Yl(n,o,a,t);case z:return(e=Ul(24,n,t,o)).elementType=z,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:s=10;break e;case A:s=9;break e;case L:s=11;break e;case O:s=14;break e;case I:s=16,r=null;break e;case R:s=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Ul(s,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Wl(e,t,n,r){return(e=Ul(7,e,r,t)).lanes=n,e}function Yl(e,t,n,r){return(e=Ul(23,e,r,t)).elementType=G,e.lanes=n,e}function Kl(e,t,n){return(e=Ul(6,e,null,t)).lanes=n,e}function Xl(e,t,n){return(t=Ul(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ql(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=jt(0),this.expirationTimes=jt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=jt(0),this.mutableSourceEagerHydrationData=null}function Jl(e,t,n,r){var o=t.current,a=pl(),s=fl(o);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(bo(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}l=l.return}while(null!==l);throw Error(i(171))}if(1===n.tag){var d=n.type;if(bo(d)){n=xo(n,d,l);break e}}n=l}else n=po;return null===t.context?t.context=n:t.pendingContext=n,(t=ca(a,s)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),ua(o,t),gl(o,s,a),s}function ed(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function td(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nd(e,t){td(e,t),(e=e.alternate)&&td(e,t)}function rd(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Ql(e,t,null!=n&&!0===n.hydrate),t=Ul(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,la(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 od(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ad(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a._internalRoot;if("function"==typeof o){var s=o;o=function(){var e=ed(i);s.call(e)}}Jl(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 rd(e,0,t?{hydrate:!0}:void 0)}(n,r),i=a._internalRoot,"function"==typeof o){var l=o;o=function(){var e=ed(i);l.call(e)}}wl((function(){Jl(t,i,e,o)}))}return ed(i)}function id(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!od(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:_,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Ws=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||go.current)Di=!0;else{if(0==(n&r)){switch(Di=!1,t.tag){case 3:Vi(t),qa();break;case 5:Ma(t);break;case 1:bo(t.type)&&wo(t);break;case 4:Ia(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var o=t.type._context;uo(Qo,o._currentValue),o._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Qi(e,t,n):(uo(Ga,1&Ga.current),null!==(t=as(e,t,n))?t.sibling:null);uo(Ga,1&Ga.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return os(e,t,n);t.flags|=64}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),uo(Ga,Ga.current),r)break;return null;case 23:case 24:return t.lanes=0,ji(e,t,n)}return as(e,t,n)}Di=0!=(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,o=ho(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;wo(t)}else a=!1;t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,la(t);var s=r.getDerivedStateFromProps;"function"==typeof s&&ha(t,r,s,e),o.updater=ba,t.stateNode=o,o._reactInternals=t,wa(t,r,e,n),t=Zi(null,t,r,!0,a,n)}else t.tag=0,Gi(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 Zl(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===O)return 14}return 2}(o),e=Xo(o,e),a){case 0:t=Hi(null,t,o,e,n);break e;case 1:t=Ui(null,t,o,e,n);break e;case 11:t=zi(null,t,o,e,n);break e;case 14:t=Fi(null,t,o,Xo(o.type,e),r,n);break e}throw Error(i(306,o,""))}return t;case 0:return r=t.type,o=t.pendingProps,Hi(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 1:return r=t.type,o=t.pendingProps,Ui(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 3:if(Vi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,o=null!==(o=t.memoizedState)?o.element:null,da(e,t),fa(t,r,null,n),(r=t.memoizedState.element)===o)qa(),t=as(e,t,n);else{if((a=(o=t.stateNode).hydrate)&&(Ba=qr(t.stateNode.containerInfo.firstChild),Fa=t,a=ja=!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 Gi(e,t,r,n),qa();t=t.child}return t;case 5:return Ma(t),null===e&&Ua(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,s=o.children,Hr(r,o)?s=null:null!==a&&Hr(r,a)&&(t.flags|=16),$i(e,t),Gi(e,t,s,n),t.child;case 6:return null===e&&Ua(t),null;case 13:return Qi(e,t,n);case 4:return Ia(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ca(t,null,r,n):Gi(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,zi(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 7:return Gi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Gi(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,o=t.pendingProps,s=t.memoizedProps,a=o.value;var l=t.type._context;if(uo(Qo,l._currentValue),l._currentValue=a,null!==s)if(l=s.value,0===(a=dr(l,a)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,a):1073741823))){if(s.children===o.children&&!go.current){t=as(e,t,n);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){var d=l.dependencies;if(null!==d){s=l.child;for(var c=d.firstContext;null!==c;){if(c.context===r&&0!=(c.observedBits&a)){1===l.tag&&((c=ca(-1,n&-n)).tag=2,ua(l,c)),l.lanes|=n,null!==(c=l.alternate)&&(c.lanes|=n),oa(l.return,n),d.lanes|=n;break}c=c.next}}else s=10===l.tag&&l.type===t.type?null:l.child;if(null!==s)s.return=l;else for(s=l;null!==s;){if(s===t){s=null;break}if(null!==(l=s.sibling)){l.return=s.return,s=l;break}s=s.return}l=s}Gi(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,Gi(e,t,r,n),t.child;case 14:return a=Xo(o=t.type,t.pendingProps),Fi(e,t,o,a=Xo(o.type,a),r,n);case 15:return Bi(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:Xo(r,o),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,bo(r)?(e=!0,wo(t)):e=!1,aa(t,n),ya(t,r,o),wa(t,r,o,n),Zi(null,t,r,!0,e,n);case 19:return os(e,t,n);case 23:case 24:return ji(e,t,n)}throw Error(i(156,t.tag))},rd.prototype.render=function(e){Jl(e,this._internalRoot,null,null)},rd.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jl(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(gl(e,4,pl()),nd(e,4))},tt=function(e){13===e.tag&&(gl(e,67108864,pl()),nd(e,67108864))},nt=function(e){if(13===e.tag){var t=pl(),n=fl(e);gl(e,n,t),nd(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));X(r),ne(r,o)}}}break;case"textarea":de(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Oe=xl,Ie=function(e,t,n,r,o){var a=Os;Os|=4;try{return Vo(98,e.bind(null,t,n,r,o))}finally{0===(Os=a)&&(qs(),Wo())}},Re=function(){0==(49&Os)&&(function(){if(null!==ol){var e=ol;ol=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hl(e,Ho())}))}Wo()}(),Ml())},Me=function(e,t){var n=Os;Os|=2;try{return e(t)}finally{0===(Os=n)&&(qs(),Wo())}};var sd={Events:[no,ro,oo,Ne,Pe,Ml,{current:!1}]},ld={findFiberByHostInstance:to,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},dd={bundleType:ld.bundleType,version:ld.version,rendererPackageName:ld.rendererPackageName,rendererConfig:ld.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Qe(e))?null:e.stateNode},findFiberByHostInstance:ld.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cd=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cd.isDisabled&&cd.supportsFiber)try{_o=cd.inject(dd),Eo=cd}catch(me){}}t.hydrate=function(e,t,n){if(!od(t))throw Error(i(200));return ad(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 s,l,d,c;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(c=e.entries();!(l=c.next()).done;)if(!i.has(l.value[0]))return!1;for(c=e.entries();!(l=c.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(c=e.entries();!(l=c.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=(d=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,d[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==d[l]&&"__v"!==d[l]&&"__o"!==d[l]||!e.$$typeof)&&!a(e[d[l]],i[d[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}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>Z,ql:()=>J});var r=n(7294),o=n(5697),a=n.n(o),i=n(9590),s=n.n(i),l=n(1143),d=n.n(l),c=n(6774),u=n.n(c);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},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(h).map((function(e){return h[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}),{}),_=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=_(e,h.TITLE),n=_(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=_(e,"defaultTitle");return t||r||void 0},S=function(e){return _(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[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},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 d=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][d]&&(o[n][d]=!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()},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},N=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}},O=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},I=[h.NOSCRIPT,h.SCRIPT,h.STYLE],R=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},G=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)}))},z=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=D(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=M(n),a=N(t);return o?"<"+e+' data-rh="true" '+o+">"+R(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+R(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return G(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+'="'+R(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===I.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},F=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,d=e.titleAttributes,c=e.linkTags,u=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=P(e.metaTags,y),a=P(t,b),i=P(n,v);return{priorityMethods:{toComponent:function(){return[].concat(G(h.META,o.priority),G(h.LINK,a.priority),G(h.SCRIPT,i.priority))},toString:function(){return z(h.META,o.priority,r)+" "+z(h.LINK,a.priority,r)+" "+z(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=g.priorityMethods,c=g.linkTags,u=g.metaTags,p=g.scriptTags}return{priority:f,base:z(h.BASE,t,r),bodyAttributes:z("bodyAttributes",n,r),htmlAttributes:z("htmlAttributes",o,r),link:z(h.LINK,c,r),meta:z(h.META,u,r),noscript:z(h.NOSCRIPT,a,r),script:z(h.SCRIPT,p,r),style:z(h.STYLE,i,r),title:z(h.TITLE,{title:l,titleAttributes:d},r)}},B=[],j=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=F({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),H=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),U="undefined"!=typeof document,Z=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new j(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);Z.canUseDOM=U,Z.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},Z.defaultProps={context:{}},Z.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},q=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],d=t[l]||"";n.getAttribute(l)!==d&&n.setAttribute(l,d),-1===o.indexOf(l)&&o.push(l);var c=a.indexOf(l);-1!==c&&a.splice(c,1)}for(var u=a.length-1;u>=0;u-=1)n.removeAttribute(a[u]);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,s=e.onChangeClientState,l=e.scriptTags,d=e.styleTags,c=e.title,u=e.titleAttributes;q(h.BODY,e.bodyAttributes),q(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=N(e)),q(h.TITLE,t)}(c,u);var p={baseTag:V(h.BASE,n),linkTags:V(h.LINK,o),metaTags:V(h.META,a),noscriptTags:V(h.NOSCRIPT,i),scriptTags:V(h.SCRIPT,l),styleTags:V(h.STYLE,d)},f={},g={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(g[e]=p[e].oldTags)})),t&&t(),s(e,f,g)},Y=null,K=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!u()(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:_(e,"defer"),encode:_(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(h.LINK,["rel","href"],e),metaTags:A(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:A(h.SCRIPT,["src","innerHTML"],e),styleTags:A(h.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});Z.canUseDOM?(t=a,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){W(t,(function(){Y=null}))})):(W(t),Y=null)):F&&(o=F(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);K.propTypes={context:H.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Q=["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()(O(this.props,"helmetData"),O(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case h.BODY:return p({},o,{bodyAttributes:p({},a)});case h.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return d()(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."),d()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,X),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 h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps: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=m(e,Q),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof j||(a=new j(a.context,a.instances)),a?r.createElement(K,p({},o,{context:a.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(K,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,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,d=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,u=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,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 c:case u:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case d:case p:case h:case m:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===u}t.AsyncMode=c,t.ConcurrentMode=u,t.ContextConsumer=d,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===d},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)===h},t.isMemo=function(e){return w(e)===m},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===u||e===s||e===i||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===l||e.$$typeof===d||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},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 s=n(7294),l=n(5697),d=[],c=[];function u(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=u(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 g(e,t){var u,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return d.push(h),"function"==typeof g.webpack&&c.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),p=u=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),r._loadModule()})),h(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},r}r(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(s.Component),a(u,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),p}function m(e){return g(u,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(p,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}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(h,"propTypes",{report:l.func.isRequired}),a(h,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(d).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=m},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>s,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 s(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:()=>c,rU:()=>h});var r=n(6550),o=n(5068),a=n(7294),i=n(9318),s=n(7462),l=n(3366),d=n(8776),c=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 u=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},g=a.forwardRef;void 0===g&&(g=f);var m=g((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.Z)(e,["innerRef","navigate","onClick"]),d=i.target,c=(0,s.Z)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||d&&"_self"!==d||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=f!==g&&t||n,a.createElement("a",c)}));var h=g((function(e,t){var n=e.component,o=void 0===n?m:n,c=e.replace,h=e.to,b=e.innerRef,v=(0,l.Z)(e,["component","replace","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,d.Z)(!1);var n=e.history,r=p(u(h,e.location),e.location),l=r?n.createHref(r):"",m=(0,s.Z)({},v,{href:l,navigate:function(){var t=u(h,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(p(t));(c||r?n.replace:n.push)(t)}});return f!==g?m.ref=t||b:m.innerRef=b,a.createElement(o,m)}))})),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,c=void 0===i?"active":i,f=e.activeStyle,g=e.className,m=e.exact,y=e.isActive,x=e.location,w=e.sensitive,k=e.strict,_=e.style,E=e.to,S=e.innerRef,C=(0,l.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,d.Z)(!1);var n=x||e.location,i=p(u(E,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.LX)(n.pathname,{path:T,exact:m,sensitive:w,strict:k}):null,L=!!(y?y(A,n):A),N="function"==typeof g?g(L):g,P="function"==typeof _?_(L):_;L&&(N=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(" ")}(N,c),P=(0,s.Z)({},P,f));var O=(0,s.Z)({"aria-current":L&&o||null,className:N,style:P,to:i},C);return b!==v?O.ref=t||S:O.innerRef=S,a.createElement(h,O)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>E,F0:()=>y,LX:()=>_,TH:()=>I,k6:()=>O,rs:()=>N,s6:()=>v});var r=n(5068),o=n(7294),a=n(5697),i=n.n(a),s=n(9318),l=n(8776),d=n(7462),c=n(9658),u=n.n(c),p=(n(9864),n(3366)),f=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[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.Z)(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 d=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[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 d.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:d}},h=function(e){var t=m();return t.displayName=e,t},b=h("Router-History"),v=h("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 x={},w=1e4,k=0;function _(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,d=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:u()(e,o,t),keys:o};return k<w&&(r[e]=a,k++),a}(n,{end:a,strict:s,sensitive:d}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var c=l[0],p=l.slice(1),f=e===c;return a&&!f?null:{path:n,url:"/"===n&&""===c?"/":c,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,l.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?_(n.pathname,e.props):t.match,a=(0,d.Z)({},t,{location:n,match:r}),i=e.props,s=i.children,c=i.component,u=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:c?o.createElement(c,a):u?u(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function S(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=S(e);return 0!==t.pathname.indexOf(n)?t:(0,d.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,s.Ep)(e)}function A(e){return function(){(0,l.Z)(!1)}}function L(){}o.Component;var N=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,l.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?_(a.pathname,(0,d.Z)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var P=o.useContext;function O(){return P(b)}function I(){return P(v).location}},9658:(e,t,n)=>{var r=n(5826);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="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var u=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+u.length,p)s+=p[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],v=n[5],y=n[6],x=n[7];s&&(r.push(s),s="");var w=null!=m&&null!=g&&g!==m,k="+"===y||"*"===y,_="?"===y||"*"===y,E=n[2]||c,S=b||v;r.push({name:h||a++,prefix:m||"",delimiter:E,optional:_,repeat:k,partial:w,asterisk:!!x,pattern:S?d(S):x?".*":"[^"+l(E)+"]+?"})}}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+")$",u(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,d=0;d<e.length;d++){var c=e[d];if("string"!=typeof c){var u,p=s[c.name];if(null==p){if(c.optional){c.partial&&(a+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(p)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(u=l(p[f]),!n[d].test(u))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(u)+"`");a+=(0===f?c.prefix:c.delimiter)+u}}else{if(u=c.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(p),!n[d].test(u))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+u+'"');a+=c.prefix+u}}else a+=c}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function d(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function u(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 d=e[s];if("string"==typeof d)i+=l(d);else{var p=l(d.prefix),f="(?:"+d.pattern+")";t.push(d),d.repeat&&(f+="(?:"+p+f+")*"),i+=f=d.optional?d.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var g=l(n.delimiter||"/"),m=i.slice(-g.length)===g;return o||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=a?"$":o&&m?"":"(?="+g+"|$)",c(new RegExp("^"+i,u(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 c(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 c(new RegExp("(?:"+r.join("|")+")",u(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},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,s=60110,l=60112;t.Suspense=60113;var d=60115,c=60116;if("function"==typeof Symbol&&Symbol.for){var u=Symbol.for;o=u("react.element"),a=u("react.portal"),t.Fragment=u("react.fragment"),t.StrictMode=u("react.strict_mode"),t.Profiler=u("react.profiler"),i=u("react.provider"),s=u("react.context"),l=u("react.forward_ref"),t.Suspense=u("react.suspense"),d=u("react.memo"),c=u("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 g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m={};function h(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}h.prototype.isReactComponent={},h.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")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,r(y,h.prototype),y.isPureReactComponent=!0;var x={current:null},w=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,n){var r,a={},i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)w.call(t,r)&&!k.hasOwnProperty(r)&&(a[r]=t[r]);var l=arguments.length-2;if(1===l)a.children=n;else if(1<l){for(var d=Array(l),c=0;c<l;c++)d[c]=arguments[c+2];a.children=d}if(e&&e.defaultProps)for(r in l=e.defaultProps)void 0===a[r]&&(a[r]=l[r]);return{$$typeof:o,type:e,key:i,ref:s,props:a,_owner:x.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var S=/\/+/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 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 o:case a:l=!0}}if(l)return i=i(l=e),e=""===r?"."+C(l,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(S,"$&/")+"/"),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||l&&l.key===i.key?"":(""+i.key).replace(S,"$&/")+"/")+e)),t.push(i)),1;if(l=0,r=""===r?".":r+":",Array.isArray(e))for(var d=0;d<e.length;d++){var c=r+C(s=e[d],d);l+=T(s,t,n,c,i)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),d=0;!(s=e.next()).done;)l+=T(s=s.value,t,n,c=r+C(s,d++),i);else if("object"===s)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return l}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 N={current:null};function P(){var e=N.current;if(null===e)throw Error(f(321));return e}var O={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:x,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=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,n){if(null==e)throw Error(f(267,e));var a=r({},e.props),i=e.key,s=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,l=x.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var d=e.type.defaultProps;for(c in t)w.call(t,c)&&!k.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==d?d[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=n;else if(1<c){d=Array(c);for(var u=0;u<c;u++)d[u]=arguments[u+2];a.children=d}return{$$typeof:o,type:e.type,key:i,ref:s,props:a,_owner:l}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:s,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:d,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 s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var d=null,c=null,u=function(){if(null!==d)try{var e=t.unstable_now();d(!0,e),d=null}catch(n){throw setTimeout(u,0),n}};n=function(e){null!==d?setTimeout(n,0,e):(d=e,setTimeout(u,0))},r=function(e,t){c=setTimeout(e,t)},o=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var g=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 g&&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 m=!1,h=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 x=new MessageChannel,w=x.port2;x.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?w.postMessage(null):(m=!1,h=null)}catch(n){throw w.postMessage(null),n}}else m=!1},n=function(e){h=e,m||(m=!0,w.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<S(o,t)))break e;e[r]=t,e[n]=o,n=r}}function _(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],s=a+1,l=e[s];if(void 0!==i&&0>S(i,n))void 0!==l&&0>S(l,i)?(e[r]=l,e[s]=n,r=s):(e[r]=i,e[a]=n,r=a);else{if(!(void 0!==l&&0>S(l,n)))break e;e[r]=l,e[s]=n,r=s}}}return t}return null}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],T=[],A=1,L=null,N=3,P=!1,O=!1,I=!1;function R(e){for(var t=_(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=_(T)}}function M(e){if(I=!1,R(e),!O)if(null!==_(C))O=!0,n(D);else{var t=_(T);null!==t&&r(M,t.startTime-e)}}function D(e,n){O=!1,I&&(I=!1,o()),P=!0;var a=N;try{for(R(n),L=_(C);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,N=L.priorityLevel;var s=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?L.callback=s:L===_(C)&&E(C),R(n)}else E(C);L=_(C)}if(null!==L)var l=!0;else{var d=_(T);null!==d&&r(M,d.startTime-n),l=!1}return l}finally{L=null,N=a,P=!1}}var G=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(){O||P||(O=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return N},t.unstable_getFirstCallbackNode=function(){return _(C)},t.unstable_next=function(e){switch(N){case 1:case 2:case 3:var t=3;break;default:t=N}var n=N;N=t;try{return e()}finally{N=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=G,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=N;N=e;try{return t()}finally{N=n}},t.unstable_scheduleCallback=function(e,a,i){var s=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?s+i:s:i=s,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:A++,callback:a,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>s?(e.sortIndex=i,k(T,e),null===_(C)&&e===_(T)&&(I?o():I=!0,r(M,i-s))):(e.sortIndex=l,k(C,e),O||P||(O=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=N;return function(){var n=N;N=t;try{return e.apply(this,arguments)}finally{N=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 s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var d=a[l];if(!s(d))return!1;var c=e[d],u=t[d];if(!1===(o=n?n.call(r,c,u,d):void 0)||void 0===o&&c!==u)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,s=r.useLayoutEffect,l=r.useDebugValue;function d(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var c="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,c=r[1];return s((function(){o.value=n,o.getSnapshot=t,d(o)&&c({inst:o})}),[e,n,t]),i((function(){return d(o)&&c({inst:o}),e((function(){d(o)&&c({inst:o})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:c},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:"Zealot",tagline:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",url:"https://zealot.ews.im",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/zealot.png",i18n:{defaultLocale:"en",locales:["en","zh-Hans"],path:"i18n",localeConfigs:{}},organizationName:"tryzealot",projectName:"docs",presets:[["classic",{docs:{sidebarPath:"/home/runner/work/docs/docs/sidebars.js",editUrl:"https://github.com/tryzealot/docs/tree/main/",lastVersion:"5.0.0",versions:{current:{label:"Next \ud83d\udea7"}}},theme:{customCss:"/home/runner/work/docs/docs/src/css/custom.css"},sitemap:{changefreq:"weekly",priority:.5,ignorePatterns:["/tags/**"],filename:"sitemap.xml"}}]],themeConfig:{navbar:{title:"Zealot",logo:{alt:"Zealot Logo",src:"img/zealot.png",srcDark:"img/zealot-dark.png"},items:[{type:"doc",docId:"self-hosted/index",label:"Self Hosted",position:"left"},{type:"doc",docId:"developer-guide/index",position:"left",label:"Developer Guide"},{type:"doc",docId:"user-guide/index",position:"left",label:"User Guide"},{type:"doc",docId:"contributing-guide/index",position:"left",label:"Contributing Guide"},{type:"doc",docId:"user-guide/changelog",position:"left",label:"Changelog"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsAfter:[{type:"html",value:'<hr class="dropdown-separator">'},{href:"https://tryzealot.github.io/docs-legacy",label:"Legacy docs"}],dropdownItemsBefore:[]},{type:"localeDropdown",position:"right",dropdownItemsBefore:[],dropdownItemsAfter:[]}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Community",items:[{label:"Github Discussions",href:"https://github.com/tryzealot/zealot/discussions"},{label:"Telegram",href:"https://t.me/+csa3Y2KOx44wMGRl"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/tryzealot/zealot"}]}],copyright:"Copyright \xa9 2023 icyleaf. Built with Docusaurus."},prism:{additionalLanguages:["kotlin","java","swift","groovy","ruby","nginx","toml","hcl"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}},{className:"code-block-error-line",line:"This will error"}],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:{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"}}]}},colorMode:{defaultMode:"light",disableSwitch:!1,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('{"/markdown-page-9d5":{"__comp":"1f391b9e","__context":{"plugin":"a7434565"},"content":"393be207"},"/docs/4.x-c9e":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"cae0f04b"},"/docs/4.x/category/administrator-103":{"__comp":"14eb3368","categoryGeneratedIndex":"9c3aeab1"},"/docs/4.x/category/apps-04a":{"__comp":"14eb3368","categoryGeneratedIndex":"6a4aefb0"},"/docs/4.x/category/cloud-provider-guides-f84":{"__comp":"14eb3368","categoryGeneratedIndex":"51763432"},"/docs/4.x/category/configuration-bbc":{"__comp":"14eb3368","categoryGeneratedIndex":"39534802"},"/docs/4.x/category/debug-files-dd6":{"__comp":"14eb3368","categoryGeneratedIndex":"3dd373c6"},"/docs/4.x/category/deployment-469":{"__comp":"14eb3368","categoryGeneratedIndex":"b9de103e"},"/docs/4.x/category/local-development-600":{"__comp":"14eb3368","categoryGeneratedIndex":"cd4eb1ed"},"/docs/4.x/category/monitoring-0aa":{"__comp":"14eb3368","categoryGeneratedIndex":"14094f46"},"/docs/4.x/category/sdks-f90":{"__comp":"14eb3368","categoryGeneratedIndex":"fe6331dc"},"/docs/4.x/category/toolkits-eeb":{"__comp":"14eb3368","categoryGeneratedIndex":"6cdd9503"},"/docs/4.x/contributing-guide/-595":{"__comp":"17896441","content":"72b5199f"},"/docs/4.x/contributing-guide/local-development/devcontainer-8a7":{"__comp":"17896441","content":"14a24e11"},"/docs/4.x/contributing-guide/local-development/source-code-9c2":{"__comp":"17896441","content":"c02123b5"},"/docs/4.x/developer-guide/-ce0":{"__comp":"17896441","content":"31dae65f"},"/docs/4.x/developer-guide/api-074":{"__comp":"17896441","content":"6c0d6c9a"},"/docs/4.x/developer-guide/api/apps-213":{"__comp":"17896441","content":"616acc84"},"/docs/4.x/developer-guide/api/debug_files-632":{"__comp":"17896441","content":"f9b37612"},"/docs/4.x/developer-guide/fastlane-9ff":{"__comp":"17896441","content":"c9fa300e"},"/docs/4.x/developer-guide/fastlane/zealot-191":{"__comp":"17896441","content":"c01945e0"},"/docs/4.x/developer-guide/fastlane/zealot_debug_file-187":{"__comp":"17896441","content":"ea003b3f"},"/docs/4.x/developer-guide/fastlane/zealot_sync_devices-609":{"__comp":"17896441","content":"ad4ca79f"},"/docs/4.x/developer-guide/fastlane/zealot_version_check-8f5":{"__comp":"17896441","content":"e7a8c7f9"},"/docs/4.x/developer-guide/sdk/android-dd8":{"__comp":"17896441","content":"aecd11f5"},"/docs/4.x/developer-guide/sdk/ios-d34":{"__comp":"17896441","content":"84706228"},"/docs/4.x/self-hosted/-472":{"__comp":"17896441","content":"fb7a7e13"},"/docs/4.x/self-hosted/configuration/environment-variables-78e":{"__comp":"17896441","content":"55db4623"},"/docs/4.x/self-hosted/configuration/schedule-jobs-db7":{"__comp":"17896441","content":"889fb5f5"},"/docs/4.x/self-hosted/configuration/third-party-authentication-8f0":{"__comp":"17896441","content":"69bb3584"},"/docs/4.x/self-hosted/deployment/architecture-575":{"__comp":"17896441","content":"5a522f46"},"/docs/4.x/self-hosted/deployment/docker-a96":{"__comp":"17896441","content":"2b8fdfa9"},"/docs/4.x/self-hosted/deployment/docker/step-by-step-f5a":{"__comp":"17896441","content":"52f780b0"},"/docs/4.x/self-hosted/deployment/fly-777":{"__comp":"17896441","content":"30a84665"},"/docs/4.x/self-hosted/deployment/kubernetes-80b":{"__comp":"17896441","content":"799ffaed"},"/docs/4.x/self-hosted/deployment/nomad-4be":{"__comp":"17896441","content":"ef513ce2"},"/docs/4.x/self-hosted/deployment/railway-6d9":{"__comp":"17896441","content":"b272fba4"},"/docs/4.x/self-hosted/deployment/render-23a":{"__comp":"17896441","content":"ddf401e0"},"/docs/4.x/self-hosted/deployment/requirements-9ee":{"__comp":"17896441","content":"21b281f9"},"/docs/4.x/self-hosted/deployment/source-code-2e3":{"__comp":"17896441","content":"35a98222"},"/docs/4.x/self-hosted/reverse-proxies-c94":{"__comp":"17896441","content":"f8a75f5e"},"/docs/4.x/self-hosted/storage-d32":{"__comp":"17896441","content":"220930de"},"/docs/4.x/user-guide/-814":{"__comp":"17896441","content":"5f8b303a"},"/docs/4.x/user-guide/administrator/apple-team-a72":{"__comp":"17896441","content":"5ec84ac2"},"/docs/4.x/user-guide/administrator/backup-846":{"__comp":"17896441","content":"1b734938"},"/docs/4.x/user-guide/administrator/monitoring/background-jobs-7ea":{"__comp":"17896441","content":"5da52b15"},"/docs/4.x/user-guide/administrator/monitoring/database-analytics-671":{"__comp":"17896441","content":"bf6ff0a4"},"/docs/4.x/user-guide/administrator/monitoring/logging-578":{"__comp":"17896441","content":"25301e6f"},"/docs/4.x/user-guide/administrator/monitoring/system-info-b65":{"__comp":"17896441","content":"8aa13b20"},"/docs/4.x/user-guide/administrator/permissions-adb":{"__comp":"17896441","content":"699a8fef"},"/docs/4.x/user-guide/administrator/project-settings-3b3":{"__comp":"17896441","content":"a949db22"},"/docs/4.x/user-guide/apps/create-af8":{"__comp":"17896441","content":"35a60b9c"},"/docs/4.x/user-guide/best_practices-fd7":{"__comp":"17896441","content":"8992496f"},"/docs/4.x/user-guide/changelog-88f":{"__comp":"17896441","content":"4d44c677"},"/docs/4.x/user-guide/credits-2b3":{"__comp":"17896441","content":"4cad2fe6"},"/docs/4.x/user-guide/dashboard-70e":{"__comp":"17896441","content":"4c432e95"},"/docs/4.x/user-guide/debug-files/upload-03e":{"__comp":"17896441","content":"002e3694"},"/docs/4.x/user-guide/qa-67e":{"__comp":"17896441","content":"3ee87be9"},"/docs/4.x/user-guide/toolkits/fetch-udid-b2a":{"__comp":"17896441","content":"52d3380a"},"/docs/4.x/user-guide/toolkits/teardown-8c8":{"__comp":"17896441","content":"bbec0ea8"},"/docs/4.x/user-guide/webhooks-322":{"__comp":"17896441","content":"e40683f4"},"/docs/4.x/user-guide/webhooks/dingtalk-54a":{"__comp":"17896441","content":"9e3eaffa"},"/docs/4.x/user-guide/webhooks/discord-e9c":{"__comp":"17896441","content":"2dc3018f"},"/docs/4.x/user-guide/webhooks/feishu-670":{"__comp":"17896441","content":"c0aa555d"},"/docs/4.x/user-guide/webhooks/slack-815":{"__comp":"17896441","content":"b5e1e414"},"/docs/4.x/user-guide/webhooks/wecom-8ae":{"__comp":"17896441","content":"011dea14"},"/docs/next-1c1":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"935f2afb"},"/docs/next/category/administrator-380":{"__comp":"14eb3368","categoryGeneratedIndex":"78cdd3ae"},"/docs/next/category/apps-102":{"__comp":"14eb3368","categoryGeneratedIndex":"20ab3326"},"/docs/next/category/cloud-provider-guides-df8":{"__comp":"14eb3368","categoryGeneratedIndex":"d59c50f6"},"/docs/next/category/configuration-1f8":{"__comp":"14eb3368","categoryGeneratedIndex":"226ba89c"},"/docs/next/category/debug-files-bf7":{"__comp":"14eb3368","categoryGeneratedIndex":"8bf7b385"},"/docs/next/category/deployment-de4":{"__comp":"14eb3368","categoryGeneratedIndex":"ab71d4e1"},"/docs/next/category/local-development-b0d":{"__comp":"14eb3368","categoryGeneratedIndex":"367ed454"},"/docs/next/category/monitoring-f5c":{"__comp":"14eb3368","categoryGeneratedIndex":"bdd7b463"},"/docs/next/category/sdks-34d":{"__comp":"14eb3368","categoryGeneratedIndex":"ef294a35"},"/docs/next/category/toolkits-00e":{"__comp":"14eb3368","categoryGeneratedIndex":"c8054fdf"},"/docs/next/contributing-guide/-414":{"__comp":"17896441","content":"600ac4e1"},"/docs/next/contributing-guide/local-development/devcontainer-499":{"__comp":"17896441","content":"0da88c94"},"/docs/next/contributing-guide/local-development/source-code-475":{"__comp":"17896441","content":"4bf92ea9"},"/docs/next/developer-guide/-796":{"__comp":"17896441","content":"848dab9f"},"/docs/next/developer-guide/api-2d3":{"__comp":"17896441","content":"45ab56fc"},"/docs/next/developer-guide/api/apps-ac7":{"__comp":"17896441","content":"f02d2d32"},"/docs/next/developer-guide/api/debug_files-aa9":{"__comp":"17896441","content":"aaab4dd5"},"/docs/next/developer-guide/fastlane-50f":{"__comp":"17896441","content":"adf2c0d2"},"/docs/next/developer-guide/fastlane/zealot-ce6":{"__comp":"17896441","content":"ede4b0bb"},"/docs/next/developer-guide/fastlane/zealot_debug_file-79f":{"__comp":"17896441","content":"d1dd54d0"},"/docs/next/developer-guide/fastlane/zealot_sync_devices-bde":{"__comp":"17896441","content":"0e2cdf96"},"/docs/next/developer-guide/fastlane/zealot_version_check-95a":{"__comp":"17896441","content":"bc9a5c2d"},"/docs/next/developer-guide/sdk/android-815":{"__comp":"17896441","content":"43ef865f"},"/docs/next/developer-guide/sdk/ios-1eb":{"__comp":"17896441","content":"c5b0ab6a"},"/docs/next/self-hosted/-4a8":{"__comp":"17896441","content":"5f153871"},"/docs/next/self-hosted/configuration/environment-variables-d1d":{"__comp":"17896441","content":"f90fa3e0"},"/docs/next/self-hosted/configuration/schedule-jobs-396":{"__comp":"17896441","content":"56af2409"},"/docs/next/self-hosted/configuration/third-party-authentication-4ed":{"__comp":"17896441","content":"566ccdfa"},"/docs/next/self-hosted/deployment/architecture-820":{"__comp":"17896441","content":"d4be948d"},"/docs/next/self-hosted/deployment/docker-bab":{"__comp":"17896441","content":"84e62756"},"/docs/next/self-hosted/deployment/docker/step-by-step-b7c":{"__comp":"17896441","content":"fa199c0f"},"/docs/next/self-hosted/deployment/fly-35b":{"__comp":"17896441","content":"0e6c8da6"},"/docs/next/self-hosted/deployment/kubernetes-db7":{"__comp":"17896441","content":"b4e44ac6"},"/docs/next/self-hosted/deployment/nomad-022":{"__comp":"17896441","content":"dd05d4e3"},"/docs/next/self-hosted/deployment/railway-042":{"__comp":"17896441","content":"f8e38d3d"},"/docs/next/self-hosted/deployment/render-a27":{"__comp":"17896441","content":"784c299a"},"/docs/next/self-hosted/deployment/requirements-274":{"__comp":"17896441","content":"09ee1501"},"/docs/next/self-hosted/deployment/source-code-d47":{"__comp":"17896441","content":"37ca8f58"},"/docs/next/self-hosted/reverse-proxies-f22":{"__comp":"17896441","content":"477073af"},"/docs/next/self-hosted/storage-e44":{"__comp":"17896441","content":"5df973a0"},"/docs/next/user-guide/-3eb":{"__comp":"17896441","content":"7737c9f3"},"/docs/next/user-guide/administrator/apple-team-71d":{"__comp":"17896441","content":"27385049"},"/docs/next/user-guide/administrator/backup-1c6":{"__comp":"17896441","content":"9da9701d"},"/docs/next/user-guide/administrator/monitoring/background-jobs-24f":{"__comp":"17896441","content":"88e80bd0"},"/docs/next/user-guide/administrator/monitoring/database-analytics-708":{"__comp":"17896441","content":"cd085125"},"/docs/next/user-guide/administrator/monitoring/logging-621":{"__comp":"17896441","content":"0b1f21de"},"/docs/next/user-guide/administrator/monitoring/system-info-68b":{"__comp":"17896441","content":"1129db35"},"/docs/next/user-guide/administrator/permissions-347":{"__comp":"17896441","content":"58234510"},"/docs/next/user-guide/administrator/settings-75a":{"__comp":"17896441","content":"39b02d66"},"/docs/next/user-guide/apps/-0f2":{"__comp":"17896441","content":"454f6929"},"/docs/next/user-guide/apps/create-679":{"__comp":"17896441","content":"1e930e9c"},"/docs/next/user-guide/apps/detail-a89":{"__comp":"17896441","content":"433a7c95"},"/docs/next/user-guide/apps/upload-e60":{"__comp":"17896441","content":"f906dd81"},"/docs/next/user-guide/best_practices-5ea":{"__comp":"17896441","content":"99e3e97f"},"/docs/next/user-guide/changelog-b74":{"__comp":"17896441","content":"c53e755e"},"/docs/next/user-guide/credits-535":{"__comp":"17896441","content":"eb2d718d"},"/docs/next/user-guide/dashboard-a36":{"__comp":"17896441","content":"0a799d0e"},"/docs/next/user-guide/debug-files/-727":{"__comp":"17896441","content":"6573317f"},"/docs/next/user-guide/debug-files/review-e27":{"__comp":"17896441","content":"aaf82ead"},"/docs/next/user-guide/debug-files/upload-f76":{"__comp":"17896441","content":"60fb9086"},"/docs/next/user-guide/qa-fd5":{"__comp":"17896441","content":"e92f4833"},"/docs/next/user-guide/toolkits/fetch-udid-cf3":{"__comp":"17896441","content":"5c74b3a7"},"/docs/next/user-guide/toolkits/teardown-98d":{"__comp":"17896441","content":"14fae669"},"/docs/next/user-guide/webhooks-795":{"__comp":"17896441","content":"45923ef2"},"/docs/next/user-guide/webhooks/dingtalk-b50":{"__comp":"17896441","content":"f3108074"},"/docs/next/user-guide/webhooks/discord-e4a":{"__comp":"17896441","content":"fe140d6b"},"/docs/next/user-guide/webhooks/feishu-066":{"__comp":"17896441","content":"4b3973b8"},"/docs/next/user-guide/webhooks/slack-484":{"__comp":"17896441","content":"10830de6"},"/docs/next/user-guide/webhooks/wecom-241":{"__comp":"17896441","content":"88f9ce8f"},"/docs-b73":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"c9b278a8"},"/docs/category/administrator-614":{"__comp":"14eb3368","categoryGeneratedIndex":"bdc68495"},"/docs/category/apps-e5b":{"__comp":"14eb3368","categoryGeneratedIndex":"5a3653dd"},"/docs/category/cloud-provider-guides-15e":{"__comp":"14eb3368","categoryGeneratedIndex":"437849bc"},"/docs/category/configuration-28b":{"__comp":"14eb3368","categoryGeneratedIndex":"1caa3b90"},"/docs/category/debug-files-a8f":{"__comp":"14eb3368","categoryGeneratedIndex":"1efa993c"},"/docs/category/deployment-cf3":{"__comp":"14eb3368","categoryGeneratedIndex":"1addd124"},"/docs/category/local-development-411":{"__comp":"14eb3368","categoryGeneratedIndex":"7386cd72"},"/docs/category/monitoring-1ad":{"__comp":"14eb3368","categoryGeneratedIndex":"5191259b"},"/docs/category/sdks-28f":{"__comp":"14eb3368","categoryGeneratedIndex":"7e370ea7"},"/docs/category/toolkits-f3f":{"__comp":"14eb3368","categoryGeneratedIndex":"aceb8a36"},"/docs/contributing-guide/-1c7":{"__comp":"17896441","content":"49206f6f"},"/docs/contributing-guide/local-development/devcontainer-6bc":{"__comp":"17896441","content":"8f9c93ae"},"/docs/contributing-guide/local-development/source-code-20c":{"__comp":"17896441","content":"2c0f0ab1"},"/docs/developer-guide/-efd":{"__comp":"17896441","content":"77590075"},"/docs/developer-guide/api-479":{"__comp":"17896441","content":"6768319c"},"/docs/developer-guide/api/apps-b42":{"__comp":"17896441","content":"c3e055b8"},"/docs/developer-guide/api/debug_files-e16":{"__comp":"17896441","content":"b56911e0"},"/docs/developer-guide/fastlane-1a0":{"__comp":"17896441","content":"687041db"},"/docs/developer-guide/fastlane/zealot-e1d":{"__comp":"17896441","content":"a1f04802"},"/docs/developer-guide/fastlane/zealot_debug_file-d03":{"__comp":"17896441","content":"b7ca75af"},"/docs/developer-guide/fastlane/zealot_sync_devices-b34":{"__comp":"17896441","content":"2020b7aa"},"/docs/developer-guide/fastlane/zealot_version_check-1b7":{"__comp":"17896441","content":"20b08819"},"/docs/developer-guide/sdk/android-3a2":{"__comp":"17896441","content":"45256cfe"},"/docs/developer-guide/sdk/ios-c33":{"__comp":"17896441","content":"48295ea8"},"/docs/self-hosted/-666":{"__comp":"17896441","content":"bc9d66cc"},"/docs/self-hosted/configuration/environment-variables-d7d":{"__comp":"17896441","content":"7ab8d5f3"},"/docs/self-hosted/configuration/schedule-jobs-a57":{"__comp":"17896441","content":"a087da7b"},"/docs/self-hosted/configuration/third-party-authentication-7f5":{"__comp":"17896441","content":"2593a83b"},"/docs/self-hosted/deployment/architecture-e1c":{"__comp":"17896441","content":"9d2c8d89"},"/docs/self-hosted/deployment/docker-a75":{"__comp":"17896441","content":"41f50648"},"/docs/self-hosted/deployment/docker/step-by-step-bf4":{"__comp":"17896441","content":"93688e09"},"/docs/self-hosted/deployment/fly-ed1":{"__comp":"17896441","content":"10daa3a4"},"/docs/self-hosted/deployment/kubernetes-e83":{"__comp":"17896441","content":"897621f7"},"/docs/self-hosted/deployment/nomad-15f":{"__comp":"17896441","content":"b8b76bfb"},"/docs/self-hosted/deployment/railway-df1":{"__comp":"17896441","content":"aaf543f1"},"/docs/self-hosted/deployment/render-766":{"__comp":"17896441","content":"71b71564"},"/docs/self-hosted/deployment/requirements-8ec":{"__comp":"17896441","content":"e6546d07"},"/docs/self-hosted/deployment/source-code-0d9":{"__comp":"17896441","content":"8ac0e0b2"},"/docs/self-hosted/reverse-proxies-42c":{"__comp":"17896441","content":"14b2f636"},"/docs/self-hosted/storage-ca7":{"__comp":"17896441","content":"36bff928"},"/docs/user-guide/-853":{"__comp":"17896441","content":"aef75111"},"/docs/user-guide/administrator/apple-team-f62":{"__comp":"17896441","content":"a8003ee7"},"/docs/user-guide/administrator/backup-240":{"__comp":"17896441","content":"bf0a73a8"},"/docs/user-guide/administrator/monitoring/background-jobs-a44":{"__comp":"17896441","content":"da03b20b"},"/docs/user-guide/administrator/monitoring/database-analytics-d89":{"__comp":"17896441","content":"475cf40c"},"/docs/user-guide/administrator/monitoring/logging-8d8":{"__comp":"17896441","content":"79fb26a6"},"/docs/user-guide/administrator/monitoring/system-info-71b":{"__comp":"17896441","content":"e532b6bb"},"/docs/user-guide/administrator/permissions-0d3":{"__comp":"17896441","content":"7d49456b"},"/docs/user-guide/administrator/project-settings-737":{"__comp":"17896441","content":"d02aa106"},"/docs/user-guide/administrator/settings-ca5":{"__comp":"17896441","content":"c94f5806"},"/docs/user-guide/apps/-621":{"__comp":"17896441","content":"f6a4c755"},"/docs/user-guide/apps/create-bfc":{"__comp":"17896441","content":"286cd782"},"/docs/user-guide/apps/detail-9a6":{"__comp":"17896441","content":"58e8de69"},"/docs/user-guide/apps/upload-1b1":{"__comp":"17896441","content":"90050cbc"},"/docs/user-guide/best_practices-91c":{"__comp":"17896441","content":"674c5fcf"},"/docs/user-guide/changelog-b06":{"__comp":"17896441","content":"f0954aa2"},"/docs/user-guide/credits-7f0":{"__comp":"17896441","content":"1948baf2"},"/docs/user-guide/dashboard-aaf":{"__comp":"17896441","content":"56f1fb64"},"/docs/user-guide/debug-files/-70a":{"__comp":"17896441","content":"8cddcc36"},"/docs/user-guide/debug-files/review-dbc":{"__comp":"17896441","content":"61175dc6"},"/docs/user-guide/debug-files/upload-601":{"__comp":"17896441","content":"a86b8a96"},"/docs/user-guide/qa-569":{"__comp":"17896441","content":"db37eded"},"/docs/user-guide/toolkits/fetch-udid-ac3":{"__comp":"17896441","content":"0efaccc0"},"/docs/user-guide/toolkits/teardown-f07":{"__comp":"17896441","content":"49510311"},"/docs/user-guide/webhooks-6ea":{"__comp":"17896441","content":"fe4d1fcf"},"/docs/user-guide/webhooks/dingtalk-44c":{"__comp":"17896441","content":"1cb76857"},"/docs/user-guide/webhooks/discord-2e3":{"__comp":"17896441","content":"708d50e3"},"/docs/user-guide/webhooks/feishu-96d":{"__comp":"17896441","content":"568a2802"},"/docs/user-guide/webhooks/slack-5cf":{"__comp":"17896441","content":"a7227298"},"/docs/user-guide/webhooks/wecom-f9b":{"__comp":"17896441","content":"f944a33e"},"/-fc2":{"__comp":"c4f5d8e4","__context":{"plugin":"a7434565"},"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.5e42589e.js b/assets/js/main.5e42589e.js new file mode 100644 index 000000000..edc7c2257 --- /dev/null +++ b/assets/js/main.5e42589e.js @@ -0,0 +1,2 @@ +/*! For license information please see main.5e42589e.js.LICENSE.txt */ +(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[179],{4334:(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}},7459:(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}},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),s=n(6887);const l={"002e3694":[()=>n.e(3335).then(n.bind(n,5112)),"@site/versioned_docs/version-4.x/user-guide/debug-files/upload.md",5112],"011dea14":[()=>n.e(2546).then(n.bind(n,8923)),"@site/versioned_docs/version-4.x/user-guide/webhooks/wecom.md",8923],"09ee1501":[()=>n.e(9578).then(n.bind(n,4701)),"@site/docs/self-hosted/deployment/requirements.md",4701],"0a799d0e":[()=>n.e(8823).then(n.bind(n,6130)),"@site/docs/user-guide/dashboard.md",6130],"0b1f21de":[()=>n.e(1988).then(n.bind(n,7090)),"@site/docs/user-guide/administrator/monitoring/logging.mdx",7090],"0da88c94":[()=>Promise.all([n.e(532),n.e(112)]).then(n.bind(n,2831)),"@site/docs/contributing-guide/local-development/devcontainer.md",2831],"0e2cdf96":[()=>n.e(648).then(n.bind(n,5770)),"@site/docs/developer-guide/fastlane/zealot_sync_devices.md",5770],"0e6c8da6":[()=>n.e(2256).then(n.bind(n,7369)),"@site/docs/self-hosted/deployment/fly.md",7369],"0efaccc0":[()=>n.e(7372).then(n.bind(n,3485)),"@site/versioned_docs/version-5.0.0/user-guide/toolkits/fetch-udid.mdx",3485],"10830de6":[()=>n.e(8995).then(n.bind(n,8572)),"@site/docs/user-guide/webhooks/slack.md",8572],"10daa3a4":[()=>n.e(58).then(n.bind(n,4382)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/fly.md",4382],"1129db35":[()=>n.e(4070).then(n.bind(n,6792)),"@site/docs/user-guide/administrator/monitoring/system-info.mdx",6792],"14094f46":[()=>n.e(8422).then(n.t.bind(n,9807,19)),"~docs/default/category-docs-4-x-userguide-category-monitoring-186.json",9807],"14a24e11":[()=>Promise.all([n.e(532),n.e(7400)]).then(n.bind(n,6824)),"@site/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",6824],"14b2f636":[()=>Promise.all([n.e(532),n.e(5672)]).then(n.bind(n,8717)),"@site/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",8717],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],"14fae669":[()=>n.e(2197).then(n.bind(n,990)),"@site/docs/user-guide/toolkits/teardown.mdx",990],17896441:[()=>Promise.all([n.e(532),n.e(6097),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"1948baf2":[()=>n.e(5208).then(n.bind(n,2357)),"@site/versioned_docs/version-5.0.0/user-guide/credits.md",2357],"1addd124":[()=>n.e(5979).then(n.t.bind(n,8943,19)),"~docs/default/category-docs-selfhosted-category-deployment-bab.json",8943],"1b734938":[()=>n.e(4684).then(n.bind(n,4952)),"@site/versioned_docs/version-4.x/user-guide/administrator/backup.md",4952],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1caa3b90":[()=>n.e(4029).then(n.t.bind(n,973,19)),"~docs/default/category-docs-selfhosted-category-configuration-a96.json",973],"1cb76857":[()=>n.e(8735).then(n.bind(n,9195)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/dingtalk.md",9195],"1e930e9c":[()=>n.e(5566).then(n.bind(n,8862)),"@site/docs/user-guide/apps/create.mdx",8862],"1efa993c":[()=>n.e(1010).then(n.t.bind(n,9848,19)),"~docs/default/category-docs-userguide-category-debug-files-a9a.json",9848],"1f391b9e":[()=>Promise.all([n.e(532),n.e(6097),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"2020b7aa":[()=>n.e(7143).then(n.bind(n,7091)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_sync_devices.md",7091],"20ab3326":[()=>n.e(5696).then(n.t.bind(n,1809,19)),"~docs/default/category-docsnext-userguide-category-apps-a41.json",1809],"20b08819":[()=>n.e(2387).then(n.bind(n,3964)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_version_check.md",3964],"21b281f9":[()=>n.e(3523).then(n.bind(n,7481)),"@site/versioned_docs/version-4.x/self-hosted/deployment/requirements.md",7481],"220930de":[()=>n.e(1461).then(n.bind(n,3524)),"@site/versioned_docs/version-4.x/self-hosted/storage.md",3524],"226ba89c":[()=>n.e(689).then(n.t.bind(n,5173,19)),"~docs/default/category-docsnext-selfhosted-category-configuration-d39.json",5173],"247783bb":[()=>n.e(9334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"25301e6f":[()=>n.e(8843).then(n.bind(n,7781)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/logging.md",7781],"2593a83b":[()=>n.e(4643).then(n.bind(n,5009)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/third-party-authentication.md",5009],27385049:[()=>n.e(4910).then(n.bind(n,4445)),"@site/docs/user-guide/administrator/apple-team.mdx",4445],"286cd782":[()=>n.e(6782).then(n.bind(n,4256)),"@site/versioned_docs/version-5.0.0/user-guide/apps/create.mdx",4256],"2b8fdfa9":[()=>n.e(5281).then(n.bind(n,5728)),"@site/versioned_docs/version-4.x/self-hosted/deployment/docker.md",5728],"2c0f0ab1":[()=>Promise.all([n.e(532),n.e(1440)]).then(n.bind(n,8958)),"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",8958],"2dc3018f":[()=>n.e(9852).then(n.bind(n,4830)),"@site/versioned_docs/version-4.x/user-guide/webhooks/discord.md",4830],"30a84665":[()=>n.e(957).then(n.bind(n,8738)),"@site/versioned_docs/version-4.x/self-hosted/deployment/fly.md",8738],"31dae65f":[()=>n.e(4750).then(n.bind(n,9967)),"@site/versioned_docs/version-4.x/developer-guide/index.md",9967],"35a60b9c":[()=>n.e(8138).then(n.bind(n,4668)),"@site/versioned_docs/version-4.x/user-guide/apps/create.md",4668],"35a98222":[()=>n.e(8719).then(n.bind(n,6816)),"@site/versioned_docs/version-4.x/self-hosted/deployment/source-code.md",6816],"367ed454":[()=>n.e(5862).then(n.t.bind(n,2801,19)),"~docs/default/category-docsnext-contributingguide-category-local-development-1dc.json",2801],"36bff928":[()=>n.e(4203).then(n.bind(n,1565)),"@site/versioned_docs/version-5.0.0/self-hosted/storage.md",1565],"37ca8f58":[()=>n.e(8336).then(n.bind(n,9470)),"@site/docs/self-hosted/deployment/source-code.md",9470],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],39534802:[()=>n.e(9512).then(n.t.bind(n,7649,19)),"~docs/default/category-docs-4-x-selfhosted-category-configuration-1a5.json",7649],"39b02d66":[()=>n.e(2923).then(n.bind(n,4950)),"@site/docs/user-guide/administrator/settings.mdx",4950],"3dd373c6":[()=>n.e(8253).then(n.t.bind(n,6423,19)),"~docs/default/category-docs-4-x-userguide-category-debug-files-74f.json",6423],"3ee87be9":[()=>n.e(9120).then(n.bind(n,9953)),"@site/versioned_docs/version-4.x/user-guide/qa.md",9953],"41f50648":[()=>n.e(2813).then(n.bind(n,9366)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/docker.md",9366],"433a7c95":[()=>n.e(315).then(n.bind(n,2806)),"@site/docs/user-guide/apps/detail.mdx",2806],"437849bc":[()=>n.e(8846).then(n.t.bind(n,5120,19)),"~docs/default/category-docs-selfhosted-category-cloud-provider-guides-fb8.json",5120],"43ef865f":[()=>Promise.all([n.e(532),n.e(2855)]).then(n.bind(n,7067)),"@site/docs/developer-guide/sdk/android.md",7067],"45256cfe":[()=>Promise.all([n.e(532),n.e(3803)]).then(n.bind(n,7413)),"@site/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",7413],"454f6929":[()=>n.e(266).then(n.bind(n,7293)),"@site/docs/user-guide/apps/index.mdx",7293],"45923ef2":[()=>n.e(1570).then(n.bind(n,834)),"@site/docs/user-guide/webhooks.md",834],"45ab56fc":[()=>n.e(6219).then(n.bind(n,6575)),"@site/docs/developer-guide/api.md",6575],"475cf40c":[()=>n.e(9873).then(n.bind(n,4284)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/database-analytics.mdx",4284],"477073af":[()=>Promise.all([n.e(532),n.e(3385)]).then(n.bind(n,6292)),"@site/docs/self-hosted/reverse-proxies.mdx",6292],"48295ea8":[()=>Promise.all([n.e(532),n.e(614)]).then(n.bind(n,6293)),"@site/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",6293],"49206f6f":[()=>n.e(3855).then(n.bind(n,5700)),"@site/versioned_docs/version-5.0.0/contributing-guide/index.md",5700],49510311:[()=>n.e(9455).then(n.bind(n,3323)),"@site/versioned_docs/version-5.0.0/user-guide/toolkits/teardown.mdx",3323],"4b3973b8":[()=>n.e(6926).then(n.bind(n,9945)),"@site/docs/user-guide/webhooks/feishu.md",9945],"4bf92ea9":[()=>Promise.all([n.e(532),n.e(2957)]).then(n.bind(n,282)),"@site/docs/contributing-guide/local-development/source-code.md",282],"4c432e95":[()=>n.e(1175).then(n.bind(n,5359)),"@site/versioned_docs/version-4.x/user-guide/dashboard.md",5359],"4cad2fe6":[()=>n.e(5729).then(n.bind(n,6282)),"@site/versioned_docs/version-4.x/user-guide/credits.md",6282],"4d44c677":[()=>n.e(564).then(n.bind(n,4862)),"@site/versioned_docs/version-4.x/user-guide/changelog.md",4862],51763432:[()=>n.e(3099).then(n.t.bind(n,1368,19)),"~docs/default/category-docs-4-x-selfhosted-category-cloud-provider-guides-f1d.json",1368],"5191259b":[()=>n.e(2018).then(n.t.bind(n,4025,19)),"~docs/default/category-docs-userguide-category-monitoring-cf9.json",4025],"52d3380a":[()=>n.e(1261).then(n.bind(n,5134)),"@site/versioned_docs/version-4.x/user-guide/toolkits/fetch-udid.mdx",5134],"52f780b0":[()=>n.e(1489).then(n.bind(n,9693)),"@site/versioned_docs/version-4.x/self-hosted/deployment/docker/step-by-step.md",9693],"55db4623":[()=>n.e(7133).then(n.bind(n,1931)),"@site/versioned_docs/version-4.x/self-hosted/configuration/environment-variables.md",1931],"566ccdfa":[()=>n.e(2710).then(n.bind(n,1986)),"@site/docs/self-hosted/configuration/third-party-authentication.md",1986],"568a2802":[()=>n.e(1521).then(n.bind(n,361)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/feishu.md",361],"56af2409":[()=>n.e(3130).then(n.bind(n,816)),"@site/docs/self-hosted/configuration/schedule-jobs.md",816],"56f1fb64":[()=>n.e(9218).then(n.bind(n,4518)),"@site/versioned_docs/version-5.0.0/user-guide/dashboard.md",4518],58234510:[()=>n.e(7313).then(n.bind(n,2614)),"@site/docs/user-guide/administrator/permissions.md",2614],"58e8de69":[()=>n.e(6212).then(n.bind(n,1215)),"@site/versioned_docs/version-5.0.0/user-guide/apps/detail.mdx",1215],"5a3653dd":[()=>n.e(6832).then(n.t.bind(n,3939,19)),"~docs/default/category-docs-userguide-category-apps-877.json",3939],"5a522f46":[()=>n.e(8738).then(n.bind(n,4890)),"@site/versioned_docs/version-4.x/self-hosted/deployment/architecture.mdx",4890],"5c74b3a7":[()=>n.e(3670).then(n.bind(n,5386)),"@site/docs/user-guide/toolkits/fetch-udid.mdx",5386],"5da52b15":[()=>n.e(2918).then(n.bind(n,3211)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/background-jobs.md",3211],"5df973a0":[()=>n.e(8763).then(n.bind(n,4809)),"@site/docs/self-hosted/storage.md",4809],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ec84ac2":[()=>n.e(9516).then(n.bind(n,2482)),"@site/versioned_docs/version-4.x/user-guide/administrator/apple-team.mdx",2482],"5f153871":[()=>n.e(7069).then(n.bind(n,2171)),"@site/docs/self-hosted/index.md",2171],"5f8b303a":[()=>n.e(6868).then(n.bind(n,5219)),"@site/versioned_docs/version-4.x/user-guide/index.mdx",5219],"600ac4e1":[()=>n.e(6215).then(n.bind(n,3414)),"@site/docs/contributing-guide/index.md",3414],"60fb9086":[()=>n.e(1257).then(n.bind(n,8611)),"@site/docs/user-guide/debug-files/upload.mdx",8611],"61175dc6":[()=>n.e(7525).then(n.bind(n,6437)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/review.mdx",6437],"616acc84":[()=>n.e(9940).then(n.bind(n,3721)),"@site/versioned_docs/version-4.x/developer-guide/api/apps.md",3721],"6573317f":[()=>n.e(3307).then(n.bind(n,4204)),"@site/docs/user-guide/debug-files/index.mdx",4204],"674c5fcf":[()=>n.e(5920).then(n.bind(n,5808)),"@site/versioned_docs/version-5.0.0/user-guide/best_practices.md",5808],"6768319c":[()=>n.e(6159).then(n.bind(n,7629)),"@site/versioned_docs/version-5.0.0/developer-guide/api.md",7629],"687041db":[()=>n.e(336).then(n.bind(n,2881)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane.md",2881],"699a8fef":[()=>n.e(3954).then(n.bind(n,8118)),"@site/versioned_docs/version-4.x/user-guide/administrator/permissions.md",8118],"69bb3584":[()=>n.e(4234).then(n.bind(n,5049)),"@site/versioned_docs/version-4.x/self-hosted/configuration/third-party-authentication.md",5049],"6a4aefb0":[()=>n.e(9346).then(n.t.bind(n,9777,19)),"~docs/default/category-docs-4-x-userguide-category-apps-0b2.json",9777],"6c0d6c9a":[()=>n.e(5148).then(n.bind(n,7252)),"@site/versioned_docs/version-4.x/developer-guide/api.md",7252],"6cdd9503":[()=>n.e(5111).then(n.t.bind(n,4047,19)),"~docs/default/category-docs-4-x-userguide-category-toolkits-f2e.json",4047],"708d50e3":[()=>n.e(5272).then(n.bind(n,5715)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/discord.md",5715],"71b71564":[()=>n.e(6186).then(n.bind(n,7962)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/render.md",7962],"72b5199f":[()=>n.e(6567).then(n.bind(n,7440)),"@site/versioned_docs/version-4.x/contributing-guide/index.md",7440],"7386cd72":[()=>n.e(5902).then(n.t.bind(n,8141,19)),"~docs/default/category-docs-contributingguide-category-local-development-477.json",8141],"7737c9f3":[()=>n.e(96).then(n.bind(n,2766)),"@site/docs/user-guide/index.mdx",2766],77590075:[()=>n.e(4765).then(n.bind(n,2851)),"@site/versioned_docs/version-5.0.0/developer-guide/index.md",2851],"784c299a":[()=>n.e(5351).then(n.bind(n,8903)),"@site/docs/self-hosted/deployment/render.md",8903],"78cdd3ae":[()=>n.e(7965).then(n.t.bind(n,2427,19)),"~docs/default/category-docsnext-userguide-category-administrator-31b.json",2427],"799ffaed":[()=>n.e(8493).then(n.bind(n,4113)),"@site/versioned_docs/version-4.x/self-hosted/deployment/kubernetes.md",4113],"79fb26a6":[()=>n.e(6716).then(n.bind(n,3162)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/logging.mdx",3162],"7ab8d5f3":[()=>n.e(4769).then(n.bind(n,7346)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/environment-variables.md",7346],"7d49456b":[()=>n.e(5945).then(n.bind(n,216)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/permissions.md",216],"7e370ea7":[()=>n.e(7595).then(n.t.bind(n,1638,19)),"~docs/default/category-docs-developerguide-category-sdks-4f3.json",1638],84706228:[()=>Promise.all([n.e(532),n.e(4943)]).then(n.bind(n,7886)),"@site/versioned_docs/version-4.x/developer-guide/sdk/ios.md",7886],"848dab9f":[()=>n.e(2647).then(n.bind(n,9933)),"@site/docs/developer-guide/index.md",9933],"84e62756":[()=>n.e(826).then(n.bind(n,3686)),"@site/docs/self-hosted/deployment/docker.md",3686],"889fb5f5":[()=>n.e(7321).then(n.bind(n,5170)),"@site/versioned_docs/version-4.x/self-hosted/configuration/schedule-jobs.md",5170],"88e80bd0":[()=>n.e(6665).then(n.bind(n,8248)),"@site/docs/user-guide/administrator/monitoring/background-jobs.mdx",8248],"88f9ce8f":[()=>n.e(387).then(n.bind(n,5143)),"@site/docs/user-guide/webhooks/wecom.md",5143],"897621f7":[()=>n.e(4974).then(n.bind(n,933)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/kubernetes.md",933],"8992496f":[()=>n.e(8772).then(n.bind(n,8830)),"@site/versioned_docs/version-4.x/user-guide/best_practices.md",8830],"8aa13b20":[()=>n.e(6197).then(n.bind(n,8691)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/system-info.md",8691],"8ac0e0b2":[()=>n.e(469).then(n.bind(n,343)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/source-code.md",343],"8bf7b385":[()=>n.e(4067).then(n.t.bind(n,1949,19)),"~docs/default/category-docsnext-userguide-category-debug-files-13b.json",1949],"8cddcc36":[()=>n.e(1653).then(n.bind(n,3432)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/index.mdx",3432],"8f9c93ae":[()=>Promise.all([n.e(532),n.e(4885)]).then(n.bind(n,277)),"@site/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",277],"90050cbc":[()=>n.e(7236).then(n.bind(n,7173)),"@site/versioned_docs/version-5.0.0/user-guide/apps/upload.mdx",7173],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93688e09":[()=>n.e(3820).then(n.bind(n,482)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/docker/step-by-step.md",482],"99e3e97f":[()=>n.e(7157).then(n.bind(n,9733)),"@site/docs/user-guide/best_practices.md",9733],"9c3aeab1":[()=>n.e(2011).then(n.t.bind(n,5734,19)),"~docs/default/category-docs-4-x-userguide-category-administrator-4f8.json",5734],"9d2c8d89":[()=>n.e(2820).then(n.bind(n,2874)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/architecture.mdx",2874],"9da9701d":[()=>n.e(5783).then(n.bind(n,4438)),"@site/docs/user-guide/administrator/backup.mdx",4438],"9e3eaffa":[()=>n.e(5728).then(n.bind(n,444)),"@site/versioned_docs/version-4.x/user-guide/webhooks/dingtalk.md",444],a087da7b:[()=>n.e(7042).then(n.bind(n,7453)),"@site/versioned_docs/version-5.0.0/self-hosted/configuration/schedule-jobs.md",7453],a1f04802:[()=>n.e(411).then(n.bind(n,4973)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot.md",4973],a7227298:[()=>n.e(3844).then(n.bind(n,2114)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/slack.md",2114],a7434565:[()=>n.e(7645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a8003ee7:[()=>n.e(2530).then(n.bind(n,5618)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/apple-team.mdx",5618],a86b8a96:[()=>n.e(572).then(n.bind(n,9339)),"@site/versioned_docs/version-5.0.0/user-guide/debug-files/upload.mdx",9339],a949db22:[()=>n.e(483).then(n.bind(n,8064)),"@site/versioned_docs/version-4.x/user-guide/administrator/project-settings.md",8064],aaab4dd5:[()=>n.e(9656).then(n.bind(n,7825)),"@site/docs/developer-guide/api/debug_files.md",7825],aaf543f1:[()=>n.e(2143).then(n.bind(n,3789)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/railway.md",3789],aaf82ead:[()=>n.e(884).then(n.bind(n,5807)),"@site/docs/user-guide/debug-files/review.mdx",5807],ab71d4e1:[()=>n.e(9710).then(n.t.bind(n,4191,19)),"~docs/default/category-docsnext-selfhosted-category-deployment-fed.json",4191],aceb8a36:[()=>n.e(81).then(n.t.bind(n,1956,19)),"~docs/default/category-docs-userguide-category-toolkits-2ac.json",1956],ad4ca79f:[()=>n.e(2966).then(n.bind(n,5022)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_sync_devices.md",5022],adf2c0d2:[()=>n.e(4596).then(n.bind(n,9726)),"@site/docs/developer-guide/fastlane.md",9726],aecd11f5:[()=>Promise.all([n.e(532),n.e(4429)]).then(n.bind(n,5736)),"@site/versioned_docs/version-4.x/developer-guide/sdk/android.md",5736],aef75111:[()=>n.e(3084).then(n.bind(n,3245)),"@site/versioned_docs/version-5.0.0/user-guide/index.mdx",3245],b272fba4:[()=>n.e(5803).then(n.bind(n,6974)),"@site/versioned_docs/version-4.x/self-hosted/deployment/railway.md",6974],b4e44ac6:[()=>n.e(9184).then(n.bind(n,853)),"@site/docs/self-hosted/deployment/kubernetes.md",853],b56911e0:[()=>n.e(2621).then(n.bind(n,5463)),"@site/versioned_docs/version-5.0.0/developer-guide/api/debug_files.md",5463],b5e1e414:[()=>n.e(9100).then(n.bind(n,3533)),"@site/versioned_docs/version-4.x/user-guide/webhooks/slack.md",3533],b7ca75af:[()=>n.e(6295).then(n.bind(n,6384)),"@site/versioned_docs/version-5.0.0/developer-guide/fastlane/zealot_debug_file.md",6384],b8b76bfb:[()=>n.e(8901).then(n.bind(n,1733)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/nomad.md",1733],b9de103e:[()=>n.e(3171).then(n.t.bind(n,5295,19)),"~docs/default/category-docs-4-x-selfhosted-category-deployment-eef.json",5295],bbec0ea8:[()=>n.e(4011).then(n.bind(n,5217)),"@site/versioned_docs/version-4.x/user-guide/toolkits/teardown.md",5217],bc9a5c2d:[()=>n.e(8958).then(n.bind(n,7988)),"@site/docs/developer-guide/fastlane/zealot_version_check.md",7988],bc9d66cc:[()=>n.e(2438).then(n.bind(n,8858)),"@site/versioned_docs/version-5.0.0/self-hosted/index.md",8858],bdc68495:[()=>n.e(3618).then(n.t.bind(n,4040,19)),"~docs/default/category-docs-userguide-category-administrator-395.json",4040],bdd7b463:[()=>n.e(5309).then(n.t.bind(n,9898,19)),"~docs/default/category-docsnext-userguide-category-monitoring-339.json",9898],bf0a73a8:[()=>n.e(2209).then(n.bind(n,5872)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/backup.mdx",5872],bf6ff0a4:[()=>n.e(1120).then(n.bind(n,2516)),"@site/versioned_docs/version-4.x/user-guide/administrator/monitoring/database-analytics.md",2516],c01945e0:[()=>n.e(5705).then(n.bind(n,6210)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot.md",6210],c02123b5:[()=>Promise.all([n.e(532),n.e(3877)]).then(n.bind(n,4881)),"@site/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",4881],c0aa555d:[()=>n.e(4985).then(n.bind(n,713)),"@site/versioned_docs/version-4.x/user-guide/webhooks/feishu.md",713],c3e055b8:[()=>n.e(7681).then(n.bind(n,7332)),"@site/versioned_docs/version-5.0.0/developer-guide/api/apps.md",7332],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,5402)),"@site/src/pages/index.js",5402],c53e755e:[()=>n.e(7322).then(n.bind(n,69)),"@site/docs/user-guide/changelog.md",69],c5b0ab6a:[()=>Promise.all([n.e(532),n.e(9396)]).then(n.bind(n,2428)),"@site/docs/developer-guide/sdk/ios.md",2428],c8054fdf:[()=>n.e(443).then(n.t.bind(n,7120,19)),"~docs/default/category-docsnext-userguide-category-toolkits-eb7.json",7120],c94f5806:[()=>n.e(1394).then(n.bind(n,4957)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/settings.mdx",4957],c9b278a8:[()=>n.e(9181).then(n.t.bind(n,5e3,19)),"~docs/default/version-5-0-0-metadata-prop-0b8.json",5e3],c9fa300e:[()=>n.e(7466).then(n.bind(n,8594)),"@site/versioned_docs/version-4.x/developer-guide/fastlane.md",8594],cae0f04b:[()=>n.e(5709).then(n.t.bind(n,4166,19)),"~docs/default/version-4-x-metadata-prop-21f.json",4166],cd085125:[()=>n.e(1649).then(n.bind(n,1337)),"@site/docs/user-guide/administrator/monitoring/database-analytics.mdx",1337],cd4eb1ed:[()=>n.e(5260).then(n.t.bind(n,5812,19)),"~docs/default/category-docs-4-x-contributingguide-category-local-development-9ee.json",5812],d02aa106:[()=>n.e(4590).then(n.bind(n,9186)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/project-settings.md",9186],d1dd54d0:[()=>n.e(1591).then(n.bind(n,2479)),"@site/docs/developer-guide/fastlane/zealot_debug_file.md",2479],d4be948d:[()=>n.e(5610).then(n.bind(n,2502)),"@site/docs/self-hosted/deployment/architecture.mdx",2502],d59c50f6:[()=>n.e(4587).then(n.t.bind(n,3534,19)),"~docs/default/category-docsnext-selfhosted-category-cloud-provider-guides-cdc.json",3534],da03b20b:[()=>n.e(4771).then(n.bind(n,1211)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/background-jobs.mdx",1211],db37eded:[()=>n.e(7702).then(n.bind(n,1774)),"@site/versioned_docs/version-5.0.0/user-guide/qa.md",1774],dd05d4e3:[()=>n.e(4604).then(n.bind(n,7148)),"@site/docs/self-hosted/deployment/nomad.md",7148],ddf401e0:[()=>n.e(6984).then(n.bind(n,9021)),"@site/versioned_docs/version-4.x/self-hosted/deployment/render.md",9021],e40683f4:[()=>n.e(9014).then(n.bind(n,5610)),"@site/versioned_docs/version-4.x/user-guide/webhooks.md",5610],e532b6bb:[()=>n.e(5545).then(n.bind(n,5262)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/monitoring/system-info.mdx",5262],e6546d07:[()=>n.e(9611).then(n.bind(n,7499)),"@site/versioned_docs/version-5.0.0/self-hosted/deployment/requirements.md",7499],e7a8c7f9:[()=>n.e(777).then(n.bind(n,6719)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_version_check.md",6719],e92f4833:[()=>n.e(4159).then(n.bind(n,5760)),"@site/docs/user-guide/qa.md",5760],ea003b3f:[()=>n.e(7787).then(n.bind(n,8730)),"@site/versioned_docs/version-4.x/developer-guide/fastlane/zealot_debug_file.md",8730],eb2d718d:[()=>n.e(475).then(n.bind(n,3617)),"@site/docs/user-guide/credits.md",3617],ede4b0bb:[()=>n.e(7070).then(n.bind(n,9841)),"@site/docs/developer-guide/fastlane/zealot.md",9841],ef294a35:[()=>n.e(1643).then(n.t.bind(n,4995,19)),"~docs/default/category-docsnext-developerguide-category-sdks-aef.json",4995],ef513ce2:[()=>n.e(4802).then(n.bind(n,5864)),"@site/versioned_docs/version-4.x/self-hosted/deployment/nomad.md",5864],f02d2d32:[()=>n.e(7276).then(n.bind(n,4858)),"@site/docs/developer-guide/api/apps.md",4858],f0954aa2:[()=>n.e(7779).then(n.bind(n,3092)),"@site/versioned_docs/version-5.0.0/user-guide/changelog.md",3092],f3108074:[()=>n.e(6118).then(n.bind(n,3173)),"@site/docs/user-guide/webhooks/dingtalk.md",3173],f6a4c755:[()=>n.e(6787).then(n.bind(n,3990)),"@site/versioned_docs/version-5.0.0/user-guide/apps/index.mdx",3990],f8a75f5e:[()=>Promise.all([n.e(532),n.e(5787)]).then(n.bind(n,6536)),"@site/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",6536],f8e38d3d:[()=>n.e(2107).then(n.bind(n,2511)),"@site/docs/self-hosted/deployment/railway.md",2511],f906dd81:[()=>n.e(9154).then(n.bind(n,2918)),"@site/docs/user-guide/apps/upload.mdx",2918],f90fa3e0:[()=>n.e(3630).then(n.bind(n,5733)),"@site/docs/self-hosted/configuration/environment-variables.md",5733],f944a33e:[()=>n.e(5218).then(n.bind(n,3936)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks/wecom.md",3936],f9b37612:[()=>n.e(1627).then(n.bind(n,4269)),"@site/versioned_docs/version-4.x/developer-guide/api/debug_files.md",4269],fa199c0f:[()=>n.e(8575).then(n.bind(n,3966)),"@site/docs/self-hosted/deployment/docker/step-by-step.md",3966],fb7a7e13:[()=>n.e(9019).then(n.bind(n,8716)),"@site/versioned_docs/version-4.x/self-hosted/index.md",8716],fe140d6b:[()=>n.e(9966).then(n.bind(n,4092)),"@site/docs/user-guide/webhooks/discord.md",4092],fe4d1fcf:[()=>n.e(260).then(n.bind(n,4504)),"@site/versioned_docs/version-5.0.0/user-guide/webhooks.md",4504],fe6331dc:[()=>n.e(2242).then(n.t.bind(n,5978,19)),"~docs/default/category-docs-4-x-developerguide-category-sdks-75e.json",5978]};function d(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 c=n(9670),u=n(226);function p(e,t){if("*"===e)return i()({loading:d,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(u.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const a=s[`${e}-${t}`],p={},f=[],g=[],m=(0,c.Z)(a);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),g.push(r[2]))})),i().Map({loading:d,loader:p,modules:f,webpack:()=>g,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 s=n.split(".");s.slice(0,-1).forEach((e=>{a=a[e]})),a[s[s.length-1]]=o}));const s=i.__comp;delete i.__comp;const l=i.__context;return delete i.__context,r.createElement(u.z,{value:l},r.createElement(s,(0,o.Z)({},i,n)))}})}const f=[{path:"/markdown-page",component:p("/markdown-page","9d5"),exact:!0},{path:"/docs/4.x",component:p("/docs/4.x","c9e"),routes:[{path:"/docs/4.x/category/administrator",component:p("/docs/4.x/category/administrator","103"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/apps",component:p("/docs/4.x/category/apps","04a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/cloud-provider-guides",component:p("/docs/4.x/category/cloud-provider-guides","f84"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/configuration",component:p("/docs/4.x/category/configuration","bbc"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/debug-files",component:p("/docs/4.x/category/debug-files","dd6"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/deployment",component:p("/docs/4.x/category/deployment","469"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/category/local-development",component:p("/docs/4.x/category/local-development","600"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/category/monitoring",component:p("/docs/4.x/category/monitoring","0aa"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/category/sdks",component:p("/docs/4.x/category/sdks","f90"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/category/toolkits",component:p("/docs/4.x/category/toolkits","eeb"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/contributing-guide/",component:p("/docs/4.x/contributing-guide/","595"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/contributing-guide/local-development/devcontainer",component:p("/docs/4.x/contributing-guide/local-development/devcontainer","8a7"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/contributing-guide/local-development/source-code",component:p("/docs/4.x/contributing-guide/local-development/source-code","9c2"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/4.x/developer-guide/",component:p("/docs/4.x/developer-guide/","ce0"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api",component:p("/docs/4.x/developer-guide/api","074"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api/apps",component:p("/docs/4.x/developer-guide/api/apps","213"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/api/debug_files",component:p("/docs/4.x/developer-guide/api/debug_files","632"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane",component:p("/docs/4.x/developer-guide/fastlane","9ff"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot",component:p("/docs/4.x/developer-guide/fastlane/zealot","191"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_debug_file",component:p("/docs/4.x/developer-guide/fastlane/zealot_debug_file","187"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_sync_devices",component:p("/docs/4.x/developer-guide/fastlane/zealot_sync_devices","609"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/fastlane/zealot_version_check",component:p("/docs/4.x/developer-guide/fastlane/zealot_version_check","8f5"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/sdk/android",component:p("/docs/4.x/developer-guide/sdk/android","dd8"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/developer-guide/sdk/ios",component:p("/docs/4.x/developer-guide/sdk/ios","d34"),exact:!0,sidebar:"developerGuide"},{path:"/docs/4.x/self-hosted/",component:p("/docs/4.x/self-hosted/","472"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/environment-variables",component:p("/docs/4.x/self-hosted/configuration/environment-variables","78e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/schedule-jobs",component:p("/docs/4.x/self-hosted/configuration/schedule-jobs","db7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/configuration/third-party-authentication",component:p("/docs/4.x/self-hosted/configuration/third-party-authentication","8f0"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/architecture",component:p("/docs/4.x/self-hosted/deployment/architecture","575"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/docker",component:p("/docs/4.x/self-hosted/deployment/docker","a96"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/docker/step-by-step",component:p("/docs/4.x/self-hosted/deployment/docker/step-by-step","f5a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/fly",component:p("/docs/4.x/self-hosted/deployment/fly","777"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/kubernetes",component:p("/docs/4.x/self-hosted/deployment/kubernetes","80b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/nomad",component:p("/docs/4.x/self-hosted/deployment/nomad","4be"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/railway",component:p("/docs/4.x/self-hosted/deployment/railway","6d9"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/render",component:p("/docs/4.x/self-hosted/deployment/render","23a"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/requirements",component:p("/docs/4.x/self-hosted/deployment/requirements","9ee"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/deployment/source-code",component:p("/docs/4.x/self-hosted/deployment/source-code","2e3"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/reverse-proxies",component:p("/docs/4.x/self-hosted/reverse-proxies","c94"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/self-hosted/storage",component:p("/docs/4.x/self-hosted/storage","d32"),exact:!0,sidebar:"selfHosted"},{path:"/docs/4.x/user-guide/",component:p("/docs/4.x/user-guide/","814"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/apple-team",component:p("/docs/4.x/user-guide/administrator/apple-team","a72"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/backup",component:p("/docs/4.x/user-guide/administrator/backup","846"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/background-jobs",component:p("/docs/4.x/user-guide/administrator/monitoring/background-jobs","7ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/database-analytics",component:p("/docs/4.x/user-guide/administrator/monitoring/database-analytics","671"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/logging",component:p("/docs/4.x/user-guide/administrator/monitoring/logging","578"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/monitoring/system-info",component:p("/docs/4.x/user-guide/administrator/monitoring/system-info","b65"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/permissions",component:p("/docs/4.x/user-guide/administrator/permissions","adb"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/administrator/project-settings",component:p("/docs/4.x/user-guide/administrator/project-settings","3b3"),exact:!0},{path:"/docs/4.x/user-guide/apps/create",component:p("/docs/4.x/user-guide/apps/create","af8"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/best_practices",component:p("/docs/4.x/user-guide/best_practices","fd7"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/changelog",component:p("/docs/4.x/user-guide/changelog","88f"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/credits",component:p("/docs/4.x/user-guide/credits","2b3"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/dashboard",component:p("/docs/4.x/user-guide/dashboard","70e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/debug-files/upload",component:p("/docs/4.x/user-guide/debug-files/upload","03e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/qa",component:p("/docs/4.x/user-guide/qa","67e"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/toolkits/fetch-udid",component:p("/docs/4.x/user-guide/toolkits/fetch-udid","b2a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/toolkits/teardown",component:p("/docs/4.x/user-guide/toolkits/teardown","8c8"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks",component:p("/docs/4.x/user-guide/webhooks","322"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/dingtalk",component:p("/docs/4.x/user-guide/webhooks/dingtalk","54a"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/discord",component:p("/docs/4.x/user-guide/webhooks/discord","e9c"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/feishu",component:p("/docs/4.x/user-guide/webhooks/feishu","670"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/slack",component:p("/docs/4.x/user-guide/webhooks/slack","815"),exact:!0,sidebar:"userGuide"},{path:"/docs/4.x/user-guide/webhooks/wecom",component:p("/docs/4.x/user-guide/webhooks/wecom","8ae"),exact:!0,sidebar:"userGuide"}]},{path:"/docs/next",component:p("/docs/next","1c1"),routes:[{path:"/docs/next/category/administrator",component:p("/docs/next/category/administrator","380"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/apps",component:p("/docs/next/category/apps","102"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/cloud-provider-guides",component:p("/docs/next/category/cloud-provider-guides","df8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/configuration",component:p("/docs/next/category/configuration","1f8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/debug-files",component:p("/docs/next/category/debug-files","bf7"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/deployment",component:p("/docs/next/category/deployment","de4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/category/local-development",component:p("/docs/next/category/local-development","b0d"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/category/monitoring",component:p("/docs/next/category/monitoring","f5c"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/category/sdks",component:p("/docs/next/category/sdks","34d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/category/toolkits",component:p("/docs/next/category/toolkits","00e"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/contributing-guide/",component:p("/docs/next/contributing-guide/","414"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/contributing-guide/local-development/devcontainer",component:p("/docs/next/contributing-guide/local-development/devcontainer","499"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/contributing-guide/local-development/source-code",component:p("/docs/next/contributing-guide/local-development/source-code","475"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/next/developer-guide/",component:p("/docs/next/developer-guide/","796"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api",component:p("/docs/next/developer-guide/api","2d3"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api/apps",component:p("/docs/next/developer-guide/api/apps","ac7"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/api/debug_files",component:p("/docs/next/developer-guide/api/debug_files","aa9"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane",component:p("/docs/next/developer-guide/fastlane","50f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot",component:p("/docs/next/developer-guide/fastlane/zealot","ce6"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_debug_file",component:p("/docs/next/developer-guide/fastlane/zealot_debug_file","79f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_sync_devices",component:p("/docs/next/developer-guide/fastlane/zealot_sync_devices","bde"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/fastlane/zealot_version_check",component:p("/docs/next/developer-guide/fastlane/zealot_version_check","95a"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/sdk/android",component:p("/docs/next/developer-guide/sdk/android","815"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/developer-guide/sdk/ios",component:p("/docs/next/developer-guide/sdk/ios","1eb"),exact:!0,sidebar:"developerGuide"},{path:"/docs/next/self-hosted/",component:p("/docs/next/self-hosted/","4a8"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/environment-variables",component:p("/docs/next/self-hosted/configuration/environment-variables","d1d"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/schedule-jobs",component:p("/docs/next/self-hosted/configuration/schedule-jobs","396"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/configuration/third-party-authentication",component:p("/docs/next/self-hosted/configuration/third-party-authentication","4ed"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/architecture",component:p("/docs/next/self-hosted/deployment/architecture","820"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/docker",component:p("/docs/next/self-hosted/deployment/docker","bab"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/docker/step-by-step",component:p("/docs/next/self-hosted/deployment/docker/step-by-step","b7c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/fly",component:p("/docs/next/self-hosted/deployment/fly","35b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/kubernetes",component:p("/docs/next/self-hosted/deployment/kubernetes","db7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/nomad",component:p("/docs/next/self-hosted/deployment/nomad","022"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/railway",component:p("/docs/next/self-hosted/deployment/railway","042"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/render",component:p("/docs/next/self-hosted/deployment/render","a27"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/requirements",component:p("/docs/next/self-hosted/deployment/requirements","274"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/deployment/source-code",component:p("/docs/next/self-hosted/deployment/source-code","d47"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/reverse-proxies",component:p("/docs/next/self-hosted/reverse-proxies","f22"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/self-hosted/storage",component:p("/docs/next/self-hosted/storage","e44"),exact:!0,sidebar:"selfHosted"},{path:"/docs/next/user-guide/",component:p("/docs/next/user-guide/","3eb"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/apple-team",component:p("/docs/next/user-guide/administrator/apple-team","71d"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/backup",component:p("/docs/next/user-guide/administrator/backup","1c6"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/background-jobs",component:p("/docs/next/user-guide/administrator/monitoring/background-jobs","24f"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/database-analytics",component:p("/docs/next/user-guide/administrator/monitoring/database-analytics","708"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/logging",component:p("/docs/next/user-guide/administrator/monitoring/logging","621"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/monitoring/system-info",component:p("/docs/next/user-guide/administrator/monitoring/system-info","68b"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/permissions",component:p("/docs/next/user-guide/administrator/permissions","347"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/administrator/settings",component:p("/docs/next/user-guide/administrator/settings","75a"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/",component:p("/docs/next/user-guide/apps/","0f2"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/create",component:p("/docs/next/user-guide/apps/create","679"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/detail",component:p("/docs/next/user-guide/apps/detail","a89"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/apps/upload",component:p("/docs/next/user-guide/apps/upload","e60"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/best_practices",component:p("/docs/next/user-guide/best_practices","5ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/changelog",component:p("/docs/next/user-guide/changelog","b74"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/credits",component:p("/docs/next/user-guide/credits","535"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/dashboard",component:p("/docs/next/user-guide/dashboard","a36"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/",component:p("/docs/next/user-guide/debug-files/","727"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/review",component:p("/docs/next/user-guide/debug-files/review","e27"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/debug-files/upload",component:p("/docs/next/user-guide/debug-files/upload","f76"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/qa",component:p("/docs/next/user-guide/qa","fd5"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/toolkits/fetch-udid",component:p("/docs/next/user-guide/toolkits/fetch-udid","cf3"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/toolkits/teardown",component:p("/docs/next/user-guide/toolkits/teardown","98d"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks",component:p("/docs/next/user-guide/webhooks","795"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/dingtalk",component:p("/docs/next/user-guide/webhooks/dingtalk","b50"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/discord",component:p("/docs/next/user-guide/webhooks/discord","e4a"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/feishu",component:p("/docs/next/user-guide/webhooks/feishu","066"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/slack",component:p("/docs/next/user-guide/webhooks/slack","484"),exact:!0,sidebar:"userGuide"},{path:"/docs/next/user-guide/webhooks/wecom",component:p("/docs/next/user-guide/webhooks/wecom","241"),exact:!0,sidebar:"userGuide"}]},{path:"/docs",component:p("/docs","b73"),routes:[{path:"/docs/category/administrator",component:p("/docs/category/administrator","614"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/apps",component:p("/docs/category/apps","e5b"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/cloud-provider-guides",component:p("/docs/category/cloud-provider-guides","15e"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/configuration",component:p("/docs/category/configuration","28b"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/debug-files",component:p("/docs/category/debug-files","a8f"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/deployment",component:p("/docs/category/deployment","cf3"),exact:!0,sidebar:"selfHosted"},{path:"/docs/category/local-development",component:p("/docs/category/local-development","411"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/category/monitoring",component:p("/docs/category/monitoring","1ad"),exact:!0,sidebar:"userGuide"},{path:"/docs/category/sdks",component:p("/docs/category/sdks","28f"),exact:!0,sidebar:"developerGuide"},{path:"/docs/category/toolkits",component:p("/docs/category/toolkits","f3f"),exact:!0,sidebar:"userGuide"},{path:"/docs/contributing-guide/",component:p("/docs/contributing-guide/","1c7"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/contributing-guide/local-development/devcontainer",component:p("/docs/contributing-guide/local-development/devcontainer","6bc"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/contributing-guide/local-development/source-code",component:p("/docs/contributing-guide/local-development/source-code","20c"),exact:!0,sidebar:"contributingGuide"},{path:"/docs/developer-guide/",component:p("/docs/developer-guide/","efd"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api",component:p("/docs/developer-guide/api","479"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api/apps",component:p("/docs/developer-guide/api/apps","b42"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/api/debug_files",component:p("/docs/developer-guide/api/debug_files","e16"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane",component:p("/docs/developer-guide/fastlane","1a0"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot",component:p("/docs/developer-guide/fastlane/zealot","e1d"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_debug_file",component:p("/docs/developer-guide/fastlane/zealot_debug_file","d03"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_sync_devices",component:p("/docs/developer-guide/fastlane/zealot_sync_devices","b34"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/fastlane/zealot_version_check",component:p("/docs/developer-guide/fastlane/zealot_version_check","1b7"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/sdk/android",component:p("/docs/developer-guide/sdk/android","3a2"),exact:!0,sidebar:"developerGuide"},{path:"/docs/developer-guide/sdk/ios",component:p("/docs/developer-guide/sdk/ios","c33"),exact:!0,sidebar:"developerGuide"},{path:"/docs/self-hosted/",component:p("/docs/self-hosted/","666"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/environment-variables",component:p("/docs/self-hosted/configuration/environment-variables","d7d"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/schedule-jobs",component:p("/docs/self-hosted/configuration/schedule-jobs","a57"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/configuration/third-party-authentication",component:p("/docs/self-hosted/configuration/third-party-authentication","7f5"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/architecture",component:p("/docs/self-hosted/deployment/architecture","e1c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/docker",component:p("/docs/self-hosted/deployment/docker","a75"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/docker/step-by-step",component:p("/docs/self-hosted/deployment/docker/step-by-step","bf4"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/fly",component:p("/docs/self-hosted/deployment/fly","ed1"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/kubernetes",component:p("/docs/self-hosted/deployment/kubernetes","e83"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/nomad",component:p("/docs/self-hosted/deployment/nomad","15f"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/railway",component:p("/docs/self-hosted/deployment/railway","df1"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/render",component:p("/docs/self-hosted/deployment/render","766"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/requirements",component:p("/docs/self-hosted/deployment/requirements","8ec"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/deployment/source-code",component:p("/docs/self-hosted/deployment/source-code","0d9"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/reverse-proxies",component:p("/docs/self-hosted/reverse-proxies","42c"),exact:!0,sidebar:"selfHosted"},{path:"/docs/self-hosted/storage",component:p("/docs/self-hosted/storage","ca7"),exact:!0,sidebar:"selfHosted"},{path:"/docs/user-guide/",component:p("/docs/user-guide/","853"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/apple-team",component:p("/docs/user-guide/administrator/apple-team","f62"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/backup",component:p("/docs/user-guide/administrator/backup","240"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/background-jobs",component:p("/docs/user-guide/administrator/monitoring/background-jobs","a44"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/database-analytics",component:p("/docs/user-guide/administrator/monitoring/database-analytics","d89"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/logging",component:p("/docs/user-guide/administrator/monitoring/logging","8d8"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/monitoring/system-info",component:p("/docs/user-guide/administrator/monitoring/system-info","71b"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/permissions",component:p("/docs/user-guide/administrator/permissions","0d3"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/administrator/project-settings",component:p("/docs/user-guide/administrator/project-settings","737"),exact:!0},{path:"/docs/user-guide/administrator/settings",component:p("/docs/user-guide/administrator/settings","ca5"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/",component:p("/docs/user-guide/apps/","621"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/create",component:p("/docs/user-guide/apps/create","bfc"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/detail",component:p("/docs/user-guide/apps/detail","9a6"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/apps/upload",component:p("/docs/user-guide/apps/upload","1b1"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/best_practices",component:p("/docs/user-guide/best_practices","91c"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/changelog",component:p("/docs/user-guide/changelog","b06"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/credits",component:p("/docs/user-guide/credits","7f0"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/dashboard",component:p("/docs/user-guide/dashboard","aaf"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/",component:p("/docs/user-guide/debug-files/","70a"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/review",component:p("/docs/user-guide/debug-files/review","dbc"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/debug-files/upload",component:p("/docs/user-guide/debug-files/upload","601"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/qa",component:p("/docs/user-guide/qa","569"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/toolkits/fetch-udid",component:p("/docs/user-guide/toolkits/fetch-udid","ac3"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/toolkits/teardown",component:p("/docs/user-guide/toolkits/teardown","f07"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks",component:p("/docs/user-guide/webhooks","6ea"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/dingtalk",component:p("/docs/user-guide/webhooks/dingtalk","44c"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/discord",component:p("/docs/user-guide/webhooks/discord","2e3"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/feishu",component:p("/docs/user-guide/webhooks/feishu","96d"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/slack",component:p("/docs/user-guide/webhooks/slack","5cf"),exact:!0,sidebar:"userGuide"},{path:"/docs/user-guide/webhooks/wecom",component:p("/docs/user-guide/webhooks/wecom","f9b"),exact:!0,sidebar:"userGuide"}]},{path:"/",component:p("/","fc2"),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),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var d=n(723),c=n(6550),u=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),g=n(5742),m=n(2263),h=n(4996),b=n(6668),v=n(1944),y=n(4711),x=n(9727),w=n(3320),k=n(8780),_=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,m.Z)(),n=(0,y.l)();return r.createElement(g.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 S(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),o=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.Z)(),{pathname:r}=(0,c.TH)();return e+(0,k.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:o;return r.createElement(g.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function C(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(g.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:x.h})),n&&r.createElement(v.d,{image:n}),r.createElement(S,null),r.createElement(E,null),r.createElement(_.Z,{tag:w.HX,locale:e}),r.createElement(g.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,u.f)(d.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),N=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=l.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const O=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 I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(d.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.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}),I(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(O,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const M=R,D="__docusaurus-base-url-issue-banner-container",G="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${F}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${F}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${G}" 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 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 j(){const{siteConfig:{baseUrl:e}}=(0,m.Z)();return(0,r.useLayoutEffect)((()=>{window[F]=!1}),[]),r.createElement(r.Fragment,null,!s.Z.canUseDOM&&r.createElement(g.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:D}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(j,null):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:a}}=(0,m.Z)(),i=(0,h.Z)(e),{htmlLang:s,direction:l}=a[o];return r.createElement(g.Z,null,r.createElement("html",{lang:s,dir:l}),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 U=n(4763),Z=n(2389);function V(){const e=(0,Z.Z)();return r.createElement(g.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function q(){const e=(0,u.H)(d.Z),t=(0,c.TH)();return r.createElement(U.Z,null,r.createElement(N.M,null,r.createElement(L.t,null,r.createElement(p,null,r.createElement(H,null),r.createElement(C,null),r.createElement($,null),r.createElement(M,{location:A(t)},e)),r.createElement(V,null))))}var W=n(6887);const Y=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 K=n(9670);const X=new Set,Q=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Q.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,u.f)(d.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,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Q.has(e))(e)&&(Q.add(e),I(e))},te=Object.freeze(ee);if(s.Z.canUseDOM){window.docusaurus=te;const e=o.hydrate;I(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(a.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>u});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next \ud83d\udea7","isLast":false,"path":"/docs/next","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/next/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/next/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/next/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/next/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/next/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/next/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/next/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/next/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/next/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/next/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/next/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/next/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/next/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/next/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/next/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/next/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/next/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/next/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/next/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/next/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/next/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/next/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/next/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/next/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/next/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/next/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/next/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/next/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/next/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/next/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/next/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/next/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/next/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/next/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/next/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/next/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/next/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/docs/next/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/next/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/next/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/next/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/next/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/next/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/next/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/next/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/next/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/next/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/next/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/next/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/next/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/next/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/next/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/next/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/next/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/next/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/next/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/next/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/next/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/next/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/next/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/next/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/next/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/next/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/next/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/next/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/next/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/next/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/next/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/next/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/next/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/next/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/next/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/next/contributing-guide/","label":"Getting Started"}}}},{"name":"5.0.0","label":"5.0.0","isLast":true,"path":"/docs","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/docs/user-guide/administrator/project-settings"},{"id":"user-guide/administrator/settings","path":"/docs/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/docs/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/docs/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/docs/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/docs/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/docs/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/docs/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/contributing-guide/","label":"Getting Started"}}}},{"name":"4.x","label":"4.x","isLast":false,"path":"/docs/4.x","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/docs/4.x/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/docs/4.x/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/docs/4.x/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/docs/4.x/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/docs/4.x/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/docs/4.x/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/docs/4.x/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/docs/4.x/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/docs/4.x/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/docs/4.x/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/docs/4.x/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/docs/4.x/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/docs/4.x/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/docs/4.x/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/docs/4.x/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/docs/4.x/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/docs/4.x/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/docs/4.x/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/docs/4.x/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/docs/4.x/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/docs/4.x/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/docs/4.x/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/docs/4.x/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/docs/4.x/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/docs/4.x/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/docs/4.x/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/docs/4.x/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/docs/4.x/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/docs/4.x/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/docs/4.x/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/docs/4.x/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/docs/4.x/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/docs/4.x/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/docs/4.x/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/docs/4.x/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/docs/4.x/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/docs/4.x/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/docs/4.x/user-guide/administrator/project-settings"},{"id":"user-guide/apps/create","path":"/docs/4.x/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/docs/4.x/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/docs/4.x/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/docs/4.x/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/docs/4.x/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/docs/4.x/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/docs/4.x/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/docs/4.x/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/docs/4.x/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/docs/4.x/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/docs/4.x/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/docs/4.x/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/docs/4.x/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/docs/4.x/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/docs/4.x/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/docs/4.x/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/docs/4.x/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/docs/4.x/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/docs/4.x/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/docs/4.x/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/docs/4.x/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/docs/4.x/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/docs/4.x/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/docs/4.x/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/docs/4.x/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/docs/4.x/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/docs/4.x/self-hosted/","label":"Getting Started"}},"userGuide":{"link":{"path":"/docs/4.x/user-guide/","label":"Getting Started"}},"developerGuide":{"link":{"path":"/docs/4.x/developer-guide/","label":"Getting Started"}},"contributingGuide":{"link":{"path":"/docs/4.x/contributing-guide/","label":"Getting Started"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en","zh-Hans"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var s=n(7529);const l=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-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"}}}'),d={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},c=r.createContext(d);function u(e){let{children:t}=e;return r.createElement(c.Provider,{value:d},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),s=n(7961);function l(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(d,{error:t}))}function d(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 c(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(c,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??u)(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),s=n(2263),l=n(3919),d=n(412);const c=o.createContext({collectLink:()=>{}});var u=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,s.Z)(),{withBaseUrl:w}=(0,u.C)(),k=(0,o.useContext)(c),_=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>_.current));const E=p||f;const S=(0,l.Z)(E),C=E?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;T&&S&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:x}));const L=(0,o.useRef)(!1),N=n?a.OL:a.rU,P=d.Z.canUseIntersectionObserver,O=(0,o.useRef)(),I=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,o.useEffect)((()=>(!P&&S&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&O.current&&O.current.disconnect()})),[O,T,P,S]);const R=T?.startsWith("#")??!1,M=!T||!S||R;return M||h||k.collectLink(T),M?o.createElement("a",(0,r.Z)({ref:_,href:T},E&&!S&&{target:"_blank",rel:"noopener noreferrer"},v)):o.createElement(N,(0,r.Z)({},v,{onMouseEnter:I,onTouchStart:I,innerRef:e=>{_.current=e,P&&e&&S&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),O.current.observe(e))},to:T},n&&{isActive:m,activeClassName:g}))}const f=o.forwardRef(p)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});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 s(e,t){let{message:n,id:r}=e;return o(i({message:n,id:r}),t)}function l(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 s=i({message:t,id:n});return r.createElement(r.Fragment,null,o(s,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:()=>s});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 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)}},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 s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=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:()=>m,gA:()=>p,_r:()=>c,Jo:()=>h,zh:()=>u,yW:()=>g,gB:()=>f});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 s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(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 d={},c=()=>i("docusaurus-plugin-content-docs")??d,u=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 p(e){void 0===e&&(e={});const t=c(),{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 f(e){return u(e).versions}function g(e){const t=u(e);return s(t)}function m(e){const t=u(e),{pathname:n}=(0,r.TH)();return l(t,n)}function h(e){const t=u(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},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(1472)(`./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"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ut});var r=n(7294),o=n(4334),a=n(4763),i=n(1944),s=n(7462),l=n(6550),d=n(5999),c=n(5936);const u="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(u);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,d.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 m(e){const t=e.children??g,{containerRef:n,onClick:o}=f();return r.createElement("div",{ref:n,role:"region","aria-label":g},r.createElement("a",(0,s.Z)({},e,{href:`#${u}`,onClick:o}),t))}var h=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(m,{className:v.skipToContent})}var x=n(6668),w=n(9689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:i,...l}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const _={closeButton:"closeButton_CVFx"};function E(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,d.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",_.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const S={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,o.Z)(S.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.L)(),{isActive:t,close:n}=(0,w.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),N=n(2466);var P=n(902),O=n(3102);const I=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,O.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(I.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(I);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,O.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:M(a)})),[o,a,t])}function G(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:i}=D();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 z=n(2949),F=n(2389);function B(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function j(e){return r.createElement("svg",(0,s.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 H(e){let{className:t,buttonClassName:n,value:a,onChange:i}=e;const s=(0,F.Z)(),l=(0,d.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,d.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,d.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,!s&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===a?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(B,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(j,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})))}const U=r.memo(H),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.L)().navbar.style,o=(0,x.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:i}=(0,z.I)();return o?null:r.createElement(U,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:i})}var q=n(1327);function W(){return r.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,d.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 K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:i,html:l,isDropdownLink:d,prependBaseUrlToHref:c,...u}=e;const p=(0,Q.Z)(o),f=(0,Q.Z)(t),g=(0,Q.Z)(a,{forcePrependBaseUrl:!0}),m=i&&a&&!(0,J.Z)(a),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(te.Z,d&&{width:12,height:12}))};return a?r.createElement(X.Z,(0,s.Z)({href:c?g:a},u,h)):r.createElement(X.Z,(0,s.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},u,h))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const i=r.createElement(ne,(0,s.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,s.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,s.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),se=n(8596),le=n(2263);function de(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:i,...l}=e;const d=(0,r.useRef)(null),[c,u]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{d.current&&!d.current.contains(e.target)&&u(!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)}}),[d]),r.createElement("div",{ref:d,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.Z)("navbar__link",a)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!c))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ee,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function ue(e){let{items:t,className:n,position:a,onClick:i,...d}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),u=de(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!u});return(0,r.useEffect)((()=>{u&&g(!u)}),[c,u,g]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},d,{onClick:e=>{e.preventDefault(),f()}}),d.children??d.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(Ee,(0,s.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?ue:ce;return r.createElement(o,n)}var fe=n(4711);function ge(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,s.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 me="iconLanguage_nlXk";var he=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,be.searchBox)},t)}var ye=n(143),xe=n(3438);var we=n(373);const ke=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:c,localeConfigs:u}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:g}=(0,l.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}`;return{label:u[e].label,lang:u[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...o],h=t?(0,d.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):u[i].label;return r.createElement(pe,(0,s.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(ge,{className:me}),h),items:m}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(he.Z,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return r.createElement(s,{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,ye.Iw)(o),l=(0,xe.vY)(t,o);return null===l?null:r.createElement(ae,(0,s.Z)({exact:!0},a,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:i}=(0,ye.Iw)(o),l=(0,xe.oz)(t,o).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,s.Z)({exact:!0},a,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const i=(0,xe.lO)(o)[0],l=t??i.label,d=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(ae,(0,s.Z)({},a,{label:l,to:d}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:i,...c}=e;const{search:u,hash:p}=(0,l.TH)(),f=(0,ye.Iw)(n),g=(0,ye.gB)(n),{savePreferredVersionName:m}=(0,we.J)(n),h=[...a,...g.map((e=>{const t=f.alternateDocVersions[e.name]??ke(e);return{label:e.label,to:`${t.path}${u}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...i],b=(0,xe.lO)(n)[0],v=t&&h.length>1?(0,d.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:ke(b).path;return h.length<=1?r.createElement(ae,(0,s.Z)({},c,{mobile:t,label:v,to:y,isActive:o?()=>!1:void 0})):r.createElement(pe,(0,s.Z)({},c,{mobile:t,label:v,to:y,items:h,isActive:o?()=>!1:void 0}))}};function Ee(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 Se(){const e=(0,L.e)(),t=(0,x.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ee,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ce(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(d.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 Te(){const e=0===(0,x.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(Ce,{onClick:()=>t.hide()}),t.content)}function Ae(){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(G,{header:r.createElement(K,null),primaryMenu:r.createElement(Se,null),secondaryMenu:r.createElement(Te,null)}):null}const Le={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Pe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.L)(),i=(0,L.e)(),{navbarRef:s,isNavbarVisible:l}=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,N.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 s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,d=window.innerHeight;s&&i>=s?n(!1):i+d<l&&n(!0)})),(0,c.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:s,"aria-label":(0,d.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Le.navbarHideable,!l&&Le.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown})},t,r.createElement(Ne,{onClick:i.toggle}),r.createElement(Ae,null))}var Oe=n(8780);const Ie={errorBoundaryError:"errorBoundaryError_a6uf"};function Re(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(d.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 Me(e){let{error:t}=e;const n=(0,Oe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Ie.errorBoundaryError},n)}class De extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ge="right";function ze(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,s.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 Fe(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,d.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(ze,null))}const Be={colorModeToggle:"colorModeToggle_DEke"};function je(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(De,{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(Ee,e)))))}function $e(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 He(){const e=(0,L.e)(),t=(0,x.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??Ge)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement($e,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Fe,null),r.createElement(W,null),r.createElement(je,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(je,{items:o}),r.createElement(V,{className:Be.colorModeToggle}),!a&&r.createElement(ve,null,r.createElement(he.Z,null)))})}function Ue(){return r.createElement(Pe,null,r.createElement(He,null))}function Ze(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:i,...l}=t,d=(0,Q.Z)(n),c=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,s.Z)({className:"footer__link-item"},o?{href:i?c:o}:{to:d},l),a,o&&!(0,J.Z)(o)&&r.createElement(te.Z,null))}function Ve(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(Ze,{item:t}))}function qe(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(Ve,{key:t,item:e})))))}function We(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(qe,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function Xe(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(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(We,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(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 at(){const{footer:e}=(0,x.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(ot,{style:a,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:o&&r.createElement(nt,{logo:o}),copyright:t&&r.createElement(rt,{copyright:t})})}const it=r.memo(at),st=(0,P.Qc)([z.S,w.pl,N.OC,we.L5,i.VC,function(e){let{children:t}=e;return r.createElement(O.n2,null,r.createElement(L.M,null,r.createElement(R,null,t)))}]);function lt(e){let{children:t}=e;return r.createElement(st,null,t)}function dt(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(d.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(Re,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Me,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function ut(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:d}=e;return(0,b.t)(),r.createElement(lt,null,r.createElement(i.d,{title:l,description:d}),r.createElement(y,null),r.createElement(A,null),r.createElement(Ue,null),r.createElement("div",{id:u,className:(0,o.Z)(h.k.wrapper.main,ct.mainWrapper,s)},r.createElement(a.Z,{fallback:e=>r.createElement(dt,e)},t)),!n&&r.createElement(it,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),o=n(7294),a=n(9960),i=n(4996),s=n(2263),l=n(6668),d=n(941);function c(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)},s=o.createElement(d.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},s):s}function u(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:d}}=(0,l.L)(),{imageClassName:u,titleClassName:p,...f}=e,g=(0,i.Z)(d?.href||"/"),m=n?"":t,h=d?.alt??m;return o.createElement(a.Z,(0,r.Z)({to:g},f,d?.target&&{target:d.target}),d&&o.createElement(c,{logo:d,alt:h,imageClassName:u}),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:()=>d});var r=n(7462),o=n(7294),a=n(4334),i=n(2389),s=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function d(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:d,className:c,alt:u,...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:d[e],alt:u,className:(0,a.Z)(l.themedImage,l[`themedImage--${e}`],c)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>h});var r=n(7462),o=n(7294),a=n(412),i=n(1442);const s="ease-in-out";function l(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 d={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?d:c;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??s}`,height:`${t}px`}}function l(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return u(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=d.height,e.style.overflow=d.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!a.Z.canUseDOM)return e?d:c}function g(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:l}=e;const d=(0,o.useRef)(null);return p({collapsibleRef:d,collapsed:n,animation:a}),o.createElement(t,{ref:d,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(d.current,n),i?.(n))},className:s},r)}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,o.useState)(!t),[s,l]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&l(t)}),[a,t]),a?o.createElement(g,(0,r.Z)({},n,{collapsed:s})):null}function h(e){let{lazy:t,...n}=e;const r=t?m:g;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>f});var r=n(7294),o=n(2389),a=n(12),i=n(902),s=n(6668);const l=(0,a.WA)("docusaurus.announcement.dismiss"),d=(0,a.WA)("docusaurus.announcement.id"),c=()=>"true"===l.get(),u=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const i=(0,r.useCallback)((()=>{u(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=d.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;d.set(t),r&&u(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function g(){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:()=>h,S:()=>m});var r=n(7294),o=n(412),a=n(902),i=n(12),s=n(6668);const l=r.createContext(void 0),d="theme",c=(0,i.WA)(d),u={light:"light",dark:"dark"},p=e=>e===u.dark?u.dark:u.light,f=e=>o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),g=e=>{c.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,a]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&g(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?u.dark:u.light:e),c.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!==d)return;const t=c.get();null!==t&&i(p(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===u.dark},setLightTheme(){i(u.light)},setDarkTheme(){i(u.dark)}})),[o,i])}();return r.createElement(l.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(l);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:()=>h});var r=n(7294),o=n(143),a=n(9935),i=n(6668),s=n(3438),l=n(902),d=n(12);const c=e=>`docs-preferred-version-${e}`,u={save:(e,t,n)=>{(0,d.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,d.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,d.WA)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=u.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(u.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){u.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return r.createElement(f.Provider,{value:n},t)}function h(e){let{children:t}=e;return s.cE?r.createElement(m,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=b(),{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])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),i=r.createContext(a);function s(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 l(){const e=(0,r.useContext)(i);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>i});var r=n(7294),o=n(902);const a=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(a.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>u,e:()=>p});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),s=n(6668),l=n(902);const d=r.createContext(void 0);function c(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,d]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return d(!1),!1}));const c=(0,r.useCallback)((()=>{d((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&d(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function u(e){let{children:t}=e;const n=c();return r.createElement(d.Provider,{value:n},t)}function p(){const e=r.useContext(d);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,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 s(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const i=(0,r.useContext)(a);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),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)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>d});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return o.Z.canUseDOM?window.innerWidth>i?a.desktop:a.mobile:a.ssr}const l=!1;function d(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?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})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>S,Wl:()=>g,_F:()=>v,cE:()=>p,hI:()=>E,jA:()=>m,lO:()=>w,oz:()=>k,s1:()=>x,vY:()=>_,xz:()=>f});var r=n(7294),o=n(6550),a=n(8790),i=n(143),s=n(373),l=n(4477),d=n(1116),c=n(7392),u=n(8596);const p=!!i._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function g(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=g(t);if(e)return e}}}function m(){const{pathname:e}=(0,o.TH)(),t=(0,d.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||b(e.items,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,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 x(){const e=(0,d.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([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 _(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- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),i=t.routes,s=i.find((e=>(0,o.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,d=l?n.docsSidebars[l]:void 0;return{docElement:(0,a.H)(i),sidebarName:l,sidebarItems:d}}function S(e){return e.filter((e=>"category"!==e.type||!!g(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>s,_X:()=>l});var r=n(7294),o=n(6550),a=n(1688),i=n(902);function s(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 l(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)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>c,VC:()=>f});var r=n(7294),o=n(7459),a=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),d=n(2263);function c(e){let{title:t,description:n,keywords:o,image:i,children:s}=e;const c=function(e){const{siteConfig:t}=(0,d.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:u}=(0,l.C)(),p=i?u(i,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),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}),s)}const u=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(u),s=(0,o.Z)(i,t);return r.createElement(u.Provider,{value:s},r.createElement(a.Z,null,r.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),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:()=>d,Ql:()=>l,i6:()=>s,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 s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function d(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});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 s(){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:()=>f,OC:()=>l,RF:()=>u,o5:()=>p});var r=n(7294),o=n(412),a=n(2389),i=n(902);const s=r.createContext(void 0);function l(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(s.Provider,{value:n},t)}function d(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function u(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(c()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();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=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function f(){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:()=>r,os:()=>o});n(2263);const r="default";function o(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>u,WA:()=>c});var r=n(7294),o=n(1688);const a="localStorage";function i(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 s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const d={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(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=s(t?.persistence);return null===n?d:{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),i({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),i({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),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?d:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,o.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},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:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),d=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=s===i?e:e.replace(`/${s}/`,"/"),u=d.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${u}`}}}},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}},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}})},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>x,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("/")||[],s=e&&o(e),l=t&&o(t),d=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var u=0,p=i.length;p>=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),u++):u&&(a(i,p),u--)}if(!d)for(;u--;u)i.unshift("..");!d||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function u(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(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 g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var m=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),m||(0,s.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,d=i.forceRefresh,x=void 0!==d&&d,w=i.getUserConfirmation,k=void 0===w?h:w,_=i.keyLength,E=void 0===_?6:_,S=e.basename?u(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 S&&(a=c(a,S)),f(a,r,n)}function T(){return Math.random().toString(36).substr(2,E)}var A=g();function L(e){(0,r.Z)(j,e),j.length=n.length,A.notifyListeners(j.location,j.action)}function N(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||I(C(e.state))}function P(){I(C(y()))}var O=!1;function I(e){if(O)O=!1,L();else{A.confirmTransitionTo(e,"POP",k,(function(t){t?L({action:"POP",location:e}):function(e){var t=j.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(O=!0,G(o))}(e)}))}}var R=C(y()),M=[R.key];function D(e){return S+p(e)}function G(e){n.go(e)}var z=0;function F(e){1===(z+=e)&&1===e?(window.addEventListener(b,N),a&&window.addEventListener(v,P)):0===z&&(window.removeEventListener(b,N),a&&window.removeEventListener(v,P))}var B=!1;var j={length:n.length,action:"POP",location:R,createHref:D,push:function(e,t){var r="PUSH",a=f(e,t,T(),j.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=D(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=M.indexOf(j.location.key),d=M.slice(0,l+1);d.push(a.key),M=d,L({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,T(),j.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=D(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=M.indexOf(j.location.key);-1!==l&&(M[l]=a.key),L({action:r,location:a})}else window.location.replace(t)}}))},go:G,goBack:function(){G(-1)},goForward:function(){G(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return B||(F(1),B=!0),function(){return B&&(B=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return j}var w="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:l},slash:{encodePath:l,decodePath:l}};function _(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 S(e){window.location.replace(_(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),m||(0,s.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?h:o,i=n.hashType,d=void 0===i?"slash":i,b=e.basename?u(l(e.basename)):"",v=k[d],y=v.encodePath,x=v.decodePath;function C(){var e=x(E());return b&&(e=c(e,b)),f(e)}var T=g();function A(e){(0,r.Z)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var L=!1,N=null;function P(){var e,t,n=E(),r=y(n);if(n!==r)S(r);else{var o=C(),i=B.location;if(!L&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(N===p(o))return;N=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=B.location,n=M.lastIndexOf(p(t));-1===n&&(n=0);var r=M.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(L=!0,D(o))}(e)}))}}(o)}}var O=E(),I=y(O);O!==I&&S(I);var R=C(),M=[p(R)];function D(e){t.go(e)}var G=0;function z(e){1===(G+=e)&&1===e?window.addEventListener(w,P):0===G&&window.removeEventListener(w,P)}var F=!1;var B={length:t.length,action:"POP",location:R,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=_(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(E()!==o){N=t,function(e){window.location.hash=e}(o);var a=M.lastIndexOf(p(B.location)),i=M.slice(0,a+1);i.push(t),M=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);E()!==o&&(N=t,S(o));var a=M.indexOf(p(B.location));-1!==a&&(M[a]=t),A({action:n,location:r})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return F||(z(1),F=!0),function(){return F&&(F=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-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,d=void 0===l?6:l,c=g();function u(e){(0,r.Z)(x,e),x.length=x.entries.length,c.notifyListeners(x.location,x.action)}function m(){return Math.random().toString(36).substr(2,d)}var h=T(s,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?m():e.key||m())})),v=p;function y(e){var t=T(x.index+e,0,x.entries.length-1),r=x.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?u({action:"POP",location:r,index:t}):u()}))}var x={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,m(),x.location);c.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),u({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),x.location);c.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,u({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),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return x}},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},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 d=Object.defineProperty,c=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=c(n);u&&(i=i.concat(u(n)));for(var s=l(t),m=l(n),h=0;h<i.length;++h){var b=i[h];if(!(a[b]||r&&r[b]||m&&m[b]||s&&s[b])){var v=p(n,b);try{d(t,b,v)}catch(y){}}}}return t}},1143: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 d=[n,r,o,a,i,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return d[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},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),d=a.querySelector(r.barSelector),c=r.speed,u=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(d,i(e,c,u)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*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");c(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),d=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),d!=document.body&&c(d,"nprogress-custom-parent"),d.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(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 d(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;d(n,t)||(e.className=r.substring(1))}function u(e,t){var n,r=p(e);d(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,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l<arguments.length;l++){for(var d in a=Object(arguments[l]))n.call(a,d)&&(s[d]=a[d]);if(t){i=t(a);for(var c=0;c<i.length;c++)r.call(a,i[c])&&(s[i[c]]=a[i[c]])}}return s}},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 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 d=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===d&&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],d=r.util.type(l);"Object"!==d||a[i(l)]?"Array"!==d||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};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 s;return l(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,s,c,u){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var g=0;g<f.length;++g){if(u&&u.cause==p+","+g)return;var m=f[g],h=m.inside,b=!!m.lookbehind,v=!!m.greedy,y=m.alias;if(v&&!m.pattern.global){var x=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,x+"g")}for(var w=m.pattern||m,k=s.next,_=c;k!==t.tail&&!(u&&_>=u.reach);_+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var S,C=1;if(v){if(!(S=a(w,_,e,b))||S.index>=e.length)break;var T=S.index,A=S.index+S[0].length,L=_;for(L+=k.value.length;T>=L;)L+=(k=k.next).value.length;if(_=L-=k.value.length,k.value instanceof o)continue;for(var N=k;N!==t.tail&&(L<A||"string"==typeof N.value);N=N.next)C++,L+=N.value.length;C--,E=e.slice(_,L),S.index-=_}else if(!(S=a(w,0,E,b)))continue;T=S.index;var P=S[0],O=E.slice(0,T),I=E.slice(T+P.length),R=_+E.length;u&&R>u.reach&&(u.reach=R);var M=k.prev;if(O&&(M=l(t,M,O),_+=O.length),d(t,M,C),k=l(t,M,new o(p,h?r.tokenize(P,h):P,y,P)),I&&l(t,k,I),C>1){var D={cause:p+","+g,reach:R};i(e,t,n,k.prev,_,D),u&&D.reach>u.reach&&(u.reach=D.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 d(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}(),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 s=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),l="language-"+(s=(/[a-z][\w-]*/i.exec(s)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,l]:i.alias.push(l):i.alias=[l]}}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],d=/language-(.+)/.exec(a);if(d){n=d[1];break}}var c,u=e.languages[n];if(u)t.content=e.highlight((c=t.content,c.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n);var r=s[t];return r||e}))),u,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"),s={amp:"&",lt:"<",gt:">",quot:'"'},l=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(u(["definition-mutation","punctuation"])&&"("===c(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=c(0);"variable"===i.type&&(f(i,"variable-input"),o.push(i.content))}n=a+1}if(u(["punctuation","property-query"])&&"{"===c(0).content&&(n++,f(c(0),"property-mutation"),o.length>0)){var s=p(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l<s;l++){var d=t[l];"variable"===d.type&&o.indexOf(d.content)>=0&&f(d,"variable-input")}}}}function c(e){return t[n+e]}function u(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function 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)}})),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 s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(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 d(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,l(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,i)}return new e.Token("interpolation",a,r.alias,t)}function c(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),i=0,c={},u=l(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=s(i++,r)););return c[n]=o,n})).join(""),n,r),p=Object.keys(c);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,s=a.indexOf(o);if(-1!==s){++i;var l=a.substring(0,s),u=d(c[o]),f=a.substring(s+o.length),g=[];if(l&&g.push(l),g.push(u),f){var m=[f];e(m),g.push.apply(g,m)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(u),new e.Token(r,u,"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 u={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 u&&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 s=i[1];if(3===i.length&&"string"!=typeof s&&"embedded-code"===s.type){var l=p(s),d=s.alias,u=Array.isArray(d)?d[0]:d,f=e.languages[u];if(!f)continue;i[1]=c(l,f,u)}}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(""):""},s=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 l=i(o);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(l+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=i(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}o.content&&"string"!=typeof o.content&&s(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(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,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 d=s[l];if("string"==typeof d||d.content&&"string"==typeof d.content){var c=a[o],u=n.tokenStack[c],p="string"==typeof d?d:d.content,f=t(r,c),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(u,n.grammar),"language-"+r,u),b=p.substring(g+f.length),v=[];m&&v.push.apply(v,i([m])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof d?s.splice.apply(s,[l,1].concat(v)):d.content=v}}else d.content&&i(d.content)}return s}(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},485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},4677:()=>{Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},3436:()=>{!function(e){var t=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:t}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:t}},punctuation:/[{};]/}}(Prism)},9385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},874:()=>{Prism.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:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},1472:(e,t,n)=>{var r={"./prism-groovy":485,"./prism-hcl":4677,"./prism-java":2503,"./prism-kotlin":2334,"./prism-nginx":3436,"./prism-ruby":9385,"./prism-swift":874,"./prism-toml":9930};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=1472},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 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}},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 s=new Set,l={};function d(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)s.add(t[e])}var u=!("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,g={},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 b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function x(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(m,e)||!f.call(g,e)&&(p.test(e)?m[e]=!0:(g[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 h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,_=60106,E=60107,S=60108,C=60114,T=60109,A=60110,L=60112,N=60113,P=60120,O=60115,I=60116,R=60121,M=60128,D=60129,G=60130,z=60131;if("function"==typeof Symbol&&Symbol.for){var F=Symbol.for;k=F("react.element"),_=F("react.portal"),E=F("react.fragment"),S=F("react.strict_mode"),C=F("react.profiler"),T=F("react.provider"),A=F("react.context"),L=F("react.forward_ref"),N=F("react.suspense"),P=F("react.suspense_list"),O=F("react.memo"),I=F("react.lazy"),R=F("react.block"),F("react.scope"),M=F("react.opaque.id"),D=F("react.debug_trace_mode"),G=F("react.offscreen"),z=F("react.legacy_hidden")}var B,j="function"==typeof Symbol&&Symbol.iterator;function $(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=j&&e[j]||e["@@iterator"])?e:null}function H(e){if(void 0===B)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);B=t&&t[1]||""}return"\n"+B+e}var U=!1;function Z(e,t){if(!e||U)return"";U=!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(l){var r=l}Reflect.construct(e,[],t)}else{try{t.call()}catch(l){r=l}e.call(t.prototype)}else{try{throw Error()}catch(l){r=l}e()}}catch(l){if(l&&r&&"string"==typeof l.stack){for(var o=l.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])return"\n"+o[i].replace(" at new "," at ")}while(1<=i&&0<=s);break}}}finally{U=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?H(e):""}function V(e){switch(e.tag){case 5:return H(e.type);case 16:return H("Lazy");case 13:return H("Suspense");case 19:return H("SuspenseList");case 0:case 2:case 15:return e=Z(e.type,!1);case 11:return e=Z(e.type.render,!1);case 22:return e=Z(e.type._render,!1);case 1:return e=Z(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case E:return"Fragment";case _:return"Portal";case C:return"Profiler";case S:return"StrictMode";case N: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 O:return q(e.type);case R:return q(e._render);case I:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var 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 X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return 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)&&x(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&&Q(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 se(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return o({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function le(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 de(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var ue={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 ge,me,he=(me=function(e,t){if(e.namespaceURI!==ue.svg||"innerHTML"in e)e.innerHTML=t;else{for((ge=ge||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ge.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 me(e,t)}))}:me);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 xe(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 we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=xe(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 _e(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 Se(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 Ne(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 Oe(e,t){return e(t)}function Ie(e,t,n,r,o){return e(t,n,r,o)}function Re(){}var Me=Oe,De=!1,Ge=!1;function ze(){null===Te&&null===Ae||(Re(),Pe())}function Fe(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 Be=!1;if(u)try{var je={};Object.defineProperty(je,"passive",{get:function(){Be=!0}}),window.addEventListener("test",je,je),window.removeEventListener("test",je,je)}catch(me){Be=!1}function $e(e,t,n,r,o,a,i,s,l){var d=Array.prototype.slice.call(arguments,3);try{t.apply(n,d)}catch(c){this.onError(c)}}var He=!1,Ue=null,Ze=!1,Ve=null,qe={onError:function(e){He=!0,Ue=e}};function We(e,t,n,r,o,a,i,s,l){He=!1,Ue=null,$e.apply(qe,arguments)}function Ye(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 Ke(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(i(188))}function Qe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(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 Xe(o),e;if(a===r)return Xe(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=a;break}if(l===r){s=!0,r=o,n=a;break}l=l.sibling}if(!s){for(l=a.child;l;){if(l===n){s=!0,n=a,r=o;break}if(l===r){s=!0,r=a,n=o;break}l=l.sibling}if(!s)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,st=null,lt=null,dt=new Map,ct=new Map,ut=[],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 gt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":st=null;break;case"mouseover":case"mouseout":lt=null;break;case"pointerover":case"pointerout":dt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function mt(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 ht(e){var t=to(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ke(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=Qt(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=Qt(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!==st&&bt(st)&&(st=null),null!==lt&&bt(lt)&&(lt=null),dt.forEach(vt),ct.forEach(vt)}function xt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,yt)))}function wt(e){function t(t){return xt(t,e)}if(0<at.length){xt(at[0],e);for(var n=1;n<at.length;n++){var r=at[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&xt(it,e),null!==st&&xt(st,e),null!==lt&&xt(lt,e),dt.forEach(t),ct.forEach(t),n=0;n<ut.length;n++)(r=ut[n]).blockedOn===e&&(r.blockedOn=null);for(;0<ut.length&&null===(n=ut[0]).blockedOn;)ht(n),null===n.blockedOn&&ut.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 _t={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},Et={},St={};function Ct(e){if(Et[e])return Et[e];if(!_t[e])return e;var t,n=_t[e];for(t in n)if(n.hasOwnProperty(t)&&t in St)return Et[e]=n[t];return e}u&&(St=document.createElement("div").style,"AnimationEvent"in window||(delete _t.animationend.animation,delete _t.animationiteration.animation,delete _t.animationstart.animation),"TransitionEvent"in window||delete _t.transitionend.transition);var Tt=Ct("animationend"),At=Ct("animationiteration"),Lt=Ct("animationstart"),Nt=Ct("transitionend"),Pt=new Map,Ot=new Map,It=["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",Nt,"transitionEnd","waiting","waiting"];function Rt(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)),Ot.set(r,t),Pt.set(r,o),d(o,[r])}}(0,a.unstable_now)();var Mt=8;function Dt(e){if(0!=(1&e))return Mt=15,1;if(0!=(2&e))return Mt=14,2;if(0!=(4&e))return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):0!=(32&e)?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):0!=(256&e)?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):0!=(4096&e)?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):0!=(134217728&e)?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):0!=(1073741824&e)?(Mt=1,1073741824):(Mt=8,e)}function Gt(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var r=0,o=0,a=e.expiredLanes,i=e.suspendedLanes,s=e.pingedLanes;if(0!==a)r=a,o=Mt=15;else if(0!==(a=134217727&n)){var l=a&~i;0!==l?(r=Dt(l),o=Mt):0!==(s&=a)&&(r=Dt(s),o=Mt)}else 0!==(a=n&~i)?(r=Dt(a),o=Mt):0!==s&&(r=Dt(s),o=Mt);if(0===r)return 0;if(r=n&((0>(r=31-Ht(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&i)){if(Dt(t),o<=Mt)return t;Mt=o}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-Ht(t)),r|=e[n],t&=~o;return r}function zt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function Ft(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Bt(24&~t))?Ft(10,t):e;case 10:return 0===(e=Bt(192&~t))?Ft(8,t):e;case 8:return 0===(e=Bt(3584&~t))&&(0===(e=Bt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Bt(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function Bt(e){return e&-e}function jt(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-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ut(e)/Zt|0)|0},Ut=Math.log,Zt=Math.LN2;var Vt=a.unstable_UserBlockingPriority,qt=a.unstable_runWithPriority,Wt=!0;function Yt(e,t,n,r){De||Re();var o=Xt,a=De;De=!0;try{Ie(o,e,t,n,r)}finally{(De=a)||ze()}}function Kt(e,t,n,r){qt(Vt,Xt.bind(null,e,t,n,r))}function Xt(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=Qt(e,t,n,r);if(null===a)o&>(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=mt(it,e,t,n,r,o),!0;case"dragenter":return st=mt(st,e,t,n,r,o),!0;case"mouseover":return lt=mt(lt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return dt.set(a,mt(dt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,ct.set(a,mt(ct.get(a)||null,e,t,n,r,o)),!0}return!1}(a,e,t,n,r))return;gt(e,r)}Rr(e,t,r,null,n)}}}function Qt(e,t,n,r){var o=Se(r);if(null!==(o=to(o))){var a=Ye(o);if(null===a)o=null;else{var i=a.tag;if(13===i){if(null!==(o=Ke(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 Rr(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 sn(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 ln,dn,cn,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(un),fn=o({},un,{view:0,detail:0}),gn=sn(fn),mn=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!==cn&&(cn&&"mousemove"===e.type?(ln=e.screenX-cn.screenX,dn=e.screenY-cn.screenY):dn=ln=0,cn=e),ln)},movementY:function(e){return"movementY"in e?e.movementY:dn}}),hn=sn(mn),bn=sn(o({},mn,{dataTransfer:0})),vn=sn(o({},fn,{relatedTarget:0})),yn=sn(o({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),xn=o({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=sn(xn),kn=sn(o({},un,{data:0})),_n={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"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function Tn(){return Cn}var An=o({},fn,{key:function(e){if(e.key){var t=_n[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=sn(An),Nn=sn(o({},mn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Pn=sn(o({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),On=sn(o({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),In=o({},mn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Rn=sn(In),Mn=[9,13,27,32],Dn=u&&"CompositionEvent"in window,Gn=null;u&&"documentMode"in document&&(Gn=document.documentMode);var zn=u&&"TextEvent"in window&&!Gn,Fn=u&&(!Dn||Gn&&8<Gn&&11>=Gn),Bn=String.fromCharCode(32),jn=!1;function $n(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var Zn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Zn[e.type]:"textarea"===t}function qn(e,t,n,r){Ne(r),0<(t=Dr(t,"onChange")).length&&(n=new pn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,Yn=null;function Kn(e){Ar(e,0)}function Xn(e){if(X(ro(e)))return e}function Qn(e,t){if("change"===e)return t}var Jn=!1;if(u){var er;if(u){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),Yn=Wn=null)}function or(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,Se(e)),e=Kn,De)e(t);else{De=!0;try{Oe(e,t)}finally{De=!1,ze()}}}}function ar(e,t,n){"focusin"===e?(rr(),Yn=n,(Wn=t).attachEvent("onpropertychange",or)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function sr(e,t){if("click"===e)return Xn(t)}function lr(e,t){if("input"===e||"change"===e)return Xn(t)}var dr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},cr=Object.prototype.hasOwnProperty;function ur(e,t){if(dr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!dr(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 gr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?gr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function mr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function hr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=u&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,xr=null,wr=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wr||null==vr||vr!==Q(r)||("selectionStart"in(r=vr)&&hr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},xr&&ur(xr,r)||(xr=r,0<(r=Dr(yr,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}Rt("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),Rt("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),Rt(It,2);for(var _r="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Er=0;Er<_r.length;Er++)Ot.set(_r[Er],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),d("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),d("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),d("onBeforeInput",["compositionend","keypress","textInput","paste"]),d("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),d("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),d("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Sr="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(Sr));function Tr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,s,l,d){if(We.apply(this,arguments),He){if(!He)throw Error(i(198));var c=Ue;He=!1,Ue=null,Ze||(Ze=!0,Ve=c)}}(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 s=r[i],l=s.instance,d=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Tr(o,s,d),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,d=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Tr(o,s,d),a=l}}}if(Ze)throw e=Ve,Ze=!1,Ve=null,e}function Lr(e,t){var n=ao(t),r=e+"__bubble";n.has(r)||(Ir(t,e,2,!1),n.add(r))}var Nr="_reactListening"+Math.random().toString(36).slice(2);function Pr(e){e[Nr]||(e[Nr]=!0,s.forEach((function(t){Cr.has(t)||Or(t,!1,e,null),Or(t,!0,e,null)})))}function Or(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),s=e+"__"+(t?"capture":"bubble");i.has(s)||(t&&(o|=4),Ir(a,e,o,t),i.add(s))}function Ir(e,t,n,r){var o=Ot.get(t);switch(void 0===o?2:o){case 0:o=Yt;break;case 1:o=Kt;break;default:o=Xt}n=o.bind(null,t,n,e),o=void 0,!Be||"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 Rr(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=to(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}!function(e,t,n){if(Ge)return e(t,n);Ge=!0;try{return Me(e,t,n)}finally{Ge=!1,ze()}}((function(){var r=a,o=Se(n),i=[];e:{var s=Pt.get(e);if(void 0!==s){var l=pn,d=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":l=Ln;break;case"focusin":d="focus",l=vn;break;case"focusout":d="blur",l=vn;break;case"beforeblur":case"afterblur":l=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":l=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=Pn;break;case Tt:case At:case Lt:l=yn;break;case Nt:l=On;break;case"scroll":l=gn;break;case"wheel":l=Rn;break;case"copy":case"cut":case"paste":l=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=Nn}var c=0!=(4&t),u=!c&&"scroll"===e,p=c?null!==s?s+"Capture":null:s;c=[];for(var f,g=r;null!==g;){var m=(f=g).stateNode;if(5===f.tag&&null!==m&&(f=m,null!==p&&(null!=(m=Fe(g,p))&&c.push(Mr(g,m,f)))),u)break;g=g.return}0<c.length&&(s=new l(s,d,null,n,o),i.push({event:s,listeners:c}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(d=n.relatedTarget||n.fromElement)||!to(d)&&!d[Jr])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(d=(d=n.relatedTarget||n.toElement)?to(d):null)&&(d!==(u=Ye(d))||5!==d.tag&&6!==d.tag)&&(d=null)):(l=null,d=r),l!==d)){if(c=hn,m="onMouseLeave",p="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(c=Nn,m="onPointerLeave",p="onPointerEnter",g="pointer"),u=null==l?s:ro(l),f=null==d?s:ro(d),(s=new c(m,g+"leave",l,n,o)).target=u,s.relatedTarget=f,m=null,to(o)===r&&((c=new c(p,g+"enter",d,n,o)).target=f,c.relatedTarget=u,m=c),u=m,l&&d)e:{for(p=d,g=0,f=c=l;f;f=Gr(f))g++;for(f=0,m=p;m;m=Gr(m))f++;for(;0<g-f;)c=Gr(c),g--;for(;0<f-g;)p=Gr(p),f--;for(;g--;){if(c===p||null!==p&&c===p.alternate)break e;c=Gr(c),p=Gr(p)}c=null}else c=null;null!==l&&zr(i,s,l,c,!1),null!==d&&null!==u&&zr(i,u,d,c,!0)}if("select"===(l=(s=r?ro(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var h=Qn;else if(Vn(s))if(Jn)h=lr;else{h=ir;var b=ar}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(h=sr);switch(h&&(h=h(e,r))?qn(i,h,n,o):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&oe(s,"number",s.value)),b=r?ro(r):window,e){case"focusin":(Vn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,xr=null);break;case"focusout":xr=yr=vr=null;break;case"mousedown":wr=!0;break;case"contextmenu":case"mouseup":case"dragend":wr=!1,kr(i,n,o);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(i,n,o)}var v;if(Dn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Un?$n(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Fn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=nn()):(en="value"in(Jt=o)?Jt.value:Jt.textContent,Un=!0)),0<(b=Dr(r,y)).length&&(y=new kn(y,e,null,n,o),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=zn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(jn=!0,Bn);case"textInput":return(e=t.data)===Bn&&jn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!Dn&&$n(e,t)?(e=nn(),tn=en=Jt=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 Fn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Dr(r,"onBeforeInput")).length&&(o=new kn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=v))}Ar(i,t)}))}function Mr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Dr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Fe(e,n))&&r.unshift(Mr(e,a,o)),null!=(a=Fe(e,t))&&r.push(Mr(e,a,o))),e=e.return}return r}function Gr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function zr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,d=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==d&&(s=d,o?null!=(l=Fe(n,a))&&i.unshift(Mr(n,l,s)):o||null!=(l=Fe(n,a))&&i.push(Mr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function Fr(){}var Br=null,jr=null;function $r(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Hr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Ur="function"==typeof setTimeout?setTimeout:void 0,Zr="function"==typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function 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 Yr=0;var Kr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Kr,Qr="__reactProps$"+Kr,Jr="__reactContainer$"+Kr,eo="__reactEvents$"+Kr;function to(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wr(e);null!==e;){if(n=e[Xr])return n;e=Wr(e)}return t}n=(e=n).parentNode}return null}function no(e){return!(e=e[Xr]||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[Qr]||null}function ao(e){var t=e[eo];return void 0===t&&(t=e[eo]=new Set),t}var io=[],so=-1;function lo(e){return{current:e}}function co(e){0>so||(e.current=io[so],io[so]=null,so--)}function uo(e,t){so++,io[so]=e.current,e.current=t}var po={},fo=lo(po),go=lo(!1),mo=po;function ho(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(go),co(fo)}function yo(e,t,n){if(fo.current!==po)throw Error(i(168));uo(fo,t),uo(go,n)}function xo(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,q(t)||"Unknown",a));return o({},n,r)}function wo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||po,mo=fo.current,uo(fo,e),uo(go,go.current),!0}function ko(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=xo(e,t,mo),r.__reactInternalMemoizedMergedChildContext=e,co(go),co(fo),uo(fo,e)):co(go),uo(go,n)}var _o=null,Eo=null,So=a.unstable_runWithPriority,Co=a.unstable_scheduleCallback,To=a.unstable_cancelCallback,Ao=a.unstable_shouldYield,Lo=a.unstable_requestPaint,No=a.unstable_now,Po=a.unstable_getCurrentPriorityLevel,Oo=a.unstable_ImmediatePriority,Io=a.unstable_UserBlockingPriority,Ro=a.unstable_NormalPriority,Mo=a.unstable_LowPriority,Do=a.unstable_IdlePriority,Go={},zo=void 0!==Lo?Lo:function(){},Fo=null,Bo=null,jo=!1,$o=No(),Ho=1e4>$o?No:function(){return No()-$o};function Uo(){switch(Po()){case Oo:return 99;case Io:return 98;case Ro:return 97;case Mo:return 96;case Do:return 95;default:throw Error(i(332))}}function Zo(e){switch(e){case 99:return Oo;case 98:return Io;case 97:return Ro;case 96:return Mo;case 95:return Do;default:throw Error(i(332))}}function Vo(e,t){return e=Zo(e),So(e,t)}function qo(e,t,n){return e=Zo(e),Co(e,t,n)}function Wo(){if(null!==Bo){var e=Bo;Bo=null,To(e)}Yo()}function Yo(){if(!jo&&null!==Fo){jo=!0;var e=0;try{var t=Fo;Vo(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fo=null}catch(n){throw null!==Fo&&(Fo=Fo.slice(e+1)),Co(Oo,Wo),n}finally{jo=!1}}}var Ko=w.ReactCurrentBatchConfig;function Xo(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 Qo=lo(null),Jo=null,ea=null,ta=null;function na(){ta=ea=Jo=null}function ra(e){var t=Qo.current;co(Qo),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)&&(Di=!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 sa=!1;function la(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function da(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 ca(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function ua(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;sa=!1;var i=a.firstBaseUpdate,s=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var d=l,c=d.next;d.next=null,null===s?i=c:s.next=c,s=d;var u=e.alternate;if(null!==u){var p=(u=u.updateQueue).lastBaseUpdate;p!==s&&(null===p?u.firstBaseUpdate=c:p.next=c,u.lastBaseUpdate=d)}}if(null!==i){for(p=a.baseState,s=0,u=c=d=null;;){l=i.lane;var f=i.eventTime;if((r&l)===l){null!==u&&(u=u.next={eventTime:f,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var g=e,m=i;switch(l=t,f=n,m.tag){case 1:if("function"==typeof(g=m.payload)){p=g.call(f,p,l);break e}p=g;break e;case 3:g.flags=-4097&g.flags|64;case 0:if(null==(l="function"==typeof(g=m.payload)?g.call(f,p,l):g))break e;p=o({},p,l);break e;case 2:sa=!0}}null!==i.callback&&(e.flags|=32,null===(l=a.effects)?a.effects=[i]:l.push(i))}else f={eventTime:f,lane:l,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===u?(c=u=f,d=p):u=u.next=f,s|=l;if(null===(i=i.next)){if(null===(l=a.shared.pending))break;i=l.next,l.next=null,a.lastBaseUpdate=l,a.shared.pending=null}}null===u&&(d=p),a.baseState=d,a.firstBaseUpdate=c,a.lastBaseUpdate=u,js|=s,e.lanes=s,e.memoizedState=p}}function ga(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 ma=(new r.Component).refs;function ha(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)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.payload=t,null!=n&&(a.callback=n),ua(e,a),gl(e,o,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),ua(e,a),gl(e,o,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=pl(),r=fl(e),o=ca(n,r);o.tag=2,null!=t&&(o.callback=t),ua(e,o),gl(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||(!ur(n,r)||!ur(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)?mo:fo.current,a=(r=null!=(r=t.contextTypes))?ho(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 xa(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 wa(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=ma,la(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=ia(a):(a=bo(t)?mo:fo.current,o.context=ho(e,a)),fa(e,n,o,r),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(ha(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 _a(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===ma&&(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 Sa(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=Vl(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 s(t){return e&&null===t.alternate&&(t.flags=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Kl(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function d(e,t,n,r){return null!==t&&t.elementType===n.type?((r=o(t,n.props)).ref=_a(e,t,n),r.return=e,r):((r=ql(n.type,n.key,n.props,null,e.mode,r)).ref=_a(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xl(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function u(e,t,n,r,a){return null===t||7!==t.tag?((t=Wl(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=Kl(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=ql(t.type,t.key,t.props,null,e.mode,n)).ref=_a(e,null,t),n.return=e,n;case _:return(t=Xl(t,e.mode,n)).return=e,t}if(ka(t)||$(t))return(t=Wl(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:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?n.type===E?u(e,t,n.props.children,r,o):d(e,t,n,r):null;case _:return n.key===o?c(e,t,n,r):null}if(ka(n)||$(n))return null!==o?null:u(e,t,n,r,null);Ea(e,n)}return null}function g(e,t,n,r,o){if("string"==typeof r||"number"==typeof r)return l(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?u(t,e,r.props.children,o,r.key):d(t,e,r,o);case _:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o)}if(ka(r)||$(r))return u(t,e=e.get(n)||null,r,o,null);Ea(t,r)}return null}function m(o,i,s,l){for(var d=null,c=null,u=i,m=i=0,h=null;null!==u&&m<s.length;m++){u.index>m?(h=u,u=null):h=u.sibling;var b=f(o,u,s[m],l);if(null===b){null===u&&(u=h);break}e&&u&&null===b.alternate&&t(o,u),i=a(b,i,m),null===c?d=b:c.sibling=b,c=b,u=h}if(m===s.length)return n(o,u),d;if(null===u){for(;m<s.length;m++)null!==(u=p(o,s[m],l))&&(i=a(u,i,m),null===c?d=u:c.sibling=u,c=u);return d}for(u=r(o,u);m<s.length;m++)null!==(h=g(u,o,m,s[m],l))&&(e&&null!==h.alternate&&u.delete(null===h.key?m:h.key),i=a(h,i,m),null===c?d=h:c.sibling=h,c=h);return e&&u.forEach((function(e){return t(o,e)})),d}function h(o,s,l,d){var c=$(l);if("function"!=typeof c)throw Error(i(150));if(null==(l=c.call(l)))throw Error(i(151));for(var u=c=null,m=s,h=s=0,b=null,v=l.next();null!==m&&!v.done;h++,v=l.next()){m.index>h?(b=m,m=null):b=m.sibling;var y=f(o,m,v.value,d);if(null===y){null===m&&(m=b);break}e&&m&&null===y.alternate&&t(o,m),s=a(y,s,h),null===u?c=y:u.sibling=y,u=y,m=b}if(v.done)return n(o,m),c;if(null===m){for(;!v.done;h++,v=l.next())null!==(v=p(o,v.value,d))&&(s=a(v,s,h),null===u?c=v:u.sibling=v,u=v);return c}for(m=r(o,m);!v.done;h++,v=l.next())null!==(v=g(m,o,h,v.value,d))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),s=a(v,s,h),null===u?c=v:u.sibling=v,u=v);return e&&m.forEach((function(e){return t(o,e)})),c}return function(e,r,a,l){var d="object"==typeof a&&null!==a&&a.type===E&&null===a.key;d&&(a=a.props.children);var c="object"==typeof a&&null!==a;if(c)switch(a.$$typeof){case k:e:{for(c=a.key,d=r;null!==d;){if(d.key===c){if(7===d.tag){if(a.type===E){n(e,d.sibling),(r=o(d,a.props.children)).return=e,e=r;break e}}else if(d.elementType===a.type){n(e,d.sibling),(r=o(d,a.props)).ref=_a(e,d,a),r.return=e,e=r;break e}n(e,d);break}t(e,d),d=d.sibling}a.type===E?((r=Wl(a.props.children,e.mode,l,a.key)).return=e,e=r):((l=ql(a.type,a.key,a.props,null,e.mode,l)).ref=_a(e,r,a),l.return=e,e=l)}return s(e);case _:e:{for(d=a.key;null!==r;){if(r.key===d){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=Xl(a,e.mode,l)).return=e,e=r}return s(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=Kl(a,e.mode,l)).return=e,e=r),s(e);if(ka(a))return m(e,r,a,l);if($(a))return h(e,r,a,l);if(c&&Ea(e,a),void 0===a&&!d)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,q(e.type)||"Component"))}return n(e,r)}}var Ca=Sa(!0),Ta=Sa(!1),Aa={},La=lo(Aa),Na=lo(Aa),Pa=lo(Aa);function Oa(e){if(e===Aa)throw Error(i(174));return e}function Ia(e,t){switch(uo(Pa,t),uo(Na,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 Ra(){co(La),co(Na),co(Pa)}function Ma(e){Oa(Pa.current);var t=Oa(La.current),n=fe(t,e.type);t!==n&&(uo(Na,e),uo(La,n))}function Da(e){Na.current===e&&(co(La),co(Na))}var Ga=lo(0);function za(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 Fa=null,Ba=null,ja=!1;function $a(e,t){var n=Ul(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 Ha(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 Ua(e){if(ja){var t=Ba;if(t){var n=t;if(!Ha(e,t)){if(!(t=qr(n.nextSibling))||!Ha(e,t))return e.flags=-1025&e.flags|2,ja=!1,void(Fa=e);$a(Fa,n)}Fa=e,Ba=qr(t.firstChild)}else e.flags=-1025&e.flags|2,ja=!1,Fa=e}}function Za(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Fa=e}function Va(e){if(e!==Fa)return!1;if(!ja)return Za(e),ja=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Hr(t,e.memoizedProps))for(t=Ba;t;)$a(e,t),t=qr(t.nextSibling);if(Za(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){Ba=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Ba=null}}else Ba=Fa?qr(e.stateNode.nextSibling):null;return!0}function qa(){Ba=Fa=null,ja=!1}var Wa=[];function Ya(){for(var e=0;e<Wa.length;e++)Wa[e]._workInProgressVersionPrimary=null;Wa.length=0}var Ka=w.ReactCurrentDispatcher,Xa=w.ReactCurrentBatchConfig,Qa=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(!dr(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,o,a){if(Qa=a,Ja=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Ka.current=null===e||null===e.memoizedState?Oi:Ii,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,Ka.current=Ri,e=n(r,o)}while(ri)}if(Ka.current=Pi,t=null!==ei&&null!==ei.next,Qa=0,ti=ei=Ja=null,ni=!1,t)throw Error(i(300));return e}function si(){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 li(){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 di(e,t){return"function"==typeof t?t(e):t}function ci(e){var t=li(),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 s=o.next;o.next=a.next,a.next=s}r.baseQueue=o=a,n.pending=null}if(null!==o){o=o.next,r=r.baseState;var l=s=a=null,d=o;do{var c=d.lane;if((Qa&c)===c)null!==l&&(l=l.next={lane:0,action:d.action,eagerReducer:d.eagerReducer,eagerState:d.eagerState,next:null}),r=d.eagerReducer===e?d.eagerState:e(r,d.action);else{var u={lane:c,action:d.action,eagerReducer:d.eagerReducer,eagerState:d.eagerState,next:null};null===l?(s=l=u,a=r):l=l.next=u,Ja.lanes|=c,js|=c}d=d.next}while(null!==d&&d!==o);null===l?a=r:l.next=s,dr(r,t.memoizedState)||(Di=!0),t.memoizedState=r,t.baseState=a,t.baseQueue=l,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function ui(e){var t=li(),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 s=o=o.next;do{a=e(a,s.action),s=s.next}while(s!==o);dr(a,t.memoizedState)||(Di=!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=(Qa&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=Is;if(null===o)throw Error(i(349));var a=t._getVersion,s=a(t._source),l=Ka.current,d=l.useState((function(){return pi(o,t,n)})),c=d[1],u=d[0];d=ti;var p=e.memoizedState,f=p.refs,g=f.getSnapshot,m=p.source;p=p.subscribe;var h=Ja;return e.memoizedState={refs:f,source:t,subscribe:r},l.useEffect((function(){f.getSnapshot=n,f.setSnapshot=c;var e=a(t._source);if(!dr(s,e)){e=n(t._source),dr(u,e)||(c(e),e=fl(h),o.mutableReadLanes|=e&o.pendingLanes),e=o.mutableReadLanes,o.entangledLanes|=e;for(var r=o.entanglements,i=e;0<i;){var l=31-Ht(i),d=1<<l;r[l]|=e,i&=~d}}}),[n,t,r]),l.useEffect((function(){return r(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var r=fl(h);o.mutableReadLanes|=r&o.pendingLanes}catch(a){n((function(){throw a}))}}))}),[t,r]),dr(g,n)&&dr(m,t)&&dr(p,r)||((e={pending:null,dispatch:null,lastRenderedReducer:di,lastRenderedState:u}).dispatch=c=Ni.bind(null,Ja,e),d.queue=e,d.baseQueue=null,u=pi(o,t,n),d.memoizedState=d.baseState=u),u}function gi(e,t,n){return fi(li(),e,t,n)}function mi(e){var t=si();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:di,lastRenderedState:e}).dispatch=Ni.bind(null,Ja,e),[t.memoizedState,e]}function hi(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},si().memoizedState=e}function vi(){return li().memoizedState}function yi(e,t,n,r){var o=si();Ja.flags|=e,o.memoizedState=hi(1|t,n,void 0,void 0===r?null:r)}function xi(e,t,n,r){var o=li();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 hi(t,n,a,r)}Ja.flags|=e,o.memoizedState=hi(1|t,n,a,r)}function wi(e,t){return yi(516,4,e,t)}function ki(e,t){return xi(516,4,e,t)}function _i(e,t){return xi(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 Si(e,t,n){return n=null!=n?n.concat([e]):null,xi(4,2,Ei.bind(null,t,e),n)}function Ci(){}function Ti(e,t){var n=li();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=li();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=Uo();Vo(98>n?98:n,(function(){e(!0)})),Vo(97<n?97:n,(function(){var n=Xa.transition;Xa.transition=1;try{e(!1),t()}finally{Xa.transition=n}}))}function Ni(e,t,n){var r=pl(),o=fl(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 s=t.lastRenderedState,l=i(s,n);if(a.eagerReducer=i,a.eagerState=l,dr(l,s))return}catch(d){}gl(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},Oi={readContext:ia,useCallback:function(e,t){return si().memoizedState=[e,void 0===t?null:t],e},useContext:ia,useEffect:wi,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=si();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=si();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=Ni.bind(null,Ja,e),[r.memoizedState,e]},useRef:bi,useState:mi,useDebugValue:Ci,useDeferredValue:function(e){var t=mi(e),n=t[0],r=t[1];return wi((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=mi(!1),t=e[0];return bi(e=Li.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=si();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fi(r,e,t,n)},useOpaqueIdentifier:function(){if(ja){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Yr++).toString(36))),Error(i(355))})),n=mi(t)[1];return 0==(2&Ja.mode)&&(Ja.flags|=516,hi(5,(function(){n("r:"+(Yr++).toString(36))}),void 0,null)),t}return mi(t="r:"+(Yr++).toString(36)),t},unstable_isNewReconciler:!1},Ii={readContext:ia,useCallback:Ti,useContext:ia,useEffect:ki,useImperativeHandle:Si,useLayoutEffect:_i,useMemo:Ai,useReducer:ci,useRef:vi,useState:function(){return ci(di)},useDebugValue:Ci,useDeferredValue:function(e){var t=ci(di),n=t[0],r=t[1];return ki((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=ci(di)[0];return[vi().current,e]},useMutableSource:gi,useOpaqueIdentifier:function(){return ci(di)[0]},unstable_isNewReconciler:!1},Ri={readContext:ia,useCallback:Ti,useContext:ia,useEffect:ki,useImperativeHandle:Si,useLayoutEffect:_i,useMemo:Ai,useReducer:ui,useRef:vi,useState:function(){return ui(di)},useDebugValue:Ci,useDeferredValue:function(e){var t=ui(di),n=t[0],r=t[1];return ki((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=ui(di)[0];return[vi().current,e]},useMutableSource:gi,useOpaqueIdentifier:function(){return ui(di)[0]},unstable_isNewReconciler:!1},Mi=w.ReactCurrentOwner,Di=!1;function Gi(e,t,n,r){t.child=null===e?Ta(t,null,n,r):Ca(t,e.child,n,r)}function zi(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||Di?(t.flags|=1,Gi(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,as(e,t,o))}function Fi(e,t,n,r,o,a){if(null===e){var i=n.type;return"function"!=typeof i||Zl(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=ql(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,Bi(e,t,i,r,o,a))}return i=e.child,0==(o&a)&&(o=i.memoizedProps,(n=null!==(n=n.compare)?n:ur)(o,r)&&e.ref===t.ref)?as(e,t,a):(t.flags|=1,(e=Vl(i,r)).ref=t.ref,e.return=t,t.child=e)}function Bi(e,t,n,r,o,a){if(null!==e&&ur(e.memoizedProps,r)&&e.ref===t.ref){if(Di=!1,0==(a&o))return t.lanes=e.lanes,as(e,t,a);0!=(16384&e.flags)&&(Di=!0)}return Hi(e,t,n,r,a)}function ji(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},kl(t,n);else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},kl(t,e),null;t.memoizedState={baseLanes:0},kl(t,null!==a?a.baseLanes:n)}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,kl(t,r);return Gi(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 Hi(e,t,n,r,o){var a=bo(n)?mo:fo.current;return a=ho(t,a),aa(t,o),n=ii(e,t,n,r,a,o),null===e||Di?(t.flags|=1,Gi(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,as(e,t,o))}function Ui(e,t,n,r,o){if(bo(n)){var a=!0;wo(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),wa(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,d=n.contextType;"object"==typeof d&&null!==d?d=ia(d):d=ho(t,d=bo(n)?mo:fo.current);var c=n.getDerivedStateFromProps,u="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate;u||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==d)&&xa(t,i,r,d),sa=!1;var p=t.memoizedState;i.state=p,fa(t,r,i,o),l=t.memoizedState,s!==r||p!==l||go.current||sa?("function"==typeof c&&(ha(t,n,c,r),l=t.memoizedState),(s=sa||va(t,n,s,r,p,l,d))?(u||"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=l),i.props=r,i.state=l,i.context=d,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,da(e,t),s=t.memoizedProps,d=t.type===t.elementType?s:Xo(t.type,s),i.props=d,u=t.pendingProps,p=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=ia(l):l=ho(t,l=bo(n)?mo:fo.current);var f=n.getDerivedStateFromProps;(c="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==u||p!==l)&&xa(t,i,r,l),sa=!1,p=t.memoizedState,i.state=p,fa(t,r,i,o);var g=t.memoizedState;s!==u||p!==g||go.current||sa?("function"==typeof f&&(ha(t,n,f,r),g=t.memoizedState),(d=sa||va(t,n,d,r,p,g,l))?(c||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("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|=256),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=l,r=d):("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|=256),r=!1)}return Zi(e,t,n,r,a,o)}function Zi(e,t,n,r,o,a){$i(e,t);var i=0!=(64&t.flags);if(!r&&!i)return o&&ko(t,n,!1),as(e,t,a);r=t.stateNode,Mi.current=t;var s=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,s,a)):Gi(e,t,s,a),t.memoizedState=r.state,o&&ko(t,n,!0),t.child}function Vi(e){var t=e.stateNode;t.pendingContext?yo(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yo(0,t.context,!1),Ia(e,t.containerInfo)}var qi,Wi,Yi,Ki,Xi={dehydrated:null,retryLane:0};function Qi(e,t,n){var r,o=t.pendingProps,a=Ga.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(Ga,1&a),null===e?(void 0!==o.fallback&&Ua(t),e=o.children,a=o.fallback,i?(e=Ji(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,e):"number"==typeof o.unstable_expectedLoadTime?(e=Ji(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,t.lanes=33554432,e):((n=Yl({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(o=ts(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=Xi,o):(n=es(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=Yl(t,o,0,null),n=Wl(n,o,r,null),a.return=e,n.return=e,a.sibling=n,e.child=a,n}function es(e,t,n,r){var o=e.child;return e=o.sibling,n=Vl(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 ts(e,t,n,r,o){var a=t.mode,i=e.child;e=i.sibling;var s={mode:"hidden",children:n};return 0==(2&a)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=s,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Vl(i,s),null!==e?r=Vl(e,r):(r=Wl(r,a,o,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function ns(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),oa(e.return,t)}function rs(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 os(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Gi(e,t,r.children,n),0!=(2&(r=Ga.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&&ns(e,n);else if(19===e.tag)ns(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(Ga,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===za(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),rs(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===za(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}rs(t,!0,n,null,a,t.lastEffect);break;case"together":rs(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function as(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),js|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Vl(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Vl(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function is(e,t){if(!ja)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 ss(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 Ra(),co(go),co(fo),Ya(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Va(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Wi(t),null;case 5:Da(t);var a=Oa(Pa.current);if(n=t.type,null!==e&&null!=t.stateNode)Yi(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=Oa(La.current),Va(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[Xr]=t,r[Qr]=s,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<Sr.length;e++)Lr(Sr[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,s),Lr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!s.multiple},Lr("invalid",r);break;case"textarea":le(r,s),Lr("invalid",r)}for(var d in _e(n,s),e=null,s)s.hasOwnProperty(d)&&(a=s[d],"children"===d?"string"==typeof a?r.textContent!==a&&(e=["children",a]):"number"==typeof a&&r.textContent!==""+a&&(e=["children",""+a]):l.hasOwnProperty(d)&&null!=a&&"onScroll"===d&&Lr("scroll",r));switch(n){case"input":K(r),re(r,s,!0);break;case"textarea":K(r),ce(r);break;case"select":case"option":break;default:"function"==typeof s.onClick&&(r.onclick=Fr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(d=9===a.nodeType?a:a.ownerDocument,e===ue.html&&(e=pe(n)),e===ue.html?"script"===n?((e=d.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=d.createElement(n,{is:r.is}):(e=d.createElement(n),"select"===n&&(d=e,r.multiple?d.multiple=!0:r.size&&(d.size=r.size))):e=d.createElementNS(e,n),e[Xr]=t,e[Qr]=r,qi(e,t,!1,!1),t.stateNode=e,d=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<Sr.length;a++)Lr(Sr[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":le(e,r),a=se(e,r),Lr("invalid",e);break;default:a=r}_e(n,a);var c=a;for(s in c)if(c.hasOwnProperty(s)){var u=c[s];"style"===s?we(e,u):"dangerouslySetInnerHTML"===s?null!=(u=u?u.__html:void 0)&&he(e,u):"children"===s?"string"==typeof u?("textarea"!==n||""!==u)&&be(e,u):"number"==typeof u&&be(e,""+u):"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&"autoFocus"!==s&&(l.hasOwnProperty(s)?null!=u&&"onScroll"===s&&Lr("scroll",e):null!=u&&x(e,s,u,d))}switch(n){case"input":K(e),re(e,r,!1);break;case"textarea":K(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(s=r.value)?ie(e,!!r.multiple,s,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=Fr)}$r(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Ki(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Oa(Pa.current),Oa(La.current),Va(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return co(Ga),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Va(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Ga.current)?0===zs&&(zs=3):(0!==zs&&3!==zs||(zs=4),null===Is||0==(134217727&js)&&0==(134217727&$s)||vl(Is,Ms))),(r||n)&&(t.flags|=4),null);case 4:return Ra(),Wi(t),null===e&&Pr(t.stateNode.containerInfo),null;case 10:return ra(t),null;case 19:if(co(Ga),null===(r=t.memoizedState))return null;if(s=0!=(64&t.flags),null===(d=r.rendering))if(s)is(r,!1);else{if(0!==zs||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(d=za(e))){for(t.flags|=64,is(r,!1),null!==(s=d.updateQueue)&&(t.updateQueue=s,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(s=n).flags&=2,s.nextEffect=null,s.firstEffect=null,s.lastEffect=null,null===(d=s.alternate)?(s.childLanes=0,s.lanes=e,s.child=null,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=d.childLanes,s.lanes=d.lanes,s.child=d.child,s.memoizedProps=d.memoizedProps,s.memoizedState=d.memoizedState,s.updateQueue=d.updateQueue,s.type=d.type,e=d.dependencies,s.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return uo(Ga,1&Ga.current|2),t.child}e=e.sibling}null!==r.tail&&Ho()>Vs&&(t.flags|=64,s=!0,is(r,!1),t.lanes=33554432)}else{if(!s)if(null!==(e=za(d))){if(t.flags|=64,s=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),is(r,!0),null===r.tail&&"hidden"===r.tailMode&&!d.alternate&&!ja)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*Ho()-r.renderingStartTime>Vs&&1073741824!==n&&(t.flags|=64,s=!0,is(r,!1),t.lanes=33554432);r.isBackwards?(d.sibling=t.child,t.child=d):(null!==(n=r.last)?n.sibling=d:t.child=d,r.last=d)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=Ho(),n.sibling=null,t=Ga.current,uo(Ga,s?1&t|2:1&t),n):null;case 23:case 24:return _l(),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 ls(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(Ra(),co(go),co(fo),Ya(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Da(e),null;case 13:return co(Ga),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return co(Ga),null;case 4:return Ra(),null;case 10:return ra(e),null;case 23:case 24:return _l(),null;default:return null}}function ds(e,t){try{var n="",r=t;do{n+=V(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 cs(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Wi=function(){},Yi=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Oa(La.current);var i,s=null;switch(n){case"input":a=J(e,a),r=J(e,r),s=[];break;case"option":a=ae(e,a),r=ae(e,r),s=[];break;case"select":a=o({},a,{value:void 0}),r=o({},r,{value:void 0}),s=[];break;case"textarea":a=se(e,a),r=se(e,r),s=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Fr)}for(u in _e(n,r),n=null,a)if(!r.hasOwnProperty(u)&&a.hasOwnProperty(u)&&null!=a[u])if("style"===u){var d=a[u];for(i in d)d.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(l.hasOwnProperty(u)?s||(s=[]):(s=s||[]).push(u,null));for(u in r){var c=r[u];if(d=null!=a?a[u]:void 0,r.hasOwnProperty(u)&&c!==d&&(null!=c||null!=d))if("style"===u)if(d){for(i in d)!d.hasOwnProperty(i)||c&&c.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in c)c.hasOwnProperty(i)&&d[i]!==c[i]&&(n||(n={}),n[i]=c[i])}else n||(s||(s=[]),s.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,d=d?d.__html:void 0,null!=c&&d!==c&&(s=s||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(s=s||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(l.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&Lr("scroll",e),s||d===c||(s=[])):"object"==typeof c&&null!==c&&c.$$typeof===M?c.toString():(s=s||[]).push(u,c))}n&&(s=s||[]).push("style",n);var u=s;(t.updateQueue=u)&&(t.flags|=4)}},Ki=function(e,t,n,r){n!==r&&(t.flags|=4)};var us="function"==typeof WeakMap?WeakMap:Map;function ps(e,t,n){(n=ca(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ks||(Ks=!0,Xs=r),cs(0,t)},n}function fs(e,t,n){(n=ca(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return cs(0,t),r(o)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Qs?Qs=new Set([this]):Qs.add(this),cs(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var gs="function"==typeof WeakSet?WeakSet:Set;function ms(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){Bl(e,n)}else t.current=null}function hs(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:Xo(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(i(163))}function bs(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)&&(Gl(n,e),Dl(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:Xo(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&ga(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}ga(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&&wt(n)))))}throw Error(i(163))}function vs(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=xe("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 ys(e,t){if(Eo&&"function"==typeof Eo.onCommitFiberUnmount)try{Eo.onCommitFiberUnmount(_o,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))Gl(t,n);else{r=t;try{o()}catch(a){Bl(r,a)}}n=n.next}while(n!==e)}break;case 1:if(ms(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(a){Bl(t,a)}break;case 5:ms(t);break;case 4:Ss(e,t)}}function xs(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 ws(e){return 5===e.tag||3===e.tag||4===e.tag}function ks(e){e:{for(var t=e.return;null!==t;){if(ws(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||ws(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?_s(e,n,t):Es(e,n,t)}function _s(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=Fr));else if(4!==r&&null!==(e=e.child))for(_s(e,t,n),e=e.sibling;null!==e;)_s(e,t,n),e=e.sibling}function Es(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(Es(e,t,n),e=e.sibling;null!==e;)Es(e,t,n),e=e.sibling}function Ss(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 s=e,l=o,d=l;;)if(ys(s,d),null!==d.child&&4!==d.tag)d.child.return=d,d=d.child;else{if(d===l)break e;for(;null===d.sibling;){if(null===d.return||d.return===l)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}r?(s=n,l=o.stateNode,8===s.nodeType?s.parentNode.removeChild(l):s.removeChild(l)):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(ys(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 Cs(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[Qr]=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 s=a[o],l=a[o+1];"style"===s?we(n,l):"dangerouslySetInnerHTML"===s?he(n,l):"children"===s?be(n,l):x(n,s,l,t)}switch(e){case"input":ne(n,r);break;case"textarea":de(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,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Zs=Ho(),vs(t.child,!0)),void Ts(t);case 19:return void Ts(t);case 23:case 24:return void vs(t,null!==t.memoizedState)}throw Error(i(163))}function Ts(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new gs),t.forEach((function(t){var r=$l.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function As(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ls=Math.ceil,Ns=w.ReactCurrentDispatcher,Ps=w.ReactCurrentOwner,Os=0,Is=null,Rs=null,Ms=0,Ds=0,Gs=lo(0),zs=0,Fs=null,Bs=0,js=0,$s=0,Hs=0,Us=null,Zs=0,Vs=1/0;function qs(){Vs=Ho()+500}var Ws,Ys=null,Ks=!1,Xs=null,Qs=null,Js=!1,el=null,tl=90,nl=[],rl=[],ol=null,al=0,il=null,sl=-1,ll=0,dl=0,cl=null,ul=!1;function pl(){return 0!=(48&Os)?Ho():-1!==sl?sl:sl=Ho()}function fl(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Uo()?1:2;if(0===ll&&(ll=Bs),0!==Ko.transition){0!==dl&&(dl=null!==Us?Us.pendingLanes:0),e=ll;var t=4186112&~dl;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Uo(),0!=(4&Os)&&98===e?e=Ft(12,ll):e=Ft(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),ll),e}function gl(e,t,n){if(50<al)throw al=0,il=null,Error(i(185));if(null===(e=ml(e,t)))return null;$t(e,t,n),e===Is&&($s|=t,4===zs&&vl(e,Ms));var r=Uo();1===t?0!=(8&Os)&&0==(48&Os)?yl(e):(hl(e,n),0===Os&&(qs(),Wo())):(0==(4&Os)||98!==r&&99!==r||(null===ol?ol=new Set([e]):ol.add(e)),hl(e,n)),Us=e}function ml(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 hl(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,o=e.pingedLanes,a=e.expirationTimes,s=e.pendingLanes;0<s;){var l=31-Ht(s),d=1<<l,c=a[l];if(-1===c){if(0==(d&r)||0!=(d&o)){c=t,Dt(d);var u=Mt;a[l]=10<=u?c+250:6<=u?c+5e3:-1}}else c<=t&&(e.expiredLanes|=d);s&=~d}if(r=Gt(e,e===Is?Ms:0),t=Mt,0===r)null!==n&&(n!==Go&&To(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Go&&To(n)}15===t?(n=yl.bind(null,e),null===Fo?(Fo=[n],Bo=Co(Oo,Yo)):Fo.push(n),n=Go):14===t?n=qo(99,yl.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=qo(n,bl.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bl(e){if(sl=-1,dl=ll=0,0!=(48&Os))throw Error(i(327));var t=e.callbackNode;if(Ml()&&e.callbackNode!==t)return null;var n=Gt(e,e===Is?Ms:0);if(0===n)return null;var r=n,o=Os;Os|=16;var a=Cl();for(Is===e&&Ms===r||(qs(),El(e,r));;)try{Ll();break}catch(l){Sl(e,l)}if(na(),Ns.current=a,Os=o,null!==Rs?r=0:(Is=null,Ms=0,r=zs),0!=(Bs&$s))El(e,0);else if(0!==r){if(2===r&&(Os|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=zt(e))&&(r=Tl(e,n))),1===r)throw t=Fs,El(e,0),vl(e,n),hl(e,Ho()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Ol(e);break;case 3:if(vl(e,n),(62914560&n)===n&&10<(r=Zs+500-Ho())){if(0!==Gt(e,0))break;if(((o=e.suspendedLanes)&n)!==n){pl(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=Ur(Ol.bind(null,e),r);break}Ol(e);break;case 4:if(vl(e,n),(4186112&n)===n)break;for(r=e.eventTimes,o=-1;0<n;){var s=31-Ht(n);a=1<<s,(s=r[s])>o&&(o=s),n&=~a}if(n=o,10<(n=(120>(n=Ho()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ls(n/1960))-n)){e.timeoutHandle=Ur(Ol.bind(null,e),n);break}Ol(e);break;default:throw Error(i(329))}}return hl(e,Ho()),e.callbackNode===t?bl.bind(null,e):null}function vl(e,t){for(t&=~Hs,t&=~$s,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),r=1<<n;e[n]=-1,t&=~r}}function yl(e){if(0!=(48&Os))throw Error(i(327));if(Ml(),e===Is&&0!=(e.expiredLanes&Ms)){var t=Ms,n=Tl(e,t);0!=(Bs&$s)&&(n=Tl(e,t=Gt(e,t)))}else n=Tl(e,t=Gt(e,0));if(0!==e.tag&&2===n&&(Os|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=zt(e))&&(n=Tl(e,t))),1===n)throw n=Fs,El(e,0),vl(e,t),hl(e,Ho()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ol(e),hl(e,Ho()),null}function xl(e,t){var n=Os;Os|=1;try{return e(t)}finally{0===(Os=n)&&(qs(),Wo())}}function wl(e,t){var n=Os;Os&=-2,Os|=8;try{return e(t)}finally{0===(Os=n)&&(qs(),Wo())}}function kl(e,t){uo(Gs,Ds),Ds|=t,Bs|=t}function _l(){Ds=Gs.current,co(Gs)}function El(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Zr(n)),null!==Rs)for(n=Rs.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&vo();break;case 3:Ra(),co(go),co(fo),Ya();break;case 5:Da(r);break;case 4:Ra();break;case 13:case 19:co(Ga);break;case 10:ra(r);break;case 23:case 24:_l()}n=n.return}Is=e,Rs=Vl(e.current,null),Ms=Ds=Bs=t,zs=0,Fs=null,Hs=$s=js=0}function Sl(e,t){for(;;){var n=Rs;try{if(na(),Ka.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(Qa=0,ti=ei=Ja=null,ri=!1,Ps.current=null,null===n||null===n.return){zs=1,Fs=t,Rs=null;break}e:{var a=e,i=n.return,s=n,l=t;if(t=Ms,s.flags|=2048,s.firstEffect=s.lastEffect=null,null!==l&&"object"==typeof l&&"function"==typeof l.then){var d=l;if(0==(2&s.mode)){var c=s.alternate;c?(s.updateQueue=c.updateQueue,s.memoizedState=c.memoizedState,s.lanes=c.lanes):(s.updateQueue=null,s.memoizedState=null)}var u=0!=(1&Ga.current),p=i;do{var f;if(f=13===p.tag){var g=p.memoizedState;if(null!==g)f=null!==g.dehydrated;else{var m=p.memoizedProps;f=void 0!==m.fallback&&(!0!==m.unstable_avoidThisFallback||!u)}}if(f){var h=p.updateQueue;if(null===h){var b=new Set;b.add(d),p.updateQueue=b}else h.add(d);if(0==(2&p.mode)){if(p.flags|=64,s.flags|=16384,s.flags&=-2981,1===s.tag)if(null===s.alternate)s.tag=17;else{var v=ca(-1,1);v.tag=2,ua(s,v)}s.lanes|=1;break e}l=void 0,s=t;var y=a.pingCache;if(null===y?(y=a.pingCache=new us,l=new Set,y.set(d,l)):void 0===(l=y.get(d))&&(l=new Set,y.set(d,l)),!l.has(s)){l.add(s);var x=jl.bind(null,a,d,s);d.then(x,x)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);l=Error((q(s.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!==zs&&(zs=2),l=ds(l,s),p=i;do{switch(p.tag){case 3:a=l,p.flags|=4096,t&=-t,p.lanes|=t,pa(p,ps(0,a,t));break e;case 1:a=l;var w=p.type,k=p.stateNode;if(0==(64&p.flags)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Qs||!Qs.has(k)))){p.flags|=4096,t&=-t,p.lanes|=t,pa(p,fs(p,a,t));break e}}p=p.return}while(null!==p)}Pl(n)}catch(_){t=_,Rs===n&&null!==n&&(Rs=n=n.return);continue}break}}function Cl(){var e=Ns.current;return Ns.current=Pi,null===e?Pi:e}function Tl(e,t){var n=Os;Os|=16;var r=Cl();for(Is===e&&Ms===t||El(e,t);;)try{Al();break}catch(o){Sl(e,o)}if(na(),Os=n,Ns.current=r,null!==Rs)throw Error(i(261));return Is=null,Ms=0,zs}function Al(){for(;null!==Rs;)Nl(Rs)}function Ll(){for(;null!==Rs&&!Ao();)Nl(Rs)}function Nl(e){var t=Ws(e.alternate,e,Ds);e.memoizedProps=e.pendingProps,null===t?Pl(e):Rs=t,Ps.current=null}function Pl(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ss(n,t,Ds)))return void(Rs=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ds)||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=ls(t)))return n.flags&=2047,void(Rs=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Rs=t);Rs=t=e}while(null!==t);0===zs&&(zs=5)}function Ol(e){var t=Uo();return Vo(99,Il.bind(null,e,t)),null}function Il(e,t){do{Ml()}while(null!==el);if(0!=(48&Os))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 s=e.eventTimes,l=e.expirationTimes;0<a;){var d=31-Ht(a),c=1<<d;o[d]=0,s[d]=-1,l[d]=-1,a&=~c}if(null!==ol&&0==(24&r)&&ol.has(e)&&ol.delete(e),e===Is&&(Rs=Is=null,Ms=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(o=Os,Os|=32,Ps.current=null,Br=Wt,hr(s=mr())){if("selectionStart"in s)l={start:s.selectionStart,end:s.selectionEnd};else e:if(l=(l=s.ownerDocument)&&l.defaultView||window,(c=l.getSelection&&l.getSelection())&&0!==c.rangeCount){l=c.anchorNode,a=c.anchorOffset,d=c.focusNode,c=c.focusOffset;try{l.nodeType,d.nodeType}catch(C){l=null;break e}var u=0,p=-1,f=-1,g=0,m=0,h=s,b=null;t:for(;;){for(var v;h!==l||0!==a&&3!==h.nodeType||(p=u+a),h!==d||0!==c&&3!==h.nodeType||(f=u+c),3===h.nodeType&&(u+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===s)break t;if(b===l&&++g===a&&(p=u),b===d&&++m===c&&(f=u),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}l=-1===p||-1===f?null:{start:p,end:f}}else l=null;l=l||{start:0,end:0}}else l=null;jr={focusedElem:s,selectionRange:l},Wt=!1,cl=null,ul=!1,Ys=r;do{try{Rl()}catch(C){if(null===Ys)throw Error(i(330));Bl(Ys,C),Ys=Ys.nextEffect}}while(null!==Ys);cl=null,Ys=r;do{try{for(s=e;null!==Ys;){var y=Ys.flags;if(16&y&&be(Ys.stateNode,""),128&y){var x=Ys.alternate;if(null!==x){var w=x.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:ks(Ys),Ys.flags&=-3;break;case 6:ks(Ys),Ys.flags&=-3,Cs(Ys.alternate,Ys);break;case 1024:Ys.flags&=-1025;break;case 1028:Ys.flags&=-1025,Cs(Ys.alternate,Ys);break;case 4:Cs(Ys.alternate,Ys);break;case 8:Ss(s,l=Ys);var k=l.alternate;xs(l),null!==k&&xs(k)}Ys=Ys.nextEffect}}catch(C){if(null===Ys)throw Error(i(330));Bl(Ys,C),Ys=Ys.nextEffect}}while(null!==Ys);if(w=jr,x=mr(),y=w.focusedElem,s=w.selectionRange,x!==y&&y&&y.ownerDocument&&gr(y.ownerDocument.documentElement,y)){null!==s&&hr(y)&&(x=s.start,void 0===(w=s.end)&&(w=x),"selectionStart"in y?(y.selectionStart=x,y.selectionEnd=Math.min(w,y.value.length)):(w=(x=y.ownerDocument||document)&&x.defaultView||window).getSelection&&(w=w.getSelection(),l=y.textContent.length,k=Math.min(s.start,l),s=void 0===s.end?k:Math.min(s.end,l),!w.extend&&k>s&&(l=s,s=k,k=l),l=fr(y,k),a=fr(y,s),l&&a&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==a.node||w.focusOffset!==a.offset)&&((x=x.createRange()).setStart(l.node,l.offset),w.removeAllRanges(),k>s?(w.addRange(x),w.extend(a.node,a.offset)):(x.setEnd(a.node,a.offset),w.addRange(x))))),x=[];for(w=y;w=w.parentNode;)1===w.nodeType&&x.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<x.length;y++)(w=x[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Wt=!!Br,jr=Br=null,e.current=n,Ys=r;do{try{for(y=e;null!==Ys;){var _=Ys.flags;if(36&_&&bs(y,Ys.alternate,Ys),128&_){x=void 0;var E=Ys.ref;if(null!==E){var S=Ys.stateNode;Ys.tag,x=S,"function"==typeof E?E(x):E.current=x}}Ys=Ys.nextEffect}}catch(C){if(null===Ys)throw Error(i(330));Bl(Ys,C),Ys=Ys.nextEffect}}while(null!==Ys);Ys=null,zo(),Os=o}else e.current=n;if(Js)Js=!1,el=e,tl=t;else for(Ys=r;null!==Ys;)t=Ys.nextEffect,Ys.nextEffect=null,8&Ys.flags&&((_=Ys).sibling=null,_.stateNode=null),Ys=t;if(0===(r=e.pendingLanes)&&(Qs=null),1===r?e===il?al++:(al=0,il=e):al=0,n=n.stateNode,Eo&&"function"==typeof Eo.onCommitFiberRoot)try{Eo.onCommitFiberRoot(_o,n,void 0,64==(64&n.current.flags))}catch(C){}if(hl(e,Ho()),Ks)throw Ks=!1,e=Xs,Xs=null,e;return 0!=(8&Os)||Wo(),null}function Rl(){for(;null!==Ys;){var e=Ys.alternate;ul||null===cl||(0!=(8&Ys.flags)?Je(Ys,cl)&&(ul=!0):13===Ys.tag&&As(e,Ys)&&Je(Ys,cl)&&(ul=!0));var t=Ys.flags;0!=(256&t)&&hs(e,Ys),0==(512&t)||Js||(Js=!0,qo(97,(function(){return Ml(),null}))),Ys=Ys.nextEffect}}function Ml(){if(90!==tl){var e=97<tl?97:tl;return tl=90,Vo(e,zl)}return!1}function Dl(e,t){nl.push(t,e),Js||(Js=!0,qo(97,(function(){return Ml(),null})))}function Gl(e,t){rl.push(t,e),Js||(Js=!0,qo(97,(function(){return Ml(),null})))}function zl(){if(null===el)return!1;var e=el;if(el=null,0!=(48&Os))throw Error(i(331));var t=Os;Os|=32;var n=rl;rl=[];for(var r=0;r<n.length;r+=2){var o=n[r],a=n[r+1],s=o.destroy;if(o.destroy=void 0,"function"==typeof s)try{s()}catch(d){if(null===a)throw Error(i(330));Bl(a,d)}}for(n=nl,nl=[],r=0;r<n.length;r+=2){o=n[r],a=n[r+1];try{var l=o.create;o.destroy=l()}catch(d){if(null===a)throw Error(i(330));Bl(a,d)}}for(l=e.current.firstEffect;null!==l;)e=l.nextEffect,l.nextEffect=null,8&l.flags&&(l.sibling=null,l.stateNode=null),l=e;return Os=t,Wo(),!0}function Fl(e,t,n){ua(e,t=ps(0,t=ds(n,t),1)),t=pl(),null!==(e=ml(e,1))&&($t(e,1,t),hl(e,t))}function Bl(e,t){if(3===e.tag)Fl(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Fl(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Qs||!Qs.has(r))){var o=fs(n,e=ds(t,e),1);if(ua(n,o),o=pl(),null!==(n=ml(n,1)))$t(n,1,o),hl(n,o);else if("function"==typeof r.componentDidCatch&&(null===Qs||!Qs.has(r)))try{r.componentDidCatch(t,e)}catch(a){}break}}n=n.return}}function jl(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=pl(),e.pingedLanes|=e.suspendedLanes&n,Is===e&&(Ms&n)===n&&(4===zs||3===zs&&(62914560&Ms)===Ms&&500>Ho()-Zs?El(e,0):Hs|=n),hl(e,t)}function $l(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===Uo()?1:2:(0===ll&&(ll=Bs),0===(t=Bt(62914560&~ll))&&(t=4194304))),n=pl(),null!==(e=ml(e,t))&&($t(e,t,n),hl(e,n))}function Hl(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 Ul(e,t,n,r){return new Hl(e,t,n,r)}function Zl(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vl(e,t){var n=e.alternate;return null===n?((n=Ul(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 ql(e,t,n,r,o,a){var s=2;if(r=e,"function"==typeof e)Zl(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case E:return Wl(n.children,o,a,t);case D:s=8,o|=16;break;case S:s=8,o|=1;break;case C:return(e=Ul(12,n,t,8|o)).elementType=C,e.type=C,e.lanes=a,e;case N:return(e=Ul(13,n,t,o)).type=N,e.elementType=N,e.lanes=a,e;case P:return(e=Ul(19,n,t,o)).elementType=P,e.lanes=a,e;case G:return Yl(n,o,a,t);case z:return(e=Ul(24,n,t,o)).elementType=z,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:s=10;break e;case A:s=9;break e;case L:s=11;break e;case O:s=14;break e;case I:s=16,r=null;break e;case R:s=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Ul(s,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Wl(e,t,n,r){return(e=Ul(7,e,r,t)).lanes=n,e}function Yl(e,t,n,r){return(e=Ul(23,e,r,t)).elementType=G,e.lanes=n,e}function Kl(e,t,n){return(e=Ul(6,e,null,t)).lanes=n,e}function Xl(e,t,n){return(t=Ul(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ql(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=jt(0),this.expirationTimes=jt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=jt(0),this.mutableSourceEagerHydrationData=null}function Jl(e,t,n,r){var o=t.current,a=pl(),s=fl(o);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(bo(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}l=l.return}while(null!==l);throw Error(i(171))}if(1===n.tag){var d=n.type;if(bo(d)){n=xo(n,d,l);break e}}n=l}else n=po;return null===t.context?t.context=n:t.pendingContext=n,(t=ca(a,s)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),ua(o,t),gl(o,s,a),s}function ed(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function td(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nd(e,t){td(e,t),(e=e.alternate)&&td(e,t)}function rd(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Ql(e,t,null!=n&&!0===n.hydrate),t=Ul(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,la(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 od(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ad(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a._internalRoot;if("function"==typeof o){var s=o;o=function(){var e=ed(i);s.call(e)}}Jl(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 rd(e,0,t?{hydrate:!0}:void 0)}(n,r),i=a._internalRoot,"function"==typeof o){var l=o;o=function(){var e=ed(i);l.call(e)}}wl((function(){Jl(t,i,e,o)}))}return ed(i)}function id(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!od(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:_,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Ws=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||go.current)Di=!0;else{if(0==(n&r)){switch(Di=!1,t.tag){case 3:Vi(t),qa();break;case 5:Ma(t);break;case 1:bo(t.type)&&wo(t);break;case 4:Ia(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var o=t.type._context;uo(Qo,o._currentValue),o._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Qi(e,t,n):(uo(Ga,1&Ga.current),null!==(t=as(e,t,n))?t.sibling:null);uo(Ga,1&Ga.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return os(e,t,n);t.flags|=64}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),uo(Ga,Ga.current),r)break;return null;case 23:case 24:return t.lanes=0,ji(e,t,n)}return as(e,t,n)}Di=0!=(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,o=ho(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;wo(t)}else a=!1;t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,la(t);var s=r.getDerivedStateFromProps;"function"==typeof s&&ha(t,r,s,e),o.updater=ba,t.stateNode=o,o._reactInternals=t,wa(t,r,e,n),t=Zi(null,t,r,!0,a,n)}else t.tag=0,Gi(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 Zl(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===O)return 14}return 2}(o),e=Xo(o,e),a){case 0:t=Hi(null,t,o,e,n);break e;case 1:t=Ui(null,t,o,e,n);break e;case 11:t=zi(null,t,o,e,n);break e;case 14:t=Fi(null,t,o,Xo(o.type,e),r,n);break e}throw Error(i(306,o,""))}return t;case 0:return r=t.type,o=t.pendingProps,Hi(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 1:return r=t.type,o=t.pendingProps,Ui(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 3:if(Vi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,o=null!==(o=t.memoizedState)?o.element:null,da(e,t),fa(t,r,null,n),(r=t.memoizedState.element)===o)qa(),t=as(e,t,n);else{if((a=(o=t.stateNode).hydrate)&&(Ba=qr(t.stateNode.containerInfo.firstChild),Fa=t,a=ja=!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 Gi(e,t,r,n),qa();t=t.child}return t;case 5:return Ma(t),null===e&&Ua(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,s=o.children,Hr(r,o)?s=null:null!==a&&Hr(r,a)&&(t.flags|=16),$i(e,t),Gi(e,t,s,n),t.child;case 6:return null===e&&Ua(t),null;case 13:return Qi(e,t,n);case 4:return Ia(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ca(t,null,r,n):Gi(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,zi(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 7:return Gi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Gi(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,o=t.pendingProps,s=t.memoizedProps,a=o.value;var l=t.type._context;if(uo(Qo,l._currentValue),l._currentValue=a,null!==s)if(l=s.value,0===(a=dr(l,a)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,a):1073741823))){if(s.children===o.children&&!go.current){t=as(e,t,n);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){var d=l.dependencies;if(null!==d){s=l.child;for(var c=d.firstContext;null!==c;){if(c.context===r&&0!=(c.observedBits&a)){1===l.tag&&((c=ca(-1,n&-n)).tag=2,ua(l,c)),l.lanes|=n,null!==(c=l.alternate)&&(c.lanes|=n),oa(l.return,n),d.lanes|=n;break}c=c.next}}else s=10===l.tag&&l.type===t.type?null:l.child;if(null!==s)s.return=l;else for(s=l;null!==s;){if(s===t){s=null;break}if(null!==(l=s.sibling)){l.return=s.return,s=l;break}s=s.return}l=s}Gi(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,Gi(e,t,r,n),t.child;case 14:return a=Xo(o=t.type,t.pendingProps),Fi(e,t,o,a=Xo(o.type,a),r,n);case 15:return Bi(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:Xo(r,o),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,bo(r)?(e=!0,wo(t)):e=!1,aa(t,n),ya(t,r,o),wa(t,r,o,n),Zi(null,t,r,!0,e,n);case 19:return os(e,t,n);case 23:case 24:return ji(e,t,n)}throw Error(i(156,t.tag))},rd.prototype.render=function(e){Jl(e,this._internalRoot,null,null)},rd.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jl(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(gl(e,4,pl()),nd(e,4))},tt=function(e){13===e.tag&&(gl(e,67108864,pl()),nd(e,67108864))},nt=function(e){if(13===e.tag){var t=pl(),n=fl(e);gl(e,n,t),nd(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));X(r),ne(r,o)}}}break;case"textarea":de(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Oe=xl,Ie=function(e,t,n,r,o){var a=Os;Os|=4;try{return Vo(98,e.bind(null,t,n,r,o))}finally{0===(Os=a)&&(qs(),Wo())}},Re=function(){0==(49&Os)&&(function(){if(null!==ol){var e=ol;ol=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hl(e,Ho())}))}Wo()}(),Ml())},Me=function(e,t){var n=Os;Os|=2;try{return e(t)}finally{0===(Os=n)&&(qs(),Wo())}};var sd={Events:[no,ro,oo,Ne,Pe,Ml,{current:!1}]},ld={findFiberByHostInstance:to,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},dd={bundleType:ld.bundleType,version:ld.version,rendererPackageName:ld.rendererPackageName,rendererConfig:ld.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Qe(e))?null:e.stateNode},findFiberByHostInstance:ld.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cd=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cd.isDisabled&&cd.supportsFiber)try{_o=cd.inject(dd),Eo=cd}catch(me){}}t.hydrate=function(e,t,n){if(!od(t))throw Error(i(200));return ad(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 s,l,d,c;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(c=e.entries();!(l=c.next()).done;)if(!i.has(l.value[0]))return!1;for(c=e.entries();!(l=c.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(c=e.entries();!(l=c.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=(d=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,d[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==d[l]&&"__v"!==d[l]&&"__o"!==d[l]||!e.$$typeof)&&!a(e[d[l]],i[d[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}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>Z,ql:()=>J});var r=n(7294),o=n(5697),a=n.n(o),i=n(9590),s=n.n(i),l=n(1143),d=n.n(l),c=n(6774),u=n.n(c);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},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(h).map((function(e){return h[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}),{}),_=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=_(e,h.TITLE),n=_(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=_(e,"defaultTitle");return t||r||void 0},S=function(e){return _(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[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},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 d=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][d]&&(o[n][d]=!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()},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},N=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}},O=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},I=[h.NOSCRIPT,h.SCRIPT,h.STYLE],R=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},G=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)}))},z=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=D(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=M(n),a=N(t);return o?"<"+e+' data-rh="true" '+o+">"+R(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+R(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return G(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+'="'+R(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===I.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},F=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,d=e.titleAttributes,c=e.linkTags,u=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=P(e.metaTags,y),a=P(t,b),i=P(n,v);return{priorityMethods:{toComponent:function(){return[].concat(G(h.META,o.priority),G(h.LINK,a.priority),G(h.SCRIPT,i.priority))},toString:function(){return z(h.META,o.priority,r)+" "+z(h.LINK,a.priority,r)+" "+z(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=g.priorityMethods,c=g.linkTags,u=g.metaTags,p=g.scriptTags}return{priority:f,base:z(h.BASE,t,r),bodyAttributes:z("bodyAttributes",n,r),htmlAttributes:z("htmlAttributes",o,r),link:z(h.LINK,c,r),meta:z(h.META,u,r),noscript:z(h.NOSCRIPT,a,r),script:z(h.SCRIPT,p,r),style:z(h.STYLE,i,r),title:z(h.TITLE,{title:l,titleAttributes:d},r)}},B=[],j=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=F({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),H=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),U="undefined"!=typeof document,Z=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new j(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);Z.canUseDOM=U,Z.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},Z.defaultProps={context:{}},Z.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},q=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],d=t[l]||"";n.getAttribute(l)!==d&&n.setAttribute(l,d),-1===o.indexOf(l)&&o.push(l);var c=a.indexOf(l);-1!==c&&a.splice(c,1)}for(var u=a.length-1;u>=0;u-=1)n.removeAttribute(a[u]);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,s=e.onChangeClientState,l=e.scriptTags,d=e.styleTags,c=e.title,u=e.titleAttributes;q(h.BODY,e.bodyAttributes),q(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=N(e)),q(h.TITLE,t)}(c,u);var p={baseTag:V(h.BASE,n),linkTags:V(h.LINK,o),metaTags:V(h.META,a),noscriptTags:V(h.NOSCRIPT,i),scriptTags:V(h.SCRIPT,l),styleTags:V(h.STYLE,d)},f={},g={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(g[e]=p[e].oldTags)})),t&&t(),s(e,f,g)},Y=null,K=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!u()(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:_(e,"defer"),encode:_(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(h.LINK,["rel","href"],e),metaTags:A(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:A(h.SCRIPT,["src","innerHTML"],e),styleTags:A(h.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});Z.canUseDOM?(t=a,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){W(t,(function(){Y=null}))})):(W(t),Y=null)):F&&(o=F(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);K.propTypes={context:H.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Q=["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()(O(this.props,"helmetData"),O(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case h.BODY:return p({},o,{bodyAttributes:p({},a)});case h.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return d()(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."),d()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,X),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 h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps: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=m(e,Q),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof j||(a=new j(a.context,a.instances)),a?r.createElement(K,p({},o,{context:a.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(K,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,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,d=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,u=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,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 c:case u:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case d:case p:case h:case m:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===u}t.AsyncMode=c,t.ConcurrentMode=u,t.ContextConsumer=d,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===d},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)===h},t.isMemo=function(e){return w(e)===m},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===u||e===s||e===i||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===l||e.$$typeof===d||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},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 s=n(7294),l=n(5697),d=[],c=[];function u(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=u(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 g(e,t){var u,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return d.push(h),"function"==typeof g.webpack&&c.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),p=u=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),r._loadModule()})),h(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},r}r(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(s.Component),a(u,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),p}function m(e){return g(u,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(p,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}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(h,"propTypes",{report:l.func.isRequired}),a(h,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(d).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=m},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>s,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 s(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:()=>c,rU:()=>h});var r=n(6550),o=n(5068),a=n(7294),i=n(9318),s=n(7462),l=n(3366),d=n(8776),c=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 u=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},g=a.forwardRef;void 0===g&&(g=f);var m=g((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.Z)(e,["innerRef","navigate","onClick"]),d=i.target,c=(0,s.Z)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||d&&"_self"!==d||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=f!==g&&t||n,a.createElement("a",c)}));var h=g((function(e,t){var n=e.component,o=void 0===n?m:n,c=e.replace,h=e.to,b=e.innerRef,v=(0,l.Z)(e,["component","replace","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,d.Z)(!1);var n=e.history,r=p(u(h,e.location),e.location),l=r?n.createHref(r):"",m=(0,s.Z)({},v,{href:l,navigate:function(){var t=u(h,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(p(t));(c||r?n.replace:n.push)(t)}});return f!==g?m.ref=t||b:m.innerRef=b,a.createElement(o,m)}))})),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,c=void 0===i?"active":i,f=e.activeStyle,g=e.className,m=e.exact,y=e.isActive,x=e.location,w=e.sensitive,k=e.strict,_=e.style,E=e.to,S=e.innerRef,C=(0,l.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,d.Z)(!1);var n=x||e.location,i=p(u(E,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.LX)(n.pathname,{path:T,exact:m,sensitive:w,strict:k}):null,L=!!(y?y(A,n):A),N="function"==typeof g?g(L):g,P="function"==typeof _?_(L):_;L&&(N=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(" ")}(N,c),P=(0,s.Z)({},P,f));var O=(0,s.Z)({"aria-current":L&&o||null,className:N,style:P,to:i},C);return b!==v?O.ref=t||S:O.innerRef=S,a.createElement(h,O)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>E,F0:()=>y,LX:()=>_,TH:()=>I,k6:()=>O,rs:()=>N,s6:()=>v});var r=n(5068),o=n(7294),a=n(5697),i=n.n(a),s=n(9318),l=n(8776),d=n(7462),c=n(9658),u=n.n(c),p=(n(9864),n(3366)),f=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[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.Z)(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 d=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[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 d.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:d}},h=function(e){var t=m();return t.displayName=e,t},b=h("Router-History"),v=h("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 x={},w=1e4,k=0;function _(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,d=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:u()(e,o,t),keys:o};return k<w&&(r[e]=a,k++),a}(n,{end:a,strict:s,sensitive:d}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var c=l[0],p=l.slice(1),f=e===c;return a&&!f?null:{path:n,url:"/"===n&&""===c?"/":c,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,l.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?_(n.pathname,e.props):t.match,a=(0,d.Z)({},t,{location:n,match:r}),i=e.props,s=i.children,c=i.component,u=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:c?o.createElement(c,a):u?u(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function S(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=S(e);return 0!==t.pathname.indexOf(n)?t:(0,d.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,s.Ep)(e)}function A(e){return function(){(0,l.Z)(!1)}}function L(){}o.Component;var N=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,l.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?_(a.pathname,(0,d.Z)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var P=o.useContext;function O(){return P(b)}function I(){return P(v).location}},9658:(e,t,n)=>{var r=n(5826);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="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var u=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+u.length,p)s+=p[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],v=n[5],y=n[6],x=n[7];s&&(r.push(s),s="");var w=null!=m&&null!=g&&g!==m,k="+"===y||"*"===y,_="?"===y||"*"===y,E=n[2]||c,S=b||v;r.push({name:h||a++,prefix:m||"",delimiter:E,optional:_,repeat:k,partial:w,asterisk:!!x,pattern:S?d(S):x?".*":"[^"+l(E)+"]+?"})}}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+")$",u(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,d=0;d<e.length;d++){var c=e[d];if("string"!=typeof c){var u,p=s[c.name];if(null==p){if(c.optional){c.partial&&(a+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(p)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(u=l(p[f]),!n[d].test(u))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(u)+"`");a+=(0===f?c.prefix:c.delimiter)+u}}else{if(u=c.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(p),!n[d].test(u))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+u+'"');a+=c.prefix+u}}else a+=c}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function d(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function u(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 d=e[s];if("string"==typeof d)i+=l(d);else{var p=l(d.prefix),f="(?:"+d.pattern+")";t.push(d),d.repeat&&(f+="(?:"+p+f+")*"),i+=f=d.optional?d.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var g=l(n.delimiter||"/"),m=i.slice(-g.length)===g;return o||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=a?"$":o&&m?"":"(?="+g+"|$)",c(new RegExp("^"+i,u(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 c(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 c(new RegExp("(?:"+r.join("|")+")",u(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},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,s=60110,l=60112;t.Suspense=60113;var d=60115,c=60116;if("function"==typeof Symbol&&Symbol.for){var u=Symbol.for;o=u("react.element"),a=u("react.portal"),t.Fragment=u("react.fragment"),t.StrictMode=u("react.strict_mode"),t.Profiler=u("react.profiler"),i=u("react.provider"),s=u("react.context"),l=u("react.forward_ref"),t.Suspense=u("react.suspense"),d=u("react.memo"),c=u("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 g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m={};function h(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}h.prototype.isReactComponent={},h.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")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,r(y,h.prototype),y.isPureReactComponent=!0;var x={current:null},w=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,n){var r,a={},i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)w.call(t,r)&&!k.hasOwnProperty(r)&&(a[r]=t[r]);var l=arguments.length-2;if(1===l)a.children=n;else if(1<l){for(var d=Array(l),c=0;c<l;c++)d[c]=arguments[c+2];a.children=d}if(e&&e.defaultProps)for(r in l=e.defaultProps)void 0===a[r]&&(a[r]=l[r]);return{$$typeof:o,type:e,key:i,ref:s,props:a,_owner:x.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var S=/\/+/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 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 o:case a:l=!0}}if(l)return i=i(l=e),e=""===r?"."+C(l,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(S,"$&/")+"/"),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||l&&l.key===i.key?"":(""+i.key).replace(S,"$&/")+"/")+e)),t.push(i)),1;if(l=0,r=""===r?".":r+":",Array.isArray(e))for(var d=0;d<e.length;d++){var c=r+C(s=e[d],d);l+=T(s,t,n,c,i)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),d=0;!(s=e.next()).done;)l+=T(s=s.value,t,n,c=r+C(s,d++),i);else if("object"===s)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return l}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 N={current:null};function P(){var e=N.current;if(null===e)throw Error(f(321));return e}var O={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:x,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=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,n){if(null==e)throw Error(f(267,e));var a=r({},e.props),i=e.key,s=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,l=x.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var d=e.type.defaultProps;for(c in t)w.call(t,c)&&!k.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==d?d[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=n;else if(1<c){d=Array(c);for(var u=0;u<c;u++)d[u]=arguments[u+2];a.children=d}return{$$typeof:o,type:e.type,key:i,ref:s,props:a,_owner:l}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:s,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:d,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 s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var d=null,c=null,u=function(){if(null!==d)try{var e=t.unstable_now();d(!0,e),d=null}catch(n){throw setTimeout(u,0),n}};n=function(e){null!==d?setTimeout(n,0,e):(d=e,setTimeout(u,0))},r=function(e,t){c=setTimeout(e,t)},o=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var g=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 g&&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 m=!1,h=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 x=new MessageChannel,w=x.port2;x.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?w.postMessage(null):(m=!1,h=null)}catch(n){throw w.postMessage(null),n}}else m=!1},n=function(e){h=e,m||(m=!0,w.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<S(o,t)))break e;e[r]=t,e[n]=o,n=r}}function _(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],s=a+1,l=e[s];if(void 0!==i&&0>S(i,n))void 0!==l&&0>S(l,i)?(e[r]=l,e[s]=n,r=s):(e[r]=i,e[a]=n,r=a);else{if(!(void 0!==l&&0>S(l,n)))break e;e[r]=l,e[s]=n,r=s}}}return t}return null}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],T=[],A=1,L=null,N=3,P=!1,O=!1,I=!1;function R(e){for(var t=_(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=_(T)}}function M(e){if(I=!1,R(e),!O)if(null!==_(C))O=!0,n(D);else{var t=_(T);null!==t&&r(M,t.startTime-e)}}function D(e,n){O=!1,I&&(I=!1,o()),P=!0;var a=N;try{for(R(n),L=_(C);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,N=L.priorityLevel;var s=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?L.callback=s:L===_(C)&&E(C),R(n)}else E(C);L=_(C)}if(null!==L)var l=!0;else{var d=_(T);null!==d&&r(M,d.startTime-n),l=!1}return l}finally{L=null,N=a,P=!1}}var G=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(){O||P||(O=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return N},t.unstable_getFirstCallbackNode=function(){return _(C)},t.unstable_next=function(e){switch(N){case 1:case 2:case 3:var t=3;break;default:t=N}var n=N;N=t;try{return e()}finally{N=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=G,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=N;N=e;try{return t()}finally{N=n}},t.unstable_scheduleCallback=function(e,a,i){var s=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?s+i:s:i=s,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:A++,callback:a,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>s?(e.sortIndex=i,k(T,e),null===_(C)&&e===_(T)&&(I?o():I=!0,r(M,i-s))):(e.sortIndex=l,k(C,e),O||P||(O=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=N;return function(){var n=N;N=t;try{return e.apply(this,arguments)}finally{N=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 s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var d=a[l];if(!s(d))return!1;var c=e[d],u=t[d];if(!1===(o=n?n.call(r,c,u,d):void 0)||void 0===o&&c!==u)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,s=r.useLayoutEffect,l=r.useDebugValue;function d(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var c="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,c=r[1];return s((function(){o.value=n,o.getSnapshot=t,d(o)&&c({inst:o})}),[e,n,t]),i((function(){return d(o)&&c({inst:o}),e((function(){d(o)&&c({inst:o})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:c},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:"Zealot",tagline:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",url:"https://zealot.ews.im",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/zealot.png",i18n:{defaultLocale:"en",locales:["en","zh-Hans"],path:"i18n",localeConfigs:{}},organizationName:"tryzealot",projectName:"docs",presets:[["classic",{docs:{sidebarPath:"/home/runner/work/docs/docs/sidebars.js",editUrl:"https://github.com/tryzealot/docs/tree/main/",lastVersion:"5.0.0",versions:{current:{label:"Next \ud83d\udea7"}}},theme:{customCss:"/home/runner/work/docs/docs/src/css/custom.css"},sitemap:{changefreq:"weekly",priority:.5,ignorePatterns:["/tags/**"],filename:"sitemap.xml"}}]],themeConfig:{navbar:{title:"Zealot",logo:{alt:"Zealot Logo",src:"img/zealot.png",srcDark:"img/zealot-dark.png"},items:[{type:"doc",docId:"self-hosted/index",label:"Self Hosted",position:"left"},{type:"doc",docId:"developer-guide/index",position:"left",label:"Developer Guide"},{type:"doc",docId:"user-guide/index",position:"left",label:"User Guide"},{type:"doc",docId:"contributing-guide/index",position:"left",label:"Contributing Guide"},{type:"doc",docId:"user-guide/changelog",position:"left",label:"Changelog"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsAfter:[{type:"html",value:'<hr class="dropdown-separator">'},{href:"https://tryzealot.github.io/docs-legacy",label:"Legacy docs"}],dropdownItemsBefore:[]},{type:"localeDropdown",position:"right",dropdownItemsBefore:[],dropdownItemsAfter:[]}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Community",items:[{label:"Github Discussions",href:"https://github.com/tryzealot/zealot/discussions"},{label:"Telegram",href:"https://t.me/+csa3Y2KOx44wMGRl"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/tryzealot/zealot"}]}],copyright:"Copyright \xa9 2023 icyleaf. Built with Docusaurus."},prism:{additionalLanguages:["kotlin","java","swift","groovy","ruby","nginx","toml","hcl"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}},{className:"code-block-error-line",line:"This will error"}],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:{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"}}]}},colorMode:{defaultMode:"light",disableSwitch:!1,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('{"/markdown-page-9d5":{"__comp":"1f391b9e","__context":{"plugin":"a7434565"},"content":"393be207"},"/docs/4.x-c9e":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"cae0f04b"},"/docs/4.x/category/administrator-103":{"__comp":"14eb3368","categoryGeneratedIndex":"9c3aeab1"},"/docs/4.x/category/apps-04a":{"__comp":"14eb3368","categoryGeneratedIndex":"6a4aefb0"},"/docs/4.x/category/cloud-provider-guides-f84":{"__comp":"14eb3368","categoryGeneratedIndex":"51763432"},"/docs/4.x/category/configuration-bbc":{"__comp":"14eb3368","categoryGeneratedIndex":"39534802"},"/docs/4.x/category/debug-files-dd6":{"__comp":"14eb3368","categoryGeneratedIndex":"3dd373c6"},"/docs/4.x/category/deployment-469":{"__comp":"14eb3368","categoryGeneratedIndex":"b9de103e"},"/docs/4.x/category/local-development-600":{"__comp":"14eb3368","categoryGeneratedIndex":"cd4eb1ed"},"/docs/4.x/category/monitoring-0aa":{"__comp":"14eb3368","categoryGeneratedIndex":"14094f46"},"/docs/4.x/category/sdks-f90":{"__comp":"14eb3368","categoryGeneratedIndex":"fe6331dc"},"/docs/4.x/category/toolkits-eeb":{"__comp":"14eb3368","categoryGeneratedIndex":"6cdd9503"},"/docs/4.x/contributing-guide/-595":{"__comp":"17896441","content":"72b5199f"},"/docs/4.x/contributing-guide/local-development/devcontainer-8a7":{"__comp":"17896441","content":"14a24e11"},"/docs/4.x/contributing-guide/local-development/source-code-9c2":{"__comp":"17896441","content":"c02123b5"},"/docs/4.x/developer-guide/-ce0":{"__comp":"17896441","content":"31dae65f"},"/docs/4.x/developer-guide/api-074":{"__comp":"17896441","content":"6c0d6c9a"},"/docs/4.x/developer-guide/api/apps-213":{"__comp":"17896441","content":"616acc84"},"/docs/4.x/developer-guide/api/debug_files-632":{"__comp":"17896441","content":"f9b37612"},"/docs/4.x/developer-guide/fastlane-9ff":{"__comp":"17896441","content":"c9fa300e"},"/docs/4.x/developer-guide/fastlane/zealot-191":{"__comp":"17896441","content":"c01945e0"},"/docs/4.x/developer-guide/fastlane/zealot_debug_file-187":{"__comp":"17896441","content":"ea003b3f"},"/docs/4.x/developer-guide/fastlane/zealot_sync_devices-609":{"__comp":"17896441","content":"ad4ca79f"},"/docs/4.x/developer-guide/fastlane/zealot_version_check-8f5":{"__comp":"17896441","content":"e7a8c7f9"},"/docs/4.x/developer-guide/sdk/android-dd8":{"__comp":"17896441","content":"aecd11f5"},"/docs/4.x/developer-guide/sdk/ios-d34":{"__comp":"17896441","content":"84706228"},"/docs/4.x/self-hosted/-472":{"__comp":"17896441","content":"fb7a7e13"},"/docs/4.x/self-hosted/configuration/environment-variables-78e":{"__comp":"17896441","content":"55db4623"},"/docs/4.x/self-hosted/configuration/schedule-jobs-db7":{"__comp":"17896441","content":"889fb5f5"},"/docs/4.x/self-hosted/configuration/third-party-authentication-8f0":{"__comp":"17896441","content":"69bb3584"},"/docs/4.x/self-hosted/deployment/architecture-575":{"__comp":"17896441","content":"5a522f46"},"/docs/4.x/self-hosted/deployment/docker-a96":{"__comp":"17896441","content":"2b8fdfa9"},"/docs/4.x/self-hosted/deployment/docker/step-by-step-f5a":{"__comp":"17896441","content":"52f780b0"},"/docs/4.x/self-hosted/deployment/fly-777":{"__comp":"17896441","content":"30a84665"},"/docs/4.x/self-hosted/deployment/kubernetes-80b":{"__comp":"17896441","content":"799ffaed"},"/docs/4.x/self-hosted/deployment/nomad-4be":{"__comp":"17896441","content":"ef513ce2"},"/docs/4.x/self-hosted/deployment/railway-6d9":{"__comp":"17896441","content":"b272fba4"},"/docs/4.x/self-hosted/deployment/render-23a":{"__comp":"17896441","content":"ddf401e0"},"/docs/4.x/self-hosted/deployment/requirements-9ee":{"__comp":"17896441","content":"21b281f9"},"/docs/4.x/self-hosted/deployment/source-code-2e3":{"__comp":"17896441","content":"35a98222"},"/docs/4.x/self-hosted/reverse-proxies-c94":{"__comp":"17896441","content":"f8a75f5e"},"/docs/4.x/self-hosted/storage-d32":{"__comp":"17896441","content":"220930de"},"/docs/4.x/user-guide/-814":{"__comp":"17896441","content":"5f8b303a"},"/docs/4.x/user-guide/administrator/apple-team-a72":{"__comp":"17896441","content":"5ec84ac2"},"/docs/4.x/user-guide/administrator/backup-846":{"__comp":"17896441","content":"1b734938"},"/docs/4.x/user-guide/administrator/monitoring/background-jobs-7ea":{"__comp":"17896441","content":"5da52b15"},"/docs/4.x/user-guide/administrator/monitoring/database-analytics-671":{"__comp":"17896441","content":"bf6ff0a4"},"/docs/4.x/user-guide/administrator/monitoring/logging-578":{"__comp":"17896441","content":"25301e6f"},"/docs/4.x/user-guide/administrator/monitoring/system-info-b65":{"__comp":"17896441","content":"8aa13b20"},"/docs/4.x/user-guide/administrator/permissions-adb":{"__comp":"17896441","content":"699a8fef"},"/docs/4.x/user-guide/administrator/project-settings-3b3":{"__comp":"17896441","content":"a949db22"},"/docs/4.x/user-guide/apps/create-af8":{"__comp":"17896441","content":"35a60b9c"},"/docs/4.x/user-guide/best_practices-fd7":{"__comp":"17896441","content":"8992496f"},"/docs/4.x/user-guide/changelog-88f":{"__comp":"17896441","content":"4d44c677"},"/docs/4.x/user-guide/credits-2b3":{"__comp":"17896441","content":"4cad2fe6"},"/docs/4.x/user-guide/dashboard-70e":{"__comp":"17896441","content":"4c432e95"},"/docs/4.x/user-guide/debug-files/upload-03e":{"__comp":"17896441","content":"002e3694"},"/docs/4.x/user-guide/qa-67e":{"__comp":"17896441","content":"3ee87be9"},"/docs/4.x/user-guide/toolkits/fetch-udid-b2a":{"__comp":"17896441","content":"52d3380a"},"/docs/4.x/user-guide/toolkits/teardown-8c8":{"__comp":"17896441","content":"bbec0ea8"},"/docs/4.x/user-guide/webhooks-322":{"__comp":"17896441","content":"e40683f4"},"/docs/4.x/user-guide/webhooks/dingtalk-54a":{"__comp":"17896441","content":"9e3eaffa"},"/docs/4.x/user-guide/webhooks/discord-e9c":{"__comp":"17896441","content":"2dc3018f"},"/docs/4.x/user-guide/webhooks/feishu-670":{"__comp":"17896441","content":"c0aa555d"},"/docs/4.x/user-guide/webhooks/slack-815":{"__comp":"17896441","content":"b5e1e414"},"/docs/4.x/user-guide/webhooks/wecom-8ae":{"__comp":"17896441","content":"011dea14"},"/docs/next-1c1":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"935f2afb"},"/docs/next/category/administrator-380":{"__comp":"14eb3368","categoryGeneratedIndex":"78cdd3ae"},"/docs/next/category/apps-102":{"__comp":"14eb3368","categoryGeneratedIndex":"20ab3326"},"/docs/next/category/cloud-provider-guides-df8":{"__comp":"14eb3368","categoryGeneratedIndex":"d59c50f6"},"/docs/next/category/configuration-1f8":{"__comp":"14eb3368","categoryGeneratedIndex":"226ba89c"},"/docs/next/category/debug-files-bf7":{"__comp":"14eb3368","categoryGeneratedIndex":"8bf7b385"},"/docs/next/category/deployment-de4":{"__comp":"14eb3368","categoryGeneratedIndex":"ab71d4e1"},"/docs/next/category/local-development-b0d":{"__comp":"14eb3368","categoryGeneratedIndex":"367ed454"},"/docs/next/category/monitoring-f5c":{"__comp":"14eb3368","categoryGeneratedIndex":"bdd7b463"},"/docs/next/category/sdks-34d":{"__comp":"14eb3368","categoryGeneratedIndex":"ef294a35"},"/docs/next/category/toolkits-00e":{"__comp":"14eb3368","categoryGeneratedIndex":"c8054fdf"},"/docs/next/contributing-guide/-414":{"__comp":"17896441","content":"600ac4e1"},"/docs/next/contributing-guide/local-development/devcontainer-499":{"__comp":"17896441","content":"0da88c94"},"/docs/next/contributing-guide/local-development/source-code-475":{"__comp":"17896441","content":"4bf92ea9"},"/docs/next/developer-guide/-796":{"__comp":"17896441","content":"848dab9f"},"/docs/next/developer-guide/api-2d3":{"__comp":"17896441","content":"45ab56fc"},"/docs/next/developer-guide/api/apps-ac7":{"__comp":"17896441","content":"f02d2d32"},"/docs/next/developer-guide/api/debug_files-aa9":{"__comp":"17896441","content":"aaab4dd5"},"/docs/next/developer-guide/fastlane-50f":{"__comp":"17896441","content":"adf2c0d2"},"/docs/next/developer-guide/fastlane/zealot-ce6":{"__comp":"17896441","content":"ede4b0bb"},"/docs/next/developer-guide/fastlane/zealot_debug_file-79f":{"__comp":"17896441","content":"d1dd54d0"},"/docs/next/developer-guide/fastlane/zealot_sync_devices-bde":{"__comp":"17896441","content":"0e2cdf96"},"/docs/next/developer-guide/fastlane/zealot_version_check-95a":{"__comp":"17896441","content":"bc9a5c2d"},"/docs/next/developer-guide/sdk/android-815":{"__comp":"17896441","content":"43ef865f"},"/docs/next/developer-guide/sdk/ios-1eb":{"__comp":"17896441","content":"c5b0ab6a"},"/docs/next/self-hosted/-4a8":{"__comp":"17896441","content":"5f153871"},"/docs/next/self-hosted/configuration/environment-variables-d1d":{"__comp":"17896441","content":"f90fa3e0"},"/docs/next/self-hosted/configuration/schedule-jobs-396":{"__comp":"17896441","content":"56af2409"},"/docs/next/self-hosted/configuration/third-party-authentication-4ed":{"__comp":"17896441","content":"566ccdfa"},"/docs/next/self-hosted/deployment/architecture-820":{"__comp":"17896441","content":"d4be948d"},"/docs/next/self-hosted/deployment/docker-bab":{"__comp":"17896441","content":"84e62756"},"/docs/next/self-hosted/deployment/docker/step-by-step-b7c":{"__comp":"17896441","content":"fa199c0f"},"/docs/next/self-hosted/deployment/fly-35b":{"__comp":"17896441","content":"0e6c8da6"},"/docs/next/self-hosted/deployment/kubernetes-db7":{"__comp":"17896441","content":"b4e44ac6"},"/docs/next/self-hosted/deployment/nomad-022":{"__comp":"17896441","content":"dd05d4e3"},"/docs/next/self-hosted/deployment/railway-042":{"__comp":"17896441","content":"f8e38d3d"},"/docs/next/self-hosted/deployment/render-a27":{"__comp":"17896441","content":"784c299a"},"/docs/next/self-hosted/deployment/requirements-274":{"__comp":"17896441","content":"09ee1501"},"/docs/next/self-hosted/deployment/source-code-d47":{"__comp":"17896441","content":"37ca8f58"},"/docs/next/self-hosted/reverse-proxies-f22":{"__comp":"17896441","content":"477073af"},"/docs/next/self-hosted/storage-e44":{"__comp":"17896441","content":"5df973a0"},"/docs/next/user-guide/-3eb":{"__comp":"17896441","content":"7737c9f3"},"/docs/next/user-guide/administrator/apple-team-71d":{"__comp":"17896441","content":"27385049"},"/docs/next/user-guide/administrator/backup-1c6":{"__comp":"17896441","content":"9da9701d"},"/docs/next/user-guide/administrator/monitoring/background-jobs-24f":{"__comp":"17896441","content":"88e80bd0"},"/docs/next/user-guide/administrator/monitoring/database-analytics-708":{"__comp":"17896441","content":"cd085125"},"/docs/next/user-guide/administrator/monitoring/logging-621":{"__comp":"17896441","content":"0b1f21de"},"/docs/next/user-guide/administrator/monitoring/system-info-68b":{"__comp":"17896441","content":"1129db35"},"/docs/next/user-guide/administrator/permissions-347":{"__comp":"17896441","content":"58234510"},"/docs/next/user-guide/administrator/settings-75a":{"__comp":"17896441","content":"39b02d66"},"/docs/next/user-guide/apps/-0f2":{"__comp":"17896441","content":"454f6929"},"/docs/next/user-guide/apps/create-679":{"__comp":"17896441","content":"1e930e9c"},"/docs/next/user-guide/apps/detail-a89":{"__comp":"17896441","content":"433a7c95"},"/docs/next/user-guide/apps/upload-e60":{"__comp":"17896441","content":"f906dd81"},"/docs/next/user-guide/best_practices-5ea":{"__comp":"17896441","content":"99e3e97f"},"/docs/next/user-guide/changelog-b74":{"__comp":"17896441","content":"c53e755e"},"/docs/next/user-guide/credits-535":{"__comp":"17896441","content":"eb2d718d"},"/docs/next/user-guide/dashboard-a36":{"__comp":"17896441","content":"0a799d0e"},"/docs/next/user-guide/debug-files/-727":{"__comp":"17896441","content":"6573317f"},"/docs/next/user-guide/debug-files/review-e27":{"__comp":"17896441","content":"aaf82ead"},"/docs/next/user-guide/debug-files/upload-f76":{"__comp":"17896441","content":"60fb9086"},"/docs/next/user-guide/qa-fd5":{"__comp":"17896441","content":"e92f4833"},"/docs/next/user-guide/toolkits/fetch-udid-cf3":{"__comp":"17896441","content":"5c74b3a7"},"/docs/next/user-guide/toolkits/teardown-98d":{"__comp":"17896441","content":"14fae669"},"/docs/next/user-guide/webhooks-795":{"__comp":"17896441","content":"45923ef2"},"/docs/next/user-guide/webhooks/dingtalk-b50":{"__comp":"17896441","content":"f3108074"},"/docs/next/user-guide/webhooks/discord-e4a":{"__comp":"17896441","content":"fe140d6b"},"/docs/next/user-guide/webhooks/feishu-066":{"__comp":"17896441","content":"4b3973b8"},"/docs/next/user-guide/webhooks/slack-484":{"__comp":"17896441","content":"10830de6"},"/docs/next/user-guide/webhooks/wecom-241":{"__comp":"17896441","content":"88f9ce8f"},"/docs-b73":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"c9b278a8"},"/docs/category/administrator-614":{"__comp":"14eb3368","categoryGeneratedIndex":"bdc68495"},"/docs/category/apps-e5b":{"__comp":"14eb3368","categoryGeneratedIndex":"5a3653dd"},"/docs/category/cloud-provider-guides-15e":{"__comp":"14eb3368","categoryGeneratedIndex":"437849bc"},"/docs/category/configuration-28b":{"__comp":"14eb3368","categoryGeneratedIndex":"1caa3b90"},"/docs/category/debug-files-a8f":{"__comp":"14eb3368","categoryGeneratedIndex":"1efa993c"},"/docs/category/deployment-cf3":{"__comp":"14eb3368","categoryGeneratedIndex":"1addd124"},"/docs/category/local-development-411":{"__comp":"14eb3368","categoryGeneratedIndex":"7386cd72"},"/docs/category/monitoring-1ad":{"__comp":"14eb3368","categoryGeneratedIndex":"5191259b"},"/docs/category/sdks-28f":{"__comp":"14eb3368","categoryGeneratedIndex":"7e370ea7"},"/docs/category/toolkits-f3f":{"__comp":"14eb3368","categoryGeneratedIndex":"aceb8a36"},"/docs/contributing-guide/-1c7":{"__comp":"17896441","content":"49206f6f"},"/docs/contributing-guide/local-development/devcontainer-6bc":{"__comp":"17896441","content":"8f9c93ae"},"/docs/contributing-guide/local-development/source-code-20c":{"__comp":"17896441","content":"2c0f0ab1"},"/docs/developer-guide/-efd":{"__comp":"17896441","content":"77590075"},"/docs/developer-guide/api-479":{"__comp":"17896441","content":"6768319c"},"/docs/developer-guide/api/apps-b42":{"__comp":"17896441","content":"c3e055b8"},"/docs/developer-guide/api/debug_files-e16":{"__comp":"17896441","content":"b56911e0"},"/docs/developer-guide/fastlane-1a0":{"__comp":"17896441","content":"687041db"},"/docs/developer-guide/fastlane/zealot-e1d":{"__comp":"17896441","content":"a1f04802"},"/docs/developer-guide/fastlane/zealot_debug_file-d03":{"__comp":"17896441","content":"b7ca75af"},"/docs/developer-guide/fastlane/zealot_sync_devices-b34":{"__comp":"17896441","content":"2020b7aa"},"/docs/developer-guide/fastlane/zealot_version_check-1b7":{"__comp":"17896441","content":"20b08819"},"/docs/developer-guide/sdk/android-3a2":{"__comp":"17896441","content":"45256cfe"},"/docs/developer-guide/sdk/ios-c33":{"__comp":"17896441","content":"48295ea8"},"/docs/self-hosted/-666":{"__comp":"17896441","content":"bc9d66cc"},"/docs/self-hosted/configuration/environment-variables-d7d":{"__comp":"17896441","content":"7ab8d5f3"},"/docs/self-hosted/configuration/schedule-jobs-a57":{"__comp":"17896441","content":"a087da7b"},"/docs/self-hosted/configuration/third-party-authentication-7f5":{"__comp":"17896441","content":"2593a83b"},"/docs/self-hosted/deployment/architecture-e1c":{"__comp":"17896441","content":"9d2c8d89"},"/docs/self-hosted/deployment/docker-a75":{"__comp":"17896441","content":"41f50648"},"/docs/self-hosted/deployment/docker/step-by-step-bf4":{"__comp":"17896441","content":"93688e09"},"/docs/self-hosted/deployment/fly-ed1":{"__comp":"17896441","content":"10daa3a4"},"/docs/self-hosted/deployment/kubernetes-e83":{"__comp":"17896441","content":"897621f7"},"/docs/self-hosted/deployment/nomad-15f":{"__comp":"17896441","content":"b8b76bfb"},"/docs/self-hosted/deployment/railway-df1":{"__comp":"17896441","content":"aaf543f1"},"/docs/self-hosted/deployment/render-766":{"__comp":"17896441","content":"71b71564"},"/docs/self-hosted/deployment/requirements-8ec":{"__comp":"17896441","content":"e6546d07"},"/docs/self-hosted/deployment/source-code-0d9":{"__comp":"17896441","content":"8ac0e0b2"},"/docs/self-hosted/reverse-proxies-42c":{"__comp":"17896441","content":"14b2f636"},"/docs/self-hosted/storage-ca7":{"__comp":"17896441","content":"36bff928"},"/docs/user-guide/-853":{"__comp":"17896441","content":"aef75111"},"/docs/user-guide/administrator/apple-team-f62":{"__comp":"17896441","content":"a8003ee7"},"/docs/user-guide/administrator/backup-240":{"__comp":"17896441","content":"bf0a73a8"},"/docs/user-guide/administrator/monitoring/background-jobs-a44":{"__comp":"17896441","content":"da03b20b"},"/docs/user-guide/administrator/monitoring/database-analytics-d89":{"__comp":"17896441","content":"475cf40c"},"/docs/user-guide/administrator/monitoring/logging-8d8":{"__comp":"17896441","content":"79fb26a6"},"/docs/user-guide/administrator/monitoring/system-info-71b":{"__comp":"17896441","content":"e532b6bb"},"/docs/user-guide/administrator/permissions-0d3":{"__comp":"17896441","content":"7d49456b"},"/docs/user-guide/administrator/project-settings-737":{"__comp":"17896441","content":"d02aa106"},"/docs/user-guide/administrator/settings-ca5":{"__comp":"17896441","content":"c94f5806"},"/docs/user-guide/apps/-621":{"__comp":"17896441","content":"f6a4c755"},"/docs/user-guide/apps/create-bfc":{"__comp":"17896441","content":"286cd782"},"/docs/user-guide/apps/detail-9a6":{"__comp":"17896441","content":"58e8de69"},"/docs/user-guide/apps/upload-1b1":{"__comp":"17896441","content":"90050cbc"},"/docs/user-guide/best_practices-91c":{"__comp":"17896441","content":"674c5fcf"},"/docs/user-guide/changelog-b06":{"__comp":"17896441","content":"f0954aa2"},"/docs/user-guide/credits-7f0":{"__comp":"17896441","content":"1948baf2"},"/docs/user-guide/dashboard-aaf":{"__comp":"17896441","content":"56f1fb64"},"/docs/user-guide/debug-files/-70a":{"__comp":"17896441","content":"8cddcc36"},"/docs/user-guide/debug-files/review-dbc":{"__comp":"17896441","content":"61175dc6"},"/docs/user-guide/debug-files/upload-601":{"__comp":"17896441","content":"a86b8a96"},"/docs/user-guide/qa-569":{"__comp":"17896441","content":"db37eded"},"/docs/user-guide/toolkits/fetch-udid-ac3":{"__comp":"17896441","content":"0efaccc0"},"/docs/user-guide/toolkits/teardown-f07":{"__comp":"17896441","content":"49510311"},"/docs/user-guide/webhooks-6ea":{"__comp":"17896441","content":"fe4d1fcf"},"/docs/user-guide/webhooks/dingtalk-44c":{"__comp":"17896441","content":"1cb76857"},"/docs/user-guide/webhooks/discord-2e3":{"__comp":"17896441","content":"708d50e3"},"/docs/user-guide/webhooks/feishu-96d":{"__comp":"17896441","content":"568a2802"},"/docs/user-guide/webhooks/slack-5cf":{"__comp":"17896441","content":"a7227298"},"/docs/user-guide/webhooks/wecom-f9b":{"__comp":"17896441","content":"f944a33e"},"/-fc2":{"__comp":"c4f5d8e4","__context":{"plugin":"a7434565"},"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.48eff89e.js.LICENSE.txt b/assets/js/main.5e42589e.js.LICENSE.txt similarity index 100% rename from assets/js/main.48eff89e.js.LICENSE.txt rename to assets/js/main.5e42589e.js.LICENSE.txt diff --git a/assets/js/runtime~main.0c247047.js b/assets/js/runtime~main.08f6f6b7.js similarity index 90% rename from assets/js/runtime~main.0c247047.js rename to assets/js/runtime~main.08f6f6b7.js index c40030f5b..b2007147f 100644 --- a/assets/js/runtime~main.0c247047.js +++ b/assets/js/runtime~main.08f6f6b7.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i<e.length;i++){f=e[i][0],d=e[i][1],b=e[i][2];for(var t=!0,o=0;o<f.length;o++)(!1&b||c>=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b<c&&(c=b));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",58:"10daa3a4",81:"aceb8a36",96:"7737c9f3",112:"0da88c94",260:"fe4d1fcf",266:"454f6929",315:"433a7c95",336:"687041db",387:"88f9ce8f",411:"a1f04802",443:"c8054fdf",469:"8ac0e0b2",475:"eb2d718d",483:"a949db22",564:"4d44c677",572:"a86b8a96",614:"48295ea8",648:"0e2cdf96",689:"226ba89c",777:"e7a8c7f9",826:"84e62756",884:"aaf82ead",957:"30a84665",1010:"1efa993c",1120:"bf6ff0a4",1175:"4c432e95",1257:"60fb9086",1261:"52d3380a",1394:"c94f5806",1440:"2c0f0ab1",1461:"220930de",1489:"52f780b0",1521:"568a2802",1570:"45923ef2",1591:"d1dd54d0",1627:"f9b37612",1643:"ef294a35",1649:"cd085125",1653:"8cddcc36",1988:"0b1f21de",2011:"9c3aeab1",2018:"5191259b",2107:"f8e38d3d",2143:"aaf543f1",2197:"14fae669",2209:"bf0a73a8",2242:"fe6331dc",2256:"0e6c8da6",2387:"20b08819",2438:"bc9d66cc",2530:"a8003ee7",2546:"011dea14",2621:"b56911e0",2647:"848dab9f",2710:"566ccdfa",2813:"41f50648",2820:"9d2c8d89",2855:"43ef865f",2918:"5da52b15",2923:"39b02d66",2957:"4bf92ea9",2966:"ad4ca79f",3084:"aef75111",3085:"1f391b9e",3099:"51763432",3130:"56af2409",3171:"b9de103e",3307:"6573317f",3335:"002e3694",3385:"477073af",3523:"21b281f9",3618:"bdc68495",3630:"f90fa3e0",3670:"5c74b3a7",3803:"45256cfe",3820:"93688e09",3844:"a7227298",3855:"49206f6f",3877:"c02123b5",3954:"699a8fef",4011:"bbec0ea8",4029:"1caa3b90",4067:"8bf7b385",4070:"1129db35",4159:"e92f4833",4195:"c4f5d8e4",4203:"36bff928",4234:"69bb3584",4429:"aecd11f5",4587:"d59c50f6",4590:"d02aa106",4596:"adf2c0d2",4604:"dd05d4e3",4643:"2593a83b",4684:"1b734938",4750:"31dae65f",4765:"77590075",4769:"7ab8d5f3",4771:"da03b20b",4802:"ef513ce2",4885:"8f9c93ae",4910:"27385049",4943:"84706228",4974:"897621f7",4985:"c0aa555d",5111:"6cdd9503",5148:"6c0d6c9a",5208:"1948baf2",5218:"f944a33e",5260:"cd4eb1ed",5272:"708d50e3",5281:"2b8fdfa9",5309:"bdd7b463",5351:"784c299a",5545:"e532b6bb",5566:"1e930e9c",5610:"d4be948d",5672:"14b2f636",5696:"20ab3326",5705:"c01945e0",5709:"cae0f04b",5728:"9e3eaffa",5729:"4cad2fe6",5783:"9da9701d",5787:"f8a75f5e",5803:"b272fba4",5862:"367ed454",5902:"7386cd72",5920:"674c5fcf",5945:"7d49456b",5979:"1addd124",6118:"f3108074",6159:"6768319c",6186:"71b71564",6197:"8aa13b20",6212:"58e8de69",6215:"600ac4e1",6219:"45ab56fc",6295:"b7ca75af",6567:"72b5199f",6665:"88e80bd0",6716:"79fb26a6",6782:"286cd782",6787:"f6a4c755",6832:"5a3653dd",6868:"5f8b303a",6926:"4b3973b8",6984:"ddf401e0",7042:"a087da7b",7069:"5f153871",7070:"ede4b0bb",7133:"55db4623",7143:"2020b7aa",7157:"99e3e97f",7236:"90050cbc",7276:"f02d2d32",7313:"58234510",7321:"889fb5f5",7322:"c53e755e",7372:"0efaccc0",7400:"14a24e11",7414:"393be207",7466:"c9fa300e",7525:"61175dc6",7595:"7e370ea7",7645:"a7434565",7681:"c3e055b8",7702:"db37eded",7779:"f0954aa2",7787:"ea003b3f",7918:"17896441",7965:"78cdd3ae",8138:"35a60b9c",8253:"3dd373c6",8336:"37ca8f58",8422:"14094f46",8493:"799ffaed",8575:"fa199c0f",8719:"35a98222",8735:"1cb76857",8738:"5a522f46",8763:"5df973a0",8772:"8992496f",8823:"0a799d0e",8843:"25301e6f",8846:"437849bc",8901:"b8b76bfb",8958:"bc9a5c2d",8995:"10830de6",9014:"e40683f4",9019:"fb7a7e13",9100:"b5e1e414",9120:"3ee87be9",9154:"f906dd81",9181:"c9b278a8",9184:"b4e44ac6",9218:"56f1fb64",9334:"247783bb",9346:"6a4aefb0",9396:"c5b0ab6a",9455:"49510311",9512:"39534802",9514:"1be78505",9516:"5ec84ac2",9578:"09ee1501",9611:"e6546d07",9656:"aaab4dd5",9710:"ab71d4e1",9817:"14eb3368",9852:"2dc3018f",9873:"475cf40c",9940:"616acc84",9966:"fe140d6b"}[e]||e)+"."+{53:"e95b52c0",58:"6a408a28",81:"fa763026",96:"d18ff927",112:"9a3bdbee",260:"e7b877fe",266:"85790b98",315:"bff33b9e",336:"11a6b274",387:"aa7ae65c",411:"c9ab6163",443:"213d8288",469:"d5a0e733",475:"6051e153",483:"6b7b55a3",564:"a00b4bae",572:"b25cbb47",614:"cb1c8c4c",648:"137c3187",689:"0b37d41e",777:"06f3f7e5",826:"954e7f9a",884:"e7b0741b",957:"459f564f",1010:"dbbfb769",1120:"2bcae668",1175:"c8a7975c",1257:"6a1f4286",1261:"c29ca81e",1394:"71421c2b",1440:"c834e30f",1461:"e6472544",1489:"0560b0fb",1521:"9a7de8f8",1570:"a3404004",1591:"29b3bd86",1627:"bb955d27",1643:"7d3f4ce1",1649:"45adf553",1653:"b34daa07",1988:"123badd3",2011:"f9148842",2018:"14bdf007",2107:"8d5bd396",2143:"233de456",2197:"34124751",2209:"68e1c242",2242:"2fbb3743",2256:"ea59c8ff",2387:"30f14a1c",2438:"c4886a6d",2530:"3886e89f",2546:"0cf930d4",2621:"f20568fd",2647:"6cfbe959",2710:"a65d5e9f",2813:"bfe074dd",2820:"26cbcb4e",2855:"53fe59f9",2918:"82a3eea2",2923:"44a5a9a1",2957:"cddeeba1",2966:"5cc7494c",3084:"7b356362",3085:"3825bb4d",3099:"b30e70a7",3130:"2c0173de",3171:"9b38c9e6",3307:"9e4af199",3335:"ee1509ca",3385:"48334569",3523:"86ce75dd",3618:"e2854411",3630:"a71db366",3670:"91eb81f1",3803:"0e54193f",3820:"907652e6",3844:"35ebea2c",3855:"f21561a7",3877:"349ea0f7",3954:"e3598141",4011:"d17078f5",4029:"fe4c84e4",4067:"e01338e4",4070:"c06e2bab",4159:"10e2b823",4195:"ce8f06be",4203:"77b2e827",4234:"5959a100",4429:"f551f28f",4587:"45c7f147",4590:"955a3464",4596:"f814af85",4604:"86cfffbf",4643:"a19ac008",4684:"1d5f7b28",4750:"472b3c36",4765:"81d3ed99",4769:"d9fceda8",4771:"1f780e66",4802:"81ae0150",4885:"a05c5661",4910:"85702e87",4943:"55624ef5",4972:"163ed418",4974:"f6b1648c",4985:"23c6be3e",5111:"97c60d0c",5148:"9295f67c",5208:"a74dd665",5218:"e7e08f39",5260:"3cfabe0b",5272:"729b189c",5281:"e35fceac",5309:"9ef09fd6",5351:"8f7c2d28",5545:"e07cd613",5566:"e4286ca0",5610:"cdfca299",5672:"7324f40e",5696:"dd0b93fe",5705:"15ed2669",5709:"0912efd0",5728:"d9965086",5729:"850401f3",5783:"779abda9",5787:"0a58249a",5803:"308d0d38",5862:"0441c163",5902:"2b57215b",5920:"0f7008be",5945:"69c39a1b",5979:"56b7eea6",6097:"b1a64e58",6118:"3a557de5",6159:"85871f4c",6186:"ad4fa5d8",6197:"ff08d007",6212:"0ca6b777",6215:"b2b014f3",6219:"fa2aac84",6295:"e29e69dd",6567:"0bde14ee",6665:"6496efab",6716:"3a2577ce",6782:"8e87f965",6787:"d5773fc8",6832:"2268688e",6868:"7659bcb6",6926:"d6c6db05",6984:"29c05be8",7042:"d4c9600b",7069:"f0d5c7f8",7070:"4328f37a",7133:"4d60599c",7143:"f295df9f",7157:"f9984c8b",7236:"7767d558",7276:"20c470ca",7313:"94cebfe9",7321:"baeac740",7322:"d62e84dd",7372:"8abee4ef",7400:"1b5645a6",7414:"8d1de187",7466:"1f302759",7525:"0f4b89ef",7595:"7921bbad",7645:"837e7198",7681:"b3f61a6d",7702:"087cf02a",7779:"1943dd97",7787:"e0cf8406",7918:"6c096025",7965:"143c61d8",8138:"2f0f9dd5",8253:"c6ff925a",8336:"b392437d",8422:"05b8a866",8493:"d72a5951",8575:"b556d1c2",8719:"2ea19b8b",8735:"672f0336",8738:"9ddd53ef",8763:"d88f348f",8772:"7c91cb88",8823:"9a818c30",8843:"edfb9e6a",8846:"e96bf3c9",8901:"d222b613",8958:"f19a24b8",8995:"ef8b81e0",9014:"bfa111d1",9019:"44732ecf",9100:"6b991e7d",9120:"c934f0c0",9154:"585a4882",9181:"64594296",9184:"0754033d",9218:"1457bc5d",9334:"7d6e64fc",9346:"690d983a",9396:"cdca54cd",9455:"15187152",9512:"7230f14b",9514:"7062d58b",9516:"0d553829",9578:"f8c15f69",9611:"c2629f9e",9656:"452b1c40",9710:"72a44086",9817:"bf9cc31c",9852:"3c83cba8",9873:"3b2cff4b",9940:"7aa5e9c2",9966:"d6b7f8e7"}[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),d={},b="zealot-new-docs:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==b+f){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+f),t.src=e),d[e]=[a];var l=(a,f)=>{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},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",27385049:"4910",39534802:"9512",49510311:"9455",51763432:"3099",58234510:"7313",77590075:"4765",84706228:"4943","935f2afb":"53","10daa3a4":"58",aceb8a36:"81","7737c9f3":"96","0da88c94":"112",fe4d1fcf:"260","454f6929":"266","433a7c95":"315","687041db":"336","88f9ce8f":"387",a1f04802:"411",c8054fdf:"443","8ac0e0b2":"469",eb2d718d:"475",a949db22:"483","4d44c677":"564",a86b8a96:"572","48295ea8":"614","0e2cdf96":"648","226ba89c":"689",e7a8c7f9:"777","84e62756":"826",aaf82ead:"884","30a84665":"957","1efa993c":"1010",bf6ff0a4:"1120","4c432e95":"1175","60fb9086":"1257","52d3380a":"1261",c94f5806:"1394","2c0f0ab1":"1440","220930de":"1461","52f780b0":"1489","568a2802":"1521","45923ef2":"1570",d1dd54d0:"1591",f9b37612:"1627",ef294a35:"1643",cd085125:"1649","8cddcc36":"1653","0b1f21de":"1988","9c3aeab1":"2011","5191259b":"2018",f8e38d3d:"2107",aaf543f1:"2143","14fae669":"2197",bf0a73a8:"2209",fe6331dc:"2242","0e6c8da6":"2256","20b08819":"2387",bc9d66cc:"2438",a8003ee7:"2530","011dea14":"2546",b56911e0:"2621","848dab9f":"2647","566ccdfa":"2710","41f50648":"2813","9d2c8d89":"2820","43ef865f":"2855","5da52b15":"2918","39b02d66":"2923","4bf92ea9":"2957",ad4ca79f:"2966",aef75111:"3084","1f391b9e":"3085","56af2409":"3130",b9de103e:"3171","6573317f":"3307","002e3694":"3335","477073af":"3385","21b281f9":"3523",bdc68495:"3618",f90fa3e0:"3630","5c74b3a7":"3670","45256cfe":"3803","93688e09":"3820",a7227298:"3844","49206f6f":"3855",c02123b5:"3877","699a8fef":"3954",bbec0ea8:"4011","1caa3b90":"4029","8bf7b385":"4067","1129db35":"4070",e92f4833:"4159",c4f5d8e4:"4195","36bff928":"4203","69bb3584":"4234",aecd11f5:"4429",d59c50f6:"4587",d02aa106:"4590",adf2c0d2:"4596",dd05d4e3:"4604","2593a83b":"4643","1b734938":"4684","31dae65f":"4750","7ab8d5f3":"4769",da03b20b:"4771",ef513ce2:"4802","8f9c93ae":"4885","897621f7":"4974",c0aa555d:"4985","6cdd9503":"5111","6c0d6c9a":"5148","1948baf2":"5208",f944a33e:"5218",cd4eb1ed:"5260","708d50e3":"5272","2b8fdfa9":"5281",bdd7b463:"5309","784c299a":"5351",e532b6bb:"5545","1e930e9c":"5566",d4be948d:"5610","14b2f636":"5672","20ab3326":"5696",c01945e0:"5705",cae0f04b:"5709","9e3eaffa":"5728","4cad2fe6":"5729","9da9701d":"5783",f8a75f5e:"5787",b272fba4:"5803","367ed454":"5862","7386cd72":"5902","674c5fcf":"5920","7d49456b":"5945","1addd124":"5979",f3108074:"6118","6768319c":"6159","71b71564":"6186","8aa13b20":"6197","58e8de69":"6212","600ac4e1":"6215","45ab56fc":"6219",b7ca75af:"6295","72b5199f":"6567","88e80bd0":"6665","79fb26a6":"6716","286cd782":"6782",f6a4c755:"6787","5a3653dd":"6832","5f8b303a":"6868","4b3973b8":"6926",ddf401e0:"6984",a087da7b:"7042","5f153871":"7069",ede4b0bb:"7070","55db4623":"7133","2020b7aa":"7143","99e3e97f":"7157","90050cbc":"7236",f02d2d32:"7276","889fb5f5":"7321",c53e755e:"7322","0efaccc0":"7372","14a24e11":"7400","393be207":"7414",c9fa300e:"7466","61175dc6":"7525","7e370ea7":"7595",a7434565:"7645",c3e055b8:"7681",db37eded:"7702",f0954aa2:"7779",ea003b3f:"7787","78cdd3ae":"7965","35a60b9c":"8138","3dd373c6":"8253","37ca8f58":"8336","14094f46":"8422","799ffaed":"8493",fa199c0f:"8575","35a98222":"8719","1cb76857":"8735","5a522f46":"8738","5df973a0":"8763","8992496f":"8772","0a799d0e":"8823","25301e6f":"8843","437849bc":"8846",b8b76bfb:"8901",bc9a5c2d:"8958","10830de6":"8995",e40683f4:"9014",fb7a7e13:"9019",b5e1e414:"9100","3ee87be9":"9120",f906dd81:"9154",c9b278a8:"9181",b4e44ac6:"9184","56f1fb64":"9218","247783bb":"9334","6a4aefb0":"9346",c5b0ab6a:"9396","1be78505":"9514","5ec84ac2":"9516","09ee1501":"9578",e6546d07:"9611",aaab4dd5:"9656",ab71d4e1:"9710","14eb3368":"9817","2dc3018f":"9852","475cf40c":"9873","616acc84":"9940",fe140d6b:"9966"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>d=e[a]=[f,b]));f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n<c.length;n++)b=c[n],r.o(e,b)&&e[b]&&e[b][0](),e[b]=0;return r.O(i)},f=self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[];f.forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f))})()})(); \ No newline at end of file +(()=>{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i<e.length;i++){f=e[i][0],d=e[i][1],b=e[i][2];for(var t=!0,o=0;o<f.length;o++)(!1&b||c>=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b<c&&(c=b));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",58:"10daa3a4",81:"aceb8a36",96:"7737c9f3",112:"0da88c94",260:"fe4d1fcf",266:"454f6929",315:"433a7c95",336:"687041db",387:"88f9ce8f",411:"a1f04802",443:"c8054fdf",469:"8ac0e0b2",475:"eb2d718d",483:"a949db22",564:"4d44c677",572:"a86b8a96",614:"48295ea8",648:"0e2cdf96",689:"226ba89c",777:"e7a8c7f9",826:"84e62756",884:"aaf82ead",957:"30a84665",1010:"1efa993c",1120:"bf6ff0a4",1175:"4c432e95",1257:"60fb9086",1261:"52d3380a",1394:"c94f5806",1440:"2c0f0ab1",1461:"220930de",1489:"52f780b0",1521:"568a2802",1570:"45923ef2",1591:"d1dd54d0",1627:"f9b37612",1643:"ef294a35",1649:"cd085125",1653:"8cddcc36",1988:"0b1f21de",2011:"9c3aeab1",2018:"5191259b",2107:"f8e38d3d",2143:"aaf543f1",2197:"14fae669",2209:"bf0a73a8",2242:"fe6331dc",2256:"0e6c8da6",2387:"20b08819",2438:"bc9d66cc",2530:"a8003ee7",2546:"011dea14",2621:"b56911e0",2647:"848dab9f",2710:"566ccdfa",2813:"41f50648",2820:"9d2c8d89",2855:"43ef865f",2918:"5da52b15",2923:"39b02d66",2957:"4bf92ea9",2966:"ad4ca79f",3084:"aef75111",3085:"1f391b9e",3099:"51763432",3130:"56af2409",3171:"b9de103e",3307:"6573317f",3335:"002e3694",3385:"477073af",3523:"21b281f9",3618:"bdc68495",3630:"f90fa3e0",3670:"5c74b3a7",3803:"45256cfe",3820:"93688e09",3844:"a7227298",3855:"49206f6f",3877:"c02123b5",3954:"699a8fef",4011:"bbec0ea8",4029:"1caa3b90",4067:"8bf7b385",4070:"1129db35",4159:"e92f4833",4195:"c4f5d8e4",4203:"36bff928",4234:"69bb3584",4429:"aecd11f5",4587:"d59c50f6",4590:"d02aa106",4596:"adf2c0d2",4604:"dd05d4e3",4643:"2593a83b",4684:"1b734938",4750:"31dae65f",4765:"77590075",4769:"7ab8d5f3",4771:"da03b20b",4802:"ef513ce2",4885:"8f9c93ae",4910:"27385049",4943:"84706228",4974:"897621f7",4985:"c0aa555d",5111:"6cdd9503",5148:"6c0d6c9a",5208:"1948baf2",5218:"f944a33e",5260:"cd4eb1ed",5272:"708d50e3",5281:"2b8fdfa9",5309:"bdd7b463",5351:"784c299a",5545:"e532b6bb",5566:"1e930e9c",5610:"d4be948d",5672:"14b2f636",5696:"20ab3326",5705:"c01945e0",5709:"cae0f04b",5728:"9e3eaffa",5729:"4cad2fe6",5783:"9da9701d",5787:"f8a75f5e",5803:"b272fba4",5862:"367ed454",5902:"7386cd72",5920:"674c5fcf",5945:"7d49456b",5979:"1addd124",6118:"f3108074",6159:"6768319c",6186:"71b71564",6197:"8aa13b20",6212:"58e8de69",6215:"600ac4e1",6219:"45ab56fc",6295:"b7ca75af",6567:"72b5199f",6665:"88e80bd0",6716:"79fb26a6",6782:"286cd782",6787:"f6a4c755",6832:"5a3653dd",6868:"5f8b303a",6926:"4b3973b8",6984:"ddf401e0",7042:"a087da7b",7069:"5f153871",7070:"ede4b0bb",7133:"55db4623",7143:"2020b7aa",7157:"99e3e97f",7236:"90050cbc",7276:"f02d2d32",7313:"58234510",7321:"889fb5f5",7322:"c53e755e",7372:"0efaccc0",7400:"14a24e11",7414:"393be207",7466:"c9fa300e",7525:"61175dc6",7595:"7e370ea7",7645:"a7434565",7681:"c3e055b8",7702:"db37eded",7779:"f0954aa2",7787:"ea003b3f",7918:"17896441",7965:"78cdd3ae",8138:"35a60b9c",8253:"3dd373c6",8336:"37ca8f58",8422:"14094f46",8493:"799ffaed",8575:"fa199c0f",8719:"35a98222",8735:"1cb76857",8738:"5a522f46",8763:"5df973a0",8772:"8992496f",8823:"0a799d0e",8843:"25301e6f",8846:"437849bc",8901:"b8b76bfb",8958:"bc9a5c2d",8995:"10830de6",9014:"e40683f4",9019:"fb7a7e13",9100:"b5e1e414",9120:"3ee87be9",9154:"f906dd81",9181:"c9b278a8",9184:"b4e44ac6",9218:"56f1fb64",9334:"247783bb",9346:"6a4aefb0",9396:"c5b0ab6a",9455:"49510311",9512:"39534802",9514:"1be78505",9516:"5ec84ac2",9578:"09ee1501",9611:"e6546d07",9656:"aaab4dd5",9710:"ab71d4e1",9817:"14eb3368",9852:"2dc3018f",9873:"475cf40c",9940:"616acc84",9966:"fe140d6b"}[e]||e)+"."+{53:"e95b52c0",58:"6a408a28",81:"fa763026",96:"d18ff927",112:"a66d3756",260:"e7b877fe",266:"85790b98",315:"bff33b9e",336:"11a6b274",387:"aa7ae65c",411:"c9ab6163",443:"213d8288",469:"d5a0e733",475:"6051e153",483:"6b7b55a3",564:"a00b4bae",572:"b25cbb47",614:"6a19fa76",648:"137c3187",689:"0b37d41e",777:"06f3f7e5",826:"954e7f9a",884:"e7b0741b",957:"459f564f",1010:"dbbfb769",1120:"2bcae668",1175:"c8a7975c",1257:"6a1f4286",1261:"c29ca81e",1394:"71421c2b",1440:"f614bdae",1461:"e6472544",1489:"0560b0fb",1521:"9a7de8f8",1570:"a3404004",1591:"29b3bd86",1627:"bb955d27",1643:"7d3f4ce1",1649:"45adf553",1653:"b34daa07",1988:"123badd3",2011:"f9148842",2018:"14bdf007",2107:"8d5bd396",2143:"233de456",2197:"34124751",2209:"68e1c242",2242:"2fbb3743",2256:"ea59c8ff",2387:"30f14a1c",2438:"c4886a6d",2530:"3886e89f",2546:"0cf930d4",2621:"f20568fd",2647:"6cfbe959",2710:"a65d5e9f",2813:"bfe074dd",2820:"26cbcb4e",2855:"e2c235a5",2918:"82a3eea2",2923:"44a5a9a1",2957:"24fd38a5",2966:"5cc7494c",3084:"7b356362",3085:"9181abc6",3099:"b30e70a7",3130:"2c0173de",3171:"9b38c9e6",3307:"9e4af199",3335:"ee1509ca",3385:"76e7fbc5",3523:"86ce75dd",3618:"e2854411",3630:"a71db366",3670:"91eb81f1",3803:"0f610341",3820:"907652e6",3844:"35ebea2c",3855:"f21561a7",3877:"97a642ab",3954:"e3598141",4011:"d17078f5",4029:"fe4c84e4",4067:"e01338e4",4070:"c06e2bab",4159:"10e2b823",4195:"83acb6e2",4203:"77b2e827",4234:"5959a100",4429:"7c614ceb",4587:"45c7f147",4590:"955a3464",4596:"f814af85",4604:"86cfffbf",4643:"a19ac008",4684:"1d5f7b28",4750:"472b3c36",4765:"81d3ed99",4769:"d9fceda8",4771:"1f780e66",4802:"81ae0150",4885:"5c0a7830",4910:"85702e87",4943:"5bdc0935",4972:"163ed418",4974:"f6b1648c",4985:"23c6be3e",5111:"97c60d0c",5148:"9295f67c",5208:"a74dd665",5218:"e7e08f39",5260:"3cfabe0b",5272:"729b189c",5281:"e35fceac",5309:"9ef09fd6",5351:"8f7c2d28",5545:"e07cd613",5566:"e4286ca0",5610:"cdfca299",5672:"547b871b",5696:"dd0b93fe",5705:"15ed2669",5709:"0912efd0",5728:"d9965086",5729:"850401f3",5783:"779abda9",5787:"21e0c5a4",5803:"308d0d38",5862:"0441c163",5902:"2b57215b",5920:"0f7008be",5945:"69c39a1b",5979:"56b7eea6",6097:"3cff0a9f",6118:"3a557de5",6159:"85871f4c",6186:"ad4fa5d8",6197:"ff08d007",6212:"0ca6b777",6215:"b2b014f3",6219:"fa2aac84",6295:"e29e69dd",6567:"0bde14ee",6665:"6496efab",6716:"3a2577ce",6782:"8e87f965",6787:"d5773fc8",6832:"2268688e",6868:"7659bcb6",6926:"d6c6db05",6984:"29c05be8",7042:"d4c9600b",7069:"f0d5c7f8",7070:"4328f37a",7133:"4d60599c",7143:"f295df9f",7157:"f9984c8b",7236:"7767d558",7276:"20c470ca",7313:"94cebfe9",7321:"baeac740",7322:"d62e84dd",7372:"8abee4ef",7400:"569eae0d",7414:"8d1de187",7466:"1f302759",7525:"0f4b89ef",7595:"7921bbad",7645:"837e7198",7681:"b3f61a6d",7702:"087cf02a",7779:"1943dd97",7787:"e0cf8406",7918:"d30cc80e",7965:"143c61d8",8138:"2f0f9dd5",8253:"c6ff925a",8336:"b392437d",8422:"05b8a866",8493:"d72a5951",8575:"b556d1c2",8719:"2ea19b8b",8735:"672f0336",8738:"9ddd53ef",8763:"d88f348f",8772:"7c91cb88",8823:"9a818c30",8843:"edfb9e6a",8846:"e96bf3c9",8901:"d222b613",8958:"f19a24b8",8995:"ef8b81e0",9014:"bfa111d1",9019:"44732ecf",9100:"6b991e7d",9120:"c934f0c0",9154:"585a4882",9181:"64594296",9184:"0754033d",9218:"1457bc5d",9334:"7d6e64fc",9346:"690d983a",9396:"707dcd75",9455:"15187152",9512:"7230f14b",9514:"1dba3c15",9516:"0d553829",9578:"f8c15f69",9611:"c2629f9e",9656:"452b1c40",9710:"72a44086",9817:"94edc1dc",9852:"3c83cba8",9873:"3b2cff4b",9940:"7aa5e9c2",9966:"d6b7f8e7"}[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),d={},b="zealot-new-docs:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==b+f){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+f),t.src=e),d[e]=[a];var l=(a,f)=>{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},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",27385049:"4910",39534802:"9512",49510311:"9455",51763432:"3099",58234510:"7313",77590075:"4765",84706228:"4943","935f2afb":"53","10daa3a4":"58",aceb8a36:"81","7737c9f3":"96","0da88c94":"112",fe4d1fcf:"260","454f6929":"266","433a7c95":"315","687041db":"336","88f9ce8f":"387",a1f04802:"411",c8054fdf:"443","8ac0e0b2":"469",eb2d718d:"475",a949db22:"483","4d44c677":"564",a86b8a96:"572","48295ea8":"614","0e2cdf96":"648","226ba89c":"689",e7a8c7f9:"777","84e62756":"826",aaf82ead:"884","30a84665":"957","1efa993c":"1010",bf6ff0a4:"1120","4c432e95":"1175","60fb9086":"1257","52d3380a":"1261",c94f5806:"1394","2c0f0ab1":"1440","220930de":"1461","52f780b0":"1489","568a2802":"1521","45923ef2":"1570",d1dd54d0:"1591",f9b37612:"1627",ef294a35:"1643",cd085125:"1649","8cddcc36":"1653","0b1f21de":"1988","9c3aeab1":"2011","5191259b":"2018",f8e38d3d:"2107",aaf543f1:"2143","14fae669":"2197",bf0a73a8:"2209",fe6331dc:"2242","0e6c8da6":"2256","20b08819":"2387",bc9d66cc:"2438",a8003ee7:"2530","011dea14":"2546",b56911e0:"2621","848dab9f":"2647","566ccdfa":"2710","41f50648":"2813","9d2c8d89":"2820","43ef865f":"2855","5da52b15":"2918","39b02d66":"2923","4bf92ea9":"2957",ad4ca79f:"2966",aef75111:"3084","1f391b9e":"3085","56af2409":"3130",b9de103e:"3171","6573317f":"3307","002e3694":"3335","477073af":"3385","21b281f9":"3523",bdc68495:"3618",f90fa3e0:"3630","5c74b3a7":"3670","45256cfe":"3803","93688e09":"3820",a7227298:"3844","49206f6f":"3855",c02123b5:"3877","699a8fef":"3954",bbec0ea8:"4011","1caa3b90":"4029","8bf7b385":"4067","1129db35":"4070",e92f4833:"4159",c4f5d8e4:"4195","36bff928":"4203","69bb3584":"4234",aecd11f5:"4429",d59c50f6:"4587",d02aa106:"4590",adf2c0d2:"4596",dd05d4e3:"4604","2593a83b":"4643","1b734938":"4684","31dae65f":"4750","7ab8d5f3":"4769",da03b20b:"4771",ef513ce2:"4802","8f9c93ae":"4885","897621f7":"4974",c0aa555d:"4985","6cdd9503":"5111","6c0d6c9a":"5148","1948baf2":"5208",f944a33e:"5218",cd4eb1ed:"5260","708d50e3":"5272","2b8fdfa9":"5281",bdd7b463:"5309","784c299a":"5351",e532b6bb:"5545","1e930e9c":"5566",d4be948d:"5610","14b2f636":"5672","20ab3326":"5696",c01945e0:"5705",cae0f04b:"5709","9e3eaffa":"5728","4cad2fe6":"5729","9da9701d":"5783",f8a75f5e:"5787",b272fba4:"5803","367ed454":"5862","7386cd72":"5902","674c5fcf":"5920","7d49456b":"5945","1addd124":"5979",f3108074:"6118","6768319c":"6159","71b71564":"6186","8aa13b20":"6197","58e8de69":"6212","600ac4e1":"6215","45ab56fc":"6219",b7ca75af:"6295","72b5199f":"6567","88e80bd0":"6665","79fb26a6":"6716","286cd782":"6782",f6a4c755:"6787","5a3653dd":"6832","5f8b303a":"6868","4b3973b8":"6926",ddf401e0:"6984",a087da7b:"7042","5f153871":"7069",ede4b0bb:"7070","55db4623":"7133","2020b7aa":"7143","99e3e97f":"7157","90050cbc":"7236",f02d2d32:"7276","889fb5f5":"7321",c53e755e:"7322","0efaccc0":"7372","14a24e11":"7400","393be207":"7414",c9fa300e:"7466","61175dc6":"7525","7e370ea7":"7595",a7434565:"7645",c3e055b8:"7681",db37eded:"7702",f0954aa2:"7779",ea003b3f:"7787","78cdd3ae":"7965","35a60b9c":"8138","3dd373c6":"8253","37ca8f58":"8336","14094f46":"8422","799ffaed":"8493",fa199c0f:"8575","35a98222":"8719","1cb76857":"8735","5a522f46":"8738","5df973a0":"8763","8992496f":"8772","0a799d0e":"8823","25301e6f":"8843","437849bc":"8846",b8b76bfb:"8901",bc9a5c2d:"8958","10830de6":"8995",e40683f4:"9014",fb7a7e13:"9019",b5e1e414:"9100","3ee87be9":"9120",f906dd81:"9154",c9b278a8:"9181",b4e44ac6:"9184","56f1fb64":"9218","247783bb":"9334","6a4aefb0":"9346",c5b0ab6a:"9396","1be78505":"9514","5ec84ac2":"9516","09ee1501":"9578",e6546d07:"9611",aaab4dd5:"9656",ab71d4e1:"9710","14eb3368":"9817","2dc3018f":"9852","475cf40c":"9873","616acc84":"9940",fe140d6b:"9966"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>d=e[a]=[f,b]));f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n<c.length;n++)b=c[n],r.o(e,b)&&e[b]&&e[b][0](),e[b]=0;return r.O(i)},f=self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[];f.forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f))})()})(); \ No newline at end of file diff --git a/docs/4.x/category/administrator/index.html b/docs/4.x/category/administrator/index.html index dbb31d5d4..1d6fdd74a 100644 --- a/docs/4.x/category/administrator/index.html +++ b/docs/4.x/category/administrator/index.html @@ -4,13 +4,13 @@ <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v2.4.3"> <title data-rh="true">Administrator | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/apps/index.html b/docs/4.x/category/apps/index.html index 6f9012275..b5275059b 100644 --- a/docs/4.x/category/apps/index.html +++ b/docs/4.x/category/apps/index.html @@ -4,13 +4,13 @@ Apps | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/cloud-provider-guides/index.html b/docs/4.x/category/cloud-provider-guides/index.html index be9b93a45..d229b5093 100644 --- a/docs/4.x/category/cloud-provider-guides/index.html +++ b/docs/4.x/category/cloud-provider-guides/index.html @@ -4,13 +4,13 @@ Cloud Provider Guides | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/configuration/index.html b/docs/4.x/category/configuration/index.html index 6dde7619a..530d39077 100644 --- a/docs/4.x/category/configuration/index.html +++ b/docs/4.x/category/configuration/index.html @@ -4,13 +4,13 @@ Configuration | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/debug-files/index.html b/docs/4.x/category/debug-files/index.html index f8a997c30..a081fd531 100644 --- a/docs/4.x/category/debug-files/index.html +++ b/docs/4.x/category/debug-files/index.html @@ -4,13 +4,13 @@ Debug Files | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/deployment/index.html b/docs/4.x/category/deployment/index.html index 75c26efbf..76b15d7ab 100644 --- a/docs/4.x/category/deployment/index.html +++ b/docs/4.x/category/deployment/index.html @@ -4,13 +4,13 @@ Deployment | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/local-development/index.html b/docs/4.x/category/local-development/index.html index 21653fa10..a7160fbe9 100644 --- a/docs/4.x/category/local-development/index.html +++ b/docs/4.x/category/local-development/index.html @@ -4,13 +4,13 @@ Local development | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/monitoring/index.html b/docs/4.x/category/monitoring/index.html index e80ef5ae4..b84fb6b95 100644 --- a/docs/4.x/category/monitoring/index.html +++ b/docs/4.x/category/monitoring/index.html @@ -4,13 +4,13 @@ Monitoring | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/sdks/index.html b/docs/4.x/category/sdks/index.html index 8f55a35d4..eefe71618 100644 --- a/docs/4.x/category/sdks/index.html +++ b/docs/4.x/category/sdks/index.html @@ -4,13 +4,13 @@ SDKs | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/category/toolkits/index.html b/docs/4.x/category/toolkits/index.html index e078eafc6..e8b993649 100644 --- a/docs/4.x/category/toolkits/index.html +++ b/docs/4.x/category/toolkits/index.html @@ -4,13 +4,13 @@ Toolkits | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/contributing-guide/index.html b/docs/4.x/contributing-guide/index.html index ef48b8012..450b83a71 100644 --- a/docs/4.x/contributing-guide/index.html +++ b/docs/4.x/contributing-guide/index.html @@ -4,8 +4,8 @@ Contributing Guide | Zealot - - + +
@@ -16,7 +16,7 @@ This helps in shorter turn around times in merging PRs For new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful. Feel free to join our discord community, if you need further discussions with the core team.

Setup for local development

These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use.

- - + + \ No newline at end of file diff --git a/docs/4.x/contributing-guide/local-development/devcontainer/index.html b/docs/4.x/contributing-guide/local-development/devcontainer/index.html index 0078b604e..cd7f3cd2c 100644 --- a/docs/4.x/contributing-guide/local-development/devcontainer/index.html +++ b/docs/4.x/contributing-guide/local-development/devcontainer/index.html @@ -4,13 +4,13 @@ Visual Studio Code Dev Container Setup | Zealot - - + +
Version: 4.x

Visual Studio Code Dev Container Setup

The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.

VSCode devcontainer

System requirements

Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose.

Install Git

Install it from offical website.

Install Docker & docker-compose

Install Visual Studio Code

Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems.

Follow the platform-specific guides below:

  1. Download Visual Studio Code for macOS.
  2. Open the browser's download list and locate the downloaded app or archive.
  3. If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari.
  4. Drag Visual Studio Code.app to the Applications folder, making it available in the macOS Launchpad.
  5. Open VS Code from the Applications folder, by double clicking the icon.

Install Remote container extension

Install the Remote Container extension.

VSCode extension

Fetch Zealot Codesoace

Zealot Codespace was in the .devcontailer folder of Zealot project, so you need clone the source code.

git clone https://github.com/tryzealot/zealot.git

Explan these files in Codespace:

FileDescription
devcontainer.jsonVSCode devcontainer config
Dockerfile.baseBase Dockerfile, auto push multi registry servers after changes
DockerfileSpeed up build time, depends on above image.
docker-compose.ymlAll services of Zealot
create-db-user.sqlCreate user and role for Zealot

Open the project in a container

Start Visual Studio Code, run the Dev Containers: Open Folder in Container... command in Command Palette and select the Zealot folder.

VSCode Command Palette

Click the Starting Dev Container (show log) to review zealot codespace build real time logging messages.

VSCode Command Palette

When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:

[7293 ms] Start: Run in container: cat /proc/344/environ
[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.
[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e
[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established
[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close
[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.
[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close

In host Docker containers:

Docker-Compose containers

Start the project

Press Ctrl + ` to open the integrated terminal in Visual Studio Code if it isn't already open. then run bin/dev to run all services.

Notice that the terminal prompt might look different than your normal terminal prompt.

VSCode Zealot in Container

Open in browser

A while after run bin/dev, select Ports to see all forwarded ports, Open in Browser in quick way.

VSCode forwarded ports

- - + + \ No newline at end of file diff --git a/docs/4.x/contributing-guide/local-development/source-code/index.html b/docs/4.x/contributing-guide/local-development/source-code/index.html index cf2a62ef7..b9bcff6e3 100644 --- a/docs/4.x/contributing-guide/local-development/source-code/index.html +++ b/docs/4.x/contributing-guide/local-development/source-code/index.html @@ -4,13 +4,13 @@ Source code | Zealot - - + +
Version: 4.x

Source code

The following is a tutorial on local deployment development for different operating systems.

Prepare dependencies

macOS

Install homebrew

First you need to install Xcode Command tools:

$ xcode-select --install

Then install Homebrew, the package management tool for macOS

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Install dependencies

$ brew install redis postgresql webp imagemagick node git

Setup Database and cache services

Run postgresql and redis services

$ brew services start postgresql
$ brew services start redis

You also need to create a default username in Postgresql:

$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

yarn

$ npm install -g yarn

Debian (Ubuntu)

System dependencies

$ apt update
$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev

Install dependencies

$ apt install -y redis postgresql-client node

Setup Database and cache services

Run postgresql and redis services

$ systemctl postgres start
$ systemctl redis start

You also need to create a default username in Postgresql:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

node

$ npm install -g yarn

Alpine Linux

System dependencies

$ apk --update --no-cache add build-base libxml2 libxslt git \
libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \
tzdata

Needs install gcompat if use arm architecture. or an exception will throws such like "Error loading shared library".

Install dependencies

$ apk --update --no-cache redis postgresql

Setup Database and cache services

Run postgresql and redis services

$ rc-service postgres start
$ rc-service redis start

You also need to create a default username in Postgresql:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

Install Ruby

Can be installed by either asdf, rvm as ruby version manager.

Following the offical install guide then:

# Enable Ruby 3.2.0 YJIT need install rust 1.58+
# Optinal install:
asdf plugin add rust
asdf install rust latest
asdf global rust latest
export RUBY_CONFIGURE_OPTS=--enable-yjit

# Required:
asdf plugin add ruby
asdf install ruby 3.2.0
asdf global ruby 3.2.0

Fetch source code

git clone https://github.com/tryzealot/zealot.git

Initialize Zealot

All the following steps need to be performed in the zealot root directory.

bundler

Install Ruby gems

$ [sudo] gem install bundler
$ bundle install

yarn

Install javascript packages:

$ yarn install

Initialize database

Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:

$ rails db:create
$ rails db:migrate

Configuring the connection database can be done via environment variables or by changing the config/database.yml file.

Initialize default account and demo data

Initialize administrator account and sample application

$ rails db:seed

Launch services

$ bin/dev

Open brower http://localhost:3000

- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/api/apps/index.html b/docs/4.x/developer-guide/api/apps/index.html index 2a9d5aa58..3af9ded64 100644 --- a/docs/4.x/developer-guide/api/apps/index.html +++ b/docs/4.x/developer-guide/api/apps/index.html @@ -4,13 +4,13 @@ App APIs | Zealot - - + +
Version: 4.x

App APIs

Upload an app

This allows you to upload an single iOS, Android or macOS file.

POST /api/apps/upload

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
fileFiletruean App file
channel_keyStringfalseChannel key
Create a new App if leave it empty
nameStringfalsethe name of App
Use app name from parsed metadata in given file if leave it empty
release_typeStringfalseEg, debug, beta, adhoc, release, enterprise 等
sourceStringfalsethe source of upload (default is api)
changelogStringfalseChangelog
Avaiables in plain text or JSON formatted struct
branchStringfalsea branch name from git
git_commitStringfalsegit commit
ci_urlStringfalsethe build url of a C
custom_fieldsStringfalseJSON formatted custom fileds
It could configures and display title,
value and icon from fontawesome in a Release page from an App

For changelog attribute which it accepts both plain text and JSON formatted contents:

plain text:

message 1\nmessage 2

JSON:

[
{
"message": "message 1",
"author": "admin",
"email": "admin@zealot.com",
"date": "2021-11-11 11:11:11"
},
{
"message": "message 1",
"author": "developer",
"email": "developer@zealot.com",
"date": "2021-11-11 11:11:11"
}
]

For custom_fields attribute which it use JSON formatted struct to build from each key-value. for example, Display country name like country=China with icon flag:

curl -X POST \
'https://YOUR_ZEALOT_URL/api/apps/upload' \
--form 'token="token"' \
--form 'channel_key="channel_key"' \
+ --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \
--form 'file=@/path/to/your/app'

Return body

{
"id": 50,
"version": 7,
"app_name": "Test Android",
"bundle_id": "com.test.app",
"release_version": "1.0",
"build_version": "1",
"source": "SOURCE",
"branch": "master",
"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",
"ci_url": "",
"size": 1565486,
"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",
"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",
"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",
"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",
"changelog": [
{
"message": "Changelog message 1"
},
{
"message": "Changelog message 2"
}
],
"text_changelog": "- Changelog message 1\n- Changelog message 2",
"custom_fields": [],
"created_at": "2021-09-01T11:43:33.977+08:00",
"app": {
"id": 1,
"name": "App name"
},
"scheme": {
"id": 8,
"name": "Test"
},
"channel": {
"slug": "1XmpC",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
}

List apps

Get a list of app.

This function takes pagination parameters page and per_page to restrict the list of app.

GET /api/apps

Parameters

AttributeTypeRequiredDescription
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

[
{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 1,
"name": "Adhoc",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
},
{
"id": 2,
"name": "内测版",
"channels": [
{
"slug": "l19Tl",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "8selv",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}
]

Get an app

Allows you to receive information about an app like name, scheme, channel.

GET /api/apps/:id

Parameters

AttributeTypeRequiredDescription
idStringtrueID

Return body

{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 5,
"name": "Test App",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}

Get versions list of app

Get a list of apps by the given channel key

GET /api/apps/versions

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

{
"app_name": "Zealot iOS",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "AdHoc"
},
"releases": [
{
"version": 2,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10292024",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
{
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
]
}

Get the latest version of app

Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url.

GET /api/apps/latest

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
release_versionStringtrueRelease version
build_versionStringtrueBuild version

Return body

{
"app_name": "Zealot iOS",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "AdHoc"
},
"releases": {
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}
}

Check version exists

Allows you to check the Release exists by given query, query accepts two combo group:

  • bundle_id, release_version and build_verion
  • bundle_id and git_commit
GET /api/apps/version_exist

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
bundle_idStringtruebundle_id or package_name
release_versionStringfalseRelease version
build_versionStringfalseBuild version
git_commitStringfalsegit commit hash

Return body

  • Return 200 if release existed.
  • Return 404 if release not existed.

Success returns:

{
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "4.1.1",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}

Not found returns:

{
"error": "Not found release"
}
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/api/debug_files/index.html b/docs/4.x/developer-guide/api/debug_files/index.html index 2d3dd3adc..e53c27b68 100644 --- a/docs/4.x/developer-guide/api/debug_files/index.html +++ b/docs/4.x/developer-guide/api/debug_files/index.html @@ -4,13 +4,13 @@ Debug File APIs | Zealot - - + +
Version: 4.x

Debug File APIs

Upload debug file

This allows you to upload an single iOS, Android debug file.

Debug file accepts:

  • iOS: a Zipped dSYM file
  • Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files.
POST /api/debug_files/upload

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
fileFiletrueArichved file by zip
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringtrueBuild version, ignore this param if iOS app

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Download debug file

This allows you to download an single iOS, Android debug file.

POST /api/debug_files/download

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringfalseBuild version, ignore this param if iOS app
orderStringfalseOrder by
version = latest version, upload_date = last uploaded date
Vaild in release_version is latest

Return body

  • Retun 200 status code if the version exists and redirect to the download address with a 302 status code.
  • return 404 status code if the version does not exist.

List debug files

Get a list of debug files.

This function takes pagination parameters page and per_page to restrict the list of debug files.

GET /api/debug_files

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

[
{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}
]

Get a debug file

Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only).

GET /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Update a existed debug file

This allows you to update a debug file.

PUT /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID
fileFiletruea Zipped debug file
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringtrueBuild version, ignore this param if iOS app

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Delete a debug file

This allows you to delete a debug file.

DELETE /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID

Return body

{
"mesage": "OK"
}
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/api/index.html b/docs/4.x/developer-guide/api/index.html index 9e0bc856f..81bbe107c 100644 --- a/docs/4.x/developer-guide/api/index.html +++ b/docs/4.x/developer-guide/api/index.html @@ -4,14 +4,14 @@ APIs | Zealot - - + +
Version: 4.x

APIs

Use the Zealot APIs to view, upload, download the build of app or debug file.

Authentication

Requests currently only support query authentication for User Token, found in API - Key at the bottom of the login user details page.

example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN

Version

The current version is v1, the APIs does not need to explicitly pass the version parameter, and the GraphGL interface is being developed gradually.

Apps

ResourceAvailable endpoints
Upload an App/api/apps/upload
List Apps/api/apps
Get an App by id/api/apps/:id
List verions from an App/api/apps/versions
Get the latest Release from an App/api/apps/latest
Check an Release from App exists/api/apps/version_exist

Full APIs to check api/apps page.

Debug files

ResourceAvailable endpoints
Upload a debug file/api/debug_files/upload
Download a debug file by id/api/debug_files/download
List Debug files/api/debug_files
Get an debug file by id/api/debug_files/:id
Check a debug file exists by id/api/debug_files/version_exist
Update a debug file by id/api/debug_files/:id
Delete a debug file by id/api/debug_files/:id

Full APIs to check api/debug_files page.

- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/fastlane/index.html b/docs/4.x/developer-guide/fastlane/index.html index f83493110..6ea5433fb 100644 --- a/docs/4.x/developer-guide/fastlane/index.html +++ b/docs/4.x/developer-guide/fastlane/index.html @@ -4,8 +4,8 @@ Fastlane plugins | Zealot - - + +
@@ -13,7 +13,7 @@ fastlane lets you automate every aspect of your development and release workflow, customize your deployment workflows using the hundreds of community built fastlane actions and plugins.

fastlane-plugin-zealot provides upload app, debug_file and version check actions to Zealot, install it in shell:

$ fastlane add_plugin zealot

More usefully plugins

In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:

PluginDescription
fastlane-plugin-ci_changelogAutomate generate changelog between previous and the latest commit of SCM during the CI services.
fastlane-plugin-update_jenkins_buildUpdate build's description of jenkins.
fastlane-plugin-humanable_build_numberAutomatic generate app build number unque and human readable friendly
fastlane-plugin-app_infoTeardown tool for mobile app(ipa, apk and aab file), analysis metedata like version, name, icon etc.
fastlane-plugin-android_channelsPackage unsign apk with channels and write empty file to META-INF with channel in general way
fastlane-plugin-ram_diskUse a virtual ram disk to do anything else
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/fastlane/zealot/index.html b/docs/4.x/developer-guide/fastlane/zealot/index.html index 2f7b5ab99..237dbc6bd 100644 --- a/docs/4.x/developer-guide/fastlane/zealot/index.html +++ b/docs/4.x/developer-guide/fastlane/zealot/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot | Zealot - - + +
Version: 4.x

Fastlane action: zealot

Uploading iOS, Android and macOS app, it requires three params:

zealot(
endpoint: 'https://zealot.com',
token: '...',
channel_key: '...',
)

Parameters

+-----------------+---------------------------------+------------------------+----------+
| zealot Options |
+-----------------+---------------------------------+------------------------+----------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+----------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| file | The path of app file. Optional | ZEALOT_FILE | |
| | if you use the `gym`, `ipa`, | | |
| | `xcodebuild` or `gradle` | | |
| | action. | | |
| name | The name of app to display on | ZEALOT_NAME | |
| | zealot | | |
| changelog | The changelog of app | ZEALOT_CHANGELOG | |
| slug | The slug of app | ZEALOT_SLUG | |
| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |
| branch | The name of git branch | ZEALOT_BRANCH | |
| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |
| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |
| | fields | | |
| password | The password of app to download | ZEALOT_PASSWORD | |
| source | The name of upload source | ZEALOT_SOURCE | fastlane |
| ci_url | The name of upload source | ZEALOT_CI_CURL | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |
| | keep secret | | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure | | |
+-----------------+---------------------------------+------------------------+----------+
* = default value is dependent on the user's system

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+

Output Variables

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+
Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html b/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html index dd5f4611c..17729188f 100644 --- a/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html +++ b/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_debug_file | Zealot - - + +
Version: 4.x

Fastlane action: zealot_debug_file

Upload iOS dSYM or Android Proguard file(s) to Zealot

  # Upload iOS dSYM file
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :ios,
xcode_scheme: 'AppName',
verify_ssl: false
)

# Upload Android Proguard files
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :android,
android_build_type: 'release',
android_flavor: 'store',
release_version: '1.1.0',
build_version: '1',
overwrite: true
)

# Upload given zip file
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
zip_file: 'path/to/your/zip_file',
release_version: '1.1.0',
build_version: '1',
verify_ssl: false
)

Parameters

+--------------------+-----------------------------------+---------------------------+---------+
| zealot_debug_file Options |
+--------------------+-----------------------------------+---------------------------+---------+
| Key | Description | Env Var | Default |
+--------------------+-----------------------------------+---------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |
| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |
| | to direct upload | | |
| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |
| | value are | | |
| | ios,mac,macos,osx,android | | |
| path | The path of debug file | ZEALOT_PATH | |
| | (iOS/macOS is archive path for | | |
| | Xcode, Android is path for app | | |
| | project) | | |
| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |
| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |
| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |
| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |
| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |
| | dSYM file | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| | (Android needs) | | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| | (Android needs) | | |
| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |
| | if it existed | | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+--------------------+-----------------------------------+---------------------------+---------+
* = default value is dependent on the user's system

+-----------------------+-----------------------------------------+
| zealot_debug_file Output Variables |
+-----------------------+-----------------------------------------+
| Key | Description |
+-----------------------+-----------------------------------------+
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+-----------------------------------------+
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html b/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html index 3a75784f8..e6f3e7872 100644 --- a/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html +++ b/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html @@ -4,14 +4,14 @@ Fastlane action: zealot_sync_devices | Zealot - - + +
Version: 4.x

Fastlane action: zealot_sync_devices

🔔 Zealot 4.5.0 built in Apple team manage which it use Apple API Key to sync iOS devices, even CAN registe the device after fetch the UDID, Check detail

Use Apple Developer account to syncing UDIDs and relates the value in Zealot.

# With Apple API Key
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
api_key_path: '/path/to/your/api_key_json_file',
team_id: '...'
)

# With password (Two-factor Authentication required)
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
username: 'user@example.com',
team_id: '...'
)

Parameters

+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| zealot_sync_devices Options |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| Key | Description | Env Var(s) | Default |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |
| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -json-file) | | |
| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -hash-option) | | |
| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |
| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |
| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |
| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html b/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html index 7a2128e62..94c518b03 100644 --- a/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html +++ b/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_version_check | Zealot - - + +
Version: 4.x

Fastlane action: zealot_version_check

Check given build exists or not on Zealot

zealot_version_check(
endpoint: 'https://zealot.com',
token: '...',
bundle_id: 'com.example.app.name',
release_version: '1.0.0',
build_version: '1'
)

Parameters

+-----------------+---------------------------------+------------------------+---------+
| zealot_version_check Options |
+-----------------+---------------------------------+------------------------+---------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |
| | app | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+-----------------+---------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/index.html b/docs/4.x/developer-guide/index.html index 0094f2b65..82389549d 100644 --- a/docs/4.x/developer-guide/index.html +++ b/docs/4.x/developer-guide/index.html @@ -4,13 +4,13 @@ Developer Guide | Zealot - - + +
Version: 4.x

Developer Guide

Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/sdk/android/index.html b/docs/4.x/developer-guide/sdk/android/index.html index 2211ec399..a673b0bde 100644 --- a/docs/4.x/developer-guide/sdk/android/index.html +++ b/docs/4.x/developer-guide/sdk/android/index.html @@ -4,13 +4,13 @@ Zealot Android SDK | Zealot - - + +
Version: 4.x

Zealot Android SDK

The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.

Install

JitPack

Using jitpack to install:

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

In build.gradle file of main app project add:

dependencies {
implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'
}

Permission

Zealot needs internet permission

<uses-permission android:name="android.permission.INTERNET" />

Usages

Add the start code to the onCreate method block of your Application file:

// Single channel
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("...")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()

// Multi-channel, such as beta, adhoc versions
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("xxxxxxx", "beta")
.setCHannelKey("yyyyyyy", "test")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()
- - + + \ No newline at end of file diff --git a/docs/4.x/developer-guide/sdk/ios/index.html b/docs/4.x/developer-guide/sdk/ios/index.html index c599244e8..ba6fbb9b9 100644 --- a/docs/4.x/developer-guide/sdk/ios/index.html +++ b/docs/4.x/developer-guide/sdk/ios/index.html @@ -4,14 +4,14 @@ Zealot iOS SDK | Zealot - - + +
Version: 4.x

Zealot iOS SDK

The iOS component provides a service to check for new versions and installations for Zealot, supporting Swift and Objective-C.

Install

Cocoapods

Adding below code into Podfile:

pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'

Install it:

pod install

Usages

Import header

  1. Add the code in your AppDelegate
import Zealot

Configure

  1. Add the following code in application:didFinishLaunchingWithOptions: method block:
// Single channel
let zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")
zealot.checkVersion()

// Multi-channel, such as beta, adhoc versions
let zealot = Zealot(endpoint: "http://zealot.com",
channelKeys: [
"beta": "xxxxxxx",
"test": "yyyyyyy"],
default_enviroment: "beta")

// Active it
zealot.checkVersion()
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/configuration/environment-variables/index.html b/docs/4.x/self-hosted/configuration/environment-variables/index.html index f59640f1a..fc0357184 100644 --- a/docs/4.x/self-hosted/configuration/environment-variables/index.html +++ b/docs/4.x/self-hosted/configuration/environment-variables/index.html @@ -4,8 +4,8 @@ Environment Variables | Zealot - - + +
@@ -19,7 +19,7 @@ specific permission comparison can see here for details

# Guest mode is ON
ZEALOT_GUEST_MODE=true

# Guest mode is OFF
ZEALOT_GUEST_MODE=false

Configure emails

Currently, only smtp is supported to configure email notification service. Email notification mainly affects are user registration, sending activation emails and changing password service, but it does not affect the use if it is not turned on.

# SMTP settings
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=you@gmail.com
SMTP_PASSWORD=yourpassword
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

# Sender and email address by default
ACTION_MAILER_DEFAULT_FROM=you@gmail.com
ACTION_MAILER_DEFAULT_TO=you@gmail.com

Disbale Cable request protection

Experimental:

ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION=true
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/configuration/schedule-jobs/index.html b/docs/4.x/self-hosted/configuration/schedule-jobs/index.html index f0e97f77a..66c410e40 100644 --- a/docs/4.x/self-hosted/configuration/schedule-jobs/index.html +++ b/docs/4.x/self-hosted/configuration/schedule-jobs/index.html @@ -4,8 +4,8 @@ Schedule Jobs | Zealot - - + +
@@ -14,7 +14,7 @@ version basically to meet the vast majority of cases, for example:

Additional: the current logic is relatively trouble-free but inflexible, in fact, there is thought to support a variety of processing logic, see https://github.com/tryzealot/zealot/issues/376

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 9
- 8
...
- 1.0
- 5
- 4
- 3
...

The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4, leaving the final version file as follows:

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 1.0
- 5

If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ZEALOT_KEEP_UPLOADS=false.

info

ZEALOT_KEEP_UPLOADS set true by default.

Backup

When you create any backup it will join itself to the schedule job list.

- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/configuration/third-party-authentication/index.html b/docs/4.x/self-hosted/configuration/third-party-authentication/index.html index d8720ab6e..af83a9ec0 100644 --- a/docs/4.x/self-hosted/configuration/third-party-authentication/index.html +++ b/docs/4.x/self-hosted/configuration/third-party-authentication/index.html @@ -4,13 +4,13 @@ Third-party Authentication | Zealot - - + +
Version: 4.x

Third-party Authentication

Avaiable services:

Service Nameprovider value
Feishufeishu
Gitlabgitlab
Googlegoogle_oauth2
LDAPldap

If the above services need to set the callback address please set it uniformly as follows

http://zealot.com/users/auth/:provider/callback

where :provider is the identifier of the above supported third-party service, for example:

# if Google is enabled, then replace `:provider` with `google_oauth2`.
http://zealot.com/users/auth/google_oauth2/callback

Gitlab

  1. Register a Gitlab On line account or use self-host service
  2. Create an application in Preferences -> Applications page.
  3. Configure Redirect URI such like http://zealot.com/users/auth/gitlab/callback (replace the domain in your case)
  4. Check scope: read_user,By default zealot only uses this license, if your enable scope is api that's fine too
GITLAB_ENABLED=true
GITLAB_SITE=https://gitlab.com/api/v4
GITLAB_SCOPE=read_user
GITLAB_APP_ID=
GITLAB_SECRET=

Google

  1. Register a Google account
  2. Enable Google Cloud Platform service
  3. Choose or create a Project then go to Credentials page
  4. Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like http://zealot.com/users/auth/google_oauth2/callback (replace the domain in your case)
GOOGLE_OAUTH_ENABLED=true
GOOGLE_CLIENT_ID=
GOOGLE_SECRET=

Feishu (Lark)

  1. Register a feishu (lark) account and download the Phone app.
  2. Enable Open platform and create application to get app_id, app_secret
  3. Configure callback url such like http://zealot.com/users/auth/feishu/callback (replace the domain in your case)
  4. Check user filed information scope: email address (Optional)
  5. Create a version and publish
FEISHU_ENABLED=true
FEISHU_APP_ID=
FEISHU_APP_SECRET=

LDAP

LDAP_ENABLED=true
LDAP_HOST=10.0.0.1
LDAP_PORT=389
LDAP_METHOD=plain
LDAP_BIND_DN="cn=Manager,dc=example,dc=com"
LDAP_PASSWORD=password
LDAP_BASE="ou=People,dc=example,dc=com"
LDAP_UID=uid
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/architecture/index.html b/docs/4.x/self-hosted/deployment/architecture/index.html index 4e067fb57..10a968c64 100644 --- a/docs/4.x/self-hosted/deployment/architecture/index.html +++ b/docs/4.x/self-hosted/deployment/architecture/index.html @@ -4,13 +4,13 @@ Zealot Architecture | Zealot - - + +
Version: 4.x

Zealot Architecture

Running Zealot requires the following set of services.

ArchitectureArchitecture
  • Mostly Linux based on amd86/arm64/armv7.
  • Ruby on Rails powered Web and API services
  • Sidekiq provides asynchronous background task management
  • PostgreSQL database
  • Redis cache
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/docker/index.html b/docs/4.x/self-hosted/deployment/docker/index.html index ccbbac6d2..9e69364fa 100644 --- a/docs/4.x/self-hosted/deployment/docker/index.html +++ b/docs/4.x/self-hosted/deployment/docker/index.html @@ -4,8 +4,8 @@ Deploy Zealot with Docker guide | Zealot - - + +
@@ -25,7 +25,7 @@ may require the device to also have an SSL certificate installed before accessing and installing the application, and Chrome may also deny access due to the certificate.

If the domain name is unregistered, you need to tie the host to access it, usually by modifying the system's /etc/hosts file.

/etc/hosts
$ sudo vim /etc/hosts

127.0.0.1 zealot.test
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html b/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html index 470635013..29c4e0c9a 100644 --- a/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html +++ b/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html @@ -4,8 +4,8 @@ Docker deployment guide | Zealot - - + +
@@ -13,7 +13,7 @@ load the sample application data and set up the administrator account, which is required for subsequent zealot updates.

docker-compose pull

Setup database data

The first time you use it, you will initialize the database, load the sample application data and set up the administrator account, which is required for subsequent zealot updates.

docker-compose run --rm zealot run_upgrade

Launch docker-compose

Manual execution is required to run the service for security periods and user-defined operations:

docker-compose up -d

Advanced

Custom volumes

You have two t

There are two ways to customize the path: (Assuming that the custom path is /data/zealot)

1. Create custom docker volume

docker volume create --name zealot-data \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/zealot-data

docker volume create --name zealot-redis \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/redis

docker volume create --name zealot-postgres \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/postgres

2. Change volumes part of docker-compose file

Open docker-compose.yml file and find volumes::

volumes:
zealot-data:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/data
zealot-redis:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/redis

zealot-postgres:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/postgres
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/fly/index.html b/docs/4.x/self-hosted/deployment/fly/index.html index 5d19312ef..69368cc15 100644 --- a/docs/4.x/self-hosted/deployment/fly/index.html +++ b/docs/4.x/self-hosted/deployment/fly/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Fly guide | Zealot - - + +
Version: 4.x

Deploy Zealot to Fly guide

Zealot support use App Configuration (fly.toml) to deploy on fly.io.

Deploying on Fly

  • Install flyctl.
  • Copy full content of app configuration save to fly.toml then change the app value .
  • Run flyctl deploy.
  • Run fly scale vm shared-cpu-1x --memory 512.

App Configuration

app = "[app-name:changeme]"
kill_signal = "SIGINT"
kill_timeout = 120
processes = []

[build]
image = "ghcr.io/tryzealot/zealot:nightly"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 80
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

[[statics]]
guest_path = "/app/public"
url_prefix = "/"
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/kubernetes/index.html b/docs/4.x/self-hosted/deployment/kubernetes/index.html index c9ae7d2ab..00e2efc1b 100644 --- a/docs/4.x/self-hosted/deployment/kubernetes/index.html +++ b/docs/4.x/self-hosted/deployment/kubernetes/index.html @@ -4,13 +4,13 @@ Deploy Zealot with Kubernetes guide | Zealot - - + +
Version: 4.x

Deploy Zealot with Kubernetes guide

Zealot support deployments using Kubernetes, but only .yaml config files are available currently.

Check list

  • ConfigMap and Secret to configure enviroment variables.
  • PersistentVolumeClaim to configure public/uploads, public/bakcup.
  • Deployment to control zealot pod.

Steps

10-zealot-namespace.yml

Zealot namespace.

10-zealot-namespace.yml
api Version: v1
kind: Namespace
metadata:
name: zealot

20-zealot-secrets.yml

Zealot enviroments secrets. This is loaded all secrets enviroments, all values need encryt by base64.

20-zealot-secrets.yml
apiVersion: v1
kind: Secret
metadata:
namespace: zealot
name: zealot-secrets
data:
ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=
ZEALOT_ADMIN_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=
ZEALOT_POSTGRES_PORT: NTQzMg==
ZEALOT_POSTGRES_USERNAME: emVhbG90
ZEALOT_POSTGRES_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_DB_NAME: emVhbG90
REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=

# echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64
SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==

21-zealot-configmap.yml

Zealot enviroments config map. This is loaded safe enviroments.

21-zealot-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: zealot
name: zealot-config
data:
ZEALOT_DOMAIN: zealot.icyleaf.dev
DEFAULT_LOCALE: en
ZEALOT_REGISTER_ENABLED: "true"

30-zealot-storage.yml

The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed.

30-zealot-storage.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-uploads
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-backup
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

40-zealot-deployment.yml

Create zealot deployment, edit replicas and image tag.

40-zealot-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zealot
namespace: zealot
spec:
restartPolicy: Always
replicas: 1
selector:
matchLabels:
app: zealot
template:
metadata:
labels:
app: zealot
spec:
containers:
- name: zealot
image: ghcr.io/tryzealot/zealot:nightly
# imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
envFrom:
- configMapRef:
name: zealot-env
- secretRef:
name: zealot-secrets
volumeMounts:
- mountPath: /app/public/uploads
name: uploads
- mountPath: /app/public/backup
name: backup
volumes:
- name: uploads
persistentVolumeClaim:
claimName: zealot-uploads
- name: backup
persistentVolumeClaim:
claimName: zealot-backup

50-zealot-service.yml

Creating zealot service.

50-zealot-service.yml
apiVersion: v1
kind: Service
metadata:
name: zealot
namespace: zealot
labels:
app: zealot
spec:
selector:
app: zealot
ports:
- port: 80
targetPort: http
name: http
protocol: TCP

60-zealot-ingress.yml

Setting up the ingress for the zealot service.

50-zealot-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zealot
namespace: zealot
annotations:
#cert-manager.io/cluster-issuer: letsencrypt-prod
#kubernetes.io/ingress.class: nginx
spec:
rules:
- host: zealot.icyleaf.dev
http:
paths:
- web:
service:
name: zealot
port:
number: 80
path: /
pathType: Prefix
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/nomad/index.html b/docs/4.x/self-hosted/deployment/nomad/index.html index c0fb98ba9..b83fec6a1 100644 --- a/docs/4.x/self-hosted/deployment/nomad/index.html +++ b/docs/4.x/self-hosted/deployment/nomad/index.html @@ -4,8 +4,8 @@ Deploy Zealot with Nomad guide | Zealot - - + +
@@ -15,7 +15,7 @@ copy the zealot.nomad in previous step and edit a new file named main.tf:

resource "nomad_job" "jobs" {
jobspec = file("${path.module}/zealot.nomad")
}

Execute terraform plan to ensure, then deploy terraform apply.

External Storages

Nomad supports multi-cluster management, and in many cases the storage deployed by the service cannot be mounted directly to the corresponding file system, but is more often placed on top of a shared file storage protocol, such as SMB, NFS, S3, etc.

CSI

Nomad currently supports the CSI in a limited capability (Nomad 1.5). Nomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad. You can find a list of plugins in the Kubernetes CSI Developer Documentation.

PluginSchemesCompatibleterraform nomad resource
kubernetes-csi-driver-smbsmbUnknownUnknown
kubernetes-csi-driver-nfsnfsSupportednomad_volume
kubernetes-csi-driver-iscsiiscsiSupportedSupported
democraticcsi/democratic-csismb/nfs/iscsiSupportednomad_external_volume
rocketduck/csi-plugin-nfsnfsSupportednomad_external_volume
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/railway/index.html b/docs/4.x/self-hosted/deployment/railway/index.html index f26270288..64cd22548 100644 --- a/docs/4.x/self-hosted/deployment/railway/index.html +++ b/docs/4.x/self-hosted/deployment/railway/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Railway guide | Zealot - - + +
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/render/index.html b/docs/4.x/self-hosted/deployment/render/index.html index e871a5ab5..9fe2fe82a 100644 --- a/docs/4.x/self-hosted/deployment/render/index.html +++ b/docs/4.x/self-hosted/deployment/render/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Render guide | Zealot - - + +
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/requirements/index.html b/docs/4.x/self-hosted/deployment/requirements/index.html index 2e443e09d..4c5c5d3fa 100644 --- a/docs/4.x/self-hosted/deployment/requirements/index.html +++ b/docs/4.x/self-hosted/deployment/requirements/index.html @@ -4,8 +4,8 @@ Zealot Self Hosted Requirements | Zealot - - + +
@@ -15,7 +15,7 @@ The storage requirements for Redis are minimal, You can start with 50MB and scale up as required.

Redis version 6.2 or higher version is recommended

Sidekiq

Sidekiq processes the background jobs with a multi-threaded process. This process starts with the entire Rails stack but it can grow over time due to memory leaks. On a very active server the Sidekiq process can use 1GB+ of memory.

Supported web browsers

tip

We don't support running Zealot with JavaScript disabled in the browser.

Zealot supports the following web browsers:

- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/deployment/source-code/index.html b/docs/4.x/self-hosted/deployment/source-code/index.html index 4575543fe..6884318ba 100644 --- a/docs/4.x/self-hosted/deployment/source-code/index.html +++ b/docs/4.x/self-hosted/deployment/source-code/index.html @@ -4,13 +4,13 @@ Source code | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/index.html b/docs/4.x/self-hosted/index.html index ffb91db88..0441efc2c 100644 --- a/docs/4.x/self-hosted/index.html +++ b/docs/4.x/self-hosted/index.html @@ -4,13 +4,13 @@ Self-hosted Installation Guide | Zealot - - + +
Version: 4.x

Self-hosted Installation Guide

This guide will help you to install and setup a production ready Zealot.

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/reverse-proxies/index.html b/docs/4.x/self-hosted/reverse-proxies/index.html index 09e290b45..7ed599814 100644 --- a/docs/4.x/self-hosted/reverse-proxies/index.html +++ b/docs/4.x/self-hosted/reverse-proxies/index.html @@ -4,8 +4,8 @@ Reverse Proxies | Zealot - - + +
@@ -15,7 +15,7 @@ routing rules (including access port number, domain name binding and SSL)

Traefik service

entryPoints:
web:
address: ":80"

websecure:
address: ":443"

certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web

Docker

Enable Docker provider then edit the Docker Compose file:

docker-compose.yml
version: '3'
services:
zealot:
<<: *defaults
labels:
- "traefik.enable=true"
- "traefik.http.services.zealot.loadbalancer.server.port=80"
- "traefik.http.routers.zealot.service=zealot"
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"
- "traefik.http.routers.zealot.tls=true"
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt"
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
# Comment port, no need to public
# ports:
# - "8901:80"
network:
# Change the network what traefik service is
- traefik-services

networks:
# Change the network what traefik service is
traefik-services:
external: true

Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine, cross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options.

Consul

Enable Consul provider or Consul Catalog provider, add key-value below:

consul kv put traefik/http/services/zealot/loadbalancer/server/port 5
consul kv put traefik/http/routers/zealot/service zealot
consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'
consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt
consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev
consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev

Nomad

Enable Nomad provider and make sure Nomad version >= 1.3:

zealot.nomad
job "zealot" {
datacenters = ["dc1"]
type = "service"

group "zealot" {
count = 1

network {
port "http"{
static = 80
}
}

service {
name = "zealot-http"
provider = "nomad"
port = "http"
}

task "server" {
driver = "docker"
config {
image = "ghcr.io/tryzealot/zealot:nightly"
ports = ["http"]
args = [
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",
- "traefik.http.routers.zealot.tls=true",
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt",
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
]
}
}
}
}

Caddy 2

The configuration only needs to relate the ip part after tls and proxy:

Caddyfile
:443

log

# Use Let's Encrypt service
tls your-email@example.com

reverse_proxy 172.16.56.100:8901

Nginx

The following is the general configuration, if not effects welcome to file a issue:

conf.d/zealot.conf
upstream zealot {
zone upstreams 64K;
server 172.16.56.100:8901;
keepalive 32;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name zealot.icyleaf.dev;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2; # Optional: http2 may needs install extension
listen [::]:443 ssl http2;
server_name zealot.icyleaf.dev;

ssl_certificate /etc/certs/zealot-cert.pem;
ssl_certificate_key /etc/certs/zealot.pem;

# Optional
# ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
# ssl_session_timeout 5m;
# ssl_session_cache shared:SSL:1m;
# ssl_prefer_server_ciphers on;

location / {
proxy_pass http://zealot;
proxy_redirect off;

proxy_pass_header Authorization;
proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Ssl on; # Optional
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

client_max_body_size 0;
proxy_read_timeout 36000s;
}
}

And you need update max body size in http block. Recommended is 200MB, if it's a game, 50% more can be played to make a surplus according to the actual file size.

nginx.conf
http {
[...]

client_max_body_size 200M;
}
- - + + \ No newline at end of file diff --git a/docs/4.x/self-hosted/storage/index.html b/docs/4.x/self-hosted/storage/index.html index 597a5a187..4be69ea60 100644 --- a/docs/4.x/self-hosted/storage/index.html +++ b/docs/4.x/self-hosted/storage/index.html @@ -4,8 +4,8 @@ Data storages | Zealot - - + +
@@ -13,7 +13,7 @@ for those who are able to manually backup and restore data before better backup management tools are available.

Postgres

This is used to store and manage all data related to Zealot, so it goes without saying.

Redis

Currently only the sidekiq asynchronous task service is using it to store some task status and statistics.

File storage

The Zealot service relies on postgresql, redis and some other disk storage for uploaded application and debug files. It is currently stored in the filesystem in the public/uploads directory.

  • apps The directory for uploading applications
  • debugs_files directory for uploading debug files

Backup storage

The Zealot service currently supports command-generated backup data, which will contain the database and binary packages of the uploaded apps and debug files.

The backup data is currently stored in the file system in the public/backup directory.

- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/apple-team/index.html b/docs/4.x/user-guide/administrator/apple-team/index.html index 56e33a818..dfb328f69 100644 --- a/docs/4.x/user-guide/administrator/apple-team/index.html +++ b/docs/4.x/user-guide/administrator/apple-team/index.html @@ -4,8 +4,8 @@ Apple Team (Developer) | Zealot - - + +
@@ -22,7 +22,7 @@ recognizable and friendly device names.

Register processingRegister processing

Although providing the UDID of a device confirms which applications can be installed, providing a feature to register a testing device that has not been registered with any application would greatly improve the efficiency of the team. This is the role of the Apple Developer feature.

Apple deveoper detail previewApple deveoper detail preview

The initial feature introduction: https://github.com/tryzealot/zealot/issues/723.

- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/backup/index.html b/docs/4.x/user-guide/administrator/backup/index.html index 890baf39f..559afe1d2 100644 --- a/docs/4.x/user-guide/administrator/backup/index.html +++ b/docs/4.x/user-guide/administrator/backup/index.html @@ -4,13 +4,13 @@ Backup Schedule | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html b/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html index 50e5aff38..02a80cdb3 100644 --- a/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html +++ b/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html @@ -4,13 +4,13 @@ Background Jobs | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html b/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html index f2cce7b86..5cbcf3d07 100644 --- a/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html +++ b/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html @@ -4,13 +4,13 @@ Database Analytics | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/monitoring/logging/index.html b/docs/4.x/user-guide/administrator/monitoring/logging/index.html index 5e4aa266d..3ca15d782 100644 --- a/docs/4.x/user-guide/administrator/monitoring/logging/index.html +++ b/docs/4.x/user-guide/administrator/monitoring/logging/index.html @@ -4,13 +4,13 @@ Logging | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/monitoring/system-info/index.html b/docs/4.x/user-guide/administrator/monitoring/system-info/index.html index 824e5c2be..c3ae45cdb 100644 --- a/docs/4.x/user-guide/administrator/monitoring/system-info/index.html +++ b/docs/4.x/user-guide/administrator/monitoring/system-info/index.html @@ -4,13 +4,13 @@ System informations | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/permissions/index.html b/docs/4.x/user-guide/administrator/permissions/index.html index 125f8a28e..540522f25 100644 --- a/docs/4.x/user-guide/administrator/permissions/index.html +++ b/docs/4.x/user-guide/administrator/permissions/index.html @@ -4,13 +4,13 @@ User Permissions and roles | Zealot - - + +
Version: 4.x

User Permissions and roles

Zealot offers four types of user permissions.

  • Guest
  • User
  • Developer
  • Administrator

Comparison

ActionGuest[On/Off]UserDeveloperAdministrator
Dashboard
View all data
✓/✕
App
View app list
✓/✕
App
View app scheme(s) and channel(s) detail
✓/✕
App
View the build(release) of app
✓/✓
Password Auth
App
View webhook list
✓/✕
App
Upload/Install/Download app
App
Create/Edit/Delete an app
App
Create/Edit/Delete a scheme/channel of app
App
Delete a given version of app
App
Test a webhook network connection
App
Enable/Disable webhook
App
Delete an app
DebugFile
View debug file list
✓/✕
DebugFile
View debug file detail
DebugFile
Download debug file
DebugFile
Upload/Delete a debug file
Teardown
View teardown list
✓/✕
Teardown
View teardown detail
✓/✕
Teardown
Delete a teardown
Admin
View and manage users
Admin
View and manage webhooks
Admin
iew and manage apple keys
Admin
View and manage settings
Admin
View system informations
Admin
View and manage background jobs
Admin
View page analytices
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/administrator/project-settings/index.html b/docs/4.x/user-guide/administrator/project-settings/index.html index a745c320a..5fc0ab370 100644 --- a/docs/4.x/user-guide/administrator/project-settings/index.html +++ b/docs/4.x/user-guide/administrator/project-settings/index.html @@ -4,13 +4,13 @@ Project Settings | Zealot - - + +
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/apps/create/index.html b/docs/4.x/user-guide/apps/create/index.html index e83efb204..72271ae7b 100644 --- a/docs/4.x/user-guide/apps/create/index.html +++ b/docs/4.x/user-guide/apps/create/index.html @@ -4,13 +4,13 @@ Create an App | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/best_practices/index.html b/docs/4.x/user-guide/best_practices/index.html index 07258b639..69758a655 100644 --- a/docs/4.x/user-guide/best_practices/index.html +++ b/docs/4.x/user-guide/best_practices/index.html @@ -4,8 +4,8 @@ Best Practices | Zealot - - + +
@@ -13,7 +13,7 @@ it is highly recommended to install the following plug-ins in addition to fastlane.

  • ci_changelog | Support for multiple CI systems to automatically generate change history
  • update_jenkins_build | Automatically Update Jenkins Build Description
  • humanable_build_number | Generate a build version number that is recognizable to development
  • app_info | View metadata about the application after successful packaging
  • ram_disk | Create in-memory virtual disks, mainly used to improve App build speed (consider if memory is large)
  • debug_file | Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files
# Build and upload ipa to zealot service
lane :upload_app do
# Building the package file, using gym in iOS, gradle in Android
gym

# Uploading to Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# Uploading dSYM file to Zealot
zealot_debug_file(
scheme: 'AppName'
)
end

# Build android package file and generate progguard then upload to zealot service
lane :upload_debug_file do
# Building the package file, using gym in iOS, gradle in Android
gradle

# Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files
debug_file

# Uploading to Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# Uploading Proguard file to Zealot
zealot_debug_file(
build_type: 'release',
flavor: 'googleplay'
)
end

CI/CD Service

For example, Jenkins, configure the project, set up the git hook to trigger packaging, nothing to say

Zealot Service

In addition to managing each uploaded application and debug file, each time an uploaded application is received, a configured web hook is triggered to send a notification to the third-party service that a new version has been received, and for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time.

- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/changelog/index.html b/docs/4.x/user-guide/changelog/index.html index 3226104ad..4fb0bfc5f 100644 --- a/docs/4.x/user-guide/changelog/index.html +++ b/docs/4.x/user-guide/changelog/index.html @@ -4,15 +4,15 @@ Change Log | Zealot - - + +
Version: 4.x

Change Log

Unreleased

tip

The following list of changes is the list that has not yet been released, code change history: Unreleased

4.7.1 (2023-03-10)

Support for parsing aab applications generated by the latest Android aapt2 build tool, full commit changes

Fixed

  • Web upgrades to the latest appt2 model to avoid exceptions when parsing aab files.
  • Web implements duplicate processing for parsing exceptions.

Added

  • Web adds application types to the details page of unpacked Android applications.
  • Web adjusts the original page after editing an application channel.

4.7.0 (2023-03-03)

Major Change The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full commit changes

Changed

  • Docker Major Change The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings.

Added

  • Web adds a control switch for "New Upload Version Prompt Window" to application types. #1058 Thanks to softwind0214
  • Web allows clicking on the application icon on the application list page to jump to the application details page.
  • Web adds the display of the version number of dependent services to the environment information.
  • Web adds support for displaying nightly build versions in the version number.

Fixed

  • Web downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See #1070 for details.
  • Web fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time.
  • Web fixes the issue where there is no confirmation prompt when a user logs out.
  • Web fixes the issue where the main historical version of an application cannot be deleted.
  • Web improves the style of multiple pages.
  • Web no longer displays Javascript debugger logs in production environments.

4.6.0 (2023-01-17)

The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full commit changes

Fixed

  • Web captures the issue of creating an application channel with an empty name. #968 Thanks to congpeijun
  • Web improves the logic for backup files that do not exist on disk. #995

Added

  • Docker supports arm64/v8 and armv7 arch. #970
  • Web Adopted a new 50x error page.

Changed

  • Web upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. #1011
  • API updates the data structure of the debug file return and changes the status code from 204 to 200.

4.5.3 (2022-11-22)

Full commit changes

Fixed

  • Web Fixes the issue where third-party login cannot be redirected. #949 Thanks to softwind0214

Added

  • Docker Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). #950

4.5.2 (2022-11-01)

Full commit changes

Fixed

  • Web fixes the issue where registering a test device is abnormal. #935 Thanks to ycy0430
  • Web adapts the QR code to support dark mode.
  • Web corrects the English language pack.

Added

  • WebHook Income webhook body structure adds the username and email fields. #934 Thanks to rkonfj
  • Docker The SIDEKIQ_CONCURRENCY environment variable is now supported to set the concurrency of background tasks, with a default value of 5.

Changed

  • Docker reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on 127.0.0.1.
  • Web optimizes the wording of the iOS device UDID profile.
  • Web updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!

4.5.1 (2022-09-14)

Full commit changes

Fixed

  • Web Fixes the issue where the application unpacking results in parsing errors.

4.5.0 (2022-08-19)

Supports the 🌑 dark mode and managing the test devices of an 👨🏻‍🔧 Apple developer account! Full commit changes

Added

  • Web supports dark mode. #816
  • Web adds Apple developer management for registering test devices. #817
  • Web adds data backup management. #835
  • Web completes the monitoring of dependent services in the management panel. #586
  • API adds three fields, platform, device_type, and custom_fields, to the release dictionary.

Changed

  • Web Incompatible change Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. #815
  • CLI Incompatible change The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead.
  • Web adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions.
  • Web removes the page statistics function in the admin panel. #814
  • Web migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. #829
  • Web due to the complexity of editing application types and channels, only the application name can be modified.

Fixed

  • Web fixes the error of selecting a channel that does not exist under an application type. #795 Thanks to tasselsd
  • API fixes the Android address return error. #813 Thanks to denymz
  • Web/API fixes the exception caused by some parameters being empty in aab parsing. tryzealot/fastlane-plugin-zealot#9 Thanks to tasselsd
  • Web fixes the issue of abnormal generation of demo data during the first initialization of the project. #821
  • API fixes the issue of abnormal data when checking the latest version of the application. #856 Thanks to denymz
  • Web fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel.
  • Web corrects many spelling errors in the English language pack.

4.4.1 (2022-06-20)

Full commit changes

Fixed

  • WebHook fixes the issue where an error is thrown after a successful trigger. #792 Thanks to tasselsd
  • Docker compatible with Caddy 2.5.0 for proxying from https to http. #790 Thanks to VisionBao songge1209

4.4.0 (2022-06-09)

Full commit changes

Changed

  • Web adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details.
  • Web upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0.
  • Web is now compatible with the macOS M1 chip.

Added

  • Web simplifies and standardizes some application links to facilitate sharing. #666
  • Web completes some missing permission check pages.

Fixed

  • Job fixes the issue of abnormal URL Schemes when parsing iOS files.
  • Web fixes the issue where service logs are not output to the terminal console.
  • Web adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons.
  • Web adapts the UI for ultra-wide screens.
  • Web fixes security vulnerabilities in third-party login dependencies.
  • API fixes the issue where uploading Android without channel_key results in an exception. #779 Thanks to likfe

4.3.1 (2021-12-22)

Full commit changes

Added

  • Web after updating the setting, the original default value can be restored.
  • Web supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking.
  • Web strengthens the visual effect of the open and closed status of the setting page.

Fixed

  • Web fixes the issue of asynchronous task methods in demo mode.
  • Web fixes the issue where selected application types and channels cannot be checked when creating and editing an application.
  • Web fixes the issue where it is not possible to navigate to the environment page.
  • Web fixes the issue where aab parsing fails when there are no intent filters.
  • Web adds error handling for unchecking all application types and channels when updating an application.
  • Web fixes the issue where the loading strategy causes all third-party logins to be unavailable.

4.3.0 (2021-12-08)

Supports parsing of the aab format, adds support for multiple languages. Full commit changes

Changed

  • Web uses the default prompt structure as the data structure for network hooks, instead of a strange structure.
  • Web no longer provides parameter changes for third-party login authorization on the settings page (requires service restart).
  • API the upload application interface and version details return the text_changelog field in the response body. 650f1ffd
  • API renames the changelog_list field in the response body to changelog. 719f0b1e
  • Web changes the log output format from an array to text format that is compatible with Markdown lists. 719f0b1e
  • Web some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. #644
  • Web does not display the build date and hash value if they cannot be obtained.

Added

  • Web supports parsing of the Android App Bundle (aab) file format and webp icons.
  • Web supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration).
  • Web supports configuring more system settings. #643
  • Web adds editing functionality for network hooks in the management panel.
  • Web rewrites and optimizes the style layout of the application list.
  • Web optimizes the basic email template.
  • Web adjusts the style and error logic of the login window.
  • Web adds file permission checking to the environment variable page in the management panel. #608
  • Web adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors.
  • Web uses a better log output format. #646

Fixed

  • Web fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page.
  • Web fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing).
  • Web fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page.
  • Web fixes the issue where the domain scope of asynchronous notifications does not take effect.
  • Web fixes the issue of exception when getting gems.
  • Web fixes the issue of abnormal judgment of the expiration time of iOS certificates.
  • Web fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted.
  • Web fixes some known errors in demo mode.

4.2.2 (2021-10-15)

Full commit changes

Fixed

  • API fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. #615 Thanks to gin7758258
  • Web fixes the issue of abnormal parsing of some apk Android files. #587

4.2.1 (2021-09-14)

Full commit changes

Changed

  • Web application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB.
  • Docker the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files.

Fixed

  • Web fixes the issue where icons are not displayed correctly after uploading an application.
  • Web is compatible with different dSYM zip extraction logics when uploading.
  • Web fixes the issue where the application icon is not displayed when installing iOS applications.
  • Web fixes a security vulnerability by disabling the editing of read-only system settings.
  • Web fixes the issue where the downloaded file suffix is not correct on macOS.
  • Web fixes the issue where the window showing that an installation is not possible does not pop up in some cases.

4.2.0 (2021-09-01)

Full commit changes

Changed

  • Web changes the default logic for cleaning up old versions to off. To enable, set the environment variable ZEALOT_KEEP_UPLOADS=false. #570
  • Web renames File Parsing to Application Unpacking. #529
  • Web removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)
  • API supports fontawesome css values for custom field icons when uploading applications, such as the value fas fa-flag for flag.
  • Docker changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see #540 for details.

Added

  • Web supports uploading, parsing, and downloading macOS applications. #562
  • Web adds quick filtering options for application types and channels for mobile devices on the channel details page. #510 Thanks to huacnlee
  • Web allows the administrator panel to configure application type templates and default registration user permissions. #562 #568
  • Web partially encrypts environment variables that involve privacy.
  • Web adds graphical displays for memory and disk usage.
  • Docker adds support for synchronizing updates with Github Container Registry images.
  • Docker adds support for configuring the postgres port number with environment variables.

Fixed

  • Web fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. #519 Thanks to ohdarling
  • Web fixes the issue where using third-party login while registering but not verifying email fails. #517 Thanks to huacnlee
  • Web fixes the issue where uploading an application through the website does not trigger application unpacking.
  • Web fixes the issue where the left navigation style is misaligned when tubrolink is enabled.
  • Web displays the unpacking link when uploading Android applications.
  • Web optimizes the display prompt for empty unpacking file lists.
  • Web fixes the issue where LDAP parameters are obtained incorrectly. #541 Thanks to Martwu
  • Web changes the error message for capturing application upload errors to a readable format.
  • Web fixes the issue where the application type creation error judgment is abnormal.
  • Web adds an exception judgment for clicking the details page when all channels of an application are deleted.
  • Web fixes the issue where uploading applications causes variable release errors in the parsing process.
  • Web fixes the issue where an error occurs when verifying password protection for an application. #564 Thanks to EasierLu
  • Web fixes the issue where editing user information in the administrator panel causes an error. #564 Thanks to EasierLu
  • Web fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).
  • Web optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments.
  • Web fixes the issue where the current user cannot be edited.
  • Web corrects the duplicate title of debug files.
  • Docker fixes the logrotate error during image initialization.
  • Docker fixes the issue where Caddy deployment needs to be confirmed. #551 Thanks to ReverseScale

4.1.0 (2021-07-17)

Full commit changes

Changed

  • Web changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop.
  • Docker sets Gihub Container Registry (gcr.io) as the default Docker image source.

Added

  • Web supports one-click login authentication for third-party platforms such as Feishu and Gitlab.
  • Web optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version.
  • Web adds the ability to view some system configuration items and modify some parameters without requiring a restart.
  • Web adds a page statistics report to the management panel.

Fixed

  • Web fixes the issue where the network hook cannot obtain the value of the title variable.
  • Web fixes the abnormal error during application parsing process.
  • Web fixes the abnormal error that occurs during application creation.
  • Web fixes the issue where system configuration cannot be edited due to being saved as empty.
  • Job fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed.

4.0.0 (2020-12-31)

Full commit changes

Fixed

  • Web corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing.
  • Web ignores the default development version number check for new versions.

4.0.0.rc2 (2020-12-25)

Full commit changes

Added

  • Web newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) #346
  • Web adds file parsing data statistics to the control panel.
  • Web adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel.
  • Web adds a quick delete function for authorized personnel to the prompt for missing files in the version details.

Changed

  • API The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. #349

Fixed

  • Web fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)
  • Web corrects the wording of the prompt when opening the version details in WeChat for Android.

4.0.0.rc1 (2020-10-29)

Full commit changes

Changed

  • Docker major change merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly #235
  • Docker upgrades Ruby to version 2.7 for deployment.
  • Web upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly.
  • Web adjusts the wording of invitation emails.
  • Web unifies the download path for applications and debugging files to /download path.
  • Web requires login permission for online application parsing.
  • Web optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details.
  • Web adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop).

Added

  • Web displays a prompt when downloading files that do not exist.
  • Web supports parsing .mobileprovision format files and enabling the parsing of .ipa files online.
  • Web allows some system settings to be modified online using the administrator panel. #245
  • Web adds guest mode. #243
  • Web supports displaying the names of iOS AdHoc version test devices. #211
  • Web supports parsing the content of uploaded version installation packages. #210
  • Web supports obtaining the UDID of iOS devices. #203
  • Web supports a demo mode with limited functionality and periodic data initialization. #198
  • Web displays the original name of the application in the version details after uploading the App.
  • Web allows filtering of the application list by version, Git branch, and packaging type.
  • Web displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)
  • Web integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies.
  • Job supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) #207
  • API adds an interface to check if the debug file exists /api/debug_files/version_exist.

Fixed

  • Web fixes the error when parsing changelog during App upload.
  • Web fixes the issue where the QR code in the version details will exceed the parent view in medium resolution.
  • Web fixes the issue where some values of the application channel are empty and the default value is not displayed.
  • Web optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)
  • Web fixes the issue where the information of the submitter is not displayed for changelogs generated using fastlane-plugin-ci_changelog in the version details.
  • Web fixes and optimizes the logic for checking new versions.
  • Web fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message.
  • Web optimizes the display of the device list in the version details on some mobile phones.
  • Web fixes the error when parsing applications without submitting parameters.
  • Web optimizes the display of the version list on mobile phones.
  • Web only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions.
  • Web fixes the issue where the administrator editing user prompt for a non-empty password.
  • Web/API fixes the issue where the latest version is used when the requested version for online download and installation does not exist.
  • Web fixes the issue where the login interface displays the sidebar menu in guest mode.
  • Web fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded.
  • Web optimizes the display of boolean and dictionary types on the system settings page.
  • Job fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning.
  • Docker fixes the issue where the internal static resources are not updated due to volume storage of the public folder.
  • Docker fixes the issue where the container version is inconsistent with the external version.

4.0.0.beta4 (2020-05-07)

Full commit changes

Added

  • Docker supports deployment on Heroku.
  • Web allows guests to view App details, lists, and upload App details.
  • API supports custom fields when uploading an App. #178
  • Web/API automatically removes the origin/ prefix when passing the branch value during App upload.
  • Web adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting.

Fixed

  • Web corrects user password description text.
  • Web fixes the URL field error in the WebHook.
  • Web/API fixes the error when uploading iOS dSYM files.
  • API fixes the abnormal has_password parameter in the App interface.
  • API fixes the source of uploaded App records always showing as Web.
  • API fixes and supports uploading changelog in JSON format as a string.
  • Web fixes the issue where CPU and memory information cannot be retrieved from system information.
  • Web fixes the occasional error when parsing Android applications online.
  • Web fixes the error when scanning QR code with WeChat.

Changed

  • API adds validation for bundle_id dimension to the latest version interface. (apps/latest)
  • Web allows guests to access application version details and download operations.
  • Web shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default.
  • Web removes the GraphQL console functionality from the development environment and recommends using graphql-playground.
  • Web removes the footbar at the bottom of the page, and the version information can be viewed in the system information.

4.0.0.beta3 (2020-01-16)

Full commit changes

Added

  • Web prompts and displays a confirmation email link for users added by administrators if their email is not activated.
  • Web enables the default Sentry anonymous reporting mechanism (can be turned off).

Fixed

  • API fixes the issue where uploading an application always creates a new channel.
  • Web/API fixes the issue where the icon of uploaded Android applications cannot be displayed.

Changed

  • Docker moves the initialization data out of the image and into zealot-docker image. #120
  • Docker reduces the size of the image from 1.18G to 308M. #114
  • Job uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)
  • Job groups asynchronous tasks and sets priority.
  • API displays all error messages in Chinese because database write operations return specific error messages.
  • Web standardizes code using Rubocop Lint rules.

4.0.0.beta2 (2020-01-10)

Full commit changes

Added

  • Web Added the ability to upload a complete version list to a specific application channel, and support deleting operations.

Fixed

  • Web provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk.
  • API fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database.
  • API only requires token verification for interfaces that perform write operations (previously most interfaces required it).

4.0.0.beta1

🌈 The first public beta version has been released!

Earlier Version:

For many years, it was developed and operated internally within the company and was not open source. It used to undertake many functions, but now it has been separated to focus on providing application hosting and distribution services

- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/credits/index.html b/docs/4.x/user-guide/credits/index.html index 7d9b43076..48c4c3c13 100644 --- a/docs/4.x/user-guide/credits/index.html +++ b/docs/4.x/user-guide/credits/index.html @@ -4,15 +4,15 @@ Credits | Zealot - - + +
Version: 4.x

Credits

Contributions

Thank you for making Zealot more useful!

Project name

Zealot from the Starcraft species Gods base soldier.

Project history submission resources may be used to for the icon copyright belongs to Blizzard, later changed to their own design icons, if there are enthusiastic designers can help design better icons, I represent this project to express my sincere gratitude.

License

Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at LICENSE file

- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/dashboard/index.html b/docs/4.x/user-guide/dashboard/index.html index e69b5f28e..2d5ee8b6e 100644 --- a/docs/4.x/user-guide/dashboard/index.html +++ b/docs/4.x/user-guide/dashboard/index.html @@ -4,13 +4,13 @@ Dashboard | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/debug-files/upload/index.html b/docs/4.x/user-guide/debug-files/upload/index.html index fd0c853b2..b1280b145 100644 --- a/docs/4.x/user-guide/debug-files/upload/index.html +++ b/docs/4.x/user-guide/debug-files/upload/index.html @@ -4,13 +4,13 @@ Create a Debug File | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/index.html b/docs/4.x/user-guide/index.html index bdd1bcafe..6f159f372 100644 --- a/docs/4.x/user-guide/index.html +++ b/docs/4.x/user-guide/index.html @@ -4,8 +4,8 @@ User Guide | Zealot - - + +
@@ -14,7 +14,7 @@ Chat on Telegram Maintainability License

Self-hosted Beta App Distribution for Android, iOS and macOS apps.

Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.

PreviewPreview

Features

  • 🌏 Cross platform of app: macOS, iOS, even APK and AAB of Android upload, install(include Arm based macOS) and download support.
  • 🗄 Multiple category: Orgainze by any category, like Debug, AdHoc, Enterprise or channels of Android.
  • 📱 iOS device in control: Automate synchronized iOS device information, register device to Apple Developer.
  • 🧑‍💻 Full developer toolkit: REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDK and [fastlane][fastlane-plugin-zealot] plugin support.
  • 💥 Teardown app inside: Parse iOS, Android or iOS profile metadata.
  • 🚨 Notification support: Build data strucite with Income WebHook.
  • 🎳 Multiple Architectures: amd86, arm64 and armv7 deploy ready.
  • 🔑 The third-party OAuth: Google, Gitlab, Feishu and LDAP support.
  • 🌑 Dark mode: Switch theme from light to dark.

Demo

Simplified Chinese by default, change the language in Settings page.

Notification: There is instability run on a free resource cloud service and RESET ALL DATA daily.

About the translation

The translation powered by DeepL and it inevitably have some defects, please provide feedback in time, thanks!

- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/qa/index.html b/docs/4.x/user-guide/qa/index.html index 4e1623b3b..81183ee65 100644 --- a/docs/4.x/user-guide/qa/index.html +++ b/docs/4.x/user-guide/qa/index.html @@ -4,13 +4,13 @@ Q&A | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/toolkits/fetch-udid/index.html b/docs/4.x/user-guide/toolkits/fetch-udid/index.html index addfc6b8e..9945cde5c 100644 --- a/docs/4.x/user-guide/toolkits/fetch-udid/index.html +++ b/docs/4.x/user-guide/toolkits/fetch-udid/index.html @@ -4,13 +4,13 @@ Find iOS Device UDID | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/toolkits/teardown/index.html b/docs/4.x/user-guide/toolkits/teardown/index.html index 6b005e04b..6f9421ba9 100644 --- a/docs/4.x/user-guide/toolkits/teardown/index.html +++ b/docs/4.x/user-guide/toolkits/teardown/index.html @@ -4,13 +4,13 @@ Teardown App view itself metadata | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/webhooks/dingtalk/index.html b/docs/4.x/user-guide/webhooks/dingtalk/index.html index a9a0a249b..6ad0fd230 100644 --- a/docs/4.x/user-guide/webhooks/dingtalk/index.html +++ b/docs/4.x/user-guide/webhooks/dingtalk/index.html @@ -4,14 +4,14 @@ Dingtalk (Dingding) | Zealot - - + +
Version: 4.x

Dingtalk (Dingding)

钉钉 use Incoming Webhooks whose constructs typically support both text and markdown, and can be configured as follows:

Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.

Text format

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Markdown format

The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog.

{
"msgtype": "markdown",
"markdown": {
"title": @title,
"text": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/webhooks/discord/index.html b/docs/4.x/user-guide/webhooks/discord/index.html index e2ebd677f..81c89fa20 100644 --- a/docs/4.x/user-guide/webhooks/discord/index.html +++ b/docs/4.x/user-guide/webhooks/discord/index.html @@ -4,14 +4,14 @@ Discord | Zealot - - + +
Version: 4.x

Discord

Discord should use Slack-Compatible Webhook whose constructs typically support both text and block rich text, and can be configured as follows:

Text format

{
"text": "##{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}"
}

Block rich text format

A simple block with markdown support

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}\nInstal QRcode:\n![qrcode](#{@qrcode_url})"
}
}
]
}

Better look at some of the structures shown in the block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Platform:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*Upload at:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/webhooks/feishu/index.html b/docs/4.x/user-guide/webhooks/feishu/index.html index 973f12e7b..ac5cb26bb 100644 --- a/docs/4.x/user-guide/webhooks/feishu/index.html +++ b/docs/4.x/user-guide/webhooks/feishu/index.html @@ -4,14 +4,14 @@ Lark (Feishu) | Zealot - - + +
Version: 4.x

Lark (Feishu)

飞书 use Incoming Webhooks whose constructs typically support both text and interactive card, and can be configured as follows:

Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.

Text format

{
"msg_type": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Interactive card format

Use card format could use partly of markdown syntax:

{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"elements": [
{
"tag": "div",
"text": {
"content": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})",
"tag": "lark_md"
}
},
{
"actions": [{
"tag": "button",
"text": {
"content": "Install",
"tag": "lark_md"
},
"url": @install_url,
"type": "default",
"value": {}
}],
"tag": "action"
}
]
}
}
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/webhooks/index.html b/docs/4.x/user-guide/webhooks/index.html index 65565a075..149dccf50 100644 --- a/docs/4.x/user-guide/webhooks/index.html +++ b/docs/4.x/user-guide/webhooks/index.html @@ -4,8 +4,8 @@ Webhooks | Zealot - - + +
@@ -13,7 +13,7 @@ The webhook is a fully customizable structure that can be used for most notification services, such as Wecom, Dingtalk, Slack, etc.

Payload (default)

Each parameter of the default structure has its value provided as a variable, and each variable starts with @, the default structure will be used if the custom structure is left empty when creating the webhook. The following variables are all provided.

{
event: @event,
title: @title,
app_name: @name,
device_type: @device_type,
release_version: @release_version,
build_version: @build_version,
size: @file_size,
changelog: @changelog,
install_url: @install_url,
icon_url: @icon_url,
qrcode_url: @qrcode_url,
uploaded_at: @uploaded_at
}

Output:

{
"event": "upload_events",
"title": "Zealot upload 1.0.0 version",
"app_name": "Zealot",
"device_type": "iOS",
"release_version": "1.0.0",
"build_version": "1",
"size": "30 MB",
"install_url": "https://zealot.test/api/apps/download/12354",
"icon_url": "https://zealot.test/api/apps/icon.png",
"qrcode_url": "https://zealot.test/api/apps/354/qrcode",
"uploaded_at": "2019-12-30 11:33:00",
"changelog": "- Add feture A\n- Fix issue B\n- Release v1.0.0",
}
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/webhooks/slack/index.html b/docs/4.x/user-guide/webhooks/slack/index.html index 4b1151dfd..f6bd6ea57 100644 --- a/docs/4.x/user-guide/webhooks/slack/index.html +++ b/docs/4.x/user-guide/webhooks/slack/index.html @@ -4,14 +4,14 @@ Slack | Zealot - - + +
Version: 4.x

Slack

Slack use Incoming Webhooks whose constructs typically support both text and block rich text, and can be configured as follows:

Text format

{
"text": "#{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}"
}

Block rich text format

A simple block with markdown support

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}\nInstal QRcode:\n![qrcode](#{@qrcode_url})"
}
}
]
}

Better look at some of the structures shown in the block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Platform:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*Upload at:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/docs/4.x/user-guide/webhooks/wecom/index.html b/docs/4.x/user-guide/webhooks/wecom/index.html index 6f6091926..bf75c32b8 100644 --- a/docs/4.x/user-guide/webhooks/wecom/index.html +++ b/docs/4.x/user-guide/webhooks/wecom/index.html @@ -4,14 +4,14 @@ Wecom (Wechat Work) | Zealot - - + +
Version: 4.x

Wecom (Wechat Work)

企业微信 use Incoming Webhooks whose constructs typically support both text and markdown, and can be configured as follows:

Text format

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\nInstall url:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Markdown format

{
"msgtype": "markdown",
"markdown": {
"content": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/docs/category/administrator/index.html b/docs/category/administrator/index.html index e8de461db..d512d7eb4 100644 --- a/docs/category/administrator/index.html +++ b/docs/category/administrator/index.html @@ -4,13 +4,13 @@ Administrator | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/apps/index.html b/docs/category/apps/index.html index 59efdce3c..2a164b9b0 100644 --- a/docs/category/apps/index.html +++ b/docs/category/apps/index.html @@ -4,13 +4,13 @@ Apps | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/cloud-provider-guides/index.html b/docs/category/cloud-provider-guides/index.html index ad37af8dc..d39239634 100644 --- a/docs/category/cloud-provider-guides/index.html +++ b/docs/category/cloud-provider-guides/index.html @@ -4,13 +4,13 @@ Cloud Provider Guides | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/configuration/index.html b/docs/category/configuration/index.html index 63f2121aa..e9eb03c11 100644 --- a/docs/category/configuration/index.html +++ b/docs/category/configuration/index.html @@ -4,13 +4,13 @@ Configuration | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/debug-files/index.html b/docs/category/debug-files/index.html index e48ab6d33..6aec17af9 100644 --- a/docs/category/debug-files/index.html +++ b/docs/category/debug-files/index.html @@ -4,13 +4,13 @@ Debug Files | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/deployment/index.html b/docs/category/deployment/index.html index b23847755..0af528fcb 100644 --- a/docs/category/deployment/index.html +++ b/docs/category/deployment/index.html @@ -4,13 +4,13 @@ Deployment | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/local-development/index.html b/docs/category/local-development/index.html index 2a8fff950..4c1fa7205 100644 --- a/docs/category/local-development/index.html +++ b/docs/category/local-development/index.html @@ -4,13 +4,13 @@ Local development | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/monitoring/index.html b/docs/category/monitoring/index.html index 5b7059374..695697eaa 100644 --- a/docs/category/monitoring/index.html +++ b/docs/category/monitoring/index.html @@ -4,13 +4,13 @@ Monitoring | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/sdks/index.html b/docs/category/sdks/index.html index 115b9c940..4617d0195 100644 --- a/docs/category/sdks/index.html +++ b/docs/category/sdks/index.html @@ -4,13 +4,13 @@ SDKs | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/category/toolkits/index.html b/docs/category/toolkits/index.html index e2de60cef..f39c1f39d 100644 --- a/docs/category/toolkits/index.html +++ b/docs/category/toolkits/index.html @@ -4,13 +4,13 @@ Toolkits | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/contributing-guide/index.html b/docs/contributing-guide/index.html index 0f27e7271..1b1bb83d4 100644 --- a/docs/contributing-guide/index.html +++ b/docs/contributing-guide/index.html @@ -4,8 +4,8 @@ Contributing Guide | Zealot - - + +
@@ -16,7 +16,7 @@ This helps in shorter turn around times in merging PRs For new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful. Feel free to join our discord community, if you need further discussions with the core team.

Setup for local development

These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use.

- - + + \ No newline at end of file diff --git a/docs/contributing-guide/local-development/devcontainer/index.html b/docs/contributing-guide/local-development/devcontainer/index.html index c447827f2..1236dd477 100644 --- a/docs/contributing-guide/local-development/devcontainer/index.html +++ b/docs/contributing-guide/local-development/devcontainer/index.html @@ -4,13 +4,13 @@ Visual Studio Code Dev Container Setup | Zealot - - + +
Version: 5.0.0

Visual Studio Code Dev Container Setup

The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.

VSCode devcontainer

System requirements

Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose.

Install Git

Install it from offical website.

Install Docker & docker-compose

Install Visual Studio Code

Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems.

Follow the platform-specific guides below:

  1. Download Visual Studio Code for macOS.
  2. Open the browser's download list and locate the downloaded app or archive.
  3. If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari.
  4. Drag Visual Studio Code.app to the Applications folder, making it available in the macOS Launchpad.
  5. Open VS Code from the Applications folder, by double clicking the icon.

Install Remote container extension

Install the Remote Container extension.

VSCode extension

Fetch Zealot Codesoace

Zealot Codespace was in the .devcontailer folder of Zealot project, so you need clone the source code.

git clone https://github.com/tryzealot/zealot.git

Explan these files in Codespace:

FileDescription
devcontainer.jsonVSCode devcontainer config
Dockerfile.baseBase Dockerfile, auto push multi registry servers after changes
DockerfileSpeed up build time, depends on above image.
docker-compose.ymlAll services of Zealot
create-db-user.sqlCreate user and role for Zealot

Open the project in a container

Start Visual Studio Code, run the Dev Containers: Open Folder in Container... command in Command Palette and select the Zealot folder.

VSCode Command Palette

Click the Starting Dev Container (show log) to review zealot codespace build real time logging messages.

VSCode Command Palette

When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:

[7293 ms] Start: Run in container: cat /proc/344/environ
[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.
[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e
[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established
[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close
[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.
[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close

In host Docker containers:

Docker-Compose containers

Start the project

Press Ctrl + ` to open the integrated terminal in Visual Studio Code if it isn't already open. then run bin/dev to run all services.

Notice that the terminal prompt might look different than your normal terminal prompt.

VSCode Zealot in Container

Open in browser

A while after run bin/dev, select Ports to see all forwarded ports, Open in Browser in quick way.

VSCode forwarded ports

- - + + \ No newline at end of file diff --git a/docs/contributing-guide/local-development/source-code/index.html b/docs/contributing-guide/local-development/source-code/index.html index 67676591b..c1df3960b 100644 --- a/docs/contributing-guide/local-development/source-code/index.html +++ b/docs/contributing-guide/local-development/source-code/index.html @@ -4,13 +4,13 @@ Source code | Zealot - - + +
Version: 5.0.0

Source code

The following is a tutorial on local deployment development for different operating systems.

Prepare dependencies

macOS

Install homebrew

First you need to install Xcode Command tools:

$ xcode-select --install

Then install Homebrew, the package management tool for macOS

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Install dependencies

$ brew install redis postgresql webp imagemagick node git

Setup Database and cache services

Run postgresql and redis services

$ brew services start postgresql
$ brew services start redis

You also need to create a default username in Postgresql:

$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

yarn

$ npm install -g yarn

Debian (Ubuntu)

System dependencies

$ apt update
$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev

Install dependencies

$ apt install -y redis postgresql-client node

Setup Database and cache services

Run postgresql and redis services

$ systemctl postgres start
$ systemctl redis start

You also need to create a default username in Postgresql:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

node

$ npm install -g yarn

Alpine Linux

System dependencies

$ apk --update --no-cache add build-base libxml2 libxslt git \
libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \
tzdata

Needs install gcompat if use arm architecture. or an exception will throws such like "Error loading shared library".

Install dependencies

$ apk --update --no-cache redis postgresql

Setup Database and cache services

Run postgresql and redis services

$ rc-service postgres start
$ rc-service redis start

You also need to create a default username in Postgresql:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

Install Ruby

Can be installed by either asdf, rvm as ruby version manager.

Following the offical install guide then:

# Enable Ruby 3.2.0 YJIT need install rust 1.58+
# Optinal install:
asdf plugin add rust
asdf install rust latest
asdf global rust latest
export RUBY_CONFIGURE_OPTS=--enable-yjit

# Required:
asdf plugin add ruby
asdf install ruby 3.2.0
asdf global ruby 3.2.0

Fetch source code

git clone https://github.com/tryzealot/zealot.git

Initialize Zealot

All the following steps need to be performed in the zealot root directory.

bundler

Install Ruby gems

$ [sudo] gem install bundler
$ bundle install

yarn

Install javascript packages:

$ yarn install

Initialize database

Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:

$ rails db:create
$ rails db:migrate

Configuring the connection database can be done via environment variables or by changing the config/database.yml file.

Initialize default account and demo data

Initialize administrator account and sample application

$ rails db:seed

Launch services

$ bin/dev

Open brower http://localhost:3000

- - + + \ No newline at end of file diff --git a/docs/developer-guide/api/apps/index.html b/docs/developer-guide/api/apps/index.html index 029a01fdb..d97abab02 100644 --- a/docs/developer-guide/api/apps/index.html +++ b/docs/developer-guide/api/apps/index.html @@ -4,13 +4,13 @@ App APIs | Zealot - - + +
Version: 5.0.0

App APIs

Upload an app

This allows you to upload an single iOS, Android or macOS file.

POST /api/apps/upload

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
fileFiletruean App file
channel_keyStringfalseChannel key
Create a new App if leave it empty
nameStringfalsethe name of App
Use app name from parsed metadata in given file if leave it empty
release_typeStringfalseEg, debug, beta, adhoc, release, enterprise 等
sourceStringfalsethe source of upload (default is api)
changelogStringfalseChangelog
Avaiables in plain text or JSON formatted struct
branchStringfalsea branch name from git
git_commitStringfalsegit commit
ci_urlStringfalsethe build url of a C
custom_fieldsStringfalseJSON formatted custom fileds
It could configures and display title,
value and icon from fontawesome in a Release page from an App

For changelog attribute which it accepts both plain text and JSON formatted contents:

plain text:

message 1\nmessage 2

JSON:

[
{
"message": "message 1",
"author": "admin",
"email": "admin@zealot.com",
"date": "2021-11-11 11:11:11"
},
{
"message": "message 1",
"author": "developer",
"email": "developer@zealot.com",
"date": "2021-11-11 11:11:11"
}
]

For custom_fields attribute which it use JSON formatted struct to build from each key-value. for example, Display country name like country=China with icon flag:

curl -X POST \
'https://YOUR_ZEALOT_URL/api/apps/upload' \
--form 'token="token"' \
--form 'channel_key="channel_key"' \
+ --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \
--form 'file=@/path/to/your/app'

Return body

{
"id": 50,
"version": 7,
"app_name": "Test Android",
"bundle_id": "com.test.app",
"release_version": "1.0",
"build_version": "1",
"source": "SOURCE",
"branch": "master",
"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",
"ci_url": "",
"size": 1565486,
"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",
"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",
"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",
"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",
"changelog": [
{
"message": "Changelog message 1"
},
{
"message": "Changelog message 2"
}
],
"text_changelog": "- Changelog message 1\n- Changelog message 2",
"custom_fields": [],
"created_at": "2021-09-01T11:43:33.977+08:00",
"app": {
"id": 1,
"name": "App name"
},
"scheme": {
"id": 8,
"name": "Test"
},
"channel": {
"slug": "1XmpC",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
}

List apps

Get a list of app.

This function takes pagination parameters page and per_page to restrict the list of app.

GET /api/apps

Parameters

AttributeTypeRequiredDescription
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

[
{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 1,
"name": "Adhoc",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
},
{
"id": 2,
"name": "内测版",
"channels": [
{
"slug": "l19Tl",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "8selv",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}
]

Get an app

Allows you to receive information about an app like name, scheme, channel.

GET /api/apps/:id

Parameters

AttributeTypeRequiredDescription
idStringtrueID

Return body

{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 5,
"name": "Test App",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}

Get versions list of app

Get a list of apps by the given channel key

GET /api/apps/versions

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

{
"app_name": "Zealot iOS",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "AdHoc"
},
"releases": [
{
"version": 2,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10292024",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
{
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
]
}

Get the latest version of app

Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url.

GET /api/apps/latest

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
release_versionStringtrueRelease version
build_versionStringtrueBuild version

Return body

{
"app_name": "Zealot iOS",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "AdHoc"
},
"releases": {
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}
}

Check version exists

Allows you to check the Release exists by given query, query accepts two combo group:

  • bundle_id, release_version and build_verion
  • bundle_id and git_commit
GET /api/apps/version_exist

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
bundle_idStringtruebundle_id or package_name
release_versionStringfalseRelease version
build_versionStringfalseBuild version
git_commitStringfalsegit commit hash

Return body

  • Return 200 if release existed.
  • Return 404 if release not existed.

Success returns:

{
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "4.1.1",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}

Not found returns:

{
"error": "Not found release"
}
- - + + \ No newline at end of file diff --git a/docs/developer-guide/api/debug_files/index.html b/docs/developer-guide/api/debug_files/index.html index 56421748a..f3a0bdfa5 100644 --- a/docs/developer-guide/api/debug_files/index.html +++ b/docs/developer-guide/api/debug_files/index.html @@ -4,13 +4,13 @@ Debug File APIs | Zealot - - + +
Version: 5.0.0

Debug File APIs

Upload debug file

This allows you to upload an single iOS, Android debug file.

Debug file accepts:

  • iOS: a Zipped dSYM file
  • Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files.
POST /api/debug_files/upload

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
fileFiletrueArichved file by zip
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringtrueBuild version, ignore this param if iOS app

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Download debug file

This allows you to download an single iOS, Android debug file.

POST /api/debug_files/download

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringfalseBuild version, ignore this param if iOS app
orderStringfalseOrder by
version = latest version, upload_date = last uploaded date
Vaild in release_version is latest

Return body

  • Retun 200 status code if the version exists and redirect to the download address with a 302 status code.
  • return 404 status code if the version does not exist.

List debug files

Get a list of debug files.

This function takes pagination parameters page and per_page to restrict the list of debug files.

GET /api/debug_files

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

[
{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}
]

Get a debug file

Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only).

GET /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Update a existed debug file

This allows you to update a debug file.

PUT /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID
fileFiletruea Zipped debug file
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringtrueBuild version, ignore this param if iOS app

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Delete a debug file

This allows you to delete a debug file.

DELETE /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID

Return body

{
"mesage": "OK"
}
- - + + \ No newline at end of file diff --git a/docs/developer-guide/api/index.html b/docs/developer-guide/api/index.html index b87ae83bf..a18946357 100644 --- a/docs/developer-guide/api/index.html +++ b/docs/developer-guide/api/index.html @@ -4,14 +4,14 @@ APIs | Zealot - - + +
Version: 5.0.0

APIs

Use the Zealot APIs to view, upload, download the build of app or debug file.

Authentication

Requests currently only support query authentication for User Token, found in API - Key at the bottom of the login user details page.

example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN

Version

The current version is v1, the APIs does not need to explicitly pass the version parameter, and the GraphGL interface is being developed gradually.

Apps

ResourceAvailable endpoints
Upload an App/api/apps/upload
List Apps/api/apps
Get an App by id/api/apps/:id
List verions from an App/api/apps/versions
Get the latest Release from an App/api/apps/latest
Check an Release from App exists/api/apps/version_exist

Full APIs to check api/apps page.

Debug files

ResourceAvailable endpoints
Upload a debug file/api/debug_files/upload
Download a debug file by id/api/debug_files/download
List Debug files/api/debug_files
Get an debug file by id/api/debug_files/:id
Check a debug file exists by id/api/debug_files/version_exist
Update a debug file by id/api/debug_files/:id
Delete a debug file by id/api/debug_files/:id

Full APIs to check api/debug_files page.

- - + + \ No newline at end of file diff --git a/docs/developer-guide/fastlane/index.html b/docs/developer-guide/fastlane/index.html index e9e663684..e6298e45f 100644 --- a/docs/developer-guide/fastlane/index.html +++ b/docs/developer-guide/fastlane/index.html @@ -4,8 +4,8 @@ Fastlane plugins | Zealot - - + +
@@ -13,7 +13,7 @@ fastlane lets you automate every aspect of your development and release workflow, customize your deployment workflows using the hundreds of community built fastlane actions and plugins.

fastlane-plugin-zealot provides upload app, debug_file and version check actions to Zealot, install it in shell:

$ fastlane add_plugin zealot

More usefully plugins

In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:

PluginDescription
fastlane-plugin-ci_changelogAutomate generate changelog between previous and the latest commit of SCM during the CI services.
fastlane-plugin-update_jenkins_buildUpdate build's description of jenkins.
fastlane-plugin-humanable_build_numberAutomatic generate app build number unque and human readable friendly
fastlane-plugin-app_infoTeardown tool for mobile app(ipa, apk and aab file), analysis metedata like version, name, icon etc.
fastlane-plugin-android_channelsPackage unsign apk with channels and write empty file to META-INF with channel in general way
fastlane-plugin-ram_diskUse a virtual ram disk to do anything else
- - + + \ No newline at end of file diff --git a/docs/developer-guide/fastlane/zealot/index.html b/docs/developer-guide/fastlane/zealot/index.html index e945c2640..428cfb558 100644 --- a/docs/developer-guide/fastlane/zealot/index.html +++ b/docs/developer-guide/fastlane/zealot/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot | Zealot - - + +
Version: 5.0.0

Fastlane action: zealot

Uploading iOS, Android and macOS app, it requires three params:

zealot(
endpoint: 'https://zealot.com',
token: '...',
channel_key: '...',
)

Parameters

+-----------------+---------------------------------+------------------------+----------+
| zealot Options |
+-----------------+---------------------------------+------------------------+----------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+----------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| file | The path of app file. Optional | ZEALOT_FILE | |
| | if you use the `gym`, `ipa`, | | |
| | `xcodebuild` or `gradle` | | |
| | action. | | |
| name | The name of app to display on | ZEALOT_NAME | |
| | zealot | | |
| changelog | The changelog of app | ZEALOT_CHANGELOG | |
| slug | The slug of app | ZEALOT_SLUG | |
| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |
| branch | The name of git branch | ZEALOT_BRANCH | |
| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |
| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |
| | fields | | |
| password | The password of app to download | ZEALOT_PASSWORD | |
| source | The name of upload source | ZEALOT_SOURCE | fastlane |
| ci_url | The name of upload source | ZEALOT_CI_CURL | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |
| | keep secret | | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure | | |
+-----------------+---------------------------------+------------------------+----------+
* = default value is dependent on the user's system

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+

Output Variables

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+
Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
- - + + \ No newline at end of file diff --git a/docs/developer-guide/fastlane/zealot_debug_file/index.html b/docs/developer-guide/fastlane/zealot_debug_file/index.html index 9ee01d59f..47d2436a7 100644 --- a/docs/developer-guide/fastlane/zealot_debug_file/index.html +++ b/docs/developer-guide/fastlane/zealot_debug_file/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_debug_file | Zealot - - + +
Version: 5.0.0

Fastlane action: zealot_debug_file

Upload iOS dSYM or Android Proguard file(s) to Zealot

  # Upload iOS dSYM file
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :ios,
xcode_scheme: 'AppName',
verify_ssl: false
)

# Upload Android Proguard files
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :android,
android_build_type: 'release',
android_flavor: 'store',
release_version: '1.1.0',
build_version: '1',
overwrite: true
)

# Upload given zip file
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
zip_file: 'path/to/your/zip_file',
release_version: '1.1.0',
build_version: '1',
verify_ssl: false
)

Parameters

+--------------------+-----------------------------------+---------------------------+---------+
| zealot_debug_file Options |
+--------------------+-----------------------------------+---------------------------+---------+
| Key | Description | Env Var | Default |
+--------------------+-----------------------------------+---------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |
| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |
| | to direct upload | | |
| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |
| | value are | | |
| | ios,mac,macos,osx,android | | |
| path | The path of debug file | ZEALOT_PATH | |
| | (iOS/macOS is archive path for | | |
| | Xcode, Android is path for app | | |
| | project) | | |
| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |
| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |
| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |
| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |
| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |
| | dSYM file | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| | (Android needs) | | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| | (Android needs) | | |
| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |
| | if it existed | | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+--------------------+-----------------------------------+---------------------------+---------+
* = default value is dependent on the user's system

+-----------------------+-----------------------------------------+
| zealot_debug_file Output Variables |
+-----------------------+-----------------------------------------+
| Key | Description |
+-----------------------+-----------------------------------------+
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+-----------------------------------------+
- - + + \ No newline at end of file diff --git a/docs/developer-guide/fastlane/zealot_sync_devices/index.html b/docs/developer-guide/fastlane/zealot_sync_devices/index.html index 0ae893899..eec54a4bd 100644 --- a/docs/developer-guide/fastlane/zealot_sync_devices/index.html +++ b/docs/developer-guide/fastlane/zealot_sync_devices/index.html @@ -4,14 +4,14 @@ Fastlane action: zealot_sync_devices | Zealot - - + +
Version: 5.0.0

Fastlane action: zealot_sync_devices

🔔 Zealot 4.5.0 built in Apple team manage which it use Apple API Key to sync iOS devices, even CAN registe the device after fetch the UDID, Check detail

Use Apple Developer account to syncing UDIDs and relates the value in Zealot.

# With Apple API Key
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
api_key_path: '/path/to/your/api_key_json_file',
team_id: '...'
)

# With password (Two-factor Authentication required)
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
username: 'user@example.com',
team_id: '...'
)

Parameters

+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| zealot_sync_devices Options |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| Key | Description | Env Var(s) | Default |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |
| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -json-file) | | |
| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -hash-option) | | |
| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |
| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |
| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |
| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/docs/developer-guide/fastlane/zealot_version_check/index.html b/docs/developer-guide/fastlane/zealot_version_check/index.html index 6a088b38a..901372027 100644 --- a/docs/developer-guide/fastlane/zealot_version_check/index.html +++ b/docs/developer-guide/fastlane/zealot_version_check/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_version_check | Zealot - - + +
Version: 5.0.0

Fastlane action: zealot_version_check

Check given build exists or not on Zealot

zealot_version_check(
endpoint: 'https://zealot.com',
token: '...',
bundle_id: 'com.example.app.name',
release_version: '1.0.0',
build_version: '1'
)

Parameters

+-----------------+---------------------------------+------------------------+---------+
| zealot_version_check Options |
+-----------------+---------------------------------+------------------------+---------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |
| | app | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+-----------------+---------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/docs/developer-guide/index.html b/docs/developer-guide/index.html index 03d94e67d..6dea6029e 100644 --- a/docs/developer-guide/index.html +++ b/docs/developer-guide/index.html @@ -4,13 +4,13 @@ Developer Guide | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/developer-guide/sdk/android/index.html b/docs/developer-guide/sdk/android/index.html index f1e93dc45..8ba786db1 100644 --- a/docs/developer-guide/sdk/android/index.html +++ b/docs/developer-guide/sdk/android/index.html @@ -4,13 +4,13 @@ Zealot Android SDK | Zealot - - + +
Version: 5.0.0

Zealot Android SDK

The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.

Install

JitPack

Using jitpack to install:

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

In build.gradle file of main app project add:

dependencies {
implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'
}

Permission

Zealot needs internet permission

<uses-permission android:name="android.permission.INTERNET" />

Usages

Add the start code to the onCreate method block of your Application file:

// Single channel
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("...")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()

// Multi-channel, such as beta, adhoc versions
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("xxxxxxx", "beta")
.setCHannelKey("yyyyyyy", "test")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()
- - + + \ No newline at end of file diff --git a/docs/developer-guide/sdk/ios/index.html b/docs/developer-guide/sdk/ios/index.html index df33e4550..96d3f178e 100644 --- a/docs/developer-guide/sdk/ios/index.html +++ b/docs/developer-guide/sdk/ios/index.html @@ -4,14 +4,14 @@ Zealot iOS SDK | Zealot - - + +
Version: 5.0.0

Zealot iOS SDK

The iOS component provides a service to check for new versions and installations for Zealot, supporting Swift and Objective-C.

Install

Cocoapods

Adding below code into Podfile:

pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'

Install it:

pod install

Usages

Import header

  1. Add the code in your AppDelegate
import Zealot

Configure

  1. Add the following code in application:didFinishLaunchingWithOptions: method block:
// Single channel
let zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")
zealot.checkVersion()

// Multi-channel, such as beta, adhoc versions
let zealot = Zealot(endpoint: "http://zealot.com",
channelKeys: [
"beta": "xxxxxxx",
"test": "yyyyyyy"],
default_enviroment: "beta")

// Active it
zealot.checkVersion()
- - + + \ No newline at end of file diff --git a/docs/next/category/administrator/index.html b/docs/next/category/administrator/index.html index 7d06f0161..d8653ef8f 100644 --- a/docs/next/category/administrator/index.html +++ b/docs/next/category/administrator/index.html @@ -4,13 +4,13 @@ Administrator | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/apps/index.html b/docs/next/category/apps/index.html index 7f57757d7..f8157bd15 100644 --- a/docs/next/category/apps/index.html +++ b/docs/next/category/apps/index.html @@ -4,13 +4,13 @@ Apps | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/cloud-provider-guides/index.html b/docs/next/category/cloud-provider-guides/index.html index 65d2f66ae..4da0f716e 100644 --- a/docs/next/category/cloud-provider-guides/index.html +++ b/docs/next/category/cloud-provider-guides/index.html @@ -4,13 +4,13 @@ Cloud Provider Guides | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/configuration/index.html b/docs/next/category/configuration/index.html index 410e62f58..bd7f64789 100644 --- a/docs/next/category/configuration/index.html +++ b/docs/next/category/configuration/index.html @@ -4,13 +4,13 @@ Configuration | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/debug-files/index.html b/docs/next/category/debug-files/index.html index 8a0a33bb1..3e21fff90 100644 --- a/docs/next/category/debug-files/index.html +++ b/docs/next/category/debug-files/index.html @@ -4,13 +4,13 @@ Debug Files | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/deployment/index.html b/docs/next/category/deployment/index.html index 1a1bf8dcf..0973085a5 100644 --- a/docs/next/category/deployment/index.html +++ b/docs/next/category/deployment/index.html @@ -4,13 +4,13 @@ Deployment | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/local-development/index.html b/docs/next/category/local-development/index.html index 8c54cf0d3..5ee98e1ad 100644 --- a/docs/next/category/local-development/index.html +++ b/docs/next/category/local-development/index.html @@ -4,13 +4,13 @@ Local development | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/monitoring/index.html b/docs/next/category/monitoring/index.html index ee361ced5..b7e1a0fa6 100644 --- a/docs/next/category/monitoring/index.html +++ b/docs/next/category/monitoring/index.html @@ -4,13 +4,13 @@ Monitoring | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/sdks/index.html b/docs/next/category/sdks/index.html index fde717a6b..a49ccf4d5 100644 --- a/docs/next/category/sdks/index.html +++ b/docs/next/category/sdks/index.html @@ -4,13 +4,13 @@ SDKs | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/category/toolkits/index.html b/docs/next/category/toolkits/index.html index d09be5190..f296aefff 100644 --- a/docs/next/category/toolkits/index.html +++ b/docs/next/category/toolkits/index.html @@ -4,13 +4,13 @@ Toolkits | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/contributing-guide/index.html b/docs/next/contributing-guide/index.html index e442528be..d016a4cb4 100644 --- a/docs/next/contributing-guide/index.html +++ b/docs/next/contributing-guide/index.html @@ -4,8 +4,8 @@ Contributing Guide | Zealot - - + +
@@ -16,7 +16,7 @@ This helps in shorter turn around times in merging PRs For new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful. Feel free to join our discord community, if you need further discussions with the core team.

Setup for local development

These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use.

- - + + \ No newline at end of file diff --git a/docs/next/contributing-guide/local-development/devcontainer/index.html b/docs/next/contributing-guide/local-development/devcontainer/index.html index a3da13328..77a89fd4b 100644 --- a/docs/next/contributing-guide/local-development/devcontainer/index.html +++ b/docs/next/contributing-guide/local-development/devcontainer/index.html @@ -4,13 +4,13 @@ Visual Studio Code Dev Container Setup | Zealot - - + +
Version: Next 🚧

Visual Studio Code Dev Container Setup

The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.

VSCode devcontainer

System requirements

Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose.

Install Git

Install it from offical website.

Install Docker & docker-compose

Install Visual Studio Code

Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems.

Follow the platform-specific guides below:

  1. Download Visual Studio Code for macOS.
  2. Open the browser's download list and locate the downloaded app or archive.
  3. If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari.
  4. Drag Visual Studio Code.app to the Applications folder, making it available in the macOS Launchpad.
  5. Open VS Code from the Applications folder, by double clicking the icon.

Install Remote container extension

Install the Remote Container extension.

VSCode extension

Fetch Zealot Codesoace

Zealot Codespace was in the .devcontailer folder of Zealot project, so you need clone the source code.

git clone https://github.com/tryzealot/zealot.git

Explan these files in Codespace:

FileDescription
devcontainer.jsonVSCode devcontainer config
Dockerfile.baseBase Dockerfile, auto push multi registry servers after changes
DockerfileSpeed up build time, depends on above image.
docker-compose.ymlAll services of Zealot
create-db-user.sqlCreate user and role for Zealot

Open the project in a container

Start Visual Studio Code, run the Dev Containers: Open Folder in Container... command in Command Palette and select the Zealot folder.

VSCode Command Palette

Click the Starting Dev Container (show log) to review zealot codespace build real time logging messages.

VSCode Command Palette

When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:

[7293 ms] Start: Run in container: cat /proc/344/environ
[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.
[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e
[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established
[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close
[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.
[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close

In host Docker containers:

Docker-Compose containers

Start the project

Press Ctrl + ` to open the integrated terminal in Visual Studio Code if it isn't already open. then run bin/dev to run all services.

Notice that the terminal prompt might look different than your normal terminal prompt.

VSCode Zealot in Container

Open in browser

A while after run bin/dev, select Ports to see all forwarded ports, Open in Browser in quick way.

VSCode forwarded ports

- - + + \ No newline at end of file diff --git a/docs/next/contributing-guide/local-development/source-code/index.html b/docs/next/contributing-guide/local-development/source-code/index.html index fd3706cf9..d08eed030 100644 --- a/docs/next/contributing-guide/local-development/source-code/index.html +++ b/docs/next/contributing-guide/local-development/source-code/index.html @@ -4,13 +4,13 @@ Source code | Zealot - - + +
Version: Next 🚧

Source code

The following is a tutorial on local deployment development for different operating systems.

Prepare dependencies

macOS

Install homebrew

First you need to install Xcode Command tools:

$ xcode-select --install

Then install Homebrew, the package management tool for macOS

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Install dependencies

$ brew install redis postgresql webp imagemagick node git

Setup Database and cache services

Run postgresql and redis services

$ brew services start postgresql
$ brew services start redis

You also need to create a default username in Postgresql:

$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

yarn

$ npm install -g yarn

Debian (Ubuntu)

System dependencies

$ apt update
$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev

Install dependencies

$ apt install -y redis postgresql-client node

Setup Database and cache services

Run postgresql and redis services

$ systemctl postgres start
$ systemctl redis start

You also need to create a default username in Postgresql:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

node

$ npm install -g yarn

Alpine Linux

System dependencies

$ apk --update --no-cache add build-base libxml2 libxslt git \
libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \
tzdata

Needs install gcompat if use arm architecture. or an exception will throws such like "Error loading shared library".

Install dependencies

$ apk --update --no-cache redis postgresql

Setup Database and cache services

Run postgresql and redis services

$ rc-service postgres start
$ rc-service redis start

You also need to create a default username in Postgresql:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

Install Ruby

Can be installed by either asdf, rvm as ruby version manager.

Following the offical install guide then:

# Enable Ruby 3.2.0 YJIT need install rust 1.58+
# Optinal install:
asdf plugin add rust
asdf install rust latest
asdf global rust latest
export RUBY_CONFIGURE_OPTS=--enable-yjit

# Required:
asdf plugin add ruby
asdf install ruby 3.2.0
asdf global ruby 3.2.0

Fetch source code

git clone https://github.com/tryzealot/zealot.git

Initialize Zealot

All the following steps need to be performed in the zealot root directory.

bundler

Install Ruby gems

$ [sudo] gem install bundler
$ bundle install

yarn

Install javascript packages:

$ yarn install

Initialize database

Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:

$ rails db:create
$ rails db:migrate

Configuring the connection database can be done via environment variables or by changing the config/database.yml file.

Initialize default account and demo data

Initialize administrator account and sample application

$ rails db:seed

Launch services

$ bin/dev

Open brower http://localhost:3000

- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/api/apps/index.html b/docs/next/developer-guide/api/apps/index.html index b054f171f..7f6746703 100644 --- a/docs/next/developer-guide/api/apps/index.html +++ b/docs/next/developer-guide/api/apps/index.html @@ -4,13 +4,13 @@ App APIs | Zealot - - + +
Version: Next 🚧

App APIs

Upload an app

This allows you to upload an single iOS, Android or macOS file.

POST /api/apps/upload

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
fileFiletruean App file
channel_keyStringfalseChannel key
Create a new App if leave it empty
nameStringfalsethe name of App
Use app name from parsed metadata in given file if leave it empty
release_typeStringfalseEg, debug, beta, adhoc, release, enterprise 等
sourceStringfalsethe source of upload (default is api)
changelogStringfalseChangelog
Avaiables in plain text or JSON formatted struct
branchStringfalsea branch name from git
git_commitStringfalsegit commit
ci_urlStringfalsethe build url of a C
custom_fieldsStringfalseJSON formatted custom fileds
It could configures and display title,
value and icon from fontawesome in a Release page from an App

For changelog attribute which it accepts both plain text and JSON formatted contents:

plain text:

message 1\nmessage 2

JSON:

[
{
"message": "message 1",
"author": "admin",
"email": "admin@zealot.com",
"date": "2021-11-11 11:11:11"
},
{
"message": "message 1",
"author": "developer",
"email": "developer@zealot.com",
"date": "2021-11-11 11:11:11"
}
]

For custom_fields attribute which it use JSON formatted struct to build from each key-value. for example, Display country name like country=China with icon flag:

curl -X POST \
'https://YOUR_ZEALOT_URL/api/apps/upload' \
--form 'token="token"' \
--form 'channel_key="channel_key"' \
+ --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \
--form 'file=@/path/to/your/app'

Return body

{
"id": 50,
"version": 7,
"app_name": "Test Android",
"bundle_id": "com.test.app",
"release_version": "1.0",
"build_version": "1",
"source": "SOURCE",
"branch": "master",
"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",
"ci_url": "",
"size": 1565486,
"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",
"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",
"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",
"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",
"changelog": [
{
"message": "Changelog message 1"
},
{
"message": "Changelog message 2"
}
],
"text_changelog": "- Changelog message 1\n- Changelog message 2",
"custom_fields": [],
"created_at": "2021-09-01T11:43:33.977+08:00",
"app": {
"id": 1,
"name": "App name"
},
"scheme": {
"id": 8,
"name": "Test"
},
"channel": {
"slug": "1XmpC",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
}

List apps

Get a list of app.

This function takes pagination parameters page and per_page to restrict the list of app.

GET /api/apps

Parameters

AttributeTypeRequiredDescription
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

[
{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 1,
"name": "Adhoc",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
},
{
"id": 2,
"name": "内测版",
"channels": [
{
"slug": "l19Tl",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "8selv",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}
]

Get an app

Allows you to receive information about an app like name, scheme, channel.

GET /api/apps/:id

Parameters

AttributeTypeRequiredDescription
idStringtrueID

Return body

{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 5,
"name": "Test App",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}

Get versions list of app

Get a list of apps by the given channel key

GET /api/apps/versions

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

{
"app_name": "Zealot iOS",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "AdHoc"
},
"releases": [
{
"version": 2,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10292024",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
{
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
]
}

Get the latest version of app

Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url.

GET /api/apps/latest

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
release_versionStringtrueRelease version
build_versionStringtrueBuild version

Return body

{
"app_name": "Zealot iOS",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "AdHoc"
},
"releases": {
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}
}

Check version exists

Allows you to check the Release exists by given query, query accepts two combo group:

  • bundle_id, release_version and build_verion
  • bundle_id and git_commit
GET /api/apps/version_exist

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
bundle_idStringtruebundle_id or package_name
release_versionStringfalseRelease version
build_versionStringfalseBuild version
git_commitStringfalsegit commit hash

Return body

  • Return 200 if release existed.
  • Return 404 if release not existed.

Success returns:

{
"version": 1,
"app_name": "Zealot iOS",
"bundle_id": "im.ews.zealot",
"release_version": "4.1.1",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}

Not found returns:

{
"error": "Not found release"
}
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/api/debug_files/index.html b/docs/next/developer-guide/api/debug_files/index.html index a2f8f7574..95c8ac615 100644 --- a/docs/next/developer-guide/api/debug_files/index.html +++ b/docs/next/developer-guide/api/debug_files/index.html @@ -4,13 +4,13 @@ Debug File APIs | Zealot - - + +
Version: Next 🚧

Debug File APIs

Upload debug file

This allows you to upload an single iOS, Android debug file.

Debug file accepts:

  • iOS: a Zipped dSYM file
  • Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files.
POST /api/debug_files/upload

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
fileFiletrueArichved file by zip
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringtrueBuild version, ignore this param if iOS app

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Download debug file

This allows you to download an single iOS, Android debug file.

POST /api/debug_files/download

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringfalseBuild version, ignore this param if iOS app
orderStringfalseOrder by
version = latest version, upload_date = last uploaded date
Vaild in release_version is latest

Return body

  • Retun 200 status code if the version exists and redirect to the download address with a 302 status code.
  • return 404 status code if the version does not exist.

List debug files

Get a list of debug files.

This function takes pagination parameters page and per_page to restrict the list of debug files.

GET /api/debug_files

Parameters

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
pageIntegerfalsePage number (default: 1)
per_pageIntegerfalseNumber of items to list per page (default: 25, max: 100).

Return body

[
{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}
]

Get a debug file

Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only).

GET /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Update a existed debug file

This allows you to update a debug file.

PUT /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID
fileFiletruea Zipped debug file
release_versionStringtrueRelease version, ignore this param if iOS app
build_versionStringtrueBuild version, ignore this param if iOS app

Return body

{
"id": 1,
"app_name": "Demo App",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

Delete a debug file

This allows you to delete a debug file.

DELETE /api/debug_files/:id

Parameters

info

Authentication required.

AttributeTypeRequiredDescription
channel_keyStringtrueChannel key
idStringtrueID

Return body

{
"mesage": "OK"
}
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/api/index.html b/docs/next/developer-guide/api/index.html index 18a50dd79..00ea454ea 100644 --- a/docs/next/developer-guide/api/index.html +++ b/docs/next/developer-guide/api/index.html @@ -4,14 +4,14 @@ APIs | Zealot - - + +
Version: Next 🚧

APIs

Use the Zealot APIs to view, upload, download the build of app or debug file.

Authentication

Requests currently only support query authentication for User Token, found in API - Key at the bottom of the login user details page.

example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN

Version

The current version is v1, the APIs does not need to explicitly pass the version parameter, and the GraphGL interface is being developed gradually.

Apps

ResourceAvailable endpoints
Upload an App/api/apps/upload
List Apps/api/apps
Get an App by id/api/apps/:id
List verions from an App/api/apps/versions
Get the latest Release from an App/api/apps/latest
Check an Release from App exists/api/apps/version_exist

Full APIs to check api/apps page.

Debug files

ResourceAvailable endpoints
Upload a debug file/api/debug_files/upload
Download a debug file by id/api/debug_files/download
List Debug files/api/debug_files
Get an debug file by id/api/debug_files/:id
Check a debug file exists by id/api/debug_files/version_exist
Update a debug file by id/api/debug_files/:id
Delete a debug file by id/api/debug_files/:id

Full APIs to check api/debug_files page.

- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/fastlane/index.html b/docs/next/developer-guide/fastlane/index.html index 5b95baf7d..4e6052e3b 100644 --- a/docs/next/developer-guide/fastlane/index.html +++ b/docs/next/developer-guide/fastlane/index.html @@ -4,8 +4,8 @@ Fastlane plugins | Zealot - - + +
@@ -13,7 +13,7 @@ fastlane lets you automate every aspect of your development and release workflow, customize your deployment workflows using the hundreds of community built fastlane actions and plugins.

fastlane-plugin-zealot provides upload app, debug_file and version check actions to Zealot, install it in shell:

$ fastlane add_plugin zealot

More usefully plugins

In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:

PluginDescription
fastlane-plugin-ci_changelogAutomate generate changelog between previous and the latest commit of SCM during the CI services.
fastlane-plugin-update_jenkins_buildUpdate build's description of jenkins.
fastlane-plugin-humanable_build_numberAutomatic generate app build number unque and human readable friendly
fastlane-plugin-app_infoTeardown tool for mobile app(ipa, apk and aab file), analysis metedata like version, name, icon etc.
fastlane-plugin-android_channelsPackage unsign apk with channels and write empty file to META-INF with channel in general way
fastlane-plugin-ram_diskUse a virtual ram disk to do anything else
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/fastlane/zealot/index.html b/docs/next/developer-guide/fastlane/zealot/index.html index 8808a0db6..33bbb3975 100644 --- a/docs/next/developer-guide/fastlane/zealot/index.html +++ b/docs/next/developer-guide/fastlane/zealot/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot | Zealot - - + +
Version: Next 🚧

Fastlane action: zealot

Uploading iOS, Android and macOS app, it requires three params:

zealot(
endpoint: 'https://zealot.com',
token: '...',
channel_key: '...',
)

Parameters

+-----------------+---------------------------------+------------------------+----------+
| zealot Options |
+-----------------+---------------------------------+------------------------+----------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+----------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| file | The path of app file. Optional | ZEALOT_FILE | |
| | if you use the `gym`, `ipa`, | | |
| | `xcodebuild` or `gradle` | | |
| | action. | | |
| name | The name of app to display on | ZEALOT_NAME | |
| | zealot | | |
| changelog | The changelog of app | ZEALOT_CHANGELOG | |
| slug | The slug of app | ZEALOT_SLUG | |
| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |
| branch | The name of git branch | ZEALOT_BRANCH | |
| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |
| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |
| | fields | | |
| password | The password of app to download | ZEALOT_PASSWORD | |
| source | The name of upload source | ZEALOT_SOURCE | fastlane |
| ci_url | The name of upload source | ZEALOT_CI_CURL | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |
| | keep secret | | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure | | |
+-----------------+---------------------------------+------------------------+----------+
* = default value is dependent on the user's system

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+

Output Variables

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+
Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/fastlane/zealot_debug_file/index.html b/docs/next/developer-guide/fastlane/zealot_debug_file/index.html index f688a1123..3aa0d8c3b 100644 --- a/docs/next/developer-guide/fastlane/zealot_debug_file/index.html +++ b/docs/next/developer-guide/fastlane/zealot_debug_file/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_debug_file | Zealot - - + +
Version: Next 🚧

Fastlane action: zealot_debug_file

Upload iOS dSYM or Android Proguard file(s) to Zealot

  # Upload iOS dSYM file
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :ios,
xcode_scheme: 'AppName',
verify_ssl: false
)

# Upload Android Proguard files
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :android,
android_build_type: 'release',
android_flavor: 'store',
release_version: '1.1.0',
build_version: '1',
overwrite: true
)

# Upload given zip file
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
zip_file: 'path/to/your/zip_file',
release_version: '1.1.0',
build_version: '1',
verify_ssl: false
)

Parameters

+--------------------+-----------------------------------+---------------------------+---------+
| zealot_debug_file Options |
+--------------------+-----------------------------------+---------------------------+---------+
| Key | Description | Env Var | Default |
+--------------------+-----------------------------------+---------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |
| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |
| | to direct upload | | |
| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |
| | value are | | |
| | ios,mac,macos,osx,android | | |
| path | The path of debug file | ZEALOT_PATH | |
| | (iOS/macOS is archive path for | | |
| | Xcode, Android is path for app | | |
| | project) | | |
| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |
| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |
| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |
| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |
| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |
| | dSYM file | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| | (Android needs) | | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| | (Android needs) | | |
| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |
| | if it existed | | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+--------------------+-----------------------------------+---------------------------+---------+
* = default value is dependent on the user's system

+-----------------------+-----------------------------------------+
| zealot_debug_file Output Variables |
+-----------------------+-----------------------------------------+
| Key | Description |
+-----------------------+-----------------------------------------+
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+-----------------------------------------+
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html b/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html index ff9b15e0d..5875dc19b 100644 --- a/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html +++ b/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html @@ -4,14 +4,14 @@ Fastlane action: zealot_sync_devices | Zealot - - + +
Version: Next 🚧

Fastlane action: zealot_sync_devices

🔔 Zealot 4.5.0 built in Apple team manage which it use Apple API Key to sync iOS devices, even CAN registe the device after fetch the UDID, Check detail

Use Apple Developer account to syncing UDIDs and relates the value in Zealot.

# With Apple API Key
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
api_key_path: '/path/to/your/api_key_json_file',
team_id: '...'
)

# With password (Two-factor Authentication required)
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
username: 'user@example.com',
team_id: '...'
)

Parameters

+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| zealot_sync_devices Options |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| Key | Description | Env Var(s) | Default |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |
| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -json-file) | | |
| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -hash-option) | | |
| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |
| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |
| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |
| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/fastlane/zealot_version_check/index.html b/docs/next/developer-guide/fastlane/zealot_version_check/index.html index b80a0e48e..6b633c5f5 100644 --- a/docs/next/developer-guide/fastlane/zealot_version_check/index.html +++ b/docs/next/developer-guide/fastlane/zealot_version_check/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_version_check | Zealot - - + +
Version: Next 🚧

Fastlane action: zealot_version_check

Check given build exists or not on Zealot

zealot_version_check(
endpoint: 'https://zealot.com',
token: '...',
bundle_id: 'com.example.app.name',
release_version: '1.0.0',
build_version: '1'
)

Parameters

+-----------------+---------------------------------+------------------------+---------+
| zealot_version_check Options |
+-----------------+---------------------------------+------------------------+---------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |
| | app | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+-----------------+---------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/index.html b/docs/next/developer-guide/index.html index eb6782504..96f4f7180 100644 --- a/docs/next/developer-guide/index.html +++ b/docs/next/developer-guide/index.html @@ -4,13 +4,13 @@ Developer Guide | Zealot - - + +
Version: Next 🚧

Developer Guide

Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/sdk/android/index.html b/docs/next/developer-guide/sdk/android/index.html index 8026279f2..dfaa8fa1c 100644 --- a/docs/next/developer-guide/sdk/android/index.html +++ b/docs/next/developer-guide/sdk/android/index.html @@ -4,13 +4,13 @@ Zealot Android SDK | Zealot - - + +
Version: Next 🚧

Zealot Android SDK

The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.

Install

JitPack

Using jitpack to install:

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

In build.gradle file of main app project add:

dependencies {
implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'
}

Permission

Zealot needs internet permission

<uses-permission android:name="android.permission.INTERNET" />

Usages

Add the start code to the onCreate method block of your Application file:

// Single channel
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("...")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()

// Multi-channel, such as beta, adhoc versions
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("xxxxxxx", "beta")
.setCHannelKey("yyyyyyy", "test")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()
- - + + \ No newline at end of file diff --git a/docs/next/developer-guide/sdk/ios/index.html b/docs/next/developer-guide/sdk/ios/index.html index b49157ec0..33a4d02d6 100644 --- a/docs/next/developer-guide/sdk/ios/index.html +++ b/docs/next/developer-guide/sdk/ios/index.html @@ -4,14 +4,14 @@ Zealot iOS SDK | Zealot - - + +
Version: Next 🚧

Zealot iOS SDK

The iOS component provides a service to check for new versions and installations for Zealot, supporting Swift and Objective-C.

Install

Cocoapods

Adding below code into Podfile:

pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'

Install it:

pod install

Usages

Import header

  1. Add the code in your AppDelegate
import Zealot

Configure

  1. Add the following code in application:didFinishLaunchingWithOptions: method block:
// Single channel
let zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")
zealot.checkVersion()

// Multi-channel, such as beta, adhoc versions
let zealot = Zealot(endpoint: "http://zealot.com",
channelKeys: [
"beta": "xxxxxxx",
"test": "yyyyyyy"],
default_enviroment: "beta")

// Active it
zealot.checkVersion()
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/configuration/environment-variables/index.html b/docs/next/self-hosted/configuration/environment-variables/index.html index 42803ea58..0dde5b746 100644 --- a/docs/next/self-hosted/configuration/environment-variables/index.html +++ b/docs/next/self-hosted/configuration/environment-variables/index.html @@ -4,8 +4,8 @@ Environment Variables | Zealot - - + +
@@ -19,7 +19,7 @@ specific permission comparison can see here for details

# Guest mode is ON
ZEALOT_GUEST_MODE=true

# Guest mode is OFF
ZEALOT_GUEST_MODE=false

Configure emails

Currently, only smtp is supported to configure email notification service. Email notification mainly affects are user registration, sending activation emails and changing password service, but it does not affect the use if it is not turned on.

# SMTP settings
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=you@gmail.com
SMTP_PASSWORD=yourpassword
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

# Sender and email address by default
ACTION_MAILER_DEFAULT_FROM=you@gmail.com
ACTION_MAILER_DEFAULT_TO=you@gmail.com

Disbale Cable request protection

Experimental:

ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION=true
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/configuration/schedule-jobs/index.html b/docs/next/self-hosted/configuration/schedule-jobs/index.html index c0ea79058..49ca5f3d7 100644 --- a/docs/next/self-hosted/configuration/schedule-jobs/index.html +++ b/docs/next/self-hosted/configuration/schedule-jobs/index.html @@ -4,8 +4,8 @@ Schedule Jobs | Zealot - - + +
@@ -14,7 +14,7 @@ version basically to meet the vast majority of cases, for example:

Additional: the current logic is relatively trouble-free but inflexible, in fact, there is thought to support a variety of processing logic, see https://github.com/tryzealot/zealot/issues/376

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 9
- 8
...
- 1.0
- 5
- 4
- 3
...

The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4, leaving the final version file as follows:

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 1.0
- 5

If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ZEALOT_KEEP_UPLOADS=false.

info

ZEALOT_KEEP_UPLOADS set true by default.

Backup

When you create any backup it will join itself to the schedule job list.

- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/configuration/third-party-authentication/index.html b/docs/next/self-hosted/configuration/third-party-authentication/index.html index 7d4356913..dac319ca4 100644 --- a/docs/next/self-hosted/configuration/third-party-authentication/index.html +++ b/docs/next/self-hosted/configuration/third-party-authentication/index.html @@ -4,13 +4,13 @@ Third-party Authentication | Zealot - - + +
Version: Next 🚧

Third-party Authentication

Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.

Serviceprovider
Feishufeishu
Gitlabgitlab
Googlegoogle_oauth2
LDAPldap
OpenID Connectopenid_connect

If the above services need to set the callback address please set it uniformly as follows

http://zealot.com/users/auth/:provider/callback

where :provider is the identifier of the above supported third-party service, for example:

# if Google is enabled, then replace `:provider` with `google_oauth2`.
http://zealot.com/users/auth/google_oauth2/callback

Gitlab

  1. Register a Gitlab On line account or use self-host service
  2. Create an application in Preferences -> Applications page.
  3. Configure Redirect URI such like http://zealot.com/users/auth/gitlab/callback (replace the domain in your case)
  4. Check scope: read_user,By default zealot only uses this license, if your enable scope is api that's fine too
GITLAB_ENABLED=true
GITLAB_SITE=https://gitlab.com/api/v4
GITLAB_SCOPE=read_user
GITLAB_APP_ID=
GITLAB_SECRET=

Google

  1. Register a Google account
  2. Enable Google Cloud Platform service
  3. Choose or create a Project then go to Credentials page
  4. Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like http://zealot.com/users/auth/google_oauth2/callback (replace the domain in your case)
GOOGLE_OAUTH_ENABLED=true
GOOGLE_CLIENT_ID=
GOOGLE_SECRET=

Feishu (Lark)

  1. Register a feishu (lark) account and download the Phone app.
  2. Enable Open platform and create application to get app_id, app_secret
  3. Configure callback url such like http://zealot.com/users/auth/feishu/callback (replace the domain in your case)
  4. Check user filed information scope: email address (Optional)
  5. Create a version and publish
FEISHU_ENABLED=true
FEISHU_APP_ID=
FEISHU_APP_SECRET=

LDAP

LDAP_ENABLED=true
LDAP_HOST=10.0.0.1
LDAP_PORT=389
LDAP_METHOD=plain
LDAP_BIND_DN="cn=Manager,dc=example,dc=com"
LDAP_PASSWORD=password
LDAP_BASE="ou=People,dc=example,dc=com"
LDAP_UID=uid

OpenID Connect

Supports both auto-discovery mode and manual settings.

Auto-discovery

Turning on auto-discovery mode will automatically fetch the [OIDC_ISSUER_URL]/.well-known/openid-configuration configuration.

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_DISCOVERY=true

Manual

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_AUTH_URI=/authorize
OIDC_TOKEN_URI=/token
OIDC_USERINFO_URI=/userinfo

Above OIDC_AUTH_URI, OIDC_TOKEN_URI, OIDC_USERINFO_URI will use the default path as above if not set.

- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/architecture/index.html b/docs/next/self-hosted/deployment/architecture/index.html index e38f0a6a1..6a4a44399 100644 --- a/docs/next/self-hosted/deployment/architecture/index.html +++ b/docs/next/self-hosted/deployment/architecture/index.html @@ -4,13 +4,13 @@ Zealot Architecture | Zealot - - + +
Version: Next 🚧

Zealot Architecture

Running Zealot requires the following set of services.

ArchitectureArchitecture
  • Mostly Linux based on amd86/arm64/armv7.
  • Ruby on Rails powered Web and API services
  • Sidekiq provides asynchronous background task management
  • PostgreSQL database
  • Redis cache
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/docker/index.html b/docs/next/self-hosted/deployment/docker/index.html index fbf9728f7..a64afc51f 100644 --- a/docs/next/self-hosted/deployment/docker/index.html +++ b/docs/next/self-hosted/deployment/docker/index.html @@ -4,8 +4,8 @@ Deploy Zealot with Docker guide | Zealot - - + +
@@ -25,7 +25,7 @@ may require the device to also have an SSL certificate installed before accessing and installing the application, and Chrome may also deny access due to the certificate.

If the domain name is unregistered, you need to tie the host to access it, usually by modifying the system's /etc/hosts file.

/etc/hosts
$ sudo vim /etc/hosts

127.0.0.1 zealot.test
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/docker/step-by-step/index.html b/docs/next/self-hosted/deployment/docker/step-by-step/index.html index 15d7147a6..9b8a1f870 100644 --- a/docs/next/self-hosted/deployment/docker/step-by-step/index.html +++ b/docs/next/self-hosted/deployment/docker/step-by-step/index.html @@ -4,8 +4,8 @@ Docker deployment guide | Zealot - - + +
@@ -13,7 +13,7 @@ load the sample application data and set up the administrator account, which is required for subsequent zealot updates.

docker-compose pull

Setup database data

The first time you use it, you will initialize the database, load the sample application data and set up the administrator account, which is required for subsequent zealot updates.

docker-compose run --rm zealot run_upgrade

Launch docker-compose

Manual execution is required to run the service for security periods and user-defined operations:

docker-compose up -d

Advanced

Custom volumes

You have two t

There are two ways to customize the path: (Assuming that the custom path is /data/zealot)

1. Create custom docker volume

docker volume create --name zealot-data \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/zealot-data

docker volume create --name zealot-redis \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/redis

docker volume create --name zealot-postgres \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/postgres

2. Change volumes part of docker-compose file

Open docker-compose.yml file and find volumes::

volumes:
zealot-data:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/data
zealot-redis:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/redis

zealot-postgres:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/postgres
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/fly/index.html b/docs/next/self-hosted/deployment/fly/index.html index a4a388377..d4f9ade74 100644 --- a/docs/next/self-hosted/deployment/fly/index.html +++ b/docs/next/self-hosted/deployment/fly/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Fly guide | Zealot - - + +
Version: Next 🚧

Deploy Zealot to Fly guide

Zealot support use App Configuration (fly.toml) to deploy on fly.io.

Deploying on Fly

  • Install flyctl.
  • Copy full content of app configuration save to fly.toml then change the app value .
  • Run flyctl deploy.
  • Run fly scale vm shared-cpu-1x --memory 512.

App Configuration

app = "[app-name:changeme]"
kill_signal = "SIGINT"
kill_timeout = 120
processes = []

[build]
image = "ghcr.io/tryzealot/zealot:nightly"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 80
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

[[statics]]
guest_path = "/app/public"
url_prefix = "/"
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/kubernetes/index.html b/docs/next/self-hosted/deployment/kubernetes/index.html index 74b24af13..b9028cd39 100644 --- a/docs/next/self-hosted/deployment/kubernetes/index.html +++ b/docs/next/self-hosted/deployment/kubernetes/index.html @@ -4,13 +4,13 @@ Deploy Zealot with Kubernetes guide | Zealot - - + +
Version: Next 🚧

Deploy Zealot with Kubernetes guide

Zealot support deployments using Kubernetes, but only .yaml config files are available currently.

Check list

  • ConfigMap and Secret to configure enviroment variables.
  • PersistentVolumeClaim to configure public/uploads, public/bakcup.
  • Deployment to control zealot pod.

Steps

10-zealot-namespace.yml

Zealot namespace.

10-zealot-namespace.yml
api Version: v1
kind: Namespace
metadata:
name: zealot

20-zealot-secrets.yml

Zealot enviroments secrets. This is loaded all secrets enviroments, all values need encryt by base64.

20-zealot-secrets.yml
apiVersion: v1
kind: Secret
metadata:
namespace: zealot
name: zealot-secrets
data:
ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=
ZEALOT_ADMIN_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=
ZEALOT_POSTGRES_PORT: NTQzMg==
ZEALOT_POSTGRES_USERNAME: emVhbG90
ZEALOT_POSTGRES_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_DB_NAME: emVhbG90
REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=

# echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64
SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==

21-zealot-configmap.yml

Zealot enviroments config map. This is loaded safe enviroments.

21-zealot-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: zealot
name: zealot-config
data:
ZEALOT_DOMAIN: zealot.icyleaf.dev
DEFAULT_LOCALE: en
ZEALOT_REGISTER_ENABLED: "true"

30-zealot-storage.yml

The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed.

30-zealot-storage.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-uploads
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-backup
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

40-zealot-deployment.yml

Create zealot deployment, edit replicas and image tag.

40-zealot-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zealot
namespace: zealot
spec:
restartPolicy: Always
replicas: 1
selector:
matchLabels:
app: zealot
template:
metadata:
labels:
app: zealot
spec:
containers:
- name: zealot
image: ghcr.io/tryzealot/zealot:nightly
# imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
envFrom:
- configMapRef:
name: zealot-env
- secretRef:
name: zealot-secrets
volumeMounts:
- mountPath: /app/public/uploads
name: uploads
- mountPath: /app/public/backup
name: backup
volumes:
- name: uploads
persistentVolumeClaim:
claimName: zealot-uploads
- name: backup
persistentVolumeClaim:
claimName: zealot-backup

50-zealot-service.yml

Creating zealot service.

50-zealot-service.yml
apiVersion: v1
kind: Service
metadata:
name: zealot
namespace: zealot
labels:
app: zealot
spec:
selector:
app: zealot
ports:
- port: 80
targetPort: http
name: http
protocol: TCP

60-zealot-ingress.yml

Setting up the ingress for the zealot service.

50-zealot-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zealot
namespace: zealot
annotations:
#cert-manager.io/cluster-issuer: letsencrypt-prod
#kubernetes.io/ingress.class: nginx
spec:
rules:
- host: zealot.icyleaf.dev
http:
paths:
- web:
service:
name: zealot
port:
number: 80
path: /
pathType: Prefix
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/nomad/index.html b/docs/next/self-hosted/deployment/nomad/index.html index a59542447..c3d426699 100644 --- a/docs/next/self-hosted/deployment/nomad/index.html +++ b/docs/next/self-hosted/deployment/nomad/index.html @@ -4,8 +4,8 @@ Deploy Zealot with Nomad guide | Zealot - - + +
@@ -15,7 +15,7 @@ copy the zealot.nomad in previous step and edit a new file named main.tf:

resource "nomad_job" "jobs" {
jobspec = file("${path.module}/zealot.nomad")
}

Execute terraform plan to ensure, then deploy terraform apply.

External Storages

Nomad supports multi-cluster management, and in many cases the storage deployed by the service cannot be mounted directly to the corresponding file system, but is more often placed on top of a shared file storage protocol, such as SMB, NFS, S3, etc.

CSI

Nomad currently supports the CSI in a limited capability (Nomad 1.5). Nomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad. You can find a list of plugins in the Kubernetes CSI Developer Documentation.

PluginSchemesCompatibleterraform nomad resource
kubernetes-csi-driver-smbsmbUnknownUnknown
kubernetes-csi-driver-nfsnfsSupportednomad_csi_volume_registration
kubernetes-csi-driver-iscsiiscsiSupportedSupported
democraticcsi/democratic-csismb/nfs/iscsiSupportednomad_csi_volume
rocketduck/csi-plugin-nfsnfsSupportednomad_csi_volume
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/railway/index.html b/docs/next/self-hosted/deployment/railway/index.html index cf9f70f0b..a0c4d75a9 100644 --- a/docs/next/self-hosted/deployment/railway/index.html +++ b/docs/next/self-hosted/deployment/railway/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Railway guide | Zealot - - + +
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/render/index.html b/docs/next/self-hosted/deployment/render/index.html index 5dc462d0b..9d05e01b7 100644 --- a/docs/next/self-hosted/deployment/render/index.html +++ b/docs/next/self-hosted/deployment/render/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Render guide | Zealot - - + +
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/requirements/index.html b/docs/next/self-hosted/deployment/requirements/index.html index 0493af425..cebb56bd3 100644 --- a/docs/next/self-hosted/deployment/requirements/index.html +++ b/docs/next/self-hosted/deployment/requirements/index.html @@ -4,8 +4,8 @@ Zealot Self Hosted Requirements | Zealot - - + +
@@ -15,7 +15,7 @@ The storage requirements for Redis are minimal, You can start with 50MB and scale up as required.

Redis version 6.2 or higher version is recommended

Sidekiq

Sidekiq processes the background jobs with a multi-threaded process. This process starts with the entire Rails stack but it can grow over time due to memory leaks. On a very active server the Sidekiq process can use 1GB+ of memory.

Supported web browsers

tip

We don't support running Zealot with JavaScript disabled in the browser.

Zealot supports the following web browsers:

- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/deployment/source-code/index.html b/docs/next/self-hosted/deployment/source-code/index.html index 917864c85..071712f05 100644 --- a/docs/next/self-hosted/deployment/source-code/index.html +++ b/docs/next/self-hosted/deployment/source-code/index.html @@ -4,13 +4,13 @@ Source code | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/self-hosted/index.html b/docs/next/self-hosted/index.html index 23d420eef..16630f7e9 100644 --- a/docs/next/self-hosted/index.html +++ b/docs/next/self-hosted/index.html @@ -4,13 +4,13 @@ Self-hosted Installation Guide | Zealot - - + +
Version: Next 🚧

Self-hosted Installation Guide

This guide will help you to install and setup a production ready Zealot.

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/reverse-proxies/index.html b/docs/next/self-hosted/reverse-proxies/index.html index b8d57f34d..0d1d5a84e 100644 --- a/docs/next/self-hosted/reverse-proxies/index.html +++ b/docs/next/self-hosted/reverse-proxies/index.html @@ -4,8 +4,8 @@ Reverse Proxies | Zealot - - + +
@@ -15,7 +15,7 @@ routing rules (including access port number, domain name binding and SSL)

Traefik service

entryPoints:
web:
address: ":80"

websecure:
address: ":443"

certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web

Docker

Enable Docker provider then edit the Docker Compose file:

docker-compose.yml
version: '3'
services:
zealot:
<<: *defaults
labels:
- "traefik.enable=true"
- "traefik.http.services.zealot.loadbalancer.server.port=80"
- "traefik.http.routers.zealot.service=zealot"
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"
- "traefik.http.routers.zealot.tls=true"
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt"
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
# Comment port, no need to public
# ports:
# - "8901:80"
network:
# Change the network what traefik service is
- traefik-services

networks:
# Change the network what traefik service is
traefik-services:
external: true

Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine, cross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options.

Consul

Enable Consul provider or Consul Catalog provider, add key-value below:

consul kv put traefik/http/services/zealot/loadbalancer/server/port 5
consul kv put traefik/http/routers/zealot/service zealot
consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'
consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt
consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev
consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev

Nomad

Enable Nomad provider and make sure Nomad version >= 1.3:

zealot.nomad
job "zealot" {
datacenters = ["dc1"]
type = "service"

group "zealot" {
count = 1

network {
port "http"{
static = 80
}
}

service {
name = "zealot-http"
provider = "nomad"
port = "http"
}

task "server" {
driver = "docker"
config {
image = "ghcr.io/tryzealot/zealot:nightly"
ports = ["http"]
args = [
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",
- "traefik.http.routers.zealot.tls=true",
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt",
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
]
}
}
}
}

Caddy 2

The configuration only needs to relate the ip part after tls and proxy:

Caddyfile
:443

log

# Use Let's Encrypt service
tls your-email@example.com

reverse_proxy 172.16.56.100:8901

Nginx

The following is the general configuration, if not effects welcome to file a issue:

conf.d/zealot.conf
upstream zealot {
zone upstreams 64K;
server 172.16.56.100:8901;
keepalive 32;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name zealot.icyleaf.dev;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2; # Optional: http2 may needs install extension
listen [::]:443 ssl http2;
server_name zealot.icyleaf.dev;

ssl_certificate /etc/certs/zealot-cert.pem;
ssl_certificate_key /etc/certs/zealot.pem;

# Optional
# ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
# ssl_session_timeout 5m;
# ssl_session_cache shared:SSL:1m;
# ssl_prefer_server_ciphers on;

location / {
proxy_pass http://zealot;
proxy_redirect off;

proxy_pass_header Authorization;
proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Ssl on; # Optional
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

client_max_body_size 0;
proxy_read_timeout 36000s;
}
}

And you need update max body size in http block. Recommended is 200MB, if it's a game, 50% more can be played to make a surplus according to the actual file size.

nginx.conf
http {
[...]

client_max_body_size 200M;
}
- - + + \ No newline at end of file diff --git a/docs/next/self-hosted/storage/index.html b/docs/next/self-hosted/storage/index.html index 1fa25d84a..d1cecd91c 100644 --- a/docs/next/self-hosted/storage/index.html +++ b/docs/next/self-hosted/storage/index.html @@ -4,8 +4,8 @@ Data storages | Zealot - - + +
@@ -13,7 +13,7 @@ for those who are able to manually backup and restore data before better backup management tools are available.

Postgres

This is used to store and manage all data related to Zealot, so it goes without saying.

Redis

Currently only the sidekiq asynchronous task service is using it to store some task status and statistics.

File storage

The Zealot service relies on postgresql, redis and some other disk storage for uploaded application and debug files. It is currently stored in the filesystem in the public/uploads directory.

  • apps The directory for uploading applications
  • debugs_files directory for uploading debug files

Backup storage

The Zealot service currently supports command-generated backup data, which will contain the database and binary packages of the uploaded apps and debug files.

The backup data is currently stored in the file system in the public/backup directory.

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/apple-team/index.html b/docs/next/user-guide/administrator/apple-team/index.html index ed75acdaf..290b7f229 100644 --- a/docs/next/user-guide/administrator/apple-team/index.html +++ b/docs/next/user-guide/administrator/apple-team/index.html @@ -4,8 +4,8 @@ Apple Team (Developer) | Zealot - - + +
@@ -22,7 +22,7 @@ recognizable and friendly device names.

Register processingRegister processing

Although providing the UDID of a device confirms which applications can be installed, providing a feature to register a testing device that has not been registered with any application would greatly improve the efficiency of the team. This is the role of the Apple Developer feature.

Apple deveoper detail previewApple deveoper detail preview

The initial feature introduction: https://github.com/tryzealot/zealot/issues/723.

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/backup/index.html b/docs/next/user-guide/administrator/backup/index.html index 37369b5c2..f494fe2e8 100644 --- a/docs/next/user-guide/administrator/backup/index.html +++ b/docs/next/user-guide/administrator/backup/index.html @@ -4,13 +4,13 @@ Backup Schedule | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/monitoring/background-jobs/index.html b/docs/next/user-guide/administrator/monitoring/background-jobs/index.html index 377394c55..71fd72924 100644 --- a/docs/next/user-guide/administrator/monitoring/background-jobs/index.html +++ b/docs/next/user-guide/administrator/monitoring/background-jobs/index.html @@ -4,13 +4,13 @@ Background Jobs | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/monitoring/database-analytics/index.html b/docs/next/user-guide/administrator/monitoring/database-analytics/index.html index 36737fbd1..13e060985 100644 --- a/docs/next/user-guide/administrator/monitoring/database-analytics/index.html +++ b/docs/next/user-guide/administrator/monitoring/database-analytics/index.html @@ -4,13 +4,13 @@ Database Analytics | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/monitoring/logging/index.html b/docs/next/user-guide/administrator/monitoring/logging/index.html index 5ceba20cd..22cb11d4f 100644 --- a/docs/next/user-guide/administrator/monitoring/logging/index.html +++ b/docs/next/user-guide/administrator/monitoring/logging/index.html @@ -4,13 +4,13 @@ Logging | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/monitoring/system-info/index.html b/docs/next/user-guide/administrator/monitoring/system-info/index.html index 18631d026..b76c3be09 100644 --- a/docs/next/user-guide/administrator/monitoring/system-info/index.html +++ b/docs/next/user-guide/administrator/monitoring/system-info/index.html @@ -4,13 +4,13 @@ System informations | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/permissions/index.html b/docs/next/user-guide/administrator/permissions/index.html index 4e3fc0013..b85525763 100644 --- a/docs/next/user-guide/administrator/permissions/index.html +++ b/docs/next/user-guide/administrator/permissions/index.html @@ -4,13 +4,13 @@ User Permissions and roles | Zealot - - + +
Version: Next 🚧

User Permissions and roles

Zealot offers four types of user permissions.

  • Guest
  • User
  • Developer
  • Administrator

Comparison

ActionGuest[On/Off]UserDeveloperAdministrator
Dashboard
View all data
✓/✕
App
View app list
✓/✕
App
View app scheme(s) and channel(s) detail
✓/✕
App
View the build(release) of app
✓/✓
Password Auth
App
View webhook list
✓/✕
App
Upload/Install/Download app
App
Create/Edit/Delete an app
App
Create/Edit/Delete a scheme/channel of app
App
Delete a given version of app
App
Test a webhook network connection
App
Enable/Disable webhook
App
Delete an app
DebugFile
View debug file list
✓/✕
DebugFile
View debug file detail
DebugFile
Download debug file
DebugFile
Upload/Delete a debug file
Teardown
View teardown list
✓/✕
Teardown
View teardown detail
✓/✕
Teardown
Delete a teardown
Admin
View and manage users
Admin
View and manage webhooks
Admin
View and manage settings
Admin
View system informations
Admin
View and manage background jobs
Admin
View page analytices
- - + + \ No newline at end of file diff --git a/docs/next/user-guide/administrator/settings/index.html b/docs/next/user-guide/administrator/settings/index.html index cc11ba233..c876cc67c 100644 --- a/docs/next/user-guide/administrator/settings/index.html +++ b/docs/next/user-guide/administrator/settings/index.html @@ -4,13 +4,13 @@ Settings | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/apps/create/index.html b/docs/next/user-guide/apps/create/index.html index b21ded993..a6618d4ba 100644 --- a/docs/next/user-guide/apps/create/index.html +++ b/docs/next/user-guide/apps/create/index.html @@ -4,13 +4,13 @@ Create an App | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/apps/detail/index.html b/docs/next/user-guide/apps/detail/index.html index 1b792e101..45bc1f65a 100644 --- a/docs/next/user-guide/apps/detail/index.html +++ b/docs/next/user-guide/apps/detail/index.html @@ -4,13 +4,13 @@ Uploaded releases | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/apps/index.html b/docs/next/user-guide/apps/index.html index 16077ab26..5fb29f6ff 100644 --- a/docs/next/user-guide/apps/index.html +++ b/docs/next/user-guide/apps/index.html @@ -4,13 +4,13 @@ Manage apps | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/apps/upload/index.html b/docs/next/user-guide/apps/upload/index.html index e5f06a4dd..5c06675b9 100644 --- a/docs/next/user-guide/apps/upload/index.html +++ b/docs/next/user-guide/apps/upload/index.html @@ -4,13 +4,13 @@ Uploaded a release | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/best_practices/index.html b/docs/next/user-guide/best_practices/index.html index 688b2aa8e..9af8999e0 100644 --- a/docs/next/user-guide/best_practices/index.html +++ b/docs/next/user-guide/best_practices/index.html @@ -4,8 +4,8 @@ Best Practices | Zealot - - + +
@@ -13,7 +13,7 @@ it is highly recommended to install the following plug-ins in addition to fastlane.

  • ci_changelog | Support for multiple CI systems to automatically generate change history
  • update_jenkins_build | Automatically Update Jenkins Build Description
  • humanable_build_number | Generate a build version number that is recognizable to development
  • app_info | View metadata about the application after successful packaging
  • ram_disk | Create in-memory virtual disks, mainly used to improve App build speed (consider if memory is large)
  • debug_file | Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files
# Build and upload ipa to zealot service
lane :upload_app do
# Building the package file, using gym in iOS, gradle in Android
gym

# Uploading to Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# Uploading dSYM file to Zealot
zealot_debug_file(
scheme: 'AppName'
)
end

# Build android package file and generate progguard then upload to zealot service
lane :upload_debug_file do
# Building the package file, using gym in iOS, gradle in Android
gradle

# Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files
debug_file

# Uploading to Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# Uploading Proguard file to Zealot
zealot_debug_file(
build_type: 'release',
flavor: 'googleplay'
)
end

CI/CD Service

For example, Jenkins, configure the project, set up the git hook to trigger packaging, nothing to say

Zealot Service

In addition to managing each uploaded application and debug file, each time an uploaded application is received, a configured web hook is triggered to send a notification to the third-party service that a new version has been received, and for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time.

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/changelog/index.html b/docs/next/user-guide/changelog/index.html index 6e979fda9..c61641fb6 100644 --- a/docs/next/user-guide/changelog/index.html +++ b/docs/next/user-guide/changelog/index.html @@ -4,15 +4,15 @@ Change Log | Zealot - - + +
Version: Next 🚧

Change Log

Unreleased

tip

The following list of changes is the list that has not yet been released, code change history: Unreleased

Added

  • Web/API supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default #1121
  • Web/API adds support for hosting Windows applications (uploading and displaying metadata parsing) #1124
  • Web has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files #1127 #1124 #961
  • Web supports unpacking v1, v2, and v3 signature information for Android applications #1124
  • Web strengthens X509 certificate information for unpacking Android and iOS applications #1124
  • Web adds a "Reparse" function to update the metadata of old structure debugging files
  • Web supports markdown format for change logs of uploaded application versions
  • Web settings page can configure the global "minimum number of items returned per page" and "maximum number of items"
  • Web for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)
  • Web adds or updates JSON format verification to network hooks and settings pages.
  • Web supports registering test devices to Apple developers with custom device names and editing/updating device names after creation.
  • Web supports downloading private key certificates for Apple developers.

Fixed

  • Web fixes the issue of being unable to delete unpacked applications
  • Web optimizes the style of some pages
  • Web corrects errors in the English language package (en language i18n)
  • Web fixes the error page that appears when creating an empty application type
  • Web fixes the 404 error page that appears when a file is not found.
  • API fixes the logic optimization of comparing build_version for retrieving the latest version of an application.
  • Web optimizes the error handling for custom field format during application upload.
  • Web optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices.
  • Web optimizes the display of error information for backup tasks.
  • Web adds type detection for application types and debug files during application upload.
  • Web fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers.

4.7.1 (2023-03-10)

Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]

Fixed

  • Web upgrades to the latest appt2 model to avoid exceptions when parsing aab files.
  • Web implements duplicate processing for parsing exceptions.

Added

  • Web adds application types to the details page of unpacked Android applications.
  • Web adjusts the original page after editing an application channel.

4.7.0 (2023-03-03)

Major Change The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full commit changes

Changed

  • Docker Major Change The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings.

Added

  • Web adds a control switch for "New Upload Version Prompt Window" to application types. #1058 Thanks to softwind0214
  • Web allows clicking on the application icon on the application list page to jump to the application details page.
  • Web adds the display of the version number of dependent services to the environment information.
  • Web adds support for displaying nightly build versions in the version number.

Fixed

  • Web downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See #1070 for details.
  • Web fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time.
  • Web fixes the issue where there is no confirmation prompt when a user logs out.
  • Web fixes the issue where the main historical version of an application cannot be deleted.
  • Web improves the style of multiple pages.
  • Web no longer displays Javascript debugger logs in production environments.

4.6.0 (2023-01-17)

The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full commit changes

Fixed

  • Web captures the issue of creating an application channel with an empty name. #968 Thanks to congpeijun
  • Web improves the logic for backup files that do not exist on disk. #995

Added

  • Docker supports arm64/v8 and armv7 arch. #970
  • Web Adopted a new 50x error page.

Changed

  • Web upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. #1011
  • API updates the data structure of the debug file return and changes the status code from 204 to 200.

4.5.3 (2022-11-22)

Full commit changes

Fixed

  • Web Fixes the issue where third-party login cannot be redirected. #949 Thanks to softwind0214

Added

  • Docker Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). #950

4.5.2 (2022-11-01)

Full commit changes

Fixed

  • Web fixes the issue where registering a test device is abnormal. #935 Thanks to ycy0430
  • Web adapts the QR code to support dark mode.
  • Web corrects the English language pack.

Added

  • WebHook Income webhook body structure adds the username and email fields. #934 Thanks to rkonfj
  • Docker The SIDEKIQ_CONCURRENCY environment variable is now supported to set the concurrency of background tasks, with a default value of 5.

Changed

  • Docker reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on 127.0.0.1.
  • Web optimizes the wording of the iOS device UDID profile.
  • Web updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!

4.5.1 (2022-09-14)

Full commit changes

Fixed

  • Web Fixes the issue where the application unpacking results in parsing errors.

4.5.0 (2022-08-19)

Supports the 🌑 dark mode and managing the test devices of an 👨🏻‍🔧 Apple developer account! Full commit changes

Added

  • Web supports dark mode. #816
  • Web adds Apple developer management for registering test devices. #817
  • Web adds data backup management. #835
  • Web completes the monitoring of dependent services in the management panel. #586
  • API adds three fields, platform, device_type, and custom_fields, to the release dictionary.

Changed

  • Web Incompatible change Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. #815
  • CLI Incompatible change The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead.
  • Web adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions.
  • Web removes the page statistics function in the admin panel. #814
  • Web migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. #829
  • Web due to the complexity of editing application types and channels, only the application name can be modified.

Fixed

  • Web fixes the error of selecting a channel that does not exist under an application type. #795 Thanks to tasselsd
  • API fixes the Android address return error. #813 Thanks to denymz
  • Web/API fixes the exception caused by some parameters being empty in aab parsing. tryzealot/fastlane-plugin-zealot#9 Thanks to tasselsd
  • Web fixes the issue of abnormal generation of demo data during the first initialization of the project. #821
  • API fixes the issue of abnormal data when checking the latest version of the application. #856 Thanks to denymz
  • Web fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel.
  • Web corrects many spelling errors in the English language pack.

4.4.1 (2022-06-20)

Full commit changes

Fixed

  • WebHook fixes the issue where an error is thrown after a successful trigger. #792 Thanks to tasselsd
  • Docker compatible with Caddy 2.5.0 for proxying from https to http. #790 Thanks to VisionBao songge1209

4.4.0 (2022-06-09)

Full commit changes

Changed

  • Web adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details.
  • Web upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0.
  • Web is now compatible with the macOS M1 chip.

Added

  • Web simplifies and standardizes some application links to facilitate sharing. #666
  • Web completes some missing permission check pages.

Fixed

  • Job fixes the issue of abnormal URL Schemes when parsing iOS files.
  • Web fixes the issue where service logs are not output to the terminal console.
  • Web adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons.
  • Web adapts the UI for ultra-wide screens.
  • Web fixes security vulnerabilities in third-party login dependencies.
  • API fixes the issue where uploading Android without channel_key results in an exception. #779 Thanks to likfe

4.3.1 (2021-12-22)

Full commit changes

Added

  • Web after updating the setting, the original default value can be restored.
  • Web supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking.
  • Web strengthens the visual effect of the open and closed status of the setting page.

Fixed

  • Web fixes the issue of asynchronous task methods in demo mode.
  • Web fixes the issue where selected application types and channels cannot be checked when creating and editing an application.
  • Web fixes the issue where it is not possible to navigate to the environment page.
  • Web fixes the issue where aab parsing fails when there are no intent filters.
  • Web adds error handling for unchecking all application types and channels when updating an application.
  • Web fixes the issue where the loading strategy causes all third-party logins to be unavailable.

4.3.0 (2021-12-08)

Supports parsing of the aab format, adds support for multiple languages. Full commit changes

Changed

  • Web uses the default prompt structure as the data structure for network hooks, instead of a strange structure.
  • Web no longer provides parameter changes for third-party login authorization on the settings page (requires service restart).
  • API the upload application interface and version details return the text_changelog field in the response body. 650f1ffd
  • API renames the changelog_list field in the response body to changelog. 719f0b1e
  • Web changes the log output format from an array to text format that is compatible with Markdown lists. 719f0b1e
  • Web some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. #644
  • Web does not display the build date and hash value if they cannot be obtained.

Added

  • Web supports parsing of the Android App Bundle (aab) file format and webp icons.
  • Web supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration).
  • Web supports configuring more system settings. #643
  • Web adds editing functionality for network hooks in the management panel.
  • Web rewrites and optimizes the style layout of the application list.
  • Web optimizes the basic email template.
  • Web adjusts the style and error logic of the login window.
  • Web adds file permission checking to the environment variable page in the management panel. #608
  • Web adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors.
  • Web uses a better log output format. #646

Fixed

  • Web fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page.
  • Web fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing).
  • Web fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page.
  • Web fixes the issue where the domain scope of asynchronous notifications does not take effect.
  • Web fixes the issue of exception when getting gems.
  • Web fixes the issue of abnormal judgment of the expiration time of iOS certificates.
  • Web fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted.
  • Web fixes some known errors in demo mode.

4.2.2 (2021-10-15)

Full commit changes

Fixed

  • API fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. #615 Thanks to gin7758258
  • Web fixes the issue of abnormal parsing of some apk Android files. #587

4.2.1 (2021-09-14)

Full commit changes

Changed

  • Web application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB.
  • Docker the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files.

Fixed

  • Web fixes the issue where icons are not displayed correctly after uploading an application.
  • Web is compatible with different dSYM zip extraction logics when uploading.
  • Web fixes the issue where the application icon is not displayed when installing iOS applications.
  • Web fixes a security vulnerability by disabling the editing of read-only system settings.
  • Web fixes the issue where the downloaded file suffix is not correct on macOS.
  • Web fixes the issue where the window showing that an installation is not possible does not pop up in some cases.

4.2.0 (2021-09-01)

Full commit changes

Changed

  • Web changes the default logic for cleaning up old versions to off. To enable, set the environment variable ZEALOT_KEEP_UPLOADS=false. #570
  • Web renames File Parsing to Application Unpacking. #529
  • Web removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)
  • API supports fontawesome css values for custom field icons when uploading applications, such as the value fas fa-flag for flag.
  • Docker changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see #540 for details.

Added

  • Web supports uploading, parsing, and downloading macOS applications. #562
  • Web adds quick filtering options for application types and channels for mobile devices on the channel details page. #510 Thanks to huacnlee
  • Web allows the administrator panel to configure application type templates and default registration user permissions. #562 #568
  • Web partially encrypts environment variables that involve privacy.
  • Web adds graphical displays for memory and disk usage.
  • Docker adds support for synchronizing updates with Github Container Registry images.
  • Docker adds support for configuring the postgres port number with environment variables.

Fixed

  • Web fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. #519 Thanks to ohdarling
  • Web fixes the issue where using third-party login while registering but not verifying email fails. #517 Thanks to huacnlee
  • Web fixes the issue where uploading an application through the website does not trigger application unpacking.
  • Web fixes the issue where the left navigation style is misaligned when tubrolink is enabled.
  • Web displays the unpacking link when uploading Android applications.
  • Web optimizes the display prompt for empty unpacking file lists.
  • Web fixes the issue where LDAP parameters are obtained incorrectly. #541 Thanks to Martwu
  • Web changes the error message for capturing application upload errors to a readable format.
  • Web fixes the issue where the application type creation error judgment is abnormal.
  • Web adds an exception judgment for clicking the details page when all channels of an application are deleted.
  • Web fixes the issue where uploading applications causes variable release errors in the parsing process.
  • Web fixes the issue where an error occurs when verifying password protection for an application. #564 Thanks to EasierLu
  • Web fixes the issue where editing user information in the administrator panel causes an error. #564 Thanks to EasierLu
  • Web fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).
  • Web optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments.
  • Web fixes the issue where the current user cannot be edited.
  • Web corrects the duplicate title of debug files.
  • Docker fixes the logrotate error during image initialization.
  • Docker fixes the issue where Caddy deployment needs to be confirmed. #551 Thanks to ReverseScale

4.1.0 (2021-07-17)

Full commit changes

Changed

  • Web changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop.
  • Docker sets Gihub Container Registry (gcr.io) as the default Docker image source.

Added

  • Web supports one-click login authentication for third-party platforms such as Feishu and Gitlab.
  • Web optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version.
  • Web adds the ability to view some system configuration items and modify some parameters without requiring a restart.
  • Web adds a page statistics report to the management panel.

Fixed

  • Web fixes the issue where the network hook cannot obtain the value of the title variable.
  • Web fixes the abnormal error during application parsing process.
  • Web fixes the abnormal error that occurs during application creation.
  • Web fixes the issue where system configuration cannot be edited due to being saved as empty.
  • Job fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed.

4.0.0 (2020-12-31)

Full commit changes

Fixed

  • Web corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing.
  • Web ignores the default development version number check for new versions.

4.0.0.rc2 (2020-12-25)

Full commit changes

Added

  • Web newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) #346
  • Web adds file parsing data statistics to the control panel.
  • Web adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel.
  • Web adds a quick delete function for authorized personnel to the prompt for missing files in the version details.

Changed

  • API The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. #349

Fixed

  • Web fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)
  • Web corrects the wording of the prompt when opening the version details in WeChat for Android.

4.0.0.rc1 (2020-10-29)

Full commit changes

Changed

  • Docker major change merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly #235
  • Docker upgrades Ruby to version 2.7 for deployment.
  • Web upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly.
  • Web adjusts the wording of invitation emails.
  • Web unifies the download path for applications and debugging files to /download path.
  • Web requires login permission for online application parsing.
  • Web optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details.
  • Web adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop).

Added

  • Web displays a prompt when downloading files that do not exist.
  • Web supports parsing .mobileprovision format files and enabling the parsing of .ipa files online.
  • Web allows some system settings to be modified online using the administrator panel. #245
  • Web adds guest mode. #243
  • Web supports displaying the names of iOS AdHoc version test devices. #211
  • Web supports parsing the content of uploaded version installation packages. #210
  • Web supports obtaining the UDID of iOS devices. #203
  • Web supports a demo mode with limited functionality and periodic data initialization. #198
  • Web displays the original name of the application in the version details after uploading the App.
  • Web allows filtering of the application list by version, Git branch, and packaging type.
  • Web displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)
  • Web integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies.
  • Job supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) #207
  • API adds an interface to check if the debug file exists /api/debug_files/version_exist.

Fixed

  • Web fixes the error when parsing changelog during App upload.
  • Web fixes the issue where the QR code in the version details will exceed the parent view in medium resolution.
  • Web fixes the issue where some values of the application channel are empty and the default value is not displayed.
  • Web optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)
  • Web fixes the issue where the information of the submitter is not displayed for changelogs generated using fastlane-plugin-ci_changelog in the version details.
  • Web fixes and optimizes the logic for checking new versions.
  • Web fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message.
  • Web optimizes the display of the device list in the version details on some mobile phones.
  • Web fixes the error when parsing applications without submitting parameters.
  • Web optimizes the display of the version list on mobile phones.
  • Web only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions.
  • Web fixes the issue where the administrator editing user prompt for a non-empty password.
  • Web/API fixes the issue where the latest version is used when the requested version for online download and installation does not exist.
  • Web fixes the issue where the login interface displays the sidebar menu in guest mode.
  • Web fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded.
  • Web optimizes the display of boolean and dictionary types on the system settings page.
  • Job fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning.
  • Docker fixes the issue where the internal static resources are not updated due to volume storage of the public folder.
  • Docker fixes the issue where the container version is inconsistent with the external version.

4.0.0.beta4 (2020-05-07)

Full commit changes

Added

  • Docker supports deployment on Heroku.
  • Web allows guests to view App details, lists, and upload App details.
  • API supports custom fields when uploading an App. #178
  • Web/API automatically removes the origin/ prefix when passing the branch value during App upload.
  • Web adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting.

Fixed

  • Web corrects user password description text.
  • Web fixes the URL field error in the WebHook.
  • Web/API fixes the error when uploading iOS dSYM files.
  • API fixes the abnormal has_password parameter in the App interface.
  • API fixes the source of uploaded App records always showing as Web.
  • API fixes and supports uploading changelog in JSON format as a string.
  • Web fixes the issue where CPU and memory information cannot be retrieved from system information.
  • Web fixes the occasional error when parsing Android applications online.
  • Web fixes the error when scanning QR code with WeChat.

Changed

  • API adds validation for bundle_id dimension to the latest version interface. (apps/latest)
  • Web allows guests to access application version details and download operations.
  • Web shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default.
  • Web removes the GraphQL console functionality from the development environment and recommends using graphql-playground.
  • Web removes the footbar at the bottom of the page, and the version information can be viewed in the system information.

4.0.0.beta3 (2020-01-16)

Full commit changes

Added

  • Web prompts and displays a confirmation email link for users added by administrators if their email is not activated.
  • Web enables the default Sentry anonymous reporting mechanism (can be turned off).

Fixed

  • API fixes the issue where uploading an application always creates a new channel.
  • Web/API fixes the issue where the icon of uploaded Android applications cannot be displayed.

Changed

  • Docker moves the initialization data out of the image and into zealot-docker image. #120
  • Docker reduces the size of the image from 1.18G to 308M. #114
  • Job uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)
  • Job groups asynchronous tasks and sets priority.
  • API displays all error messages in Chinese because database write operations return specific error messages.
  • Web standardizes code using Rubocop Lint rules.

4.0.0.beta2 (2020-01-10)

Full commit changes

Added

  • Web Added the ability to upload a complete version list to a specific application channel, and support deleting operations.

Fixed

  • Web provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk.
  • API fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database.
  • API only requires token verification for interfaces that perform write operations (previously most interfaces required it).

4.0.0.beta1

🌈 The first public beta version has been released!

Earlier Version:

For many years, it was developed and operated internally within the company and was not open source. It used to undertake many functions, but now it has been separated to focus on providing application hosting and distribution services

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/credits/index.html b/docs/next/user-guide/credits/index.html index e17819f52..28b51c83a 100644 --- a/docs/next/user-guide/credits/index.html +++ b/docs/next/user-guide/credits/index.html @@ -4,15 +4,15 @@ Credits | Zealot - - + +
Version: Next 🚧

Credits

Contributions

Thank you for making Zealot more useful!

Project name

Zealot from the Starcraft species Gods base soldier.

Project history submission resources may be used to for the icon copyright belongs to Blizzard, later changed to their own design icons, if there are enthusiastic designers can help design better icons, I represent this project to express my sincere gratitude.

License

Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at LICENSE file

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/dashboard/index.html b/docs/next/user-guide/dashboard/index.html index ac3d93627..3782c9180 100644 --- a/docs/next/user-guide/dashboard/index.html +++ b/docs/next/user-guide/dashboard/index.html @@ -4,13 +4,13 @@ Dashboard | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/debug-files/index.html b/docs/next/user-guide/debug-files/index.html index 806289256..678f90812 100644 --- a/docs/next/user-guide/debug-files/index.html +++ b/docs/next/user-guide/debug-files/index.html @@ -4,13 +4,13 @@ List debug files | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/debug-files/review/index.html b/docs/next/user-guide/debug-files/review/index.html index db1e33933..5d7adaf85 100644 --- a/docs/next/user-guide/debug-files/review/index.html +++ b/docs/next/user-guide/debug-files/review/index.html @@ -4,13 +4,13 @@ Review metadata | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/debug-files/upload/index.html b/docs/next/user-guide/debug-files/upload/index.html index 80778ab8c..e813933a3 100644 --- a/docs/next/user-guide/debug-files/upload/index.html +++ b/docs/next/user-guide/debug-files/upload/index.html @@ -4,13 +4,13 @@ Create a Debug File | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/index.html b/docs/next/user-guide/index.html index 21b0ad7f1..8ccd72f07 100644 --- a/docs/next/user-guide/index.html +++ b/docs/next/user-guide/index.html @@ -4,8 +4,8 @@ User Guide | Zealot - - + +
@@ -14,7 +14,7 @@ Chat on Telegram Maintainability License

Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.

Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.

PreviewPreview

Features

  • 🌏 Cross-platform hosting: supports macOS, iOS, Android (apk/aab), Windows, Linux extensive platforms.
  • 📱 iOS device in control: automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers.
  • 🧑‍💻 Full developer toolkit: provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building.
  • 💥 Analyze secrets within applications: interpret metadata for iOS or Android applications or describe files.
  • 🚨 Multiple notification built-in: customizable data income WebHook to any notification service.
  • 🗄 Multi-channel classification management: freely divide application channel management into different scenarios and product forms.
  • 🎳 Multiple Architectures amd86/arm64/armv7 architectures deployment ready.
  • 🔑 Third-party Auth: Google, Gitlab, LDAP, OIDC and Lark suppotted.
  • 🌑 Dark mode: Feel free to switch between day and night.

Demo

Simplified Chinese by default, change the language in Settings page.

Notification: There is instability run on a free resource cloud service and RESET ALL DATA daily.

About the translation

The translation powered by DeepL and it inevitably have some defects, please provide feedback in time, thanks!

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/qa/index.html b/docs/next/user-guide/qa/index.html index f6ad85ce7..431858ed4 100644 --- a/docs/next/user-guide/qa/index.html +++ b/docs/next/user-guide/qa/index.html @@ -4,13 +4,13 @@ Q&A | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/next/user-guide/toolkits/fetch-udid/index.html b/docs/next/user-guide/toolkits/fetch-udid/index.html index 957a19ed6..07fbc8e19 100644 --- a/docs/next/user-guide/toolkits/fetch-udid/index.html +++ b/docs/next/user-guide/toolkits/fetch-udid/index.html @@ -4,8 +4,8 @@ Fetch iOS Device UDID | Zealot - - + +
@@ -15,7 +15,7 @@ you still need to manually or script-automate adding the test device to the corresponding Ad-Hoc certificate, then install and repackage it before allowing the device to install the application.

Unregistered DeviceUnregistered Device

Registered Device

For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account.

Registered DeviceRegistered Device - - + + \ No newline at end of file diff --git a/docs/next/user-guide/toolkits/teardown/index.html b/docs/next/user-guide/toolkits/teardown/index.html index 0f14db4d1..adbad2b53 100644 --- a/docs/next/user-guide/toolkits/teardown/index.html +++ b/docs/next/user-guide/toolkits/teardown/index.html @@ -4,13 +4,13 @@ Teardown App view itself metadata | Zealot - - + +
Version: Next 🚧

Teardown App view itself metadata

Android

Retrieve AndroidManifest.xml metadata, v1 to v3 signatures informations.

iOS

Retrieve Info.plist metadata, Frameworks and signatures informations.

- - + + \ No newline at end of file diff --git a/docs/next/user-guide/webhooks/dingtalk/index.html b/docs/next/user-guide/webhooks/dingtalk/index.html index e9a19db3f..c92b72b84 100644 --- a/docs/next/user-guide/webhooks/dingtalk/index.html +++ b/docs/next/user-guide/webhooks/dingtalk/index.html @@ -4,14 +4,14 @@ Dingtalk (Dingding) | Zealot - - + +
Version: Next 🚧

Dingtalk (Dingding)

钉钉 use Incoming Webhooks whose constructs typically support both text and markdown, and can be configured as follows:

Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.

Text format

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Markdown format

The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog.

{
"msgtype": "markdown",
"markdown": {
"title": @title,
"text": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/docs/next/user-guide/webhooks/discord/index.html b/docs/next/user-guide/webhooks/discord/index.html index fbcfc2fb2..ee7fb9662 100644 --- a/docs/next/user-guide/webhooks/discord/index.html +++ b/docs/next/user-guide/webhooks/discord/index.html @@ -4,14 +4,14 @@ Discord | Zealot - - + +
Version: Next 🚧

Discord

Discord should use Slack-Compatible Webhook whose constructs typically support both text and block rich text, and can be configured as follows:

Text format

{
"text": "##{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}"
}

Block rich text format

A simple block with markdown support

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}\nInstal QRcode:\n![qrcode](#{@qrcode_url})"
}
}
]
}

Better look at some of the structures shown in the block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Platform:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*Upload at:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/docs/next/user-guide/webhooks/feishu/index.html b/docs/next/user-guide/webhooks/feishu/index.html index ff45c8891..e270e9178 100644 --- a/docs/next/user-guide/webhooks/feishu/index.html +++ b/docs/next/user-guide/webhooks/feishu/index.html @@ -4,14 +4,14 @@ Lark (Feishu) | Zealot - - + +
Version: Next 🚧

Lark (Feishu)

飞书 use Incoming Webhooks whose constructs typically support both text and interactive card, and can be configured as follows:

Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.

Text format

{
"msg_type": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Interactive card format

Use card format could use partly of markdown syntax:

{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"elements": [
{
"tag": "div",
"text": {
"content": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})",
"tag": "lark_md"
}
},
{
"actions": [{
"tag": "button",
"text": {
"content": "Install",
"tag": "lark_md"
},
"url": @install_url,
"type": "default",
"value": {}
}],
"tag": "action"
}
]
}
}
- - + + \ No newline at end of file diff --git a/docs/next/user-guide/webhooks/index.html b/docs/next/user-guide/webhooks/index.html index 4b1ea0a56..573641f74 100644 --- a/docs/next/user-guide/webhooks/index.html +++ b/docs/next/user-guide/webhooks/index.html @@ -4,8 +4,8 @@ Webhooks | Zealot - - + +
@@ -13,7 +13,7 @@ The webhook is a fully customizable structure that can be used for most notification services, such as Wecom, Dingtalk, Slack, etc.

Payload (default)

Each parameter of the default structure has its value provided as a variable, and each variable starts with @, the default structure will be used if the custom structure is left empty when creating the webhook. The following variables are all provided.

{
event: @event,
title: @title,
app_name: @name,
device_type: @device_type,
release_version: @release_version,
build_version: @build_version,
size: @file_size,
changelog: @changelog,
install_url: @install_url,
icon_url: @icon_url,
qrcode_url: @qrcode_url,
uploaded_at: @uploaded_at
}

Output:

{
"event": "upload_events",
"title": "Zealot upload 1.0.0 version",
"app_name": "Zealot",
"device_type": "iOS",
"release_version": "1.0.0",
"build_version": "1",
"size": "30 MB",
"install_url": "https://zealot.test/api/apps/download/12354",
"icon_url": "https://zealot.test/api/apps/icon.png",
"qrcode_url": "https://zealot.test/api/apps/354/qrcode",
"uploaded_at": "2019-12-30 11:33:00",
"changelog": "- Add feture A\n- Fix issue B\n- Release v1.0.0",
}
- - + + \ No newline at end of file diff --git a/docs/next/user-guide/webhooks/slack/index.html b/docs/next/user-guide/webhooks/slack/index.html index 3d8010dfb..fbef712b8 100644 --- a/docs/next/user-guide/webhooks/slack/index.html +++ b/docs/next/user-guide/webhooks/slack/index.html @@ -4,14 +4,14 @@ Slack | Zealot - - + +
Version: Next 🚧

Slack

Slack use Incoming Webhooks whose constructs typically support both text and block rich text, and can be configured as follows:

Text format

{
"text": "#{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}"
}

Block rich text format

A simple block with markdown support

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}\nInstal QRcode:\n![qrcode](#{@qrcode_url})"
}
}
]
}

Better look at some of the structures shown in the block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Platform:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*Upload at:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/docs/next/user-guide/webhooks/wecom/index.html b/docs/next/user-guide/webhooks/wecom/index.html index 0b52d438e..b250d9700 100644 --- a/docs/next/user-guide/webhooks/wecom/index.html +++ b/docs/next/user-guide/webhooks/wecom/index.html @@ -4,14 +4,14 @@ Wecom (Wechat Work) | Zealot - - + +
Version: Next 🚧

Wecom (Wechat Work)

企业微信 use Incoming Webhooks whose constructs typically support both text and markdown, and can be configured as follows:

Text format

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\nInstall url:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Markdown format

{
"msgtype": "markdown",
"markdown": {
"content": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/docs/self-hosted/configuration/environment-variables/index.html b/docs/self-hosted/configuration/environment-variables/index.html index 0bdcfb6a9..242d7547f 100644 --- a/docs/self-hosted/configuration/environment-variables/index.html +++ b/docs/self-hosted/configuration/environment-variables/index.html @@ -4,8 +4,8 @@ Environment Variables | Zealot - - + +
@@ -19,7 +19,7 @@ specific permission comparison can see here for details

# Guest mode is ON
ZEALOT_GUEST_MODE=true

# Guest mode is OFF
ZEALOT_GUEST_MODE=false

Configure emails

Currently, only smtp is supported to configure email notification service. Email notification mainly affects are user registration, sending activation emails and changing password service, but it does not affect the use if it is not turned on.

# SMTP settings
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=you@gmail.com
SMTP_PASSWORD=yourpassword
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

# Sender and email address by default
ACTION_MAILER_DEFAULT_FROM=you@gmail.com
ACTION_MAILER_DEFAULT_TO=you@gmail.com

Disbale Cable request protection

Experimental:

ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION=true
- - + + \ No newline at end of file diff --git a/docs/self-hosted/configuration/schedule-jobs/index.html b/docs/self-hosted/configuration/schedule-jobs/index.html index e3f831260..b581192ec 100644 --- a/docs/self-hosted/configuration/schedule-jobs/index.html +++ b/docs/self-hosted/configuration/schedule-jobs/index.html @@ -4,8 +4,8 @@ Schedule Jobs | Zealot - - + +
@@ -14,7 +14,7 @@ version basically to meet the vast majority of cases, for example:

Additional: the current logic is relatively trouble-free but inflexible, in fact, there is thought to support a variety of processing logic, see https://github.com/tryzealot/zealot/issues/376

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 9
- 8
...
- 1.0
- 5
- 4
- 3
...

The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4, leaving the final version file as follows:

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 1.0
- 5

If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ZEALOT_KEEP_UPLOADS=false.

info

ZEALOT_KEEP_UPLOADS set true by default.

Backup

When you create any backup it will join itself to the schedule job list.

- - + + \ No newline at end of file diff --git a/docs/self-hosted/configuration/third-party-authentication/index.html b/docs/self-hosted/configuration/third-party-authentication/index.html index 820882b86..7a334265c 100644 --- a/docs/self-hosted/configuration/third-party-authentication/index.html +++ b/docs/self-hosted/configuration/third-party-authentication/index.html @@ -4,13 +4,13 @@ Third-party Authentication | Zealot - - + +
Version: 5.0.0

Third-party Authentication

Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.

Serviceprovider
Feishufeishu
Gitlabgitlab
Googlegoogle_oauth2
LDAPldap
OpenID Connectopenid_connect

If the above services need to set the callback address please set it uniformly as follows

http://zealot.com/users/auth/:provider/callback

where :provider is the identifier of the above supported third-party service, for example:

# if Google is enabled, then replace `:provider` with `google_oauth2`.
http://zealot.com/users/auth/google_oauth2/callback

Gitlab

  1. Register a Gitlab On line account or use self-host service
  2. Create an application in Preferences -> Applications page.
  3. Configure Redirect URI such like http://zealot.com/users/auth/gitlab/callback (replace the domain in your case)
  4. Check scope: read_user,By default zealot only uses this license, if your enable scope is api that's fine too
GITLAB_ENABLED=true
GITLAB_SITE=https://gitlab.com/api/v4
GITLAB_SCOPE=read_user
GITLAB_APP_ID=
GITLAB_SECRET=

Google

  1. Register a Google account
  2. Enable Google Cloud Platform service
  3. Choose or create a Project then go to Credentials page
  4. Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like http://zealot.com/users/auth/google_oauth2/callback (replace the domain in your case)
GOOGLE_OAUTH_ENABLED=true
GOOGLE_CLIENT_ID=
GOOGLE_SECRET=

Feishu (Lark)

  1. Register a feishu (lark) account and download the Phone app.
  2. Enable Open platform and create application to get app_id, app_secret
  3. Configure callback url such like http://zealot.com/users/auth/feishu/callback (replace the domain in your case)
  4. Check user filed information scope: email address (Optional)
  5. Create a version and publish
FEISHU_ENABLED=true
FEISHU_APP_ID=
FEISHU_APP_SECRET=

LDAP

LDAP_ENABLED=true
LDAP_HOST=10.0.0.1
LDAP_PORT=389
LDAP_METHOD=plain
LDAP_BIND_DN="cn=Manager,dc=example,dc=com"
LDAP_PASSWORD=password
LDAP_BASE="ou=People,dc=example,dc=com"
LDAP_UID=uid

OpenID Connect

Supports both auto-discovery mode and manual settings.

Auto-discovery

Turning on auto-discovery mode will automatically fetch the [OIDC_ISSUER_URL]/.well-known/openid-configuration configuration.

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_DISCOVERY=true

Manual

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_AUTH_URI=/authorize
OIDC_TOKEN_URI=/token
OIDC_USERINFO_URI=/userinfo

Above OIDC_AUTH_URI, OIDC_TOKEN_URI, OIDC_USERINFO_URI will use the default path as above if not set.

- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/architecture/index.html b/docs/self-hosted/deployment/architecture/index.html index 6504fc0f5..3bc3b87b5 100644 --- a/docs/self-hosted/deployment/architecture/index.html +++ b/docs/self-hosted/deployment/architecture/index.html @@ -4,13 +4,13 @@ Zealot Architecture | Zealot - - + +
Version: 5.0.0

Zealot Architecture

Running Zealot requires the following set of services.

ArchitectureArchitecture
  • Mostly Linux based on amd86/arm64/armv7.
  • Ruby on Rails powered Web and API services
  • Sidekiq provides asynchronous background task management
  • PostgreSQL database
  • Redis cache
- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/docker/index.html b/docs/self-hosted/deployment/docker/index.html index 700ec0340..ac2791426 100644 --- a/docs/self-hosted/deployment/docker/index.html +++ b/docs/self-hosted/deployment/docker/index.html @@ -4,8 +4,8 @@ Deploy Zealot with Docker guide | Zealot - - + +
@@ -25,7 +25,7 @@ may require the device to also have an SSL certificate installed before accessing and installing the application, and Chrome may also deny access due to the certificate.

If the domain name is unregistered, you need to tie the host to access it, usually by modifying the system's /etc/hosts file.

/etc/hosts
$ sudo vim /etc/hosts

127.0.0.1 zealot.test
- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/docker/step-by-step/index.html b/docs/self-hosted/deployment/docker/step-by-step/index.html index aad4a40ab..c6801e07f 100644 --- a/docs/self-hosted/deployment/docker/step-by-step/index.html +++ b/docs/self-hosted/deployment/docker/step-by-step/index.html @@ -4,8 +4,8 @@ Docker deployment guide | Zealot - - + +
@@ -13,7 +13,7 @@ load the sample application data and set up the administrator account, which is required for subsequent zealot updates.

docker-compose pull

Setup database data

The first time you use it, you will initialize the database, load the sample application data and set up the administrator account, which is required for subsequent zealot updates.

docker-compose run --rm zealot run_upgrade

Launch docker-compose

Manual execution is required to run the service for security periods and user-defined operations:

docker-compose up -d

Advanced

Custom volumes

You have two t

There are two ways to customize the path: (Assuming that the custom path is /data/zealot)

1. Create custom docker volume

docker volume create --name zealot-data \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/zealot-data

docker volume create --name zealot-redis \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/redis

docker volume create --name zealot-postgres \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/postgres

2. Change volumes part of docker-compose file

Open docker-compose.yml file and find volumes::

volumes:
zealot-data:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/data
zealot-redis:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/redis

zealot-postgres:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/postgres
- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/fly/index.html b/docs/self-hosted/deployment/fly/index.html index e4b56fbb4..5955d7db1 100644 --- a/docs/self-hosted/deployment/fly/index.html +++ b/docs/self-hosted/deployment/fly/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Fly guide | Zealot - - + +
Version: 5.0.0

Deploy Zealot to Fly guide

Zealot support use App Configuration (fly.toml) to deploy on fly.io.

Deploying on Fly

  • Install flyctl.
  • Copy full content of app configuration save to fly.toml then change the app value .
  • Run flyctl deploy.
  • Run fly scale vm shared-cpu-1x --memory 512.

App Configuration

app = "[app-name:changeme]"
kill_signal = "SIGINT"
kill_timeout = 120
processes = []

[build]
image = "ghcr.io/tryzealot/zealot:nightly"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 80
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

[[statics]]
guest_path = "/app/public"
url_prefix = "/"
- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/kubernetes/index.html b/docs/self-hosted/deployment/kubernetes/index.html index 67d0ee309..efb25cf42 100644 --- a/docs/self-hosted/deployment/kubernetes/index.html +++ b/docs/self-hosted/deployment/kubernetes/index.html @@ -4,13 +4,13 @@ Deploy Zealot with Kubernetes guide | Zealot - - + +
Version: 5.0.0

Deploy Zealot with Kubernetes guide

Zealot support deployments using Kubernetes, but only .yaml config files are available currently.

Check list

  • ConfigMap and Secret to configure enviroment variables.
  • PersistentVolumeClaim to configure public/uploads, public/bakcup.
  • Deployment to control zealot pod.

Steps

10-zealot-namespace.yml

Zealot namespace.

10-zealot-namespace.yml
api Version: v1
kind: Namespace
metadata:
name: zealot

20-zealot-secrets.yml

Zealot enviroments secrets. This is loaded all secrets enviroments, all values need encryt by base64.

20-zealot-secrets.yml
apiVersion: v1
kind: Secret
metadata:
namespace: zealot
name: zealot-secrets
data:
ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=
ZEALOT_ADMIN_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=
ZEALOT_POSTGRES_PORT: NTQzMg==
ZEALOT_POSTGRES_USERNAME: emVhbG90
ZEALOT_POSTGRES_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_DB_NAME: emVhbG90
REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=

# echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64
SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==

21-zealot-configmap.yml

Zealot enviroments config map. This is loaded safe enviroments.

21-zealot-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: zealot
name: zealot-config
data:
ZEALOT_DOMAIN: zealot.icyleaf.dev
DEFAULT_LOCALE: en
ZEALOT_REGISTER_ENABLED: "true"

30-zealot-storage.yml

The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed.

30-zealot-storage.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-uploads
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-backup
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

40-zealot-deployment.yml

Create zealot deployment, edit replicas and image tag.

40-zealot-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zealot
namespace: zealot
spec:
restartPolicy: Always
replicas: 1
selector:
matchLabels:
app: zealot
template:
metadata:
labels:
app: zealot
spec:
containers:
- name: zealot
image: ghcr.io/tryzealot/zealot:nightly
# imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
envFrom:
- configMapRef:
name: zealot-env
- secretRef:
name: zealot-secrets
volumeMounts:
- mountPath: /app/public/uploads
name: uploads
- mountPath: /app/public/backup
name: backup
volumes:
- name: uploads
persistentVolumeClaim:
claimName: zealot-uploads
- name: backup
persistentVolumeClaim:
claimName: zealot-backup

50-zealot-service.yml

Creating zealot service.

50-zealot-service.yml
apiVersion: v1
kind: Service
metadata:
name: zealot
namespace: zealot
labels:
app: zealot
spec:
selector:
app: zealot
ports:
- port: 80
targetPort: http
name: http
protocol: TCP

60-zealot-ingress.yml

Setting up the ingress for the zealot service.

50-zealot-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zealot
namespace: zealot
annotations:
#cert-manager.io/cluster-issuer: letsencrypt-prod
#kubernetes.io/ingress.class: nginx
spec:
rules:
- host: zealot.icyleaf.dev
http:
paths:
- web:
service:
name: zealot
port:
number: 80
path: /
pathType: Prefix
- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/nomad/index.html b/docs/self-hosted/deployment/nomad/index.html index 08cf48c1d..305d81cfb 100644 --- a/docs/self-hosted/deployment/nomad/index.html +++ b/docs/self-hosted/deployment/nomad/index.html @@ -4,8 +4,8 @@ Deploy Zealot with Nomad guide | Zealot - - + +
@@ -15,7 +15,7 @@ copy the zealot.nomad in previous step and edit a new file named main.tf:

resource "nomad_job" "jobs" {
jobspec = file("${path.module}/zealot.nomad")
}

Execute terraform plan to ensure, then deploy terraform apply.

External Storages

Nomad supports multi-cluster management, and in many cases the storage deployed by the service cannot be mounted directly to the corresponding file system, but is more often placed on top of a shared file storage protocol, such as SMB, NFS, S3, etc.

CSI

Nomad currently supports the CSI in a limited capability (Nomad 1.5). Nomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad. You can find a list of plugins in the Kubernetes CSI Developer Documentation.

PluginSchemesCompatibleterraform nomad resource
kubernetes-csi-driver-smbsmbUnknownUnknown
kubernetes-csi-driver-nfsnfsSupportednomad_csi_volume_registration
kubernetes-csi-driver-iscsiiscsiSupportedSupported
democraticcsi/democratic-csismb/nfs/iscsiSupportednomad_csi_volume
rocketduck/csi-plugin-nfsnfsSupportednomad_csi_volume
- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/railway/index.html b/docs/self-hosted/deployment/railway/index.html index 475aeaa60..7cf71e7d9 100644 --- a/docs/self-hosted/deployment/railway/index.html +++ b/docs/self-hosted/deployment/railway/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Railway guide | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/render/index.html b/docs/self-hosted/deployment/render/index.html index 9da0a5bad..019853236 100644 --- a/docs/self-hosted/deployment/render/index.html +++ b/docs/self-hosted/deployment/render/index.html @@ -4,13 +4,13 @@ Deploy Zealot to Render guide | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/requirements/index.html b/docs/self-hosted/deployment/requirements/index.html index 6f43b2e53..71c135001 100644 --- a/docs/self-hosted/deployment/requirements/index.html +++ b/docs/self-hosted/deployment/requirements/index.html @@ -4,8 +4,8 @@ Zealot Self Hosted Requirements | Zealot - - + +
@@ -15,7 +15,7 @@ The storage requirements for Redis are minimal, You can start with 50MB and scale up as required.

Redis version 6.2 or higher version is recommended

Sidekiq

Sidekiq processes the background jobs with a multi-threaded process. This process starts with the entire Rails stack but it can grow over time due to memory leaks. On a very active server the Sidekiq process can use 1GB+ of memory.

Supported web browsers

tip

We don't support running Zealot with JavaScript disabled in the browser.

Zealot supports the following web browsers:

- - + + \ No newline at end of file diff --git a/docs/self-hosted/deployment/source-code/index.html b/docs/self-hosted/deployment/source-code/index.html index efb20aba5..24f646bba 100644 --- a/docs/self-hosted/deployment/source-code/index.html +++ b/docs/self-hosted/deployment/source-code/index.html @@ -4,13 +4,13 @@ Source code | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/self-hosted/index.html b/docs/self-hosted/index.html index 591e18e2b..2ba203d62 100644 --- a/docs/self-hosted/index.html +++ b/docs/self-hosted/index.html @@ -4,13 +4,13 @@ Self-hosted Installation Guide | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/self-hosted/reverse-proxies/index.html b/docs/self-hosted/reverse-proxies/index.html index 6228218fc..9320a35d9 100644 --- a/docs/self-hosted/reverse-proxies/index.html +++ b/docs/self-hosted/reverse-proxies/index.html @@ -4,8 +4,8 @@ Reverse Proxies | Zealot - - + +
@@ -15,7 +15,7 @@ routing rules (including access port number, domain name binding and SSL)

Traefik service

entryPoints:
web:
address: ":80"

websecure:
address: ":443"

certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web

Docker

Enable Docker provider then edit the Docker Compose file:

docker-compose.yml
version: '3'
services:
zealot:
<<: *defaults
labels:
- "traefik.enable=true"
- "traefik.http.services.zealot.loadbalancer.server.port=80"
- "traefik.http.routers.zealot.service=zealot"
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"
- "traefik.http.routers.zealot.tls=true"
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt"
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
# Comment port, no need to public
# ports:
# - "8901:80"
network:
# Change the network what traefik service is
- traefik-services

networks:
# Change the network what traefik service is
traefik-services:
external: true

Deployment with Docker is limited to Traefik and Zealot service are usually in the same OS system of the same machine, cross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options.

Consul

Enable Consul provider or Consul Catalog provider, add key-value below:

consul kv put traefik/http/services/zealot/loadbalancer/server/port 5
consul kv put traefik/http/routers/zealot/service zealot
consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'
consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt
consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev
consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev

Nomad

Enable Nomad provider and make sure Nomad version >= 1.3:

zealot.nomad
job "zealot" {
datacenters = ["dc1"]
type = "service"

group "zealot" {
count = 1

network {
port "http"{
static = 80
}
}

service {
name = "zealot-http"
provider = "nomad"
port = "http"
}

task "server" {
driver = "docker"
config {
image = "ghcr.io/tryzealot/zealot:nightly"
ports = ["http"]
args = [
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",
- "traefik.http.routers.zealot.tls=true",
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt",
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
]
}
}
}
}

Caddy 2

The configuration only needs to relate the ip part after tls and proxy:

Caddyfile
:443

log

# Use Let's Encrypt service
tls your-email@example.com

reverse_proxy 172.16.56.100:8901

Nginx

The following is the general configuration, if not effects welcome to file a issue:

conf.d/zealot.conf
upstream zealot {
zone upstreams 64K;
server 172.16.56.100:8901;
keepalive 32;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name zealot.icyleaf.dev;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2; # Optional: http2 may needs install extension
listen [::]:443 ssl http2;
server_name zealot.icyleaf.dev;

ssl_certificate /etc/certs/zealot-cert.pem;
ssl_certificate_key /etc/certs/zealot.pem;

# Optional
# ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
# ssl_session_timeout 5m;
# ssl_session_cache shared:SSL:1m;
# ssl_prefer_server_ciphers on;

location / {
proxy_pass http://zealot;
proxy_redirect off;

proxy_pass_header Authorization;
proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Ssl on; # Optional
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

client_max_body_size 0;
proxy_read_timeout 36000s;
}
}

And you need update max body size in http block. Recommended is 200MB, if it's a game, 50% more can be played to make a surplus according to the actual file size.

nginx.conf
http {
[...]

client_max_body_size 200M;
}
- - + + \ No newline at end of file diff --git a/docs/self-hosted/storage/index.html b/docs/self-hosted/storage/index.html index 8f42a3407..e82352a47 100644 --- a/docs/self-hosted/storage/index.html +++ b/docs/self-hosted/storage/index.html @@ -4,8 +4,8 @@ Data storages | Zealot - - + +
@@ -13,7 +13,7 @@ for those who are able to manually backup and restore data before better backup management tools are available.

Postgres

This is used to store and manage all data related to Zealot, so it goes without saying.

Redis

Currently only the sidekiq asynchronous task service is using it to store some task status and statistics.

File storage

The Zealot service relies on postgresql, redis and some other disk storage for uploaded application and debug files. It is currently stored in the filesystem in the public/uploads directory.

  • apps The directory for uploading applications
  • debugs_files directory for uploading debug files

Backup storage

The Zealot service currently supports command-generated backup data, which will contain the database and binary packages of the uploaded apps and debug files.

The backup data is currently stored in the file system in the public/backup directory.

- - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/apple-team/index.html b/docs/user-guide/administrator/apple-team/index.html index ed218bb38..accf44186 100644 --- a/docs/user-guide/administrator/apple-team/index.html +++ b/docs/user-guide/administrator/apple-team/index.html @@ -4,8 +4,8 @@ Apple Team (Developer) | Zealot - - + +
@@ -22,7 +22,7 @@ recognizable and friendly device names.

Register processingRegister processing

Although providing the UDID of a device confirms which applications can be installed, providing a feature to register a testing device that has not been registered with any application would greatly improve the efficiency of the team. This is the role of the Apple Developer feature.

Apple deveoper detail previewApple deveoper detail preview

The initial feature introduction: https://github.com/tryzealot/zealot/issues/723.

- - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/backup/index.html b/docs/user-guide/administrator/backup/index.html index e698a3b30..41d8aee4d 100644 --- a/docs/user-guide/administrator/backup/index.html +++ b/docs/user-guide/administrator/backup/index.html @@ -4,13 +4,13 @@ Backup Schedule | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/monitoring/background-jobs/index.html b/docs/user-guide/administrator/monitoring/background-jobs/index.html index 8ce676320..625199339 100644 --- a/docs/user-guide/administrator/monitoring/background-jobs/index.html +++ b/docs/user-guide/administrator/monitoring/background-jobs/index.html @@ -4,13 +4,13 @@ Background Jobs | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/monitoring/database-analytics/index.html b/docs/user-guide/administrator/monitoring/database-analytics/index.html index 7b2cfac71..bacec0700 100644 --- a/docs/user-guide/administrator/monitoring/database-analytics/index.html +++ b/docs/user-guide/administrator/monitoring/database-analytics/index.html @@ -4,13 +4,13 @@ Database Analytics | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/monitoring/logging/index.html b/docs/user-guide/administrator/monitoring/logging/index.html index b48e2dcea..3565509b7 100644 --- a/docs/user-guide/administrator/monitoring/logging/index.html +++ b/docs/user-guide/administrator/monitoring/logging/index.html @@ -4,13 +4,13 @@ Logging | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/monitoring/system-info/index.html b/docs/user-guide/administrator/monitoring/system-info/index.html index 10981eba7..e644b56bd 100644 --- a/docs/user-guide/administrator/monitoring/system-info/index.html +++ b/docs/user-guide/administrator/monitoring/system-info/index.html @@ -4,13 +4,13 @@ System informations | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/permissions/index.html b/docs/user-guide/administrator/permissions/index.html index 89cca0fea..5f0e46a7e 100644 --- a/docs/user-guide/administrator/permissions/index.html +++ b/docs/user-guide/administrator/permissions/index.html @@ -4,13 +4,13 @@ User Permissions and roles | Zealot - - + +
Version: 5.0.0

User Permissions and roles

Zealot offers four types of user permissions.

  • Guest
  • User
  • Developer
  • Administrator

Comparison

ActionGuest[On/Off]UserDeveloperAdministrator
Dashboard
View all data
✓/✕
App
View app list
✓/✕
App
View app scheme(s) and channel(s) detail
✓/✕
App
View the build(release) of app
✓/✓
Password Auth
App
View webhook list
✓/✕
App
Upload/Install/Download app
App
Create/Edit/Delete an app
App
Create/Edit/Delete a scheme/channel of app
App
Delete a given version of app
App
Test a webhook network connection
App
Enable/Disable webhook
App
Delete an app
DebugFile
View debug file list
✓/✕
DebugFile
View debug file detail
DebugFile
Download debug file
DebugFile
Upload/Delete a debug file
Teardown
View teardown list
✓/✕
Teardown
View teardown detail
✓/✕
Teardown
Delete a teardown
Admin
View and manage users
Admin
View and manage webhooks
Admin
View and manage settings
Admin
View system informations
Admin
View and manage background jobs
Admin
View page analytices
- - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/project-settings/index.html b/docs/user-guide/administrator/project-settings/index.html index 2782bb77a..3776f048f 100644 --- a/docs/user-guide/administrator/project-settings/index.html +++ b/docs/user-guide/administrator/project-settings/index.html @@ -4,13 +4,13 @@ Project Settings | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/administrator/settings/index.html b/docs/user-guide/administrator/settings/index.html index 879278345..68976eaa1 100644 --- a/docs/user-guide/administrator/settings/index.html +++ b/docs/user-guide/administrator/settings/index.html @@ -4,13 +4,13 @@ Settings | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/apps/create/index.html b/docs/user-guide/apps/create/index.html index 6764679b8..5800783f9 100644 --- a/docs/user-guide/apps/create/index.html +++ b/docs/user-guide/apps/create/index.html @@ -4,13 +4,13 @@ Create an App | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/apps/detail/index.html b/docs/user-guide/apps/detail/index.html index 4a5b4f0c5..2a6fde107 100644 --- a/docs/user-guide/apps/detail/index.html +++ b/docs/user-guide/apps/detail/index.html @@ -4,13 +4,13 @@ Uploaded releases | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/apps/index.html b/docs/user-guide/apps/index.html index 41aeff14b..6063e17cf 100644 --- a/docs/user-guide/apps/index.html +++ b/docs/user-guide/apps/index.html @@ -4,13 +4,13 @@ Manage apps | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/apps/upload/index.html b/docs/user-guide/apps/upload/index.html index 718b08374..9ffede054 100644 --- a/docs/user-guide/apps/upload/index.html +++ b/docs/user-guide/apps/upload/index.html @@ -4,13 +4,13 @@ Uploaded a release | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/best_practices/index.html b/docs/user-guide/best_practices/index.html index 148503cde..7329987d3 100644 --- a/docs/user-guide/best_practices/index.html +++ b/docs/user-guide/best_practices/index.html @@ -4,8 +4,8 @@ Best Practices | Zealot - - + +
@@ -13,7 +13,7 @@ it is highly recommended to install the following plug-ins in addition to fastlane.

  • ci_changelog | Support for multiple CI systems to automatically generate change history
  • update_jenkins_build | Automatically Update Jenkins Build Description
  • humanable_build_number | Generate a build version number that is recognizable to development
  • app_info | View metadata about the application after successful packaging
  • ram_disk | Create in-memory virtual disks, mainly used to improve App build speed (consider if memory is large)
  • debug_file | Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files
# Build and upload ipa to zealot service
lane :upload_app do
# Building the package file, using gym in iOS, gradle in Android
gym

# Uploading to Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# Uploading dSYM file to Zealot
zealot_debug_file(
scheme: 'AppName'
)
end

# Build android package file and generate progguard then upload to zealot service
lane :upload_debug_file do
# Building the package file, using gym in iOS, gradle in Android
gradle

# Automated search for iOS/macOS dSYM or Android Proguard (obfuscation) and packaging of Zip files
debug_file

# Uploading to Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# Uploading Proguard file to Zealot
zealot_debug_file(
build_type: 'release',
flavor: 'googleplay'
)
end

CI/CD Service

For example, Jenkins, configure the project, set up the git hook to trigger packaging, nothing to say

Zealot Service

In addition to managing each uploaded application and debug file, each time an uploaded application is received, a configured web hook is triggered to send a notification to the third-party service that a new version has been received, and for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time.

- - + + \ No newline at end of file diff --git a/docs/user-guide/changelog/index.html b/docs/user-guide/changelog/index.html index 0ab85f3e3..e712ac4f0 100644 --- a/docs/user-guide/changelog/index.html +++ b/docs/user-guide/changelog/index.html @@ -4,15 +4,15 @@ Change Log | Zealot - - + +
Version: 5.0.0

Change Log

Unreleased

tip

The following list of changes is the list that has not yet been released, code change history: Unreleased

Added

  • Web/API supports hosting of general applications (those that can be parsed automatically and those that cannot be parsed are skipped), and Windows and Linux platforms are added by default #1121
  • Web/API adds support for hosting Windows applications (uploading and displaying metadata parsing) #1124
  • Web has a new debugging file page and adds support for parsing and hosting multiple dSYM debugging files #1127 #1124 #961
  • Web supports unpacking v1, v2, and v3 signature information for Android applications #1124
  • Web strengthens X509 certificate information for unpacking Android and iOS applications #1124
  • Web adds a "Reparse" function to update the metadata of old structure debugging files
  • Web supports markdown format for change logs of uploaded application versions
  • Web settings page can configure the global "minimum number of items returned per page" and "maximum number of items"
  • Web for iOS applications, the application version details page displays the expiration time information of the signing certificate and the logical restriction of installation failure due to expired signing certificate (can be downloaded)
  • Web adds or updates JSON format verification to network hooks and settings pages.
  • Web supports registering test devices to Apple developers with custom device names and editing/updating device names after creation.
  • Web supports downloading private key certificates for Apple developers.

Fixed

  • Web fixes the issue of being unable to delete unpacked applications
  • Web optimizes the style of some pages
  • Web corrects errors in the English language package (en language i18n)
  • Web fixes the error page that appears when creating an empty application type
  • Web fixes the 404 error page that appears when a file is not found.
  • API fixes the logic optimization of comparing build_version for retrieving the latest version of an application.
  • Web optimizes the error handling for custom field format during application upload.
  • Web optimizes the correct redirection for URL injection, empty application history versions, and unregistered devices.
  • Web optimizes the display of error information for backup tasks.
  • Web adds type detection for application types and debug files during application upload.
  • Web fixes the error message of not preselecting the creation of a Distribution Certificate for Apple developers.

4.7.1 (2023-03-10)

Support for parsing aab applications generated by the latest Android aapt2 build tool, full [commit changes][4.7.1]

Fixed

  • Web upgrades to the latest appt2 model to avoid exceptions when parsing aab files.
  • Web implements duplicate processing for parsing exceptions.

Added

  • Web adds application types to the details page of unpacked Android applications.
  • Web adjusts the original page after editing an application channel.

4.7.0 (2023-03-03)

Major Change The minimum version of Redis dependencies has been updated from 5.x to 6.2+. Full commit changes

Changed

  • Docker Major Change The minimum version of Redis dependencies has been updated from 5.x to 6.2+. It is recommended to use version 7.x. When upgrading, please manually modify the settings.

Added

  • Web adds a control switch for "New Upload Version Prompt Window" to application types. #1058 Thanks to softwind0214
  • Web allows clicking on the application icon on the application list page to jump to the application details page.
  • Web adds the display of the version number of dependent services to the environment information.
  • Web adds support for displaying nightly build versions in the version number.

Fixed

  • Web downgrades Ruby version to 3.0 temporarily to solve the iOS application parsing crash caused by the high version. See #1070 for details.
  • Web fixes the display order of applications/types/channels, which is now fixed as ascending order of creation time.
  • Web fixes the issue where there is no confirmation prompt when a user logs out.
  • Web fixes the issue where the main historical version of an application cannot be deleted.
  • Web improves the style of multiple pages.
  • Web no longer displays Javascript debugger logs in production environments.

4.6.0 (2023-01-17)

The runtime environment has been upgraded to Ruby 3.2 and now supports arm64 platforms. Full commit changes

Fixed

  • Web captures the issue of creating an application channel with an empty name. #968 Thanks to congpeijun
  • Web improves the logic for backup files that do not exist on disk. #995

Added

  • Docker supports arm64/v8 and armv7 arch. #970
  • Web Adopted a new 50x error page.

Changed

  • Web upgrades the Ruby version to 3.2 in development environments, and devcontainers and containers now have the YJIT feature enabled by default. #1011
  • API updates the data structure of the debug file return and changes the status code from 204 to 200.

4.5.3 (2022-11-22)

Full commit changes

Fixed

  • Web Fixes the issue where third-party login cannot be redirected. #949 Thanks to softwind0214

Added

  • Docker Adds a new environment variable to disable the request protection of WebSocket (ActionCable) requests (experimental). #950

4.5.2 (2022-11-01)

Full commit changes

Fixed

  • Web fixes the issue where registering a test device is abnormal. #935 Thanks to ycy0430
  • Web adapts the QR code to support dark mode.
  • Web corrects the English language pack.

Added

  • WebHook Income webhook body structure adds the username and email fields. #934 Thanks to rkonfj
  • Docker The SIDEKIQ_CONCURRENCY environment variable is now supported to set the concurrency of background tasks, with a default value of 5.

Changed

  • Docker reduces security risks by changing the Web service, which includes puma and pumacontrolserver, to listen on 127.0.0.1.
  • Web optimizes the wording of the iOS device UDID profile.
  • Web updates the text at the bottom of the page. Thanks to Rails and the AdminLTE open source project!

4.5.1 (2022-09-14)

Full commit changes

Fixed

  • Web Fixes the issue where the application unpacking results in parsing errors.

4.5.0 (2022-08-19)

Supports the 🌑 dark mode and managing the test devices of an 👨🏻‍🔧 Apple developer account! Full commit changes

Added

  • Web supports dark mode. #816
  • Web adds Apple developer management for registering test devices. #817
  • Web adds data backup management. #835
  • Web completes the monitoring of dependent services in the management panel. #586
  • API adds three fields, platform, device_type, and custom_fields, to the release dictionary.

Changed

  • Web Incompatible change Google Analytics forces an upgrade to version 4, and previous settings need to be reconfigured to take effect. #815
  • CLI Incompatible change The data backup and restore functionality is no longer available due to changes in the structure. Please use the data backup function in the admin panel instead.
  • Web adjusts the display of device UDID acquisition, iOS version installation and download based on the device, no longer displaying all functions.
  • Web removes the page statistics function in the admin panel. #814
  • Web migrates the front-end technology stack from webpacker to esbuild + sass, and from Turbolinks to Stimulus, bringing a better front-end interaction experience. #829
  • Web due to the complexity of editing application types and channels, only the application name can be modified.

Fixed

  • Web fixes the error of selecting a channel that does not exist under an application type. #795 Thanks to tasselsd
  • API fixes the Android address return error. #813 Thanks to denymz
  • Web/API fixes the exception caused by some parameters being empty in aab parsing. tryzealot/fastlane-plugin-zealot#9 Thanks to tasselsd
  • Web fixes the issue of abnormal generation of demo data during the first initialization of the project. #821
  • API fixes the issue of abnormal data when checking the latest version of the application. #856 Thanks to denymz
  • Web fixes the issue of an error being thrown due to abnormal data in the associated network hook when viewing the details of an application channel.
  • Web corrects many spelling errors in the English language pack.

4.4.1 (2022-06-20)

Full commit changes

Fixed

  • WebHook fixes the issue where an error is thrown after a successful trigger. #792 Thanks to tasselsd
  • Docker compatible with Caddy 2.5.0 for proxying from https to http. #790 Thanks to VisionBao songge1209

4.4.0 (2022-06-09)

Full commit changes

Changed

  • Web adds filtering by version, branch, and packaging type to the list display for users who are not logged in and have not enabled guest mode, in addition to viewing application version details.
  • Web upgrades the runtime environment to Ruby 3.0 and the service framework to Rails 7.0.
  • Web is now compatible with the macOS M1 chip.

Added

  • Web simplifies and standardizes some application links to facilitate sharing. #666
  • Web completes some missing permission check pages.

Fixed

  • Job fixes the issue of abnormal URL Schemes when parsing iOS files.
  • Web fixes the issue where service logs are not output to the terminal console.
  • Web adds exception handling for processing debug files uploaded when they are deleted during parsing or cannot be found for other reasons.
  • Web adapts the UI for ultra-wide screens.
  • Web fixes security vulnerabilities in third-party login dependencies.
  • API fixes the issue where uploading Android without channel_key results in an exception. #779 Thanks to likfe

4.3.1 (2021-12-22)

Full commit changes

Added

  • Web after updating the setting, the original default value can be restored.
  • Web supports parsing and displaying app links (distinguishing between deep links and URL schemes) for Android in application unpacking.
  • Web strengthens the visual effect of the open and closed status of the setting page.

Fixed

  • Web fixes the issue of asynchronous task methods in demo mode.
  • Web fixes the issue where selected application types and channels cannot be checked when creating and editing an application.
  • Web fixes the issue where it is not possible to navigate to the environment page.
  • Web fixes the issue where aab parsing fails when there are no intent filters.
  • Web adds error handling for unchecking all application types and channels when updating an application.
  • Web fixes the issue where the loading strategy causes all third-party logins to be unavailable.

4.3.0 (2021-12-08)

Supports parsing of the aab format, adds support for multiple languages. Full commit changes

Changed

  • Web uses the default prompt structure as the data structure for network hooks, instead of a strange structure.
  • Web no longer provides parameter changes for third-party login authorization on the settings page (requires service restart).
  • API the upload application interface and version details return the text_changelog field in the response body. 650f1ffd
  • API renames the changelog_list field in the response body to changelog. 719f0b1e
  • Web changes the log output format from an array to text format that is compatible with Markdown lists. 719f0b1e
  • Web some privacy-related configuration keys or tokens are only displayed in plaintext under administrator permissions; other permissions cannot see them; demo mode is read-only and will do some encryption. #644
  • Web does not display the build date and hash value if they cannot be obtained.

Added

  • Web supports parsing of the Android App Bundle (aab) file format and webp icons.
  • Web supports language internationalization, with optional language packs: Simplified Chinese, English (support for page configuration).
  • Web supports configuring more system settings. #643
  • Web adds editing functionality for network hooks in the management panel.
  • Web rewrites and optimizes the style layout of the application list.
  • Web optimizes the basic email template.
  • Web adjusts the style and error logic of the login window.
  • Web adds file permission checking to the environment variable page in the management panel. #608
  • Web adds error details display for asynchronous tasks in the management panel, with a maximum of 5000 errors.
  • Web uses a better log output format. #646

Fixed

  • Web fixes the issue where the default selection state of boolean type parameters is incorrect on the settings page.
  • Web fixes the issue where exceptions occur when clicking install or download in the DingTalk app (changed to WeChat logic processing).
  • Web fixes the issue where the build date (time stamp when building a Docker image) cannot be displayed on the environment page.
  • Web fixes the issue where the domain scope of asynchronous notifications does not take effect.
  • Web fixes the issue of exception when getting gems.
  • Web fixes the issue of abnormal judgment of the expiration time of iOS certificates.
  • Web fixes the issue where disk space cannot be obtained when developing with a virtual machine mounted.
  • Web fixes some known errors in demo mode.

4.2.2 (2021-10-15)

Full commit changes

Fixed

  • API fixes the issue where incorrect error messages were not output due to parameter mismatches caused by batch replacements. #615 Thanks to gin7758258
  • Web fixes the issue of abnormal parsing of some apk Android files. #587

4.2.1 (2021-09-14)

Full commit changes

Changed

  • Web application icons are no longer cropped to the preset size, and image processing dependencies have been removed, reducing the Docker image size by nearly 200MB.
  • Docker the reverse proxy service Caddy no longer outputs logs to STDOUT but directly to files.

Fixed

  • Web fixes the issue where icons are not displayed correctly after uploading an application.
  • Web is compatible with different dSYM zip extraction logics when uploading.
  • Web fixes the issue where the application icon is not displayed when installing iOS applications.
  • Web fixes a security vulnerability by disabling the editing of read-only system settings.
  • Web fixes the issue where the downloaded file suffix is not correct on macOS.
  • Web fixes the issue where the window showing that an installation is not possible does not pop up in some cases.

4.2.0 (2021-09-01)

Full commit changes

Changed

  • Web changes the default logic for cleaning up old versions to off. To enable, set the environment variable ZEALOT_KEEP_UPLOADS=false. #570
  • Web renames File Parsing to Application Unpacking. #529
  • Web removes support for unpacking previously uploaded applications in the application unpacking feature. (now all uploaded applications will automatically trigger additional application unpacking)
  • API supports fontawesome css values for custom field icons when uploading applications, such as the value fas fa-flag for flag.
  • Docker changes the image to use caddy as a reverse proxy and modifies the volume persistence. Migration is required, see #540 for details.

Added

  • Web supports uploading, parsing, and downloading macOS applications. #562
  • Web adds quick filtering options for application types and channels for mobile devices on the channel details page. #510 Thanks to huacnlee
  • Web allows the administrator panel to configure application type templates and default registration user permissions. #562 #568
  • Web partially encrypts environment variables that involve privacy.
  • Web adds graphical displays for memory and disk usage.
  • Docker adds support for synchronizing updates with Github Container Registry images.
  • Docker adds support for configuring the postgres port number with environment variables.

Fixed

  • Web fixes the issue where the iOS installation button cannot be displayed on iPad and M1 chip macOS. #519 Thanks to ohdarling
  • Web fixes the issue where using third-party login while registering but not verifying email fails. #517 Thanks to huacnlee
  • Web fixes the issue where uploading an application through the website does not trigger application unpacking.
  • Web fixes the issue where the left navigation style is misaligned when tubrolink is enabled.
  • Web displays the unpacking link when uploading Android applications.
  • Web optimizes the display prompt for empty unpacking file lists.
  • Web fixes the issue where LDAP parameters are obtained incorrectly. #541 Thanks to Martwu
  • Web changes the error message for capturing application upload errors to a readable format.
  • Web fixes the issue where the application type creation error judgment is abnormal.
  • Web adds an exception judgment for clicking the details page when all channels of an application are deleted.
  • Web fixes the issue where uploading applications causes variable release errors in the parsing process.
  • Web fixes the issue where an error occurs when verifying password protection for an application. #564 Thanks to EasierLu
  • Web fixes the issue where editing user information in the administrator panel causes an error. #564 Thanks to EasierLu
  • Web fixes the issue where the "Install" button on the application details page is displayed abnormally on incorrect systems and devices (normally only iOS applications are displayed on iOS and macOS devices).
  • Web optimizes the unpacking of applications for developer certificates that fail to parse due to special character sets (currently known to be Chinese encoding) and UI layout adjustments.
  • Web fixes the issue where the current user cannot be edited.
  • Web corrects the duplicate title of debug files.
  • Docker fixes the logrotate error during image initialization.
  • Docker fixes the issue where Caddy deployment needs to be confirmed. #551 Thanks to ReverseScale

4.1.0 (2021-07-17)

Full commit changes

Changed

  • Web changes the display logic for obtaining device UDID due to the similarity of iPad's User-Agent and Desktop.
  • Docker sets Gihub Container Registry (gcr.io) as the default Docker image source.

Added

  • Web supports one-click login authentication for third-party platforms such as Feishu and Gitlab.
  • Web optimizes the logic for accessing the version details page of an application that cannot be found and allows manual redirection to the latest version.
  • Web adds the ability to view some system configuration items and modify some parameters without requiring a restart.
  • Web adds a page statistics report to the management panel.

Fixed

  • Web fixes the issue where the network hook cannot obtain the value of the title variable.
  • Web fixes the abnormal error during application parsing process.
  • Web fixes the abnormal error that occurs during application creation.
  • Web fixes the issue where system configuration cannot be edited due to being saved as empty.
  • Job fixes the issue where the logic for removing old versions causes the deletion logic and document logic to be reversed.

4.0.0 (2020-12-31)

Full commit changes

Fixed

  • Web corrects the display error caused by abnormal judgment of the expiration time of the iOS certificate during file parsing.
  • Web ignores the default development version number check for new versions.

4.0.0.rc2 (2020-12-25)

Full commit changes

Added

  • Web newly parsed files will be saved to the list, and a file parsing for uploaded applications will also be synchronized. (asynchronous task) #346
  • Web adds file parsing data statistics to the control panel.
  • Web adds data statistics for network hooks, background tasks, and disk usage for administrators in the control panel.
  • Web adds a quick delete function for authorized personnel to the prompt for missing files in the version details.

Changed

  • API The debug file version check interface has been renamed, and new check methods based on file fingerprints and dSYM UUID have been added. #349

Fixed

  • Web fixes the error when disabling LDAP login authentication. (caused by incorrect IP whitelist settings)
  • Web corrects the wording of the prompt when opening the version details in WeChat for Android.

4.0.0.rc1 (2020-10-29)

Full commit changes

Changed

  • Docker major change merges rails and worker into the same image for deployment. zealot-docker library needs to be updated accordingly #235
  • Docker upgrades Ruby to version 2.7 for deployment.
  • Web upgrades font-awesome from version 4.7.0 to 5.13.0, which may cause missing icons to display improperly.
  • Web adjusts the wording of invitation emails.
  • Web unifies the download path for applications and debugging files to /download path.
  • Web requires login permission for online application parsing.
  • Web optimizes the logic for automatically redirecting to the latest version when accessing deleted or non-existent version details.
  • Web adjusts the installation and download logic of applications (mainly due to the inability to distinguish between iPadOS UserAgent and Desktop).

Added

  • Web displays a prompt when downloading files that do not exist.
  • Web supports parsing .mobileprovision format files and enabling the parsing of .ipa files online.
  • Web allows some system settings to be modified online using the administrator panel. #245
  • Web adds guest mode. #243
  • Web supports displaying the names of iOS AdHoc version test devices. #211
  • Web supports parsing the content of uploaded version installation packages. #210
  • Web supports obtaining the UDID of iOS devices. #203
  • Web supports a demo mode with limited functionality and periodic data initialization. #198
  • Web displays the original name of the application in the version details after uploading the App.
  • Web allows filtering of the application list by version, Git branch, and packaging type.
  • Web displays the Git commit link associated with the latest upload in the version details. (if the git URL is set in the channel settings)
  • Web integrates LDAP login into the existing login interface and no longer uses the crude interface provided by third-party dependencies.
  • Job supports managing the generation and recovery of data backup using rails commands. (database and uploaded file data) #207
  • API adds an interface to check if the debug file exists /api/debug_files/version_exist.

Fixed

  • Web fixes the error when parsing changelog during App upload.
  • Web fixes the issue where the QR code in the version details will exceed the parent view in medium resolution.
  • Web fixes the issue where some values of the application channel are empty and the default value is not displayed.
  • Web optimizes the content display when parsing iOS packages online. (and solves the problem of always displaying fake data)
  • Web fixes the issue where the information of the submitter is not displayed for changelogs generated using fastlane-plugin-ci_changelog in the version details.
  • Web fixes and optimizes the logic for checking new versions.
  • Web fixes the issue where the pop-up window for confirming the deletion of debug files displays an empty message.
  • Web optimizes the display of the device list in the version details on some mobile phones.
  • Web fixes the error when parsing applications without submitting parameters.
  • Web optimizes the display of the version list on mobile phones.
  • Web only displays the bottom pagination for the latest upload dynamics of channel versions, and the top displays the total number of versions.
  • Web fixes the issue where the administrator editing user prompt for a non-empty password.
  • Web/API fixes the issue where the latest version is used when the requested version for online download and installation does not exist.
  • Web fixes the issue where the login interface displays the sidebar menu in guest mode.
  • Web fixes the issue where the same debugging file of the same application and platform is always overwritten when uploaded.
  • Web optimizes the display of boolean and dictionary types on the system settings page.
  • Job fixes the issue where old versions were accidentally deleted due to a version judgment error during scheduled cleaning.
  • Docker fixes the issue where the internal static resources are not updated due to volume storage of the public folder.
  • Docker fixes the issue where the container version is inconsistent with the external version.

4.0.0.beta4 (2020-05-07)

Full commit changes

Added

  • Docker supports deployment on Heroku.
  • Web allows guests to view App details, lists, and upload App details.
  • API supports custom fields when uploading an App. #178
  • Web/API automatically removes the origin/ prefix when passing the branch value during App upload.
  • Web adds project introduction to user authentication interfaces such as login, registration, password retrieval, and password resetting.

Fixed

  • Web corrects user password description text.
  • Web fixes the URL field error in the WebHook.
  • Web/API fixes the error when uploading iOS dSYM files.
  • API fixes the abnormal has_password parameter in the App interface.
  • API fixes the source of uploaded App records always showing as Web.
  • API fixes and supports uploading changelog in JSON format as a string.
  • Web fixes the issue where CPU and memory information cannot be retrieved from system information.
  • Web fixes the occasional error when parsing Android applications online.
  • Web fixes the error when scanning QR code with WeChat.

Changed

  • API adds validation for bundle_id dimension to the latest version interface. (apps/latest)
  • Web allows guests to access application version details and download operations.
  • Web shifts the device list on the right-hand side of iOS AdHoc application version details to the left and collapses it by default.
  • Web removes the GraphQL console functionality from the development environment and recommends using graphql-playground.
  • Web removes the footbar at the bottom of the page, and the version information can be viewed in the system information.

4.0.0.beta3 (2020-01-16)

Full commit changes

Added

  • Web prompts and displays a confirmation email link for users added by administrators if their email is not activated.
  • Web enables the default Sentry anonymous reporting mechanism (can be turned off).

Fixed

  • API fixes the issue where uploading an application always creates a new channel.
  • Web/API fixes the issue where the icon of uploaded Android applications cannot be displayed.

Changed

  • Docker moves the initialization data out of the image and into zealot-docker image. #120
  • Docker reduces the size of the image from 1.18G to 308M. #114
  • Job uses asynchronous tasks instead of traditional cron jobs to implement scheduled cleaning of old version history package files. (can be turned off)
  • Job groups asynchronous tasks and sets priority.
  • API displays all error messages in Chinese because database write operations return specific error messages.
  • Web standardizes code using Rubocop Lint rules.

4.0.0.beta2 (2020-01-10)

Full commit changes

Added

  • Web Added the ability to upload a complete version list to a specific application channel, and support deleting operations.

Fixed

  • Web provides an error prompt instead of an error message when uploading an application that is not a valid ipa or apk.
  • API fixes the issue where the latest version list of an application cannot be returned due to the non-existence of the queried version number in the database.
  • API only requires token verification for interfaces that perform write operations (previously most interfaces required it).

4.0.0.beta1

🌈 The first public beta version has been released!

Earlier Version:

For many years, it was developed and operated internally within the company and was not open source. It used to undertake many functions, but now it has been separated to focus on providing application hosting and distribution services

- - + + \ No newline at end of file diff --git a/docs/user-guide/credits/index.html b/docs/user-guide/credits/index.html index ce266f7b9..510ecbc18 100644 --- a/docs/user-guide/credits/index.html +++ b/docs/user-guide/credits/index.html @@ -4,15 +4,15 @@ Credits | Zealot - - + +
Version: 5.0.0

Credits

Contributions

Thank you for making Zealot more useful!

Project name

Zealot from the Starcraft species Gods base soldier.

Project history submission resources may be used to for the icon copyright belongs to Blizzard, later changed to their own design icons, if there are enthusiastic designers can help design better icons, I represent this project to express my sincere gratitude.

License

Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at LICENSE file

- - + + \ No newline at end of file diff --git a/docs/user-guide/dashboard/index.html b/docs/user-guide/dashboard/index.html index bd530c2f6..78b2fe4da 100644 --- a/docs/user-guide/dashboard/index.html +++ b/docs/user-guide/dashboard/index.html @@ -4,13 +4,13 @@ Dashboard | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/debug-files/index.html b/docs/user-guide/debug-files/index.html index 8318bf139..010640345 100644 --- a/docs/user-guide/debug-files/index.html +++ b/docs/user-guide/debug-files/index.html @@ -4,13 +4,13 @@ List debug files | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/debug-files/review/index.html b/docs/user-guide/debug-files/review/index.html index 84cca17f7..656520bea 100644 --- a/docs/user-guide/debug-files/review/index.html +++ b/docs/user-guide/debug-files/review/index.html @@ -4,13 +4,13 @@ Review metadata | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/debug-files/upload/index.html b/docs/user-guide/debug-files/upload/index.html index ae3336e73..dbcede4ed 100644 --- a/docs/user-guide/debug-files/upload/index.html +++ b/docs/user-guide/debug-files/upload/index.html @@ -4,13 +4,13 @@ Create a Debug File | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/index.html b/docs/user-guide/index.html index 33baef958..10bd2cdd4 100644 --- a/docs/user-guide/index.html +++ b/docs/user-guide/index.html @@ -4,8 +4,8 @@ User Guide | Zealot - - + +
@@ -14,7 +14,7 @@ Chat on Telegram Maintainability License

Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.

Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.

PreviewPreview

Features

  • 🌏 Cross-platform hosting: supports macOS, iOS, Android (apk/aab), Windows, Linux extensive platforms.
  • 📱 iOS device in control: automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers.
  • 🧑‍💻 Full developer toolkit: provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building.
  • 💥 Analyze secrets within applications: interpret metadata for iOS or Android applications or describe files.
  • 🚨 Multiple notification built-in: customizable data income WebHook to any notification service.
  • 🗄 Multi-channel classification management: freely divide application channel management into different scenarios and product forms.
  • 🎳 Multiple Architectures amd86/arm64/armv7 architectures deployment ready.
  • 🔑 Third-party Auth: Google, Gitlab, LDAP, OIDC and Lark suppotted.
  • 🌑 Dark mode: Feel free to switch between day and night.

Demo

Simplified Chinese by default, change the language in Settings page.

Notification: There is instability run on a free resource cloud service and RESET ALL DATA daily.

About the translation

The translation powered by DeepL and it inevitably have some defects, please provide feedback in time, thanks!

- - + + \ No newline at end of file diff --git a/docs/user-guide/qa/index.html b/docs/user-guide/qa/index.html index 40b5370bd..89b1b855e 100644 --- a/docs/user-guide/qa/index.html +++ b/docs/user-guide/qa/index.html @@ -4,13 +4,13 @@ Q&A | Zealot - - + + - - + + \ No newline at end of file diff --git a/docs/user-guide/toolkits/fetch-udid/index.html b/docs/user-guide/toolkits/fetch-udid/index.html index 67d32ec93..b4b781733 100644 --- a/docs/user-guide/toolkits/fetch-udid/index.html +++ b/docs/user-guide/toolkits/fetch-udid/index.html @@ -4,8 +4,8 @@ Fetch iOS Device UDID | Zealot - - + +
@@ -15,7 +15,7 @@ you still need to manually or script-automate adding the test device to the corresponding Ad-Hoc certificate, then install and repackage it before allowing the device to install the application.

Unregistered DeviceUnregistered Device

Registered Device

For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account.

Registered DeviceRegistered Device - - + + \ No newline at end of file diff --git a/docs/user-guide/toolkits/teardown/index.html b/docs/user-guide/toolkits/teardown/index.html index 8e1a25e47..85e9eb6be 100644 --- a/docs/user-guide/toolkits/teardown/index.html +++ b/docs/user-guide/toolkits/teardown/index.html @@ -4,13 +4,13 @@ Teardown App view itself metadata | Zealot - - + +
Version: 5.0.0

Teardown App view itself metadata

Android

Retrieve AndroidManifest.xml metadata, v1 to v3 signatures informations.

iOS

Retrieve Info.plist metadata, Frameworks and signatures informations.

- - + + \ No newline at end of file diff --git a/docs/user-guide/webhooks/dingtalk/index.html b/docs/user-guide/webhooks/dingtalk/index.html index 00d404c1f..4174b86c9 100644 --- a/docs/user-guide/webhooks/dingtalk/index.html +++ b/docs/user-guide/webhooks/dingtalk/index.html @@ -4,14 +4,14 @@ Dingtalk (Dingding) | Zealot - - + +
Version: 5.0.0

Dingtalk (Dingding)

钉钉 use Incoming Webhooks whose constructs typically support both text and markdown, and can be configured as follows:

Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.

Text format

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Markdown format

The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog.

{
"msgtype": "markdown",
"markdown": {
"title": @title,
"text": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/docs/user-guide/webhooks/discord/index.html b/docs/user-guide/webhooks/discord/index.html index 0fb7973bd..8d14bbe3a 100644 --- a/docs/user-guide/webhooks/discord/index.html +++ b/docs/user-guide/webhooks/discord/index.html @@ -4,14 +4,14 @@ Discord | Zealot - - + +
Version: 5.0.0

Discord

Discord should use Slack-Compatible Webhook whose constructs typically support both text and block rich text, and can be configured as follows:

Text format

{
"text": "##{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}"
}

Block rich text format

A simple block with markdown support

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}\nInstal QRcode:\n![qrcode](#{@qrcode_url})"
}
}
]
}

Better look at some of the structures shown in the block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Platform:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*Upload at:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/docs/user-guide/webhooks/feishu/index.html b/docs/user-guide/webhooks/feishu/index.html index 10372cecf..7ae39bb39 100644 --- a/docs/user-guide/webhooks/feishu/index.html +++ b/docs/user-guide/webhooks/feishu/index.html @@ -4,14 +4,14 @@ Lark (Feishu) | Zealot - - + +
Version: 5.0.0

Lark (Feishu)

飞书 use Incoming Webhooks whose constructs typically support both text and interactive card, and can be configured as follows:

Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.

Text format

{
"msg_type": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Interactive card format

Use card format could use partly of markdown syntax:

{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"elements": [
{
"tag": "div",
"text": {
"content": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})",
"tag": "lark_md"
}
},
{
"actions": [{
"tag": "button",
"text": {
"content": "Install",
"tag": "lark_md"
},
"url": @install_url,
"type": "default",
"value": {}
}],
"tag": "action"
}
]
}
}
- - + + \ No newline at end of file diff --git a/docs/user-guide/webhooks/index.html b/docs/user-guide/webhooks/index.html index 2b78eb912..c54b55d67 100644 --- a/docs/user-guide/webhooks/index.html +++ b/docs/user-guide/webhooks/index.html @@ -4,8 +4,8 @@ Webhooks | Zealot - - + +
@@ -13,7 +13,7 @@ The webhook is a fully customizable structure that can be used for most notification services, such as Wecom, Dingtalk, Slack, etc.

Payload (default)

Each parameter of the default structure has its value provided as a variable, and each variable starts with @, the default structure will be used if the custom structure is left empty when creating the webhook. The following variables are all provided.

{
event: @event,
title: @title,
app_name: @name,
device_type: @device_type,
release_version: @release_version,
build_version: @build_version,
size: @file_size,
changelog: @changelog,
install_url: @install_url,
icon_url: @icon_url,
qrcode_url: @qrcode_url,
uploaded_at: @uploaded_at
}

Output:

{
"event": "upload_events",
"title": "Zealot upload 1.0.0 version",
"app_name": "Zealot",
"device_type": "iOS",
"release_version": "1.0.0",
"build_version": "1",
"size": "30 MB",
"install_url": "https://zealot.test/api/apps/download/12354",
"icon_url": "https://zealot.test/api/apps/icon.png",
"qrcode_url": "https://zealot.test/api/apps/354/qrcode",
"uploaded_at": "2019-12-30 11:33:00",
"changelog": "- Add feture A\n- Fix issue B\n- Release v1.0.0",
}
- - + + \ No newline at end of file diff --git a/docs/user-guide/webhooks/slack/index.html b/docs/user-guide/webhooks/slack/index.html index 301a370c6..54c9eca83 100644 --- a/docs/user-guide/webhooks/slack/index.html +++ b/docs/user-guide/webhooks/slack/index.html @@ -4,14 +4,14 @@ Slack | Zealot - - + +
Version: 5.0.0

Slack

Slack use Incoming Webhooks whose constructs typically support both text and block rich text, and can be configured as follows:

Text format

{
"text": "#{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}"
}

Block rich text format

A simple block with markdown support

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\nPlatform: #{@device_type}\nUpload at: #{@uploaded_at}\nInstal QRcode:\n![qrcode](#{@qrcode_url})"
}
}
]
}

Better look at some of the structures shown in the block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Platform:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*Upload at:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/docs/user-guide/webhooks/wecom/index.html b/docs/user-guide/webhooks/wecom/index.html index 258f06691..8af6440e1 100644 --- a/docs/user-guide/webhooks/wecom/index.html +++ b/docs/user-guide/webhooks/wecom/index.html @@ -4,14 +4,14 @@ Wecom (Wechat Work) | Zealot - - + +
Version: 5.0.0

Wecom (Wechat Work)

企业微信 use Incoming Webhooks whose constructs typically support both text and markdown, and can be configured as follows:

Text format

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\nInstall url:#{@install_url}\nUplaod at: #{@uploaded_at}"
}
}

Markdown format

{
"msgtype": "markdown",
"markdown": {
"content": "## #{@title}\nPlatform: #{@device_type}\nUplaod at: #{@uploaded_at}\nInstall QRcode:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/index.html b/index.html index 81db41b5f..625e5fb9d 100644 --- a/index.html +++ b/index.html @@ -4,13 +4,13 @@ Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps. | Zealot - - + +

Zealot

Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.

Easy to Use

Easy to Use

Zealot was designed from the ground up to be easily installed and running quickly.

Focus on What Matters

Focus on What Matters

Zealot lets you focus on your app, and we'll do the chores. Go ahead and upload your apps.

Powered by Rails

Open Source 100%

Zealot is an open source project, Everyone could easy self hosted on own servers.

- - + + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index 480126ea6..144015fa4 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -4,13 +4,13 @@ Markdown page example | Zealot - - + +

Markdown page example

You don't need React to write simple standalone pages.

- - + + \ No newline at end of file diff --git a/zh-Hans/404.html b/zh-Hans/404.html index 5b0f904a7..7a210a310 100644 --- a/zh-Hans/404.html +++ b/zh-Hans/404.html @@ -4,13 +4,13 @@ 找不到页面 | Zealot - - + +

找不到页面

我们找不到您要找的页面。

请联系原始链接来源网站的所有者,并告知他们链接已损坏。

- - + + \ No newline at end of file diff --git a/zh-Hans/assets/js/000e92dd.ce6b281f.js b/zh-Hans/assets/js/000e92dd.e15bb030.js similarity index 98% rename from zh-Hans/assets/js/000e92dd.ce6b281f.js rename to zh-Hans/assets/js/000e92dd.e15bb030.js index 1141c2e17..7474ba9be 100644 --- a/zh-Hans/assets/js/000e92dd.ce6b281f.js +++ b/zh-Hans/assets/js/000e92dd.e15bb030.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4123],{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 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=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=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):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.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,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));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]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.d(t,{Z:()=>o});var r=n(7294),a=n(6010);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:n,className:o}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),l=n(6010),o=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=p(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,s]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),y=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{y&&i(y)}),[y]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,l]),tabValues:l}}var y=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=s[n].value;r!==i&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:o}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(g,(0,r.Z)({},e,t)),a.createElement(h,(0,r.Z)({},e,t)))}function E(e){const t=(0,y.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},7766:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),l=n(4866),o=n(5162);const i={sidebar_label:"Android"},u="Zealot Android SDK",s={unversionedId:"developer-guide/sdk/android",id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/zh-Hans/docs/next/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/android.md",tags:[],version:"current",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/zh-Hans/docs/next/developer-guide/sdk/ios"},next:{title:"Fastlane \u63d2\u4ef6",permalink:"/zh-Hans/docs/next/developer-guide/fastlane"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"\u7528\u6237\u6743\u9650",id:"\u7528\u6237\u6743\u9650",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002"),(0,a.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," \u5b89\u88c5\uff0c\u5148\u9700\u8981\u6dfb\u52a0 maven \u4ed3\u5e93\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"\u4e4b\u540e\u5728\u4e3b app \u9879\u76ee\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," \u6dfb\u52a0 zealot\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"\u7528\u6237\u6743\u9650"},"\u7528\u6237\u6743\u9650"),(0,a.kt)("p",null,"\u4f7f\u7528 Zealot SDK \u9700\u8981\u5f00\u542f\u7f51\u7edc\u6743\u9650"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,a.kt)("p",null,"\u5728\u4f60\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," \u6587\u4ef6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," \u65b9\u6cd5\u6dfb\u52a0\u542f\u52a8\u4ee3\u7801\uff1a"),(0,a.kt)(l.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(o.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(o.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4123],{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 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=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=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):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.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,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));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]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.d(t,{Z:()=>o});var r=n(7294),a=n(4334);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:n,className:o}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),l=n(4334),o=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=p(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,s]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),y=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{y&&i(y)}),[y]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,l]),tabValues:l}}var y=n(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=s[n].value;r!==i&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:o}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(g,(0,r.Z)({},e,t)),a.createElement(h,(0,r.Z)({},e,t)))}function E(e){const t=(0,y.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},7766:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),l=n(4866),o=n(5162);const i={sidebar_label:"Android"},u="Zealot Android SDK",s={unversionedId:"developer-guide/sdk/android",id:"developer-guide/sdk/android",title:"Zealot Android SDK",description:"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/zh-Hans/docs/next/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/android.md",tags:[],version:"current",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/zh-Hans/docs/next/developer-guide/sdk/ios"},next:{title:"Fastlane \u63d2\u4ef6",permalink:"/zh-Hans/docs/next/developer-guide/fastlane"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"\u7528\u6237\u6743\u9650",id:"\u7528\u6237\u6743\u9650",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002"),(0,a.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," \u5b89\u88c5\uff0c\u5148\u9700\u8981\u6dfb\u52a0 maven \u4ed3\u5e93\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"\u4e4b\u540e\u5728\u4e3b app \u9879\u76ee\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," \u6dfb\u52a0 zealot\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"\u7528\u6237\u6743\u9650"},"\u7528\u6237\u6743\u9650"),(0,a.kt)("p",null,"\u4f7f\u7528 Zealot SDK \u9700\u8981\u5f00\u542f\u7f51\u7edc\u6743\u9650"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,a.kt)("p",null,"\u5728\u4f60\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," \u6587\u4ef6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," \u65b9\u6cd5\u6dfb\u52a0\u542f\u52a8\u4ee3\u7801\uff1a"),(0,a.kt)(l.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(o.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(o.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/0c22aff4.4d62cf02.js b/zh-Hans/assets/js/0c22aff4.e457901f.js similarity index 99% rename from zh-Hans/assets/js/0c22aff4.4d62cf02.js rename to zh-Hans/assets/js/0c22aff4.e457901f.js index 918a516f7..20956211d 100644 --- a/zh-Hans/assets/js/0c22aff4.4d62cf02.js +++ b/zh-Hans/assets/js/0c22aff4.e457901f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3194],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.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 a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=i(a),m=n,b=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return a?r.createElement(b,s(s({ref:t},c),{},{components:a})):r.createElement(b,s({ref:t},c))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,s=new Array(l);s[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,s[1]=o;for(var i=2;i{a.d(t,{Z:()=>s});var r=a(7294),n=a(6010);const l={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return r.createElement("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,s),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>N});var r=a(7462),n=a(7294),l=a(6010),s=a(2466),o=a(6550),u=a(1980),i=a(7392),c=a(12);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:a}=e;const r=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u._X)(l),(0,n.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,i]=b({queryString:a,groupId:r}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(a);return[r,(0,n.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,n.useLayoutEffect)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),g(e)}),[i,g,l]),tabValues:l}}var v=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function k(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),r=i[a].value;r!==o&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,l.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function y(e){const t=g(e);return n.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},n.createElement(k,(0,r.Z)({},e,t)),n.createElement(f,(0,r.Z)({},e,t)))}function N(e){const t=(0,v.Z)();return n.createElement(y,(0,r.Z)({key:String(t)},e))}},400:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=a(7462),n=(a(7294),a(3905)),l=a(4866),s=a(5162);const o={sidebar_label:"\u6e90\u4ee3\u7801"},u="\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",i={unversionedId:"contributing-guide/local-development/source-code",id:"version-4.x/contributing-guide/local-development/source-code",title:"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",description:"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"\u6e90\u4ee3\u7801"},sidebar:"contributingGuide",previous:{title:"Dev Container (Docker)",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",level:2},{value:"macOS",id:"macos",level:3},{value:"\u5b89\u88c5 homebrew",id:"\u5b89\u88c5-homebrew",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis",level:4},{value:"yarn",id:"yarn",level:4},{value:"\u7591\u96be\u6742\u75c7",id:"\u7591\u96be\u6742\u75c7",level:4},{value:"M1 \u82af\u7247 MacOS \u95ee\u9898",id:"m1-\u82af\u7247-macos-\u95ee\u9898",level:5},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-2",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-2",level:4},{value:"yarn",id:"yarn-1",level:4},{value:"\u5b89\u88c5 Ruby",id:"\u5b89\u88c5-ruby",level:2},{value:"\u514b\u9686\u6e90\u4ee3\u7801",id:"\u514b\u9686\u6e90\u4ee3\u7801",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-2",level:3},{value:"\u521d\u59cb\u5316\u6570\u636e\u5e93",id:"\u521d\u59cb\u5316\u6570\u636e\u5e93",level:3},{value:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",level:3},{value:"\u8fd0\u884c Zealot \u670d\u52a1",id:"\u8fd0\u884c-zealot-\u670d\u52a1",level:3}],p={toc:d},m="wrapper";function b(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"\u6e90\u7801\u90e8\u7f72-zealot-\u6307\u5357"},"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357"),(0,n.kt)("p",null,"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002"),(0,n.kt)("h2",{id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883"},"\u51c6\u5907\u90e8\u7f72\u73af\u5883"),(0,n.kt)("h3",{id:"macos"},"macOS"),(0,n.kt)("h4",{id:"\u5b89\u88c5-homebrew"},"\u5b89\u88c5 homebrew"),(0,n.kt)("p",null,"\u9996\u5148\u9700\u8981\u5b89\u88c5 Xcode Command tools:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,n.kt)("p",null,"\u5982\u679c\u63d0\u793a\u5b89\u88c5\u5931\u8d25\uff0c\u9700\u8981\u4ece ",(0,n.kt)("a",{parentName:"p",href:"https://developer.apple.com/downloads"},"https://developer.apple.com/downloads")," \u4e0b\u8f7d\u5b89\u88c5\u3002"),(0,n.kt)("p",null,"\u4e4b\u540e\u5b89\u88c5 macOS \u7684\u5305\u7ba1\u7406\u5de5\u5177 Homebrew"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("p",null,"\u4e4b\u540e\u5f00\u59cb\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,n.kt)("p",null,"M1 \u7528\u6237\u9700\u8981\u8bbe\u7f6e\u4f9d\u8d56\u7f16\u8bd1\u8def\u5f84\u5230 SHELL \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"export CPATH=/opt/homebrew/include/\nexport LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6743\u9650\u8fc7\u9ad8\u53ef\u4ee5\u53ea\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("p",null,"\u8fd0\u884c\u8d77\u6765\u540e\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")),(0,n.kt)("h4",{id:"\u7591\u96be\u6742\u75c7"},"\u7591\u96be\u6742\u75c7"),(0,n.kt)("h5",{id:"m1-\u82af\u7247-macos-\u95ee\u9898"},"M1 \u82af\u7247 MacOS \u95ee\u9898"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o\n")),(0,n.kt)("p",null,"\u4f7f\u7528 ",(0,n.kt)("inlineCode",{parentName:"p"},"bundle install")," \u4f1a\u9047\u5230\u5982\u4e0a\u95ee\u9898\u8fd9\u4e2a\u662f\u56e0\u4e3a homebrew \u5b89\u88c5 webp \u4f9d\u8d56\u4e4b\u540e\u7f16\u8bd1\u8def\u5f84\u65e0\u6cd5\u88ab\u627e\u5230\uff0c\u4e0a\u9762\u6709\u89e3\u51b3\u529e\u6cd5\u3002"),(0,n.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-1"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-1"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"node"},"node"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,n.kt)("p",null,"\u5982\u679c\u662f\u5728 ",(0,n.kt)("inlineCode",{parentName:"p"},"arm")," \u67b6\u6784\u5b89\u88c5\u8fd8\u9700\u8981\u989d\u5916\u5b89\u88c5 ",(0,n.kt)("inlineCode",{parentName:"p"},"gcompat"),' glib \u517c\u5bb9\u5c42\uff0c\u5426\u5219\u4f1a\u62a5 "',(0,n.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'" \u5f02\u5e38\u9519\u8bef\u3002'),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-2"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-2"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6570\u636e\u5e93\u7528\u6237\u6743\u9650\uff0c\u53ef\u4ec5\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn-1"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h2",{id:"\u5b89\u88c5-ruby"},"\u5b89\u88c5 Ruby"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7 asdf\u3001rvm \u4efb\u610f\u4e00\u79cd\u65b9\u5f0f\u5b89\u88c5\u3002"),(0,n.kt)(l.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,n.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,n.kt)("p",null,"\u4e00\u4e2a\u652f\u6301\u4e3b\u6d41\u5f00\u53d1\u8bed\u8a00\u7248\u672c\u5207\u6362\u7684\u5de5\u5177\uff0c\u8bf7\u6309\u7167",(0,n.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"\u5b98\u65b9\u5b89\u88c5\u6559\u7a0b"),"\u597d\u4e4b\u540e\u5b89\u88c5 ruby\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# \u5f00\u542f Ruby 3.2.0 YJIT \u65b0\u7279\u6027\u9700\u8981\u5b89\u88c5 rust 1.58+\n# \u53ef\u9009\u5b89\u88c5:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# \u5fc5\u987b\u5b89\u88c5\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,n.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,n.kt)("p",null,"\u5982\u4e0b\u547d\u4ee4\u662f\u5148\u5b89\u88c5 rvm \u5230\u5f53\u524d\u7cfb\u7edf\u7684\u7528\u6237\u540e\u5b89\u88c5 Ruby 3.0 \u7248\u672c\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,n.kt)("h2",{id:"\u514b\u9686\u6e90\u4ee3\u7801"},"\u514b\u9686\u6e90\u4ee3\u7801"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,n.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,n.kt)("p",null,"\u4ee5\u4e0b\u6b65\u9aa4\u5747\u9700\u8981\u5728 zealot \u6839\u76ee\u5f55\u6267\u884c\u3002"),(0,n.kt)("h3",{id:"bundler"},"bundler"),(0,n.kt)("p",null,"\u5b89\u88c5 Ruby gems \u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,n.kt)("h3",{id:"yarn-2"},"yarn"),(0,n.kt)("p",null,"\u5b89\u88c5\u524d\u7aef\u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u6570\u636e\u5e93"},"\u521d\u59cb\u5316\u6570\u636e\u5e93"),(0,n.kt)("p",null,"\u786e\u4fdd\u8fde\u63a5\u6570\u636e\u5e93\u4fe1\u606f\u6ca1\u6709\u95ee\u9898\uff0c\u540e\u5c06\u4f1a\u521b\u5efa\u6570\u636e\u5e93\u8868\u5e76\u521b\u5efa\u8868\u7ed3\u6784"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,n.kt)("p",null,"\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570\u53ef\u901a\u8fc7",(0,n.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"\u73af\u5883\u53d8\u91cf"),"\u6216\u66f4\u6539 ",(0,n.kt)("inlineCode",{parentName:"p"},"config/database.yml")," \u6587\u4ef6\u3002"),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"},"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"),(0,n.kt)("p",null,"\u521d\u59cb\u5316\u7ba1\u7406\u5458\u8d26\u53f7\u548c\u5e94\u7528\u6837\u4f8b"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,n.kt)("h3",{id:"\u8fd0\u884c-zealot-\u670d\u52a1"},"\u8fd0\u884c Zealot \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,n.kt)("p",null,"\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}b.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3194],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.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 a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=i(a),m=n,b=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return a?r.createElement(b,s(s({ref:t},c),{},{components:a})):r.createElement(b,s({ref:t},c))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,s=new Array(l);s[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,s[1]=o;for(var i=2;i{a.d(t,{Z:()=>s});var r=a(7294),n=a(4334);const l={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return r.createElement("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,s),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>N});var r=a(7462),n=a(7294),l=a(4334),s=a(2466),o=a(6550),u=a(1980),i=a(7392),c=a(12);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:a}=e;const r=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u._X)(l),(0,n.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,i]=b({queryString:a,groupId:r}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(a);return[r,(0,n.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,n.useLayoutEffect)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),g(e)}),[i,g,l]),tabValues:l}}var v=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function k(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),r=i[a].value;r!==o&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,l.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function y(e){const t=g(e);return n.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},n.createElement(k,(0,r.Z)({},e,t)),n.createElement(f,(0,r.Z)({},e,t)))}function N(e){const t=(0,v.Z)();return n.createElement(y,(0,r.Z)({key:String(t)},e))}},400:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=a(7462),n=(a(7294),a(3905)),l=a(4866),s=a(5162);const o={sidebar_label:"\u6e90\u4ee3\u7801"},u="\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",i={unversionedId:"contributing-guide/local-development/source-code",id:"version-4.x/contributing-guide/local-development/source-code",title:"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",description:"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/source-code.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"\u6e90\u4ee3\u7801"},sidebar:"contributingGuide",previous:{title:"Dev Container (Docker)",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",level:2},{value:"macOS",id:"macos",level:3},{value:"\u5b89\u88c5 homebrew",id:"\u5b89\u88c5-homebrew",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis",level:4},{value:"yarn",id:"yarn",level:4},{value:"\u7591\u96be\u6742\u75c7",id:"\u7591\u96be\u6742\u75c7",level:4},{value:"M1 \u82af\u7247 MacOS \u95ee\u9898",id:"m1-\u82af\u7247-macos-\u95ee\u9898",level:5},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-2",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-2",level:4},{value:"yarn",id:"yarn-1",level:4},{value:"\u5b89\u88c5 Ruby",id:"\u5b89\u88c5-ruby",level:2},{value:"\u514b\u9686\u6e90\u4ee3\u7801",id:"\u514b\u9686\u6e90\u4ee3\u7801",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-2",level:3},{value:"\u521d\u59cb\u5316\u6570\u636e\u5e93",id:"\u521d\u59cb\u5316\u6570\u636e\u5e93",level:3},{value:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",level:3},{value:"\u8fd0\u884c Zealot \u670d\u52a1",id:"\u8fd0\u884c-zealot-\u670d\u52a1",level:3}],p={toc:d},m="wrapper";function b(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"\u6e90\u7801\u90e8\u7f72-zealot-\u6307\u5357"},"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357"),(0,n.kt)("p",null,"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002"),(0,n.kt)("h2",{id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883"},"\u51c6\u5907\u90e8\u7f72\u73af\u5883"),(0,n.kt)("h3",{id:"macos"},"macOS"),(0,n.kt)("h4",{id:"\u5b89\u88c5-homebrew"},"\u5b89\u88c5 homebrew"),(0,n.kt)("p",null,"\u9996\u5148\u9700\u8981\u5b89\u88c5 Xcode Command tools:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,n.kt)("p",null,"\u5982\u679c\u63d0\u793a\u5b89\u88c5\u5931\u8d25\uff0c\u9700\u8981\u4ece ",(0,n.kt)("a",{parentName:"p",href:"https://developer.apple.com/downloads"},"https://developer.apple.com/downloads")," \u4e0b\u8f7d\u5b89\u88c5\u3002"),(0,n.kt)("p",null,"\u4e4b\u540e\u5b89\u88c5 macOS \u7684\u5305\u7ba1\u7406\u5de5\u5177 Homebrew"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("p",null,"\u4e4b\u540e\u5f00\u59cb\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,n.kt)("p",null,"M1 \u7528\u6237\u9700\u8981\u8bbe\u7f6e\u4f9d\u8d56\u7f16\u8bd1\u8def\u5f84\u5230 SHELL \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"export CPATH=/opt/homebrew/include/\nexport LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6743\u9650\u8fc7\u9ad8\u53ef\u4ee5\u53ea\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("p",null,"\u8fd0\u884c\u8d77\u6765\u540e\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")),(0,n.kt)("h4",{id:"\u7591\u96be\u6742\u75c7"},"\u7591\u96be\u6742\u75c7"),(0,n.kt)("h5",{id:"m1-\u82af\u7247-macos-\u95ee\u9898"},"M1 \u82af\u7247 MacOS \u95ee\u9898"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o\n")),(0,n.kt)("p",null,"\u4f7f\u7528 ",(0,n.kt)("inlineCode",{parentName:"p"},"bundle install")," \u4f1a\u9047\u5230\u5982\u4e0a\u95ee\u9898\u8fd9\u4e2a\u662f\u56e0\u4e3a homebrew \u5b89\u88c5 webp \u4f9d\u8d56\u4e4b\u540e\u7f16\u8bd1\u8def\u5f84\u65e0\u6cd5\u88ab\u627e\u5230\uff0c\u4e0a\u9762\u6709\u89e3\u51b3\u529e\u6cd5\u3002"),(0,n.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-1"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-1"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"node"},"node"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,n.kt)("p",null,"\u5982\u679c\u662f\u5728 ",(0,n.kt)("inlineCode",{parentName:"p"},"arm")," \u67b6\u6784\u5b89\u88c5\u8fd8\u9700\u8981\u989d\u5916\u5b89\u88c5 ",(0,n.kt)("inlineCode",{parentName:"p"},"gcompat"),' glib \u517c\u5bb9\u5c42\uff0c\u5426\u5219\u4f1a\u62a5 "',(0,n.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'" \u5f02\u5e38\u9519\u8bef\u3002'),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-2"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-2"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6570\u636e\u5e93\u7528\u6237\u6743\u9650\uff0c\u53ef\u4ec5\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn-1"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h2",{id:"\u5b89\u88c5-ruby"},"\u5b89\u88c5 Ruby"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7 asdf\u3001rvm \u4efb\u610f\u4e00\u79cd\u65b9\u5f0f\u5b89\u88c5\u3002"),(0,n.kt)(l.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,n.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,n.kt)("p",null,"\u4e00\u4e2a\u652f\u6301\u4e3b\u6d41\u5f00\u53d1\u8bed\u8a00\u7248\u672c\u5207\u6362\u7684\u5de5\u5177\uff0c\u8bf7\u6309\u7167",(0,n.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"\u5b98\u65b9\u5b89\u88c5\u6559\u7a0b"),"\u597d\u4e4b\u540e\u5b89\u88c5 ruby\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# \u5f00\u542f Ruby 3.2.0 YJIT \u65b0\u7279\u6027\u9700\u8981\u5b89\u88c5 rust 1.58+\n# \u53ef\u9009\u5b89\u88c5:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# \u5fc5\u987b\u5b89\u88c5\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,n.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,n.kt)("p",null,"\u5982\u4e0b\u547d\u4ee4\u662f\u5148\u5b89\u88c5 rvm \u5230\u5f53\u524d\u7cfb\u7edf\u7684\u7528\u6237\u540e\u5b89\u88c5 Ruby 3.0 \u7248\u672c\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,n.kt)("h2",{id:"\u514b\u9686\u6e90\u4ee3\u7801"},"\u514b\u9686\u6e90\u4ee3\u7801"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,n.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,n.kt)("p",null,"\u4ee5\u4e0b\u6b65\u9aa4\u5747\u9700\u8981\u5728 zealot \u6839\u76ee\u5f55\u6267\u884c\u3002"),(0,n.kt)("h3",{id:"bundler"},"bundler"),(0,n.kt)("p",null,"\u5b89\u88c5 Ruby gems \u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,n.kt)("h3",{id:"yarn-2"},"yarn"),(0,n.kt)("p",null,"\u5b89\u88c5\u524d\u7aef\u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u6570\u636e\u5e93"},"\u521d\u59cb\u5316\u6570\u636e\u5e93"),(0,n.kt)("p",null,"\u786e\u4fdd\u8fde\u63a5\u6570\u636e\u5e93\u4fe1\u606f\u6ca1\u6709\u95ee\u9898\uff0c\u540e\u5c06\u4f1a\u521b\u5efa\u6570\u636e\u5e93\u8868\u5e76\u521b\u5efa\u8868\u7ed3\u6784"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,n.kt)("p",null,"\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570\u53ef\u901a\u8fc7",(0,n.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"\u73af\u5883\u53d8\u91cf"),"\u6216\u66f4\u6539 ",(0,n.kt)("inlineCode",{parentName:"p"},"config/database.yml")," \u6587\u4ef6\u3002"),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"},"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"),(0,n.kt)("p",null,"\u521d\u59cb\u5316\u7ba1\u7406\u5458\u8d26\u53f7\u548c\u5e94\u7528\u6837\u4f8b"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,n.kt)("h3",{id:"\u8fd0\u884c-zealot-\u670d\u52a1"},"\u8fd0\u884c Zealot \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,n.kt)("p",null,"\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.bf9cc31c.js b/zh-Hans/assets/js/14eb3368.94edc1dc.js similarity index 95% rename from assets/js/14eb3368.bf9cc31c.js rename to zh-Hans/assets/js/14eb3368.94edc1dc.js index 28cffa313..d5c37a83b 100644 --- a/assets/js/14eb3368.bf9cc31c.js +++ b/zh-Hans/assets/js/14eb3368.94edc1dc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(7462),r=a(7294),i=a(6010),l=a(5281),s=a(3438),c=a(8596),o=a(9960),m=a(5999),d=a(4996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.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 h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.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},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},4228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(7294),r=a(1944),i=a(3438),l=a(4996),s=a(6010),c=a(9960),o=a(3919),m=a(5999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(4966),N=a(3120),Z=a(4364),k=a(1310),_=a(7955);const L={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:L.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(_.Z,{as:"h1",className:L.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:L.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},4966:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(7462),r=a(7294),i=a(5999),l=a(6010),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:i}=e;return r.createElement(s.Z,{className:(0,l.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&r.createElement("div",{className:"pagination-nav__sublabel"},n),r.createElement("div",{className:"pagination-nav__label"},a))}function o(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&r.createElement(c,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(c,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),r=a(6010),i=a(5999),l=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7294),r=a(6010),i=a(2263),l=a(9960),s=a(5999),c=a(143),o=a(5281),m=a(373),d=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.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 v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},7955:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(7462),r=a(7294),i=a(6010),l=a(5999),s=a(6668),c=a(9960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,s.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(c.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(7462),r=a(7294),i=a(4334),l=a(5281),s=a(3438),c=a(8596),o=a(9960),m=a(5999),d=a(4996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.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 h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.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},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},4228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(7294),r=a(1944),i=a(3438),l=a(4996),s=a(4334),c=a(9960),o=a(3919),m=a(5999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(4966),N=a(3120),Z=a(4364),k=a(1310),_=a(7955);const L={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:L.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(_.Z,{as:"h1",className:L.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:L.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},4966:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(7462),r=a(7294),i=a(5999),l=a(4334),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:i}=e;return r.createElement(s.Z,{className:(0,l.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&r.createElement("div",{className:"pagination-nav__sublabel"},n),r.createElement("div",{className:"pagination-nav__label"},a))}function o(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&r.createElement(c,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(c,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),r=a(4334),i=a(5999),l=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7294),r=a(4334),i=a(2263),l=a(9960),s=a(5999),c=a(143),o=a(5281),m=a(373),d=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.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 v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},7955:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(7462),r=a(7294),i=a(4334),l=a(5999),s=a(6668),c=a(9960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,s.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(c.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}}}]); \ No newline at end of file diff --git a/assets/js/17896441.6c096025.js b/zh-Hans/assets/js/17896441.d30cc80e.js similarity index 97% rename from assets/js/17896441.6c096025.js rename to zh-Hans/assets/js/17896441.d30cc80e.js index 42495ee99..161b48536 100644 --- a/assets/js/17896441.6c096025.js +++ b/zh-Hans/assets/js/17896441.d30cc80e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7918],{1310:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7462),l=a(7294),r=a(6010),o=a(5281),s=a(3438),c=a(8596),i=a(9960),d=a(5999),m=a(4996);function u(e){return l.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),l.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 b={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function p(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.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},l.createElement(u,{className:b.breadcrumbHomeIcon})))}const E={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function h(e){let{children:t,href:a,isLast:n}=e;const r="breadcrumbs__link";return n?l.createElement("span",{className:r,itemProp:"name"},t):a?l.createElement(i.Z,{className:r,href:a,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:r},t)}function v(e){let{children:t,active:a,index:o,addMicrodata:s}=e;return l.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,r.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,l.createElement("meta",{itemProp:"position",content:String(o+1)}))}function g(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,r.Z)(o.k.docs.docBreadcrumbs,E.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(p,null),e.map(((t,a)=>{const n=a===e.length-1;return l.createElement(v,{key:a,active:n,index:a,addMicrodata:!!t.href},l.createElement(h,{href:t.href,isLast:n},t.label))})))):null}},230:(e,t,a)=>{a.r(t),a.d(t,{default:()=>X});var n=a(7294),l=a(1944),r=a(902);const o=n.createContext(null);function s(e){let{children:t,content:a}=e;const l=function(e){return(0,n.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(a);return n.createElement(o.Provider,{value:l},t)}function c(){const e=(0,n.useContext)(o);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:a}=c();return n.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:a.image??t.image})}var d=a(6010),m=a(7524),u=a(4966);function b(){const{metadata:e}=c();return n.createElement(u.Z,{previous:e.previous,next:e.next})}var p=a(3120),E=a(4364),h=a(5281),v=a(5999);function g(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:n.createElement("b",null,n.createElement("time",{dateTime:new Date(1e3*t).toISOString()},a))}}," on {date}")}function f(e){let{lastUpdatedBy:t}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:n.createElement("b",null,t)}}," by {user}")}function _(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a,lastUpdatedBy:l}=e;return n.createElement("span",{className:h.k.common.lastUpdated},n.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&a?n.createElement(g,{lastUpdatedAt:t,formattedLastUpdatedAt:a}):"",byUser:l?n.createElement(f,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var Z=a(7462);const N={iconEdit:"iconEdit_Z9Sw"};function k(e){let{className:t,...a}=e;return n.createElement("svg",(0,Z.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,d.Z)(N.iconEdit,t),"aria-hidden":"true"},a),n.createElement("g",null,n.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 L(e){let{editUrl:t}=e;return n.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:h.k.common.editThisPage},n.createElement(k,null),n.createElement(v.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}var C=a(9960);const T={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:a,count:l}=e;return n.createElement(C.Z,{href:t,className:(0,d.Z)(T.tag,l?T.tagWithCount:T.tagRegular)},a,l&&n.createElement("span",null,l))}const w={tags:"tags_jXut",tag:"tag_QGVx"};function x(e){let{tags:t}=e;return n.createElement(n.Fragment,null,n.createElement("b",null,n.createElement(v.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),n.createElement("ul",{className:(0,d.Z)(w.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return n.createElement("li",{key:a,className:w.tag},n.createElement(U,{label:t,permalink:a}))}))))}const y={lastUpdated:"lastUpdated_vwxv"};function A(e){return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},n.createElement("div",{className:"col"},n.createElement(x,e)))}function M(e){let{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},n.createElement("div",{className:"col"},t&&n.createElement(L,{editUrl:t})),n.createElement("div",{className:(0,d.Z)("col",y.lastUpdated)},(a||l)&&n.createElement(_,{lastUpdatedAt:a,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function B(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:a,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:o}=e,s=o.length>0,i=!!(t||a||r);return s||i?n.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&n.createElement(A,{tags:o}),i&&n.createElement(M,{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var I=a(6043),V=a(3743);const H={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function P(e){let{collapsed:t,...a}=e;return n.createElement("button",(0,Z.Z)({type:"button"},a,{className:(0,d.Z)("clean-btn",H.tocCollapsibleButton,!t&&H.tocCollapsibleButtonExpanded,a.className)}),n.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const D={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function S(e){let{toc:t,className:a,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:o,toggleCollapsed:s}=(0,I.u)({initialState:!0});return n.createElement("div",{className:(0,d.Z)(D.tocCollapsible,!o&&D.tocCollapsibleExpanded,a)},n.createElement(P,{collapsed:o,onClick:s}),n.createElement(I.z,{lazy:!0,className:D.tocCollapsibleContent,collapsed:o},n.createElement(V.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const z={tocMobile:"tocMobile_ITEo"};function F(){const{toc:e,frontMatter:t}=c();return n.createElement(S,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,z.tocMobile)})}var R=a(9407);function O(){const{toc:e,frontMatter:t}=c();return n.createElement(R.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var j=a(7955),G=a(1506);function W(e){let{children:t}=e;const a=function(){const{metadata:e,frontMatter:t,contentTitle:a}=c();return t.hide_title||void 0!==a?null:e.title}();return n.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},a&&n.createElement("header",null,n.createElement(j.Z,{as:"h1"},a)),n.createElement(G.Z,null,t))}var q=a(1310);const J={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Q(e){let{children:t}=e;const a=function(){const{frontMatter:e,toc:t}=c(),a=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?n.createElement(F,null):void 0,desktop:!r||"desktop"!==a&&"ssr"!==a?void 0:n.createElement(O,null)}}();return n.createElement("div",{className:"row"},n.createElement("div",{className:(0,d.Z)("col",!a.hidden&&J.docItemCol)},n.createElement(p.Z,null),n.createElement("div",{className:J.docItemContainer},n.createElement("article",null,n.createElement(q.Z,null),n.createElement(E.Z,null),a.mobile,n.createElement(W,null,t),n.createElement(B,null)),n.createElement(b,null))),a.desktop&&n.createElement("div",{className:"col col--3"},a.desktop))}function X(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,a=e.content;return n.createElement(s,{content:e.content},n.createElement(l.FG,{className:t},n.createElement(i,null),n.createElement(Q,null,n.createElement(a,null))))}},4966:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7462),l=a(7294),r=a(5999),o=a(6010),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:r}=e;return l.createElement(s.Z,{className:(0,o.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&l.createElement("div",{className:"pagination-nav__sublabel"},n),l.createElement("div",{className:"pagination-nav__label"},a))}function i(e){const{previous:t,next:a}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,r.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&l.createElement(c,(0,n.Z)({},t,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&l.createElement(c,(0,n.Z)({},a,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),l=a(6010),r=a(5999),o=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,l.Z)(t,o.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>h});var n=a(7294),l=a(6010),r=a(2263),o=a(9960),s=a(5999),c=a(143),i=a(5281),d=a(373),m=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function b(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function p(e){let{versionLabel:t,to:a,onClick:l}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(o.Z,{to:a,onClick:l},n.createElement(s.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(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:o}}=(0,r.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:E}=(0,c.Jo)(s),h=u??(v=E).docs.find((e=>e.id===v.mainDocId));var v;return n.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(b,{siteTitle:o,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(p,{versionLabel:E.label,to:h.path,onClick:()=>m(E.name)})))}function h(e){let{className:t}=e;const a=(0,m.E)();return a.banner?n.createElement(E,{className:t,versionMetadata:a}):null}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7918],{1310:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7462),l=a(7294),r=a(4334),o=a(5281),s=a(3438),c=a(8596),i=a(9960),d=a(5999),m=a(4996);function u(e){return l.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),l.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 b={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function p(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.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},l.createElement(u,{className:b.breadcrumbHomeIcon})))}const E={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function h(e){let{children:t,href:a,isLast:n}=e;const r="breadcrumbs__link";return n?l.createElement("span",{className:r,itemProp:"name"},t):a?l.createElement(i.Z,{className:r,href:a,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:r},t)}function v(e){let{children:t,active:a,index:o,addMicrodata:s}=e;return l.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,r.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,l.createElement("meta",{itemProp:"position",content:String(o+1)}))}function g(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,r.Z)(o.k.docs.docBreadcrumbs,E.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(p,null),e.map(((t,a)=>{const n=a===e.length-1;return l.createElement(v,{key:a,active:n,index:a,addMicrodata:!!t.href},l.createElement(h,{href:t.href,isLast:n},t.label))})))):null}},230:(e,t,a)=>{a.r(t),a.d(t,{default:()=>X});var n=a(7294),l=a(1944),r=a(902);const o=n.createContext(null);function s(e){let{children:t,content:a}=e;const l=function(e){return(0,n.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(a);return n.createElement(o.Provider,{value:l},t)}function c(){const e=(0,n.useContext)(o);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:a}=c();return n.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:a.image??t.image})}var d=a(4334),m=a(7524),u=a(4966);function b(){const{metadata:e}=c();return n.createElement(u.Z,{previous:e.previous,next:e.next})}var p=a(3120),E=a(4364),h=a(5281),v=a(5999);function g(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:n.createElement("b",null,n.createElement("time",{dateTime:new Date(1e3*t).toISOString()},a))}}," on {date}")}function f(e){let{lastUpdatedBy:t}=e;return n.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:n.createElement("b",null,t)}}," by {user}")}function _(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:a,lastUpdatedBy:l}=e;return n.createElement("span",{className:h.k.common.lastUpdated},n.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&a?n.createElement(g,{lastUpdatedAt:t,formattedLastUpdatedAt:a}):"",byUser:l?n.createElement(f,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var Z=a(7462);const N={iconEdit:"iconEdit_Z9Sw"};function k(e){let{className:t,...a}=e;return n.createElement("svg",(0,Z.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,d.Z)(N.iconEdit,t),"aria-hidden":"true"},a),n.createElement("g",null,n.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 L(e){let{editUrl:t}=e;return n.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:h.k.common.editThisPage},n.createElement(k,null),n.createElement(v.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}var C=a(9960);const T={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:a,count:l}=e;return n.createElement(C.Z,{href:t,className:(0,d.Z)(T.tag,l?T.tagWithCount:T.tagRegular)},a,l&&n.createElement("span",null,l))}const w={tags:"tags_jXut",tag:"tag_QGVx"};function x(e){let{tags:t}=e;return n.createElement(n.Fragment,null,n.createElement("b",null,n.createElement(v.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),n.createElement("ul",{className:(0,d.Z)(w.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return n.createElement("li",{key:a,className:w.tag},n.createElement(U,{label:t,permalink:a}))}))))}const y={lastUpdated:"lastUpdated_vwxv"};function A(e){return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},n.createElement("div",{className:"col"},n.createElement(x,e)))}function M(e){let{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return n.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},n.createElement("div",{className:"col"},t&&n.createElement(L,{editUrl:t})),n.createElement("div",{className:(0,d.Z)("col",y.lastUpdated)},(a||l)&&n.createElement(_,{lastUpdatedAt:a,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function B(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:a,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:o}=e,s=o.length>0,i=!!(t||a||r);return s||i?n.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&n.createElement(A,{tags:o}),i&&n.createElement(M,{editUrl:t,lastUpdatedAt:a,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var I=a(6043),V=a(3743);const H={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function P(e){let{collapsed:t,...a}=e;return n.createElement("button",(0,Z.Z)({type:"button"},a,{className:(0,d.Z)("clean-btn",H.tocCollapsibleButton,!t&&H.tocCollapsibleButtonExpanded,a.className)}),n.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const D={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function S(e){let{toc:t,className:a,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:o,toggleCollapsed:s}=(0,I.u)({initialState:!0});return n.createElement("div",{className:(0,d.Z)(D.tocCollapsible,!o&&D.tocCollapsibleExpanded,a)},n.createElement(P,{collapsed:o,onClick:s}),n.createElement(I.z,{lazy:!0,className:D.tocCollapsibleContent,collapsed:o},n.createElement(V.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const z={tocMobile:"tocMobile_ITEo"};function F(){const{toc:e,frontMatter:t}=c();return n.createElement(S,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,z.tocMobile)})}var R=a(9407);function O(){const{toc:e,frontMatter:t}=c();return n.createElement(R.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var j=a(7955),G=a(1506);function W(e){let{children:t}=e;const a=function(){const{metadata:e,frontMatter:t,contentTitle:a}=c();return t.hide_title||void 0!==a?null:e.title}();return n.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},a&&n.createElement("header",null,n.createElement(j.Z,{as:"h1"},a)),n.createElement(G.Z,null,t))}var q=a(1310);const J={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Q(e){let{children:t}=e;const a=function(){const{frontMatter:e,toc:t}=c(),a=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?n.createElement(F,null):void 0,desktop:!r||"desktop"!==a&&"ssr"!==a?void 0:n.createElement(O,null)}}();return n.createElement("div",{className:"row"},n.createElement("div",{className:(0,d.Z)("col",!a.hidden&&J.docItemCol)},n.createElement(p.Z,null),n.createElement("div",{className:J.docItemContainer},n.createElement("article",null,n.createElement(q.Z,null),n.createElement(E.Z,null),a.mobile,n.createElement(W,null,t),n.createElement(B,null)),n.createElement(b,null))),a.desktop&&n.createElement("div",{className:"col col--3"},a.desktop))}function X(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,a=e.content;return n.createElement(s,{content:e.content},n.createElement(l.FG,{className:t},n.createElement(i,null),n.createElement(Q,null,n.createElement(a,null))))}},4966:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7462),l=a(7294),r=a(5999),o=a(4334),s=a(9960);function c(e){const{permalink:t,title:a,subLabel:n,isNext:r}=e;return l.createElement(s.Z,{className:(0,o.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&l.createElement("div",{className:"pagination-nav__sublabel"},n),l.createElement("div",{className:"pagination-nav__label"},a))}function i(e){const{previous:t,next:a}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,r.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&l.createElement(c,(0,n.Z)({},t,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&l.createElement(c,(0,n.Z)({},a,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),l=a(4334),r=a(5999),o=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,l.Z)(t,o.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>h});var n=a(7294),l=a(4334),r=a(2263),o=a(9960),s=a(5999),c=a(143),i=a(5281),d=a(373),m=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function b(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function p(e){let{versionLabel:t,to:a,onClick:l}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(o.Z,{to:a,onClick:l},n.createElement(s.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(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:o}}=(0,r.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:E}=(0,c.Jo)(s),h=u??(v=E).docs.find((e=>e.id===v.mainDocId));var v;return n.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(b,{siteTitle:o,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(p,{versionLabel:E.label,to:h.path,onClick:()=>m(E.name)})))}function h(e){let{className:t}=e;const a=(0,m.E)();return a.banner?n.createElement(E,{className:t,versionMetadata:a}):null}}}]); \ No newline at end of file diff --git a/assets/js/1be78505.7062d58b.js b/zh-Hans/assets/js/1be78505.1dba3c15.js similarity index 99% rename from assets/js/1be78505.7062d58b.js rename to zh-Hans/assets/js/1be78505.1dba3c15.js index 6561ad8e5..65827e5fe 100644 --- a/assets/js/1be78505.7062d58b.js +++ b/zh-Hans/assets/js/1be78505.1dba3c15.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>fe});var a=n(7294),l=n(6010),o=n(1944),r=n(5281),c=n(3320),i=n(3438),s=n(4477),d=n(1116),m=n(7961),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,l]=(0,a.useState)(!1),o=(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&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var g=n(1442),f=n(6550),_=n(7524),k=n(6668),v=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,l.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),Z=n(902);const x=Symbol("EmptyContext"),B=a.createContext(x);function w(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(B.Provider,{value:o},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:o,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)(),g=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),f=(0,i._F)(t,o),_=(0,L.Mg)(h,o),{collapsed:v,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!f&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new Z.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!v),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,Z.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:f,collapsed:v,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":v},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":f}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!v:void 0,href:b?g??"#":g},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:v},a.createElement(j,{items:m,tabIndex:v?-1:0,onItemClick:n,activePath:o,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,P.Z)(m);return a.createElement("li",{className:(0,l.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,l.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 z={menuHtmlItem:"menuHtmlItem_M9Kj"};function V(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[z.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function U(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(V,(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(U,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),G={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:o}=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,l.Z)("menu thin-scrollbar",G.menu,c&&G.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,l.Z)(q,c&&O,r&&X)},c&&a.createElement(v.Z,{tabIndex:-1,className:J}),a.createElement(Y,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:o}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const o=(0,te.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const le=a.memo(ae);function oe(e){const t=(0,_.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),l&&a.createElement(le,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:o}=e;const{pathname:c}=(0,f.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,g.n)()&&s(!0),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.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,l.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(oe,{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 o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(me.docMainContainer,(t||!o)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.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)(),[l,o]=(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:l,setHiddenSidebarContainer:o}),a.createElement(ue,{hiddenSidebarContainer:l},t)))}var he=n(4972),Ee=n(197);function ge(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(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function fe(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(ge,e),a.createElement(o.FG,{className:(0,l.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),l=n(5999),o=n(1944),r=n(7961);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.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(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.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(l.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 +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>fe});var a=n(7294),l=n(4334),o=n(1944),r=n(5281),c=n(3320),i=n(3438),s=n(4477),d=n(1116),m=n(7961),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,l]=(0,a.useState)(!1),o=(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&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var g=n(1442),f=n(6550),_=n(7524),k=n(6668),v=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,l.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),Z=n(902);const x=Symbol("EmptyContext"),B=a.createContext(x);function w(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(B.Provider,{value:o},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:o,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)(),g=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),f=(0,i._F)(t,o),_=(0,L.Mg)(h,o),{collapsed:v,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!f&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new Z.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!v),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,Z.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:f,collapsed:v,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":v},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":f}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!v:void 0,href:b?g??"#":g},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:v},a.createElement(j,{items:m,tabIndex:v?-1:0,onItemClick:n,activePath:o,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,P.Z)(m);return a.createElement("li",{className:(0,l.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,l.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 z={menuHtmlItem:"menuHtmlItem_M9Kj"};function V(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[z.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function U(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(V,(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(U,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),G={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:o}=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,l.Z)("menu thin-scrollbar",G.menu,c&&G.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,l.Z)(q,c&&O,r&&X)},c&&a.createElement(v.Z,{tabIndex:-1,className:J}),a.createElement(Y,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:o}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const o=(0,te.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const le=a.memo(ae);function oe(e){const t=(0,_.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),l&&a.createElement(le,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:o}=e;const{pathname:c}=(0,f.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,g.n)()&&s(!0),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.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,l.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(oe,{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 o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(me.docMainContainer,(t||!o)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.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)(),[l,o]=(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:l,setHiddenSidebarContainer:o}),a.createElement(ue,{hiddenSidebarContainer:l},t)))}var he=n(4972),Ee=n(197);function ge(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(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function fe(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(ge,e),a.createElement(o.FG,{className:(0,l.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),l=n(5999),o=n(1944),r=n(7961);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.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(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.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(l.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/zh-Hans/assets/js/1f391b9e.3825bb4d.js b/zh-Hans/assets/js/1f391b9e.9181abc6.js similarity index 93% rename from zh-Hans/assets/js/1f391b9e.3825bb4d.js rename to zh-Hans/assets/js/1f391b9e.9181abc6.js index 5debc4782..72962e7ea 100644 --- a/zh-Hans/assets/js/1f391b9e.3825bb4d.js +++ b/zh-Hans/assets/js/1f391b9e.9181abc6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3085],{4247:(e,t,a)=>{a.r(t),a.d(t,{default:()=>d});var l=a(7294),n=a(6010),c=a(1944),r=a(5281),m=a(7961),o=a(1506),s=a(9407);const i={mdxPageWrapper:"mdxPageWrapper_j9I6"};function d(e){const{content:t}=e,{metadata:{title:a,description:d,frontMatter:p}}=t,{wrapperClassName:_,hide_table_of_contents:g}=p;return l.createElement(c.FG,{className:(0,n.Z)(_??r.k.wrapper.mdxPages,r.k.page.mdxPage)},l.createElement(c.d,{title:a,description:d}),l.createElement(m.Z,null,l.createElement("main",{className:"container container--fluid margin-vert--lg"},l.createElement("div",{className:(0,n.Z)("row",i.mdxPageWrapper)},l.createElement("div",{className:(0,n.Z)("col",!g&&"col--8")},l.createElement("article",null,l.createElement(o.Z,null,l.createElement(t,null)))),!g&&t.toc.length>0&&l.createElement("div",{className:"col col--2"},l.createElement(s.Z,{toc:t.toc,minHeadingLevel:p.toc_min_heading_level,maxHeadingLevel:p.toc_max_heading_level}))))))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[3085],{4247:(e,t,a)=>{a.r(t),a.d(t,{default:()=>d});var l=a(7294),n=a(4334),c=a(1944),r=a(5281),m=a(7961),o=a(1506),s=a(9407);const i={mdxPageWrapper:"mdxPageWrapper_j9I6"};function d(e){const{content:t}=e,{metadata:{title:a,description:d,frontMatter:p}}=t,{wrapperClassName:_,hide_table_of_contents:g}=p;return l.createElement(c.FG,{className:(0,n.Z)(_??r.k.wrapper.mdxPages,r.k.page.mdxPage)},l.createElement(c.d,{title:a,description:d}),l.createElement(m.Z,null,l.createElement("main",{className:"container container--fluid margin-vert--lg"},l.createElement("div",{className:(0,n.Z)("row",i.mdxPageWrapper)},l.createElement("div",{className:(0,n.Z)("col",!g&&"col--8")},l.createElement("article",null,l.createElement(o.Z,null,l.createElement(t,null)))),!g&&t.toc.length>0&&l.createElement("div",{className:"col col--2"},l.createElement(s.Z,{toc:t.toc,minHeadingLevel:p.toc_min_heading_level,maxHeadingLevel:p.toc_max_heading_level}))))))}}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/28463b1d.f72b3276.js b/zh-Hans/assets/js/28463b1d.a870fa84.js similarity index 98% rename from zh-Hans/assets/js/28463b1d.f72b3276.js rename to zh-Hans/assets/js/28463b1d.a870fa84.js index 65e90bdf1..af40b2414 100644 --- a/zh-Hans/assets/js/28463b1d.f72b3276.js +++ b/zh-Hans/assets/js/28463b1d.a870fa84.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4620],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>f});var n=t(7294);function i(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(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=0||(i[t]=e[t]);return i}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var d=n.createContext({}),l=function(e){var r=n.useContext(d),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(d.Provider,{value:r},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},p=n.forwardRef((function(e,r){var t=e.components,i=e.mdxType,o=e.originalType,d=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(t),p=i,f=c["".concat(d,".").concat(p)]||c[p]||g[p]||o;return t?n.createElement(f,a(a({ref:r},u),{},{components:t})):n.createElement(f,a({ref:r},u))}));function f(e,r){var t=arguments,i=r&&r.mdxType;if("string"==typeof e||i){var o=t.length,a=new Array(o);a[0]=p;var s={};for(var d in r)hasOwnProperty.call(r,d)&&(s[d]=r[d]);s.originalType=e,s[c]="string"==typeof e?e:i,a[1]=s;for(var l=2;l{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>d,default:()=>f,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var n=t(7462),i=(t(7294),t(3905)),o=t(941),a=t(4996);const s={},d="\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5",l={unversionedId:"user-guide/debug-files/review",id:"version-5.0.0/user-guide/debug-files/review",title:"\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5",description:"Android",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/review.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/review",permalink:"/zh-Hans/docs/user-guide/debug-files/review",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/user-guide/debug-files/review.mdx",tags:[],version:"5.0.0",frontMatter:{},sidebar:"userGuide",previous:{title:"\u5e94\u7528\u5217\u8868",permalink:"/zh-Hans/docs/user-guide/debug-files/"},next:{title:"\u4e0a\u4f20\u8c03\u8bd5\u6587\u4ef6",permalink:"/zh-Hans/docs/user-guide/debug-files/upload"}},u={},c=[{value:"Android",id:"android",level:2},{value:"\u7248\u672c\u5217\u8868",id:"\u7248\u672c\u5217\u8868",level:3},{value:"\u8be6\u60c5\u4fe1\u606f",id:"\u8be6\u60c5\u4fe1\u606f",level:3},{value:"iOS",id:"ios",level:2},{value:"\u7248\u672c\u5217\u8868",id:"\u7248\u672c\u5217\u8868-1",level:3},{value:"\u8be6\u60c5\u4fe1\u606f",id:"\u8be6\u60c5\u4fe1\u606f-1",level:3}],g={toc:c},p="wrapper";function f(e){let{components:r,...t}=e;return(0,i.kt)(p,(0,n.Z)({},g,t,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5"},"\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5"),(0,i.kt)("h2",{id:"android"},"Android"),(0,i.kt)("h3",{id:"\u7248\u672c\u5217\u8868"},"\u7248\u672c\u5217\u8868"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-versions-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-versions-dark.png")},mdxType:"ThemedImage"}),(0,i.kt)("h3",{id:"\u8be6\u60c5\u4fe1\u606f"},"\u8be6\u60c5\u4fe1\u606f"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-version-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-version-dark.png")},mdxType:"ThemedImage"}),(0,i.kt)("h2",{id:"ios"},"iOS"),(0,i.kt)("h3",{id:"\u7248\u672c\u5217\u8868-1"},"\u7248\u672c\u5217\u8868"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-versions-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-versions-dark.png")},mdxType:"ThemedImage"}),(0,i.kt)("h3",{id:"\u8be6\u60c5\u4fe1\u606f-1"},"\u8be6\u60c5\u4fe1\u606f"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-version-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-version-dark.png")},mdxType:"ThemedImage"}))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4620],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>f});var n=t(7294);function i(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(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=0||(i[t]=e[t]);return i}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var d=n.createContext({}),l=function(e){var r=n.useContext(d),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(d.Provider,{value:r},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},p=n.forwardRef((function(e,r){var t=e.components,i=e.mdxType,o=e.originalType,d=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(t),p=i,f=c["".concat(d,".").concat(p)]||c[p]||g[p]||o;return t?n.createElement(f,a(a({ref:r},u),{},{components:t})):n.createElement(f,a({ref:r},u))}));function f(e,r){var t=arguments,i=r&&r.mdxType;if("string"==typeof e||i){var o=t.length,a=new Array(o);a[0]=p;var s={};for(var d in r)hasOwnProperty.call(r,d)&&(s[d]=r[d]);s.originalType=e,s[c]="string"==typeof e?e:i,a[1]=s;for(var l=2;l{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>d,default:()=>f,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var n=t(7462),i=(t(7294),t(3905)),o=t(941),a=t(4996);const s={},d="\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5",l={unversionedId:"user-guide/debug-files/review",id:"version-5.0.0/user-guide/debug-files/review",title:"\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5",description:"Android",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/review.mdx",sourceDirName:"user-guide/debug-files",slug:"/user-guide/debug-files/review",permalink:"/zh-Hans/docs/user-guide/debug-files/review",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/user-guide/debug-files/review.mdx",tags:[],version:"5.0.0",frontMatter:{},sidebar:"userGuide",previous:{title:"\u5e94\u7528\u5217\u8868",permalink:"/zh-Hans/docs/user-guide/debug-files/"},next:{title:"\u4e0a\u4f20\u8c03\u8bd5\u6587\u4ef6",permalink:"/zh-Hans/docs/user-guide/debug-files/upload"}},u={},c=[{value:"Android",id:"android",level:2},{value:"\u7248\u672c\u5217\u8868",id:"\u7248\u672c\u5217\u8868",level:3},{value:"\u8be6\u60c5\u4fe1\u606f",id:"\u8be6\u60c5\u4fe1\u606f",level:3},{value:"iOS",id:"ios",level:2},{value:"\u7248\u672c\u5217\u8868",id:"\u7248\u672c\u5217\u8868-1",level:3},{value:"\u8be6\u60c5\u4fe1\u606f",id:"\u8be6\u60c5\u4fe1\u606f-1",level:3}],g={toc:c},p="wrapper";function f(e){let{components:r,...t}=e;return(0,i.kt)(p,(0,n.Z)({},g,t,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5"},"\u67e5\u770b\u8c03\u8bd5\u6587\u4ef6\u8be6\u60c5"),(0,i.kt)("h2",{id:"android"},"Android"),(0,i.kt)("h3",{id:"\u7248\u672c\u5217\u8868"},"\u7248\u672c\u5217\u8868"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-versions-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-versions-dark.png")},mdxType:"ThemedImage"}),(0,i.kt)("h3",{id:"\u8be6\u60c5\u4fe1\u606f"},"\u8be6\u60c5\u4fe1\u606f"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-version-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-android-version-dark.png")},mdxType:"ThemedImage"}),(0,i.kt)("h2",{id:"ios"},"iOS"),(0,i.kt)("h3",{id:"\u7248\u672c\u5217\u8868-1"},"\u7248\u672c\u5217\u8868"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-versions-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-versions-dark.png")},mdxType:"ThemedImage"}),(0,i.kt)("h3",{id:"\u8be6\u60c5\u4fe1\u606f-1"},"\u8be6\u60c5\u4fe1\u606f"),(0,i.kt)(o.Z,{alt:"",sources:{light:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-version-light.png"),dark:(0,a.Z)("/img/5.0.0/zh-Hans/debug-file-ios-version-dark.png")},mdxType:"ThemedImage"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/380655f7.d62bcfc6.js b/zh-Hans/assets/js/380655f7.c4872d66.js similarity index 98% rename from zh-Hans/assets/js/380655f7.d62bcfc6.js rename to zh-Hans/assets/js/380655f7.c4872d66.js index 755292451..2653b627a 100644 --- a/zh-Hans/assets/js/380655f7.d62bcfc6.js +++ b/zh-Hans/assets/js/380655f7.c4872d66.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9213],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.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,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[u,s]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=u??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=s[n].value;a!==i&&(d(t),u(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},r.createElement(h,(0,a.Z)({},e,t)),r.createElement(g,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},7504:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},u="Zealot iOS SDK",s={unversionedId:"developer-guide/sdk/ios",id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/zh-Hans/docs/next/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/ios.md",tags:[],version:"current",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/zh-Hans/docs/next/category/sdks"},next:{title:"Android",permalink:"/zh-Hans/docs/next/developer-guide/sdk/android"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002"),(0,r.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://cocoapods.org"},"Cocoapods")," \u5b89\u88c5 Zealot \u9700\u8981\u628a\u5b83\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"\u4fdd\u5b58\u540e\u5f00\u59cb\u5b89\u88c5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u5728 AppDelegate \u6587\u4ef6\u5f15\u5165 Zealot \u6846\u67b6\u5934\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"#import \n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u63a5\u7740\u5728\u4e0a\u9762\u6587\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," \u65b9\u6cd5\u8ffd\u52a0\u542f\u52a8\u4ee3\u7801\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// \u5355\u4e2a\u6e20\u9053\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// \u5355\u4e2a\u6e20\u9053\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9213],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.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,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[u,s]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=u??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=s[n].value;a!==i&&(d(t),u(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},r.createElement(h,(0,a.Z)({},e,t)),r.createElement(g,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},7504:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},u="Zealot iOS SDK",s={unversionedId:"developer-guide/sdk/ios",id:"developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/zh-Hans/docs/next/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/developer-guide/sdk/ios.md",tags:[],version:"current",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/zh-Hans/docs/next/category/sdks"},next:{title:"Android",permalink:"/zh-Hans/docs/next/developer-guide/sdk/android"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002"),(0,r.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://cocoapods.org"},"Cocoapods")," \u5b89\u88c5 Zealot \u9700\u8981\u628a\u5b83\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"\u4fdd\u5b58\u540e\u5f00\u59cb\u5b89\u88c5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u5728 AppDelegate \u6587\u4ef6\u5f15\u5165 Zealot \u6846\u67b6\u5934\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"#import \n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u63a5\u7740\u5728\u4e0a\u9762\u6587\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," \u65b9\u6cd5\u8ffd\u52a0\u542f\u52a8\u4ee3\u7801\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// \u5355\u4e2a\u6e20\u9053\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// \u5355\u4e2a\u6e20\u9053\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/3d079836.0d33a2e8.js b/zh-Hans/assets/js/3d079836.c01ac5b8.js similarity index 98% rename from zh-Hans/assets/js/3d079836.0d33a2e8.js rename to zh-Hans/assets/js/3d079836.c01ac5b8.js index 00cad7095..2815767b4 100644 --- a/zh-Hans/assets/js/3d079836.0d33a2e8.js +++ b/zh-Hans/assets/js/3d079836.c01ac5b8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2922],{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 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=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=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):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.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,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));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]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.d(t,{Z:()=>o});var r=n(7294),a=n(6010);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:n,className:o}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),l=n(6010),o=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=p(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,s]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,l]),tabValues:l}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=s[n].value;r!==i&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:o}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},o,{className:(0,l.Z)("tabs__item",y.tabItem,o?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",y.tabList)},a.createElement(g,(0,r.Z)({},e,t)),a.createElement(h,(0,r.Z)({},e,t)))}function E(e){const t=(0,v.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},364:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),l=n(4866),o=n(5162);const i={sidebar_label:"Android"},u="Zealot Android SDK",s={unversionedId:"developer-guide/sdk/android",id:"version-5.0.0/developer-guide/sdk/android",title:"Zealot Android SDK",description:"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/zh-Hans/docs/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/zh-Hans/docs/developer-guide/sdk/ios"},next:{title:"Fastlane \u63d2\u4ef6",permalink:"/zh-Hans/docs/developer-guide/fastlane"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"\u7528\u6237\u6743\u9650",id:"\u7528\u6237\u6743\u9650",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002"),(0,a.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," \u5b89\u88c5\uff0c\u5148\u9700\u8981\u6dfb\u52a0 maven \u4ed3\u5e93\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"\u4e4b\u540e\u5728\u4e3b app \u9879\u76ee\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," \u6dfb\u52a0 zealot\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"\u7528\u6237\u6743\u9650"},"\u7528\u6237\u6743\u9650"),(0,a.kt)("p",null,"\u4f7f\u7528 Zealot SDK \u9700\u8981\u5f00\u542f\u7f51\u7edc\u6743\u9650"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,a.kt)("p",null,"\u5728\u4f60\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," \u6587\u4ef6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," \u65b9\u6cd5\u6dfb\u52a0\u542f\u52a8\u4ee3\u7801\uff1a"),(0,a.kt)(l.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(o.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(o.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2922],{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 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=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=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):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.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,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));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]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.d(t,{Z:()=>o});var r=n(7294),a=n(4334);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:n,className:o}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),l=n(4334),o=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=p(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,s]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,l]),tabValues:l}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=s[n].value;r!==i&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:o}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},o,{className:(0,l.Z)("tabs__item",y.tabItem,o?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",y.tabList)},a.createElement(g,(0,r.Z)({},e,t)),a.createElement(h,(0,r.Z)({},e,t)))}function E(e){const t=(0,v.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},364:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),l=n(4866),o=n(5162);const i={sidebar_label:"Android"},u="Zealot Android SDK",s={unversionedId:"developer-guide/sdk/android",id:"version-5.0.0/developer-guide/sdk/android",title:"Zealot Android SDK",description:"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/zh-Hans/docs/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/android.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/zh-Hans/docs/developer-guide/sdk/ios"},next:{title:"Fastlane \u63d2\u4ef6",permalink:"/zh-Hans/docs/developer-guide/fastlane"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"\u7528\u6237\u6743\u9650",id:"\u7528\u6237\u6743\u9650",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002"),(0,a.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," \u5b89\u88c5\uff0c\u5148\u9700\u8981\u6dfb\u52a0 maven \u4ed3\u5e93\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"\u4e4b\u540e\u5728\u4e3b app \u9879\u76ee\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," \u6dfb\u52a0 zealot\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"\u7528\u6237\u6743\u9650"},"\u7528\u6237\u6743\u9650"),(0,a.kt)("p",null,"\u4f7f\u7528 Zealot SDK \u9700\u8981\u5f00\u542f\u7f51\u7edc\u6743\u9650"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'\n')),(0,a.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,a.kt)("p",null,"\u5728\u4f60\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," \u6587\u4ef6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," \u65b9\u6cd5\u6dfb\u52a0\u542f\u52a8\u4ee3\u7801\uff1a"),(0,a.kt)(l.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(o.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(o.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/4bc9e19e.c07c0a48.js b/zh-Hans/assets/js/4bc9e19e.e5b16ca4.js similarity index 99% rename from zh-Hans/assets/js/4bc9e19e.c07c0a48.js rename to zh-Hans/assets/js/4bc9e19e.e5b16ca4.js index 71bf2cc6b..e1ac5c9fe 100644 --- a/zh-Hans/assets/js/4bc9e19e.c07c0a48.js +++ b/zh-Hans/assets/js/4bc9e19e.e5b16ca4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5342],{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 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=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(i.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,a=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;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 l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{r.d(t,{Z:()=>o});var n=r(7294),a=r(6010);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:r,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>N});var n=r(7462),a=r(7294),l=r(6010),o=r(2466),s=r(6550),i=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function k(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,l=d(e),[o,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[i,u]=f({queryString:r,groupId:n}),[p,k]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,c.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&l.set(e)}),[r,l])]}({groupId:n}),h=(()=>{const e=i??p;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{h&&s(h)}),[h]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),k(e)}),[u,k,l]),tabValues:l}}var h=r(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),n=u[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:o}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const l=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function N(e){const t=(0,h.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},9543:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>u,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),l=r(941),o=r(4996),s=r(4866),i=r(5162);const u={},c="\u53cd\u5411\u4ee3\u7406",p={unversionedId:"self-hosted/reverse-proxies",id:"self-hosted/reverse-proxies",title:"\u53cd\u5411\u4ee3\u7406",description:"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/zh-Hans/docs/next/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/self-hosted/reverse-proxies.mdx",tags:[],version:"current",frontMatter:{},sidebar:"selfHosted",previous:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/next/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/zh-Hans/docs/next/category/cloud-provider-guides"}},d={},m=[{value:"\u51c6\u5907\u5de5\u4f5c",id:"\u51c6\u5907\u5de5\u4f5c",level:2},{value:"Traefik",id:"traefik",level:2},{value:"\u914d\u7f6e\u89e3\u91ca",id:"\u914d\u7f6e\u89e3\u91ca",level:3},{value:"Traefik \u670d\u52a1",id:"traefik-\u670d\u52a1",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2 \u914d\u7f6e",id:"caddy-2-\u914d\u7f6e",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},k="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(k,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u53cd\u5411\u4ee3\u7406"},"\u53cd\u5411\u4ee3\u7406"),(0,a.kt)("p",null,"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002"),(0,a.kt)(l.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"\u51c6\u5907\u5de5\u4f5c"},"\u51c6\u5907\u5de5\u4f5c"),(0,a.kt)("p",null,"\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u9700\u8981\u51c6\u5907\u597d\u5982\u4e0b\u6570\u636e\uff1a"),(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},"\u540d\u79f0"),(0,a.kt)("th",{parentName:"tr",align:null},"\u8303\u4f8b\u503c"),(0,a.kt)("th",{parentName:"tr",align:null},"\u5907\u6ce8"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u57df\u540d"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406 IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee",(0,a.kt)("br",null),"\u540c\u4e00\u53f0\u670d\u52a1\u53ef\u6539\u4e3a 127.0.0.1")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5916\u90e8\u6620\u5c04\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5185\u90e8\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"\u65e0\u9700\u4fee\u6539")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt \u90ae\u7bb1"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," \u662f\u4e00\u6b3e\u5f00\u6e90\u7684\u53cd\u5411\u4ee3\u7406\u4e0e\u8d1f\u8f7d\u5747\u8861\u5de5\u5177\uff0c\u5b83\u81ea\u8eab\u63d0\u4f9b\u591a\u79cd Providers \u53ef\u4ee5\u5b9e\u73b0\u63a5\u5165\u53cd\u5411\u4ee3\u7406\u5e76\u914d\u7f6e SSL \u7684\u65b9\u5f0f\u3002"),(0,a.kt)("h3",{id:"\u914d\u7f6e\u89e3\u91ca"},"\u914d\u7f6e\u89e3\u91ca"),(0,a.kt)("p",null,"\u65e0\u8bba\u4f7f\u7528\u90a3\u79cd Provider \u6838\u5fc3\u7684\u914d\u7f6e\u9879\u662f\u76f8\u540c\u7684\uff0c\u6784\u6210\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u914d\u7f6e\u4e3b\u8981\u6709\u4e09\u90e8\u5206\u7ec4\u6210\uff1a\u53d1\u73b0\u7aef\u53e3\u53f7\u3001\u8def\u7531\u89c4\u5219\uff08\u5305\u542b\u8bbf\u95ee\u7aef\u53e3\u53f7\u3001\u57df\u540d\u7ed1\u5b9a\u548cSSL\uff09"),(0,a.kt)("h3",{id:"traefik-\u670d\u52a1"},"Traefik \u670d\u52a1"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," \u540e\u5728\u4fee\u6539 zealot \u7684 Docker Compose \u914d\u7f6e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # \u7531 Treafik \u63a5\u7ba1\u65e0\u9700\u5728\u5bf9\u5916\u66b4\u9732\u7aef\u53e3\u53f7\n # ports:\n # - "8901:80"\n network:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n - traefik-services\n\nnetworks:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Docker \u90e8\u7f72\u7684\u5c40\u9650\u4e8e Traefik \u548c Zealot \u670d\u52a1\u901a\u5e38\u5728\u540c\u4e00\u4e2a\u673a\u5668\u7684\u540c\u4e00\u4e2a OS \u7cfb\u7edf\u4e2d\uff0c\u8de8\u673a\u5668\u5c31\u6ca1\u6cd5\u5b9e\u73b0\u901a\u8baf\uff0c\u5bf9\u4e8e\u8de8\u673a\u5668\u5c31\u9700\u8981\u53c2\u8003\u4e0b\u9762\u4e24\u79cd\u914d\u7f6e\u65b9\u6848\uff1a"),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5229\u7528\u5b83\u7684 Key-Value \u5b58\u50a8\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," \u4e14 Nomad \u7248\u672c\u8981\u5927\u4e8e\u7b49\u4e8e 1.3 \u624d\u53ef\u4ee5\u54df\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2-\u914d\u7f6e"},"Caddy 2 \u914d\u7f6e"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# \u4f7f\u7528 Let's Encrypt \u670d\u52a1\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("p",null,"\u914d\u7f6e\u53ea\u9700\u914d\u7f6e ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy")," \u540e\u9762 IP \u5730\u5740\u548c\u7aef\u53e3\u90e8\u5206\u5373\u53ef\u3002"),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5982\u4e0b\u662f\u901a\u7528\u914d\u7f6e\uff0c\u5982\u679c\u4e0d\u53ef\u7528\u6b22\u8fce",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"\u63d0\u95ee\u9898"),"\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n listen [::]:443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # \u53ef\u9009\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"Nginx \u8fd8\u9700\u8981\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," \u4e2d\u914d\u7f6e\u6700\u5927\u4e0a\u4f20\u6587\u4ef6\u4e0a\u4f20\u5927\u5c0f\uff0c\u666e\u901a\u5e94\u7528\u5efa\u8bae\u662f\u5728 200MB \u5de6\u53f3\uff0c\u5982\u679c\u662f\u6e38\u620f\u53ef\u6839\u636e\u5b9e\u9645\u6587\u4ef6\u5927\u5c0f\u518d\u591a\u51fa 50% \u6253\u51fa\u5bcc\u4f59\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}h.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[5342],{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 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=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(i.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,a=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;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 l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{r.d(t,{Z:()=>o});var n=r(7294),a=r(4334);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:r,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>N});var n=r(7462),a=r(7294),l=r(4334),o=r(2466),s=r(6550),i=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function k(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,l=d(e),[o,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[i,u]=f({queryString:r,groupId:n}),[p,k]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,c.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&l.set(e)}),[r,l])]}({groupId:n}),h=(()=>{const e=i??p;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{h&&s(h)}),[h]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),k(e)}),[u,k,l]),tabValues:l}}var h=r(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),n=u[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:o}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const l=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function N(e){const t=(0,h.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},9543:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>u,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),l=r(941),o=r(4996),s=r(4866),i=r(5162);const u={},c="\u53cd\u5411\u4ee3\u7406",p={unversionedId:"self-hosted/reverse-proxies",id:"self-hosted/reverse-proxies",title:"\u53cd\u5411\u4ee3\u7406",description:"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/zh-Hans/docs/next/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/self-hosted/reverse-proxies.mdx",tags:[],version:"current",frontMatter:{},sidebar:"selfHosted",previous:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/next/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/zh-Hans/docs/next/category/cloud-provider-guides"}},d={},m=[{value:"\u51c6\u5907\u5de5\u4f5c",id:"\u51c6\u5907\u5de5\u4f5c",level:2},{value:"Traefik",id:"traefik",level:2},{value:"\u914d\u7f6e\u89e3\u91ca",id:"\u914d\u7f6e\u89e3\u91ca",level:3},{value:"Traefik \u670d\u52a1",id:"traefik-\u670d\u52a1",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2 \u914d\u7f6e",id:"caddy-2-\u914d\u7f6e",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},k="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(k,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u53cd\u5411\u4ee3\u7406"},"\u53cd\u5411\u4ee3\u7406"),(0,a.kt)("p",null,"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002"),(0,a.kt)(l.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"\u51c6\u5907\u5de5\u4f5c"},"\u51c6\u5907\u5de5\u4f5c"),(0,a.kt)("p",null,"\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u9700\u8981\u51c6\u5907\u597d\u5982\u4e0b\u6570\u636e\uff1a"),(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},"\u540d\u79f0"),(0,a.kt)("th",{parentName:"tr",align:null},"\u8303\u4f8b\u503c"),(0,a.kt)("th",{parentName:"tr",align:null},"\u5907\u6ce8"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u57df\u540d"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406 IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee",(0,a.kt)("br",null),"\u540c\u4e00\u53f0\u670d\u52a1\u53ef\u6539\u4e3a 127.0.0.1")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5916\u90e8\u6620\u5c04\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5185\u90e8\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"\u65e0\u9700\u4fee\u6539")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt \u90ae\u7bb1"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," \u662f\u4e00\u6b3e\u5f00\u6e90\u7684\u53cd\u5411\u4ee3\u7406\u4e0e\u8d1f\u8f7d\u5747\u8861\u5de5\u5177\uff0c\u5b83\u81ea\u8eab\u63d0\u4f9b\u591a\u79cd Providers \u53ef\u4ee5\u5b9e\u73b0\u63a5\u5165\u53cd\u5411\u4ee3\u7406\u5e76\u914d\u7f6e SSL \u7684\u65b9\u5f0f\u3002"),(0,a.kt)("h3",{id:"\u914d\u7f6e\u89e3\u91ca"},"\u914d\u7f6e\u89e3\u91ca"),(0,a.kt)("p",null,"\u65e0\u8bba\u4f7f\u7528\u90a3\u79cd Provider \u6838\u5fc3\u7684\u914d\u7f6e\u9879\u662f\u76f8\u540c\u7684\uff0c\u6784\u6210\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u914d\u7f6e\u4e3b\u8981\u6709\u4e09\u90e8\u5206\u7ec4\u6210\uff1a\u53d1\u73b0\u7aef\u53e3\u53f7\u3001\u8def\u7531\u89c4\u5219\uff08\u5305\u542b\u8bbf\u95ee\u7aef\u53e3\u53f7\u3001\u57df\u540d\u7ed1\u5b9a\u548cSSL\uff09"),(0,a.kt)("h3",{id:"traefik-\u670d\u52a1"},"Traefik \u670d\u52a1"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," \u540e\u5728\u4fee\u6539 zealot \u7684 Docker Compose \u914d\u7f6e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # \u7531 Treafik \u63a5\u7ba1\u65e0\u9700\u5728\u5bf9\u5916\u66b4\u9732\u7aef\u53e3\u53f7\n # ports:\n # - "8901:80"\n network:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n - traefik-services\n\nnetworks:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Docker \u90e8\u7f72\u7684\u5c40\u9650\u4e8e Traefik \u548c Zealot \u670d\u52a1\u901a\u5e38\u5728\u540c\u4e00\u4e2a\u673a\u5668\u7684\u540c\u4e00\u4e2a OS \u7cfb\u7edf\u4e2d\uff0c\u8de8\u673a\u5668\u5c31\u6ca1\u6cd5\u5b9e\u73b0\u901a\u8baf\uff0c\u5bf9\u4e8e\u8de8\u673a\u5668\u5c31\u9700\u8981\u53c2\u8003\u4e0b\u9762\u4e24\u79cd\u914d\u7f6e\u65b9\u6848\uff1a"),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5229\u7528\u5b83\u7684 Key-Value \u5b58\u50a8\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," \u4e14 Nomad \u7248\u672c\u8981\u5927\u4e8e\u7b49\u4e8e 1.3 \u624d\u53ef\u4ee5\u54df\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2-\u914d\u7f6e"},"Caddy 2 \u914d\u7f6e"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# \u4f7f\u7528 Let's Encrypt \u670d\u52a1\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("p",null,"\u914d\u7f6e\u53ea\u9700\u914d\u7f6e ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy")," \u540e\u9762 IP \u5730\u5740\u548c\u7aef\u53e3\u90e8\u5206\u5373\u53ef\u3002"),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5982\u4e0b\u662f\u901a\u7528\u914d\u7f6e\uff0c\u5982\u679c\u4e0d\u53ef\u7528\u6b22\u8fce",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"\u63d0\u95ee\u9898"),"\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n listen [::]:443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # \u53ef\u9009\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"Nginx \u8fd8\u9700\u8981\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," \u4e2d\u914d\u7f6e\u6700\u5927\u4e0a\u4f20\u6587\u4ef6\u4e0a\u4f20\u5927\u5c0f\uff0c\u666e\u901a\u5e94\u7528\u5efa\u8bae\u662f\u5728 200MB \u5de6\u53f3\uff0c\u5982\u679c\u662f\u6e38\u620f\u53ef\u6839\u636e\u5b9e\u9645\u6587\u4ef6\u5927\u5c0f\u518d\u591a\u51fa 50% \u6253\u51fa\u5bcc\u4f59\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/56786dcf.2f58ac1b.js b/zh-Hans/assets/js/56786dcf.ce1d840f.js similarity index 99% rename from zh-Hans/assets/js/56786dcf.2f58ac1b.js rename to zh-Hans/assets/js/56786dcf.ce1d840f.js index d628bf795..772c8f7c8 100644 --- a/zh-Hans/assets/js/56786dcf.2f58ac1b.js +++ b/zh-Hans/assets/js/56786dcf.ce1d840f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6788],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.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 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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=k({queryString:n,groupId:a}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),f=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),v(e)}),[c,v,o]),tabValues:o}}var f=n(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function N(e){const t=v(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(h,(0,a.Z)({},e,t)))}function y(e){const t=(0,f.Z)();return r.createElement(N,(0,a.Z)({key:String(t)},e))}},9186:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Dev Container (Docker)"},s="Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-5.0.0/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",description:"Dev Container (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/zh-Hans/docs/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Dev Container (Docker)"},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/zh-Hans/docs/category/local-development"},next:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/contributing-guide/local-development/source-code"}},u={},d=[{value:"\u7cfb\u7edf\u4f9d\u8d56",id:"\u7cfb\u7edf\u4f9d\u8d56",level:2},{value:"\u5b89\u88c5 Git",id:"\u5b89\u88c5-git",level:3},{value:"\u5b89\u88c5 Docker & docker-compose",id:"\u5b89\u88c5-docker--docker-compose",level:3},{value:"\u5b89\u88c5 Visual Studio Code",id:"\u5b89\u88c5-visual-studio-code",level:3},{value:"\u5b89\u88c5 Remote container \u6269\u5c55",id:"\u5b89\u88c5-remote-container-\u6269\u5c55",level:3},{value:"\u83b7\u53d6 Zealot Codespace",id:"\u83b7\u53d6-zealot-codespace",level:2},{value:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",level:2},{value:"\u542f\u52a8\u9879\u76ee",id:"\u542f\u52a8\u9879\u76ee",level:2},{value:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",level:2}],p={toc:d},m="wrapper";function k(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-\u5f00\u53d1\u90e8\u7f72\u6307\u5357"},"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"Dev Container")," (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"\u7cfb\u7edf\u4f9d\u8d56"},"\u7cfb\u7edf\u4f9d\u8d56"),(0,r.kt)("p",null,"\u5728\u5f00\u53d1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Git\uff0cVirsual Studio Code\uff0cDocker \u548c docker-compose\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-git"},"\u5b89\u88c5 Git"),(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-docker--docker-compose"},"\u5b89\u88c5 Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: 10 Pro/Enterprise \u9700\u8981 ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," / Windows 10 Home (2004+) \u9700\u8981 Docker Desktop 2.3+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),"\u3002\uff08\u4e0d\u652f\u6301 Docker Toolbox \u548c Windows container images\uff09"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+\u3002"),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+\u3002\uff08\u4e0d\u652f\u6301 Ubuntu snap \u5305\uff09")),(0,r.kt)("h3",{id:"\u5b89\u88c5-visual-studio-code"},"\u5b89\u88c5 Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code \u662f\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fd0\u884c\u7684\u514d\u8d39\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u4f60\u7684\u5b89\u88c5\u65b9\u5f0f\uff1a"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," macOS \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u6253\u5f00\u6d4f\u89c8\u5668\u4e0b\u8f7d\u754c\u9762\u627e\u5230\u5df2\u4e0b\u8f7d\u7684\u5e94\u7528\u6587\u4ef6\u6216\u538b\u7f29\u6587\u4ef6\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u538b\u7f29\u6587\u4ef6\u5148\u8fdb\u884c\u89e3\u538b\u7f29\u64cd\u4f5c\uff0c\u5982\u679c\u4f7f\u7528 Safari \u4e0b\u8f7d\u901a\u5e38\u4f1a\u5e2e\u4f60\u81ea\u52a8\u89e3\u538b\u7f29\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u62d6\u62fd ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," \u5230\u7cfb\u7edf\u5e94\u7528\u6587\u4ef6\u5939\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u53cc\u51fb VS Code \u5e94\u7528\u5373\u53ef\u6253\u5f00\u5e94\u7528\u3002"))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," Windows \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u5b89\u88c5\u7a0b\u5e8f\uff08VSCodeUserSetup-{version}.exe\uff09\u7b49\u5f85\u5b89\u88c5\u6210\u529f\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u9ed8\u8ba4\u60c5\u51b5\u4e0b VS Code \u4f1a\u5b89\u88c5\u5230 ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code")," \u8def\u5f84\u3002"))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"))),(0,r.kt)("h3",{id:"\u5b89\u88c5-remote-container-\u6269\u5c55"},"\u5b89\u88c5 Remote container \u6269\u5c55"),(0,r.kt)("p",null,"\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u5b89\u88c5 ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"\u83b7\u53d6-zealot-codespace"},"\u83b7\u53d6 Zealot Codespace"),(0,r.kt)("p",null,"Zealot Codespace \u540c\u6837\u5b58\u653e\u5728 Zealot \u9879\u76ee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/zealot/tree/develop/.devcontainer"},".devcontailer")," \u76ee\u5f55\uff0c\u4f60\u9700\u8981\u5148\u514b\u9686\u9879\u76ee\u6e90\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Codespace \u5305\u542b\u4e86\u4e00\u7cfb\u5217\u6587\u4ef6\uff1a"),(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},"\u6587\u4ef6\u540d"),(0,r.kt)("th",{parentName:"tr",align:null},"\u8bf4\u660e"))),(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"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer \u914d\u7f6e\u6587\u4ef6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"\u955c\u50cf\u6838\u5fc3\uff0c\u53d8\u66f4\u4f1a\u81ea\u52a8\u63a8\u9001\u5230\u4e0d\u540c registry \u4ed3\u5e93")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"\u95f4\u63a5\u955c\u50cf\uff0c\u4e3b\u8981\u662f\u8282\u7701\u7f16\u8bd1\u65f6\u95f4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"\u9879\u76ee\u670d\u52a1\u4f9d\u8d56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"\u7528\u4e8e\u521d\u59cb\u5316 Postgres \u9ed8\u8ba4\u7528\u6237\u53ca\u6743\u9650")))),(0,r.kt)("h2",{id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"},"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"),(0,r.kt)("p",null,"\u6253\u5f00 Visual Studio Code \u5e94\u7528\u540e\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," \u8f93\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," \u56de\u8f66\u9009\u62e9\u521a\u514b\u9686\u4e0b\u6765\u7684 Zealot \u9879\u76ee\u76ee\u5f55\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"\u9996\u6b21\u6267\u884c\u4f1a\u62c9\u53d6 Zealot Codespace \u955c\u50cf\u5e76\u5f00\u59cb\u6784\u5efa\uff0c\u8fc7\u7a0b\u4f1a\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\u671f\u95f4\u53ef\u70b9\u51fb ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," \u67e5\u770b\u6784\u5efa\u5b9e\u65f6\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"\u6784\u5efa\u5b8c\u6210\u5e76\u542f\u52a8\u5b8c\u6bd5\u4f1a\u52a0\u8f7d\u9879\u76ee\u6587\u4ef6\u548c zsh \u7ec8\u7aef\uff0c\u901a\u8fc7\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"\u5728\u5bbf\u4e3b\u673a\u4e5f\u80fd\u770b\u5230 Docker \u542f\u52a8\u4e86 docker-compose \u5728\u8fd0\u884c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"\u542f\u52a8\u9879\u76ee"},"\u542f\u52a8\u9879\u76ee"),(0,r.kt)("p",null,"\u5982\u679c\u6ca1\u6709\u6253\u5f00 VSCode \u5185\u7f6e\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u5feb\u6377\u952e ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," \u6253\u5f00\uff0c\u65b0\u6253\u5f00\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u53ef\u8fd0\u884c Zealot \u4f9d\u8d56\u7684\u6240\u6709\u670d\u52a1\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"},"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"),(0,r.kt)("p",null,"\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u4e00\u4f1a\u540e\u4f60\u4f1a\u5728\u53f3\u4e0b\u89d2\u7a97\u53e3\u770b\u5230 ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," \u7a97\u53e3\u70b9\u51fb\u53ef\u6253\u5f00 Zealot \u7f51\u9875\u670d\u52a1\u3002\u540c\u6837\u4e5f\u53ef\u4ee5\u901a\u8fc7\u7ec8\u7aef\u533a\u57df\u9876\u90e8 ",(0,r.kt)("strong",{parentName:"p"},"Ports")," \u9009\u9879\u67e5\u770b\u53ef\u8f6c\u53d1\u7aef\u53e3\u7684\u670d\u52a1\uff0c\u70b9\u51fb\u6d4f\u89c8\u5668\u56fe\u6807\u4f1a\u628a\u5bb9\u5668\u7684\u7aef\u53e3\u8f6c\u53d1\u5e76\u7ed1\u5b9a\u5230\u672c\u5730\u968f\u673a\u65ad\u5f00\u540e\u4e0a\u9762\u8bbf\u95ee\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}k.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6788],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.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 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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=k({queryString:n,groupId:a}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),f=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),v(e)}),[c,v,o]),tabValues:o}}var f=n(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function N(e){const t=v(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(h,(0,a.Z)({},e,t)))}function y(e){const t=(0,f.Z)();return r.createElement(N,(0,a.Z)({key:String(t)},e))}},9186:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Dev Container (Docker)"},s="Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-5.0.0/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",description:"Dev Container (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/zh-Hans/docs/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"Dev Container (Docker)"},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/zh-Hans/docs/category/local-development"},next:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/contributing-guide/local-development/source-code"}},u={},d=[{value:"\u7cfb\u7edf\u4f9d\u8d56",id:"\u7cfb\u7edf\u4f9d\u8d56",level:2},{value:"\u5b89\u88c5 Git",id:"\u5b89\u88c5-git",level:3},{value:"\u5b89\u88c5 Docker & docker-compose",id:"\u5b89\u88c5-docker--docker-compose",level:3},{value:"\u5b89\u88c5 Visual Studio Code",id:"\u5b89\u88c5-visual-studio-code",level:3},{value:"\u5b89\u88c5 Remote container \u6269\u5c55",id:"\u5b89\u88c5-remote-container-\u6269\u5c55",level:3},{value:"\u83b7\u53d6 Zealot Codespace",id:"\u83b7\u53d6-zealot-codespace",level:2},{value:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",level:2},{value:"\u542f\u52a8\u9879\u76ee",id:"\u542f\u52a8\u9879\u76ee",level:2},{value:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",level:2}],p={toc:d},m="wrapper";function k(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-\u5f00\u53d1\u90e8\u7f72\u6307\u5357"},"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"Dev Container")," (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"\u7cfb\u7edf\u4f9d\u8d56"},"\u7cfb\u7edf\u4f9d\u8d56"),(0,r.kt)("p",null,"\u5728\u5f00\u53d1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Git\uff0cVirsual Studio Code\uff0cDocker \u548c docker-compose\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-git"},"\u5b89\u88c5 Git"),(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-docker--docker-compose"},"\u5b89\u88c5 Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: 10 Pro/Enterprise \u9700\u8981 ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," / Windows 10 Home (2004+) \u9700\u8981 Docker Desktop 2.3+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),"\u3002\uff08\u4e0d\u652f\u6301 Docker Toolbox \u548c Windows container images\uff09"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+\u3002"),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+\u3002\uff08\u4e0d\u652f\u6301 Ubuntu snap \u5305\uff09")),(0,r.kt)("h3",{id:"\u5b89\u88c5-visual-studio-code"},"\u5b89\u88c5 Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code \u662f\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fd0\u884c\u7684\u514d\u8d39\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u4f60\u7684\u5b89\u88c5\u65b9\u5f0f\uff1a"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," macOS \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u6253\u5f00\u6d4f\u89c8\u5668\u4e0b\u8f7d\u754c\u9762\u627e\u5230\u5df2\u4e0b\u8f7d\u7684\u5e94\u7528\u6587\u4ef6\u6216\u538b\u7f29\u6587\u4ef6\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u538b\u7f29\u6587\u4ef6\u5148\u8fdb\u884c\u89e3\u538b\u7f29\u64cd\u4f5c\uff0c\u5982\u679c\u4f7f\u7528 Safari \u4e0b\u8f7d\u901a\u5e38\u4f1a\u5e2e\u4f60\u81ea\u52a8\u89e3\u538b\u7f29\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u62d6\u62fd ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," \u5230\u7cfb\u7edf\u5e94\u7528\u6587\u4ef6\u5939\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u53cc\u51fb VS Code \u5e94\u7528\u5373\u53ef\u6253\u5f00\u5e94\u7528\u3002"))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," Windows \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u5b89\u88c5\u7a0b\u5e8f\uff08VSCodeUserSetup-{version}.exe\uff09\u7b49\u5f85\u5b89\u88c5\u6210\u529f\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u9ed8\u8ba4\u60c5\u51b5\u4e0b VS Code \u4f1a\u5b89\u88c5\u5230 ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code")," \u8def\u5f84\u3002"))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"))),(0,r.kt)("h3",{id:"\u5b89\u88c5-remote-container-\u6269\u5c55"},"\u5b89\u88c5 Remote container \u6269\u5c55"),(0,r.kt)("p",null,"\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u5b89\u88c5 ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"\u83b7\u53d6-zealot-codespace"},"\u83b7\u53d6 Zealot Codespace"),(0,r.kt)("p",null,"Zealot Codespace \u540c\u6837\u5b58\u653e\u5728 Zealot \u9879\u76ee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/zealot/tree/develop/.devcontainer"},".devcontailer")," \u76ee\u5f55\uff0c\u4f60\u9700\u8981\u5148\u514b\u9686\u9879\u76ee\u6e90\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Codespace \u5305\u542b\u4e86\u4e00\u7cfb\u5217\u6587\u4ef6\uff1a"),(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},"\u6587\u4ef6\u540d"),(0,r.kt)("th",{parentName:"tr",align:null},"\u8bf4\u660e"))),(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"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer \u914d\u7f6e\u6587\u4ef6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"\u955c\u50cf\u6838\u5fc3\uff0c\u53d8\u66f4\u4f1a\u81ea\u52a8\u63a8\u9001\u5230\u4e0d\u540c registry \u4ed3\u5e93")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"\u95f4\u63a5\u955c\u50cf\uff0c\u4e3b\u8981\u662f\u8282\u7701\u7f16\u8bd1\u65f6\u95f4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"\u9879\u76ee\u670d\u52a1\u4f9d\u8d56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"\u7528\u4e8e\u521d\u59cb\u5316 Postgres \u9ed8\u8ba4\u7528\u6237\u53ca\u6743\u9650")))),(0,r.kt)("h2",{id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"},"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"),(0,r.kt)("p",null,"\u6253\u5f00 Visual Studio Code \u5e94\u7528\u540e\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," \u8f93\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," \u56de\u8f66\u9009\u62e9\u521a\u514b\u9686\u4e0b\u6765\u7684 Zealot \u9879\u76ee\u76ee\u5f55\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"\u9996\u6b21\u6267\u884c\u4f1a\u62c9\u53d6 Zealot Codespace \u955c\u50cf\u5e76\u5f00\u59cb\u6784\u5efa\uff0c\u8fc7\u7a0b\u4f1a\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\u671f\u95f4\u53ef\u70b9\u51fb ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," \u67e5\u770b\u6784\u5efa\u5b9e\u65f6\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"\u6784\u5efa\u5b8c\u6210\u5e76\u542f\u52a8\u5b8c\u6bd5\u4f1a\u52a0\u8f7d\u9879\u76ee\u6587\u4ef6\u548c zsh \u7ec8\u7aef\uff0c\u901a\u8fc7\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"\u5728\u5bbf\u4e3b\u673a\u4e5f\u80fd\u770b\u5230 Docker \u542f\u52a8\u4e86 docker-compose \u5728\u8fd0\u884c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"\u542f\u52a8\u9879\u76ee"},"\u542f\u52a8\u9879\u76ee"),(0,r.kt)("p",null,"\u5982\u679c\u6ca1\u6709\u6253\u5f00 VSCode \u5185\u7f6e\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u5feb\u6377\u952e ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," \u6253\u5f00\uff0c\u65b0\u6253\u5f00\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u53ef\u8fd0\u884c Zealot \u4f9d\u8d56\u7684\u6240\u6709\u670d\u52a1\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"},"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"),(0,r.kt)("p",null,"\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u4e00\u4f1a\u540e\u4f60\u4f1a\u5728\u53f3\u4e0b\u89d2\u7a97\u53e3\u770b\u5230 ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," \u7a97\u53e3\u70b9\u51fb\u53ef\u6253\u5f00 Zealot \u7f51\u9875\u670d\u52a1\u3002\u540c\u6837\u4e5f\u53ef\u4ee5\u901a\u8fc7\u7ec8\u7aef\u533a\u57df\u9876\u90e8 ",(0,r.kt)("strong",{parentName:"p"},"Ports")," \u9009\u9879\u67e5\u770b\u53ef\u8f6c\u53d1\u7aef\u53e3\u7684\u670d\u52a1\uff0c\u70b9\u51fb\u6d4f\u89c8\u5668\u56fe\u6807\u4f1a\u628a\u5bb9\u5668\u7684\u7aef\u53e3\u8f6c\u53d1\u5e76\u7ed1\u5b9a\u5230\u672c\u5730\u968f\u673a\u65ad\u5f00\u540e\u4e0a\u9762\u8bbf\u95ee\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}k.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/5914602b.81f6ff86.js b/zh-Hans/assets/js/5914602b.17a5ffe7.js similarity index 99% rename from zh-Hans/assets/js/5914602b.81f6ff86.js rename to zh-Hans/assets/js/5914602b.17a5ffe7.js index 7bbe7b510..2ba4a7955 100644 --- a/zh-Hans/assets/js/5914602b.81f6ff86.js +++ b/zh-Hans/assets/js/5914602b.17a5ffe7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8797],{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 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=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(i.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,a=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;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 l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{r.d(t,{Z:()=>o});var n=r(7294),a=r(6010);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:r,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>N});var n=r(7462),a=r(7294),l=r(6010),o=r(2466),s=r(6550),i=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function k(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,l=d(e),[o,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[i,u]=f({queryString:r,groupId:n}),[p,k]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,c.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&l.set(e)}),[r,l])]}({groupId:n}),h=(()=>{const e=i??p;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{h&&s(h)}),[h]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),k(e)}),[u,k,l]),tabValues:l}}var h=r(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),n=u[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:o}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const l=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function N(e){const t=(0,h.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},6406:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>u,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),l=r(941),o=r(4996),s=r(4866),i=r(5162);const u={},c="\u53cd\u5411\u4ee3\u7406",p={unversionedId:"self-hosted/reverse-proxies",id:"version-5.0.0/self-hosted/reverse-proxies",title:"\u53cd\u5411\u4ee3\u7406",description:"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/zh-Hans/docs/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.0.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/zh-Hans/docs/category/cloud-provider-guides"}},d={},m=[{value:"\u51c6\u5907\u5de5\u4f5c",id:"\u51c6\u5907\u5de5\u4f5c",level:2},{value:"Traefik",id:"traefik",level:2},{value:"\u914d\u7f6e\u89e3\u91ca",id:"\u914d\u7f6e\u89e3\u91ca",level:3},{value:"Traefik \u670d\u52a1",id:"traefik-\u670d\u52a1",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2 \u914d\u7f6e",id:"caddy-2-\u914d\u7f6e",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},k="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(k,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u53cd\u5411\u4ee3\u7406"},"\u53cd\u5411\u4ee3\u7406"),(0,a.kt)("p",null,"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002"),(0,a.kt)(l.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"\u51c6\u5907\u5de5\u4f5c"},"\u51c6\u5907\u5de5\u4f5c"),(0,a.kt)("p",null,"\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u9700\u8981\u51c6\u5907\u597d\u5982\u4e0b\u6570\u636e\uff1a"),(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},"\u540d\u79f0"),(0,a.kt)("th",{parentName:"tr",align:null},"\u8303\u4f8b\u503c"),(0,a.kt)("th",{parentName:"tr",align:null},"\u5907\u6ce8"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u57df\u540d"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406 IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee",(0,a.kt)("br",null),"\u540c\u4e00\u53f0\u670d\u52a1\u53ef\u6539\u4e3a 127.0.0.1")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5916\u90e8\u6620\u5c04\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5185\u90e8\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"\u65e0\u9700\u4fee\u6539")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt \u90ae\u7bb1"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," \u662f\u4e00\u6b3e\u5f00\u6e90\u7684\u53cd\u5411\u4ee3\u7406\u4e0e\u8d1f\u8f7d\u5747\u8861\u5de5\u5177\uff0c\u5b83\u81ea\u8eab\u63d0\u4f9b\u591a\u79cd Providers \u53ef\u4ee5\u5b9e\u73b0\u63a5\u5165\u53cd\u5411\u4ee3\u7406\u5e76\u914d\u7f6e SSL \u7684\u65b9\u5f0f\u3002"),(0,a.kt)("h3",{id:"\u914d\u7f6e\u89e3\u91ca"},"\u914d\u7f6e\u89e3\u91ca"),(0,a.kt)("p",null,"\u65e0\u8bba\u4f7f\u7528\u90a3\u79cd Provider \u6838\u5fc3\u7684\u914d\u7f6e\u9879\u662f\u76f8\u540c\u7684\uff0c\u6784\u6210\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u914d\u7f6e\u4e3b\u8981\u6709\u4e09\u90e8\u5206\u7ec4\u6210\uff1a\u53d1\u73b0\u7aef\u53e3\u53f7\u3001\u8def\u7531\u89c4\u5219\uff08\u5305\u542b\u8bbf\u95ee\u7aef\u53e3\u53f7\u3001\u57df\u540d\u7ed1\u5b9a\u548cSSL\uff09"),(0,a.kt)("h3",{id:"traefik-\u670d\u52a1"},"Traefik \u670d\u52a1"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," \u540e\u5728\u4fee\u6539 zealot \u7684 Docker Compose \u914d\u7f6e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # \u7531 Treafik \u63a5\u7ba1\u65e0\u9700\u5728\u5bf9\u5916\u66b4\u9732\u7aef\u53e3\u53f7\n # ports:\n # - "8901:80"\n network:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n - traefik-services\n\nnetworks:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Docker \u90e8\u7f72\u7684\u5c40\u9650\u4e8e Traefik \u548c Zealot \u670d\u52a1\u901a\u5e38\u5728\u540c\u4e00\u4e2a\u673a\u5668\u7684\u540c\u4e00\u4e2a OS \u7cfb\u7edf\u4e2d\uff0c\u8de8\u673a\u5668\u5c31\u6ca1\u6cd5\u5b9e\u73b0\u901a\u8baf\uff0c\u5bf9\u4e8e\u8de8\u673a\u5668\u5c31\u9700\u8981\u53c2\u8003\u4e0b\u9762\u4e24\u79cd\u914d\u7f6e\u65b9\u6848\uff1a"),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5229\u7528\u5b83\u7684 Key-Value \u5b58\u50a8\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," \u4e14 Nomad \u7248\u672c\u8981\u5927\u4e8e\u7b49\u4e8e 1.3 \u624d\u53ef\u4ee5\u54df\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2-\u914d\u7f6e"},"Caddy 2 \u914d\u7f6e"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# \u4f7f\u7528 Let's Encrypt \u670d\u52a1\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("p",null,"\u914d\u7f6e\u53ea\u9700\u914d\u7f6e ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy")," \u540e\u9762 IP \u5730\u5740\u548c\u7aef\u53e3\u90e8\u5206\u5373\u53ef\u3002"),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5982\u4e0b\u662f\u901a\u7528\u914d\u7f6e\uff0c\u5982\u679c\u4e0d\u53ef\u7528\u6b22\u8fce",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"\u63d0\u95ee\u9898"),"\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n listen [::]:443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # \u53ef\u9009\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"Nginx \u8fd8\u9700\u8981\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," \u4e2d\u914d\u7f6e\u6700\u5927\u4e0a\u4f20\u6587\u4ef6\u4e0a\u4f20\u5927\u5c0f\uff0c\u666e\u901a\u5e94\u7528\u5efa\u8bae\u662f\u5728 200MB \u5de6\u53f3\uff0c\u5982\u679c\u662f\u6e38\u620f\u53ef\u6839\u636e\u5b9e\u9645\u6587\u4ef6\u5927\u5c0f\u518d\u591a\u51fa 50% \u6253\u51fa\u5bcc\u4f59\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}h.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8797],{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 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=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(i.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,a=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;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 l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{r.d(t,{Z:()=>o});var n=r(7294),a=r(4334);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:r,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>N});var n=r(7462),a=r(7294),l=r(4334),o=r(2466),s=r(6550),i=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function k(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,l=d(e),[o,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[i,u]=f({queryString:r,groupId:n}),[p,k]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,c.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&l.set(e)}),[r,l])]}({groupId:n}),h=(()=>{const e=i??p;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{h&&s(h)}),[h]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),k(e)}),[u,k,l]),tabValues:l}}var h=r(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),n=u[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:o}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const l=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function N(e){const t=(0,h.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},6406:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>u,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),l=r(941),o=r(4996),s=r(4866),i=r(5162);const u={},c="\u53cd\u5411\u4ee3\u7406",p={unversionedId:"self-hosted/reverse-proxies",id:"version-5.0.0/self-hosted/reverse-proxies",title:"\u53cd\u5411\u4ee3\u7406",description:"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/zh-Hans/docs/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/self-hosted/reverse-proxies.mdx",tags:[],version:"5.0.0",frontMatter:{},sidebar:"selfHosted",previous:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/zh-Hans/docs/category/cloud-provider-guides"}},d={},m=[{value:"\u51c6\u5907\u5de5\u4f5c",id:"\u51c6\u5907\u5de5\u4f5c",level:2},{value:"Traefik",id:"traefik",level:2},{value:"\u914d\u7f6e\u89e3\u91ca",id:"\u914d\u7f6e\u89e3\u91ca",level:3},{value:"Traefik \u670d\u52a1",id:"traefik-\u670d\u52a1",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2 \u914d\u7f6e",id:"caddy-2-\u914d\u7f6e",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},k="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(k,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u53cd\u5411\u4ee3\u7406"},"\u53cd\u5411\u4ee3\u7406"),(0,a.kt)("p",null,"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002"),(0,a.kt)(l.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-light.png"),dark:(0,o.Z)("/img/5.0.0/zh-Hans/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"\u51c6\u5907\u5de5\u4f5c"},"\u51c6\u5907\u5de5\u4f5c"),(0,a.kt)("p",null,"\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u9700\u8981\u51c6\u5907\u597d\u5982\u4e0b\u6570\u636e\uff1a"),(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},"\u540d\u79f0"),(0,a.kt)("th",{parentName:"tr",align:null},"\u8303\u4f8b\u503c"),(0,a.kt)("th",{parentName:"tr",align:null},"\u5907\u6ce8"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u57df\u540d"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406 IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee",(0,a.kt)("br",null),"\u540c\u4e00\u53f0\u670d\u52a1\u53ef\u6539\u4e3a 127.0.0.1")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5916\u90e8\u6620\u5c04\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5185\u90e8\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"\u65e0\u9700\u4fee\u6539")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt \u90ae\u7bb1"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," \u662f\u4e00\u6b3e\u5f00\u6e90\u7684\u53cd\u5411\u4ee3\u7406\u4e0e\u8d1f\u8f7d\u5747\u8861\u5de5\u5177\uff0c\u5b83\u81ea\u8eab\u63d0\u4f9b\u591a\u79cd Providers \u53ef\u4ee5\u5b9e\u73b0\u63a5\u5165\u53cd\u5411\u4ee3\u7406\u5e76\u914d\u7f6e SSL \u7684\u65b9\u5f0f\u3002"),(0,a.kt)("h3",{id:"\u914d\u7f6e\u89e3\u91ca"},"\u914d\u7f6e\u89e3\u91ca"),(0,a.kt)("p",null,"\u65e0\u8bba\u4f7f\u7528\u90a3\u79cd Provider \u6838\u5fc3\u7684\u914d\u7f6e\u9879\u662f\u76f8\u540c\u7684\uff0c\u6784\u6210\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u914d\u7f6e\u4e3b\u8981\u6709\u4e09\u90e8\u5206\u7ec4\u6210\uff1a\u53d1\u73b0\u7aef\u53e3\u53f7\u3001\u8def\u7531\u89c4\u5219\uff08\u5305\u542b\u8bbf\u95ee\u7aef\u53e3\u53f7\u3001\u57df\u540d\u7ed1\u5b9a\u548cSSL\uff09"),(0,a.kt)("h3",{id:"traefik-\u670d\u52a1"},"Traefik \u670d\u52a1"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," \u540e\u5728\u4fee\u6539 zealot \u7684 Docker Compose \u914d\u7f6e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # \u7531 Treafik \u63a5\u7ba1\u65e0\u9700\u5728\u5bf9\u5916\u66b4\u9732\u7aef\u53e3\u53f7\n # ports:\n # - "8901:80"\n network:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n - traefik-services\n\nnetworks:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Docker \u90e8\u7f72\u7684\u5c40\u9650\u4e8e Traefik \u548c Zealot \u670d\u52a1\u901a\u5e38\u5728\u540c\u4e00\u4e2a\u673a\u5668\u7684\u540c\u4e00\u4e2a OS \u7cfb\u7edf\u4e2d\uff0c\u8de8\u673a\u5668\u5c31\u6ca1\u6cd5\u5b9e\u73b0\u901a\u8baf\uff0c\u5bf9\u4e8e\u8de8\u673a\u5668\u5c31\u9700\u8981\u53c2\u8003\u4e0b\u9762\u4e24\u79cd\u914d\u7f6e\u65b9\u6848\uff1a"),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5229\u7528\u5b83\u7684 Key-Value \u5b58\u50a8\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," \u4e14 Nomad \u7248\u672c\u8981\u5927\u4e8e\u7b49\u4e8e 1.3 \u624d\u53ef\u4ee5\u54df\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2-\u914d\u7f6e"},"Caddy 2 \u914d\u7f6e"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# \u4f7f\u7528 Let's Encrypt \u670d\u52a1\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("p",null,"\u914d\u7f6e\u53ea\u9700\u914d\u7f6e ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy")," \u540e\u9762 IP \u5730\u5740\u548c\u7aef\u53e3\u90e8\u5206\u5373\u53ef\u3002"),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5982\u4e0b\u662f\u901a\u7528\u914d\u7f6e\uff0c\u5982\u679c\u4e0d\u53ef\u7528\u6b22\u8fce",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"\u63d0\u95ee\u9898"),"\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n listen [::]:443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # \u53ef\u9009\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"Nginx \u8fd8\u9700\u8981\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," \u4e2d\u914d\u7f6e\u6700\u5927\u4e0a\u4f20\u6587\u4ef6\u4e0a\u4f20\u5927\u5c0f\uff0c\u666e\u901a\u5e94\u7528\u5efa\u8bae\u662f\u5728 200MB \u5de6\u53f3\uff0c\u5982\u679c\u662f\u6e38\u620f\u53ef\u6839\u636e\u5b9e\u9645\u6587\u4ef6\u5927\u5c0f\u518d\u591a\u51fa 50% \u6253\u51fa\u5bcc\u4f59\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/9455.59bcb4de.js b/zh-Hans/assets/js/9455.649e6775.js similarity index 59% rename from zh-Hans/assets/js/9455.59bcb4de.js rename to zh-Hans/assets/js/9455.649e6775.js index c18fc9815..ae638d0c9 100644 --- a/zh-Hans/assets/js/9455.59bcb4de.js +++ b/zh-Hans/assets/js/9455.649e6775.js @@ -1 +1 @@ -(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9455],{3905:(e,t,n)=>{"use strict";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 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 c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=o.createContext({}),s=function(e){var t=o.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 o.createElement(i.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),p=r,f=m["".concat(i,".").concat(p)]||m[p]||d[p]||a;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 a=n.length,c=new Array(a);c[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var s=2;s{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(6010),c=n(5999),l=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:m}}=(0,l.L)();if("h1"===t||!n)return r.createElement(t,(0,o.Z)({},u,{id:void 0}));const d=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(t,(0,o.Z)({},u,{className:(0,a.Z)("anchor",m?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n}),u.children,r.createElement(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},1506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ye});var o=n(7294),r=n(3905),a=n(7462),c=n(5742);var l=n(2389),i=n(6010),s=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,s.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const h=/title=(?["'])(?.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function v(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function b(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return v(["js","jsBlock"],t);case"jsx":case"tsx":return v(["js","jsBlock","jsx"],t);case"html":return v(["js","jsBlock","html"],t);case"python":case"py":case"bash":return v(["bash"],t);case"markdown":case"md":return v(["html","jsx","bash"],t);default:return v(Object.keys(y),t)}}(o,r),l=n.split("\n"),i=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${p},`:u[t]?i[u[t]].start=p:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,i.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,i.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var L=n(902);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function B(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=w);const r=(0,L.zX)(t),a=(0,L.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const x={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 T={Prism:n(7410).Z,theme:x};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 Z(){return Z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Z.apply(this,arguments)}var j=/\r\n|\r|\n/,_=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)},H=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function S(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var A=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),O(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=Z({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=Z({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),O(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=Z({},S(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?Z({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),O(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),O(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=Z({},S(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?Z({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),O(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],i=[l];c>-1;){for(;(a=o[c]++)<r[c];){var s=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],s=m):(u=H(u,m.type),m.alias&&(u=H(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(j),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)_(l),i.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(s),o.push(0),r.push(s.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return _(l),i}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const I=A,z={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function P(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,i.Z)(n,r&&z.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",s,r?o.createElement(o.Fragment,null,o.createElement("span",{className:z.codeLineNumber}),o.createElement("span",{className:z.codeLineContent},u)):u,o.createElement("br",null))}var M=n(5999);function D(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 W(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const R={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function V(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.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 o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(a.removeAllRanges(),a.addRange(c)),r&&r.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,M.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,R.copyButton,r&&R.copyButtonCopied),onClick:l},o.createElement("span",{className:R.copyButtonIcons,"aria-hidden":"true"},o.createElement(D,{className:R.copyButtonIcon}),o.createElement(W,{className:R.copyButtonSuccessIcon})))}function $(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 q={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function F(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,M.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,r&&q.wordWrapButtonEnabled),"aria-label":a,title:a},o.createElement($,{className:q.wordWrapButtonIcon,"aria-hidden":"true"}))}function U(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:s}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=s??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return B(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),v=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=b(t,{metastring:r,language:f,magicComments:p}),L=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,i.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},v&&o.createElement("div",{className:N.codeBlockTitle},v),o.createElement("div",{className:N.codeBlockContent},o.createElement(I,(0,a.Z)({},T,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,i.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,i.Z)(N.codeBlockLines,L&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(P,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:L})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(F,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(V,{className:N.codeButton,code:C}))))}function G(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?U:C;return o.createElement(i,(0,a.Z)({key:String(r)},n),c)}var Y=n(9960);var Q=n(6043);const X={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function J(e){return!!e&&("SUMMARY"===e.tagName||J(e.parentElement))}function K(e,t){return!!e&&(e===t||K(e.parentElement,t))}function ee(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),s=(0,o.useRef)(null),{collapsed:u,setCollapsed:m}=(0,Q.u)({initialState:!r.open}),[d,p]=(0,o.useState)(r.open),f=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,a.Z)({},r,{ref:s,open:d,"data-collapsed":u,className:(0,i.Z)(X.details,c&&X.isBrowser,r.className),onMouseDown:e=>{J(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;J(t)&&K(t,s.current)&&(e.preventDefault(),u?(m(!1),p(!0)):m(!0))}}),f,o.createElement(Q.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{m(e),p(!e)}},o.createElement("div",{className:X.collapsibleContent},n)))}const te={details:"details_b_Ee"},ne="alert alert--info";function oe(e){let{...t}=e;return o.createElement(ee,(0,a.Z)({},t,{className:(0,i.Z)(ne,te.details,t.className)}))}var re=n(7955);function ae(e){return o.createElement(re.Z,e)}const ce={containsTaskList:"containsTaskList_mC6p"};function le(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&ce.containsTaskList)}const ie={img:"img_ev3q"};const se="admonition_LlT9",ue="admonitionHeading_tbUL",me="admonitionIcon_kALy",de="admonitionContent_S0QG";const pe={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},fe={secondary:"note",important:"info",success:"tip",warning:"danger"};function he(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const ge={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.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 o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(G,e)},a:function(e){return o.createElement(Y.Z,e)},pre:function(e){return o.createElement(G,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(oe,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:le(e.className)}))},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,i.Z)(t,ie.img))}));var t},h1:e=>o.createElement(ae,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ae,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ae,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ae,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ae,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ae,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=he(e),c=function(e){const t=fe[e]??e,n=pe[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),pe.info)}(n),l=r??c.label,{iconComponent:s}=c,u=a??o.createElement(s,null);return o.createElement("div",{className:(0,i.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,se)},o.createElement("div",{className:ue},o.createElement("span",{className:me},u),l),o.createElement("div",{className:de},t))},mermaid:n(1875).Z};function ye(e){let{children:t}=e;return o.createElement(r.Zo,{components:ge},t)}},9407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(6010),c=n(3743);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},i="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function u(e){let{className:t,...n}=e;return r.createElement("div",{className:(0,a.Z)(l.tableOfContents,"thin-scrollbar",t)},r.createElement(c.Z,(0,o.Z)({},n,{linkClassName:i,linkActiveClassName:s})))}},3743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(7462),r=n(7294),a=n(6668);function c(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const o=n.slice(2,e.level);e.parentIndex=Math.max(...o),n[e.level]=t}));const o=[];return t.forEach((e=>{const{parentIndex:n,...r}=e;n>=0?t[n].children.push(r):o.push(r)})),o}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:o});return function(e){return e.level>=n&&e.level<=o}(e)?[{...e,children:t}]:t}))}function i(e){const t=e.getBoundingClientRect();return t.top===t.bottom?i(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const o=e.find((e=>i(e).top>=n));if(o){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(i(o))?o:e[e.indexOf(o)-1]??null}return e[e.length-1]??null}function u(){const e=(0,r.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.L)();return(0,r.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,r.useRef)(void 0),n=u();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:o,linkActiveClassName:r,minHeadingLevel:a,maxHeadingLevel:c}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(o),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const o=[];for(let r=t;r<=n;r+=1)o.push(`h${r}.anchor`);return Array.from(document.querySelectorAll(o.join()))}({minHeadingLevel:a,maxHeadingLevel:c}),i=s(l,{anchorTopOffset:n.current}),u=e.find((e=>i&&i.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(r),e.classList.add(r),t.current=e):e.classList.remove(r)}(e,e===u)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function d(e){let{toc:t,className:n,linkClassName:o,isChild:a}=e;return t.length?r.createElement("ul",{className:a?void 0:n},t.map((e=>r.createElement("li",{key:e.id},r.createElement("a",{href:`#${e.id}`,className:o??void 0,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(d,{isChild:!0,toc:e.children,className:n,linkClassName:o}))))):null}const p=r.memo(d);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:u,maxHeadingLevel:d,...f}=e;const h=(0,a.L)(),g=u??h.tableOfContents.minHeadingLevel,y=d??h.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return(0,r.useMemo)((()=>l({toc:c(t),minHeadingLevel:n,maxHeadingLevel:o})),[t,n,o])}({toc:t,minHeadingLevel:g,maxHeadingLevel:y});return m((0,r.useMemo)((()=>{if(i&&s)return{linkClassName:i,linkActiveClassName:s,minHeadingLevel:g,maxHeadingLevel:y}}),[i,s,g,y])),r.createElement(p,(0,o.Z)({toc:v,className:n,linkClassName:i},f))}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file +(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[9455],{3905:(e,t,n)=>{"use strict";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 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 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){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 l(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 i=o.createContext({}),s=function(e){var t=o.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 o.createElement(i.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),p=r,f=m["".concat(i,".").concat(p)]||m[p]||d[p]||a;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 a=n.length,c=new Array(a);c[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var s=2;s<a;s++)c[s]=n[s];return o.createElement.apply(null,c)}return o.createElement.apply(null,n)}p.displayName="MDXCreateElement"},7955:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(4334),c=n(5999),l=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:m}}=(0,l.L)();if("h1"===t||!n)return r.createElement(t,(0,o.Z)({},u,{id:void 0}));const d=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(t,(0,o.Z)({},u,{className:(0,a.Z)("anchor",m?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n}),u.children,r.createElement(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},1506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ve});var o=n(7294),r=n(3905),a=n(7462),c=n(5742);var l=n(2389),i=n(4334),s=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,s.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const h=/title=(?<quote>["'])(?<title>.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function v(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function b(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return v(["js","jsBlock"],t);case"jsx":case"tsx":return v(["js","jsBlock","jsx"],t);case"html":return v(["js","jsBlock","html"],t);case"python":case"py":case"bash":return v(["bash"],t);case"markdown":case"md":return v(["html","jsx","bash"],t);default:return v(Object.keys(y),t)}}(o,r),l=n.split("\n"),i=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${p},`:u[t]?i[u[t]].start=p:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,i.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,i.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var L=n(902);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function B(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=w);const r=(0,L.zX)(t),a=(0,L.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const x={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 T={Prism:n(7410).Z,theme:x};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 Z(){return Z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Z.apply(this,arguments)}var j=/\r\n|\r|\n/,_=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)},H=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function S(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var A=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),O(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=Z({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=Z({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),O(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=Z({},S(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?Z({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),O(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),O(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=Z({},S(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?Z({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),O(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],i=[l];c>-1;){for(;(a=o[c]++)<r[c];){var s=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],s=m):(u=H(u,m.type),m.alias&&(u=H(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(j),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)_(l),i.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(s),o.push(0),r.push(s.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return _(l),i}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const I=A,z={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function P(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,i.Z)(n,r&&z.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",s,r?o.createElement(o.Fragment,null,o.createElement("span",{className:z.codeLineNumber}),o.createElement("span",{className:z.codeLineContent},u)):u,o.createElement("br",null))}var M=n(5999);function D(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 W(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const R={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function V(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.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 o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(a.removeAllRanges(),a.addRange(c)),r&&r.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,M.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,R.copyButton,r&&R.copyButtonCopied),onClick:l},o.createElement("span",{className:R.copyButtonIcons,"aria-hidden":"true"},o.createElement(D,{className:R.copyButtonIcon}),o.createElement(W,{className:R.copyButtonSuccessIcon})))}function $(e){return o.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),o.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 q={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function F(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,M.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,r&&q.wordWrapButtonEnabled),"aria-label":a,title:a},o.createElement($,{className:q.wordWrapButtonIcon,"aria-hidden":"true"}))}function U(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:s}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=s??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return B(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),v=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=b(t,{metastring:r,language:f,magicComments:p}),L=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,i.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},v&&o.createElement("div",{className:N.codeBlockTitle},v),o.createElement("div",{className:N.codeBlockContent},o.createElement(I,(0,a.Z)({},T,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,i.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,i.Z)(N.codeBlockLines,L&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(P,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:L})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(F,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(V,{className:N.codeButton,code:C}))))}function G(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?U:C;return o.createElement(i,(0,a.Z)({key:String(r)},n),c)}var Y=n(9960);var Q=n(7459),X=n(6043);const J={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function K(e){return!!e&&("SUMMARY"===e.tagName||K(e.parentElement))}function ee(e,t){return!!e&&(e===t||ee(e.parentElement,t))}function te(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),i=(0,o.useRef)(null),{collapsed:s,setCollapsed:u}=(0,X.u)({initialState:!r.open}),[m,d]=(0,o.useState)(r.open),p=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,a.Z)({},r,{ref:i,open:m,"data-collapsed":s,className:(0,Q.Z)(J.details,c&&J.isBrowser,r.className),onMouseDown:e=>{K(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;K(t)&&ee(t,i.current)&&(e.preventDefault(),s?(u(!1),d(!0)):u(!0))}}),p,o.createElement(X.z,{lazy:!1,collapsed:s,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{u(e),d(!e)}},o.createElement("div",{className:J.collapsibleContent},n)))}const ne={details:"details_b_Ee"},oe="alert alert--info";function re(e){let{...t}=e;return o.createElement(te,(0,a.Z)({},t,{className:(0,i.Z)(oe,ne.details,t.className)}))}var ae=n(7955);function ce(e){return o.createElement(ae.Z,e)}const le={containsTaskList:"containsTaskList_mC6p"};function ie(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&le.containsTaskList)}const se={img:"img_ev3q"};const ue="admonition_LlT9",me="admonitionHeading_tbUL",de="admonitionIcon_kALy",pe="admonitionContent_S0QG";const fe={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.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:o.createElement(M.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},he={secondary:"note",important:"info",success:"tip",warning:"danger"};function ge(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const ye={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.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 o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(G,e)},a:function(e){return o.createElement(Y.Z,e)},pre:function(e){return o.createElement(G,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(re,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:ie(e.className)}))},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,i.Z)(t,se.img))}));var t},h1:e=>o.createElement(ce,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ce,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ce,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ce,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ce,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ce,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=ge(e),c=function(e){const t=he[e]??e,n=fe[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),fe.info)}(n),l=r??c.label,{iconComponent:s}=c,u=a??o.createElement(s,null);return o.createElement("div",{className:(0,i.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,ue)},o.createElement("div",{className:me},o.createElement("span",{className:de},u),l),o.createElement("div",{className:pe},t))},mermaid:n(1875).Z};function ve(e){let{children:t}=e;return o.createElement(r.Zo,{components:ye},t)}},9407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),r=n(7294),a=n(4334),c=n(3743);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},i="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function u(e){let{className:t,...n}=e;return r.createElement("div",{className:(0,a.Z)(l.tableOfContents,"thin-scrollbar",t)},r.createElement(c.Z,(0,o.Z)({},n,{linkClassName:i,linkActiveClassName:s})))}},3743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(7462),r=n(7294),a=n(6668);function c(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const o=n.slice(2,e.level);e.parentIndex=Math.max(...o),n[e.level]=t}));const o=[];return t.forEach((e=>{const{parentIndex:n,...r}=e;n>=0?t[n].children.push(r):o.push(r)})),o}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:o});return function(e){return e.level>=n&&e.level<=o}(e)?[{...e,children:t}]:t}))}function i(e){const t=e.getBoundingClientRect();return t.top===t.bottom?i(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const o=e.find((e=>i(e).top>=n));if(o){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(i(o))?o:e[e.indexOf(o)-1]??null}return e[e.length-1]??null}function u(){const e=(0,r.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.L)();return(0,r.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,r.useRef)(void 0),n=u();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:o,linkActiveClassName:r,minHeadingLevel:a,maxHeadingLevel:c}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(o),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const o=[];for(let r=t;r<=n;r+=1)o.push(`h${r}.anchor`);return Array.from(document.querySelectorAll(o.join()))}({minHeadingLevel:a,maxHeadingLevel:c}),i=s(l,{anchorTopOffset:n.current}),u=e.find((e=>i&&i.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(r),e.classList.add(r),t.current=e):e.classList.remove(r)}(e,e===u)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function d(e){let{toc:t,className:n,linkClassName:o,isChild:a}=e;return t.length?r.createElement("ul",{className:a?void 0:n},t.map((e=>r.createElement("li",{key:e.id},r.createElement("a",{href:`#${e.id}`,className:o??void 0,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(d,{isChild:!0,toc:e.children,className:n,linkClassName:o}))))):null}const p=r.memo(d);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:i="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:u,maxHeadingLevel:d,...f}=e;const h=(0,a.L)(),g=u??h.tableOfContents.minHeadingLevel,y=d??h.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:o}=e;return(0,r.useMemo)((()=>l({toc:c(t),minHeadingLevel:n,maxHeadingLevel:o})),[t,n,o])}({toc:t,minHeadingLevel:g,maxHeadingLevel:y});return m((0,r.useMemo)((()=>{if(i&&s)return{linkClassName:i,linkActiveClassName:s,minHeadingLevel:g,maxHeadingLevel:y}}),[i,s,g,y])),r.createElement(p,(0,o.Z)({toc:v,className:n,linkClassName:i},f))}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/9d0b921d.c7b4dc33.js b/zh-Hans/assets/js/9d0b921d.e137651b.js similarity index 99% rename from zh-Hans/assets/js/9d0b921d.c7b4dc33.js rename to zh-Hans/assets/js/9d0b921d.e137651b.js index f799d6cfb..e9b0e3018 100644 --- a/zh-Hans/assets/js/9d0b921d.c7b4dc33.js +++ b/zh-Hans/assets/js/9d0b921d.e137651b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2239],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[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):l(l({},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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=k({queryString:n,groupId:a}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),f=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),v(e)}),[c,v,o]),tabValues:o}}var f=n(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function N(e){const t=v(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(h,(0,a.Z)({},e,t)))}function y(e){const t=(0,f.Z)();return r.createElement(N,(0,a.Z)({key:String(t)},e))}},3664:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Dev Container (Docker)"},s="Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-4.x/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",description:"Dev Container (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Dev Container (Docker)"},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/zh-Hans/docs/4.x/category/local-development"},next:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code"}},u={},d=[{value:"\u7cfb\u7edf\u4f9d\u8d56",id:"\u7cfb\u7edf\u4f9d\u8d56",level:2},{value:"\u5b89\u88c5 Git",id:"\u5b89\u88c5-git",level:3},{value:"\u5b89\u88c5 Docker & docker-compose",id:"\u5b89\u88c5-docker--docker-compose",level:3},{value:"\u5b89\u88c5 Visual Studio Code",id:"\u5b89\u88c5-visual-studio-code",level:3},{value:"\u5b89\u88c5 Remote container \u6269\u5c55",id:"\u5b89\u88c5-remote-container-\u6269\u5c55",level:3},{value:"\u83b7\u53d6 Zealot Codespace",id:"\u83b7\u53d6-zealot-codespace",level:2},{value:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",level:2},{value:"\u542f\u52a8\u9879\u76ee",id:"\u542f\u52a8\u9879\u76ee",level:2},{value:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",level:2}],p={toc:d},m="wrapper";function k(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-\u5f00\u53d1\u90e8\u7f72\u6307\u5357"},"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"Dev Container")," (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"\u7cfb\u7edf\u4f9d\u8d56"},"\u7cfb\u7edf\u4f9d\u8d56"),(0,r.kt)("p",null,"\u5728\u5f00\u53d1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Git\uff0cVirsual Studio Code\uff0cDocker \u548c docker-compose\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-git"},"\u5b89\u88c5 Git"),(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-docker--docker-compose"},"\u5b89\u88c5 Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: 10 Pro/Enterprise \u9700\u8981 ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," / Windows 10 Home (2004+) \u9700\u8981 Docker Desktop 2.3+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),"\u3002\uff08\u4e0d\u652f\u6301 Docker Toolbox \u548c Windows container images\uff09"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+\u3002"),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+\u3002\uff08\u4e0d\u652f\u6301 Ubuntu snap \u5305\uff09")),(0,r.kt)("h3",{id:"\u5b89\u88c5-visual-studio-code"},"\u5b89\u88c5 Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code \u662f\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fd0\u884c\u7684\u514d\u8d39\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u4f60\u7684\u5b89\u88c5\u65b9\u5f0f\uff1a"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," macOS \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u6253\u5f00\u6d4f\u89c8\u5668\u4e0b\u8f7d\u754c\u9762\u627e\u5230\u5df2\u4e0b\u8f7d\u7684\u5e94\u7528\u6587\u4ef6\u6216\u538b\u7f29\u6587\u4ef6\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u538b\u7f29\u6587\u4ef6\u5148\u8fdb\u884c\u89e3\u538b\u7f29\u64cd\u4f5c\uff0c\u5982\u679c\u4f7f\u7528 Safari \u4e0b\u8f7d\u901a\u5e38\u4f1a\u5e2e\u4f60\u81ea\u52a8\u89e3\u538b\u7f29\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u62d6\u62fd ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," \u5230\u7cfb\u7edf\u5e94\u7528\u6587\u4ef6\u5939\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u53cc\u51fb VS Code \u5e94\u7528\u5373\u53ef\u6253\u5f00\u5e94\u7528\u3002"))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," Windows \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u5b89\u88c5\u7a0b\u5e8f\uff08VSCodeUserSetup-{version}.exe\uff09\u7b49\u5f85\u5b89\u88c5\u6210\u529f\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u9ed8\u8ba4\u60c5\u51b5\u4e0b VS Code \u4f1a\u5b89\u88c5\u5230 ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code")," \u8def\u5f84\u3002"))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"))),(0,r.kt)("h3",{id:"\u5b89\u88c5-remote-container-\u6269\u5c55"},"\u5b89\u88c5 Remote container \u6269\u5c55"),(0,r.kt)("p",null,"\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u5b89\u88c5 ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"\u83b7\u53d6-zealot-codespace"},"\u83b7\u53d6 Zealot Codespace"),(0,r.kt)("p",null,"Zealot Codespace \u540c\u6837\u5b58\u653e\u5728 Zealot \u9879\u76ee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/zealot/tree/develop/.devcontainer"},".devcontailer")," \u76ee\u5f55\uff0c\u4f60\u9700\u8981\u5148\u514b\u9686\u9879\u76ee\u6e90\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Codespace \u5305\u542b\u4e86\u4e00\u7cfb\u5217\u6587\u4ef6\uff1a"),(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},"\u6587\u4ef6\u540d"),(0,r.kt)("th",{parentName:"tr",align:null},"\u8bf4\u660e"))),(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"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer \u914d\u7f6e\u6587\u4ef6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"\u955c\u50cf\u6838\u5fc3\uff0c\u53d8\u66f4\u4f1a\u81ea\u52a8\u63a8\u9001\u5230\u4e0d\u540c registry \u4ed3\u5e93")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"\u95f4\u63a5\u955c\u50cf\uff0c\u4e3b\u8981\u662f\u8282\u7701\u7f16\u8bd1\u65f6\u95f4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"\u9879\u76ee\u670d\u52a1\u4f9d\u8d56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"\u7528\u4e8e\u521d\u59cb\u5316 Postgres \u9ed8\u8ba4\u7528\u6237\u53ca\u6743\u9650")))),(0,r.kt)("h2",{id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"},"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"),(0,r.kt)("p",null,"\u6253\u5f00 Visual Studio Code \u5e94\u7528\u540e\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," \u8f93\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," \u56de\u8f66\u9009\u62e9\u521a\u514b\u9686\u4e0b\u6765\u7684 Zealot \u9879\u76ee\u76ee\u5f55\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"\u9996\u6b21\u6267\u884c\u4f1a\u62c9\u53d6 Zealot Codespace \u955c\u50cf\u5e76\u5f00\u59cb\u6784\u5efa\uff0c\u8fc7\u7a0b\u4f1a\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\u671f\u95f4\u53ef\u70b9\u51fb ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," \u67e5\u770b\u6784\u5efa\u5b9e\u65f6\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"\u6784\u5efa\u5b8c\u6210\u5e76\u542f\u52a8\u5b8c\u6bd5\u4f1a\u52a0\u8f7d\u9879\u76ee\u6587\u4ef6\u548c zsh \u7ec8\u7aef\uff0c\u901a\u8fc7\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"\u5728\u5bbf\u4e3b\u673a\u4e5f\u80fd\u770b\u5230 Docker \u542f\u52a8\u4e86 docker-compose \u5728\u8fd0\u884c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"\u542f\u52a8\u9879\u76ee"},"\u542f\u52a8\u9879\u76ee"),(0,r.kt)("p",null,"\u5982\u679c\u6ca1\u6709\u6253\u5f00 VSCode \u5185\u7f6e\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u5feb\u6377\u952e ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," \u6253\u5f00\uff0c\u65b0\u6253\u5f00\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u53ef\u8fd0\u884c Zealot \u4f9d\u8d56\u7684\u6240\u6709\u670d\u52a1\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"},"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"),(0,r.kt)("p",null,"\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u4e00\u4f1a\u540e\u4f60\u4f1a\u5728\u53f3\u4e0b\u89d2\u7a97\u53e3\u770b\u5230 ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," \u7a97\u53e3\u70b9\u51fb\u53ef\u6253\u5f00 Zealot \u7f51\u9875\u670d\u52a1\u3002\u540c\u6837\u4e5f\u53ef\u4ee5\u901a\u8fc7\u7ec8\u7aef\u533a\u57df\u9876\u90e8 ",(0,r.kt)("strong",{parentName:"p"},"Ports")," \u9009\u9879\u67e5\u770b\u53ef\u8f6c\u53d1\u7aef\u53e3\u7684\u670d\u52a1\uff0c\u70b9\u51fb\u6d4f\u89c8\u5668\u56fe\u6807\u4f1a\u628a\u5bb9\u5668\u7684\u7aef\u53e3\u8f6c\u53d1\u5e76\u7ed1\u5b9a\u5230\u672c\u5730\u968f\u673a\u65ad\u5f00\u540e\u4e0a\u9762\u8bbf\u95ee\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}k.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[2239],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[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):l(l({},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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=k({queryString:n,groupId:a}),[d,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),f=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),v(e)}),[c,v,o]),tabValues:o}}var f=n(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function N(e){const t=v(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(h,(0,a.Z)({},e,t)))}function y(e){const t=(0,f.Z)();return r.createElement(N,(0,a.Z)({key:String(t)},e))}},3664:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Dev Container (Docker)"},s="Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"version-4.x/contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",description:"Dev Container (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/contributing-guide/local-development/devcontainer.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Dev Container (Docker)"},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/zh-Hans/docs/4.x/category/local-development"},next:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code"}},u={},d=[{value:"\u7cfb\u7edf\u4f9d\u8d56",id:"\u7cfb\u7edf\u4f9d\u8d56",level:2},{value:"\u5b89\u88c5 Git",id:"\u5b89\u88c5-git",level:3},{value:"\u5b89\u88c5 Docker & docker-compose",id:"\u5b89\u88c5-docker--docker-compose",level:3},{value:"\u5b89\u88c5 Visual Studio Code",id:"\u5b89\u88c5-visual-studio-code",level:3},{value:"\u5b89\u88c5 Remote container \u6269\u5c55",id:"\u5b89\u88c5-remote-container-\u6269\u5c55",level:3},{value:"\u83b7\u53d6 Zealot Codespace",id:"\u83b7\u53d6-zealot-codespace",level:2},{value:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",level:2},{value:"\u542f\u52a8\u9879\u76ee",id:"\u542f\u52a8\u9879\u76ee",level:2},{value:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",level:2}],p={toc:d},m="wrapper";function k(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-\u5f00\u53d1\u90e8\u7f72\u6307\u5357"},"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"Dev Container")," (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"\u7cfb\u7edf\u4f9d\u8d56"},"\u7cfb\u7edf\u4f9d\u8d56"),(0,r.kt)("p",null,"\u5728\u5f00\u53d1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Git\uff0cVirsual Studio Code\uff0cDocker \u548c docker-compose\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-git"},"\u5b89\u88c5 Git"),(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-docker--docker-compose"},"\u5b89\u88c5 Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: 10 Pro/Enterprise \u9700\u8981 ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," / Windows 10 Home (2004+) \u9700\u8981 Docker Desktop 2.3+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),"\u3002\uff08\u4e0d\u652f\u6301 Docker Toolbox \u548c Windows container images\uff09"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+\u3002"),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+\u3002\uff08\u4e0d\u652f\u6301 Ubuntu snap \u5305\uff09")),(0,r.kt)("h3",{id:"\u5b89\u88c5-visual-studio-code"},"\u5b89\u88c5 Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code \u662f\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fd0\u884c\u7684\u514d\u8d39\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u4f60\u7684\u5b89\u88c5\u65b9\u5f0f\uff1a"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," macOS \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u6253\u5f00\u6d4f\u89c8\u5668\u4e0b\u8f7d\u754c\u9762\u627e\u5230\u5df2\u4e0b\u8f7d\u7684\u5e94\u7528\u6587\u4ef6\u6216\u538b\u7f29\u6587\u4ef6\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u538b\u7f29\u6587\u4ef6\u5148\u8fdb\u884c\u89e3\u538b\u7f29\u64cd\u4f5c\uff0c\u5982\u679c\u4f7f\u7528 Safari \u4e0b\u8f7d\u901a\u5e38\u4f1a\u5e2e\u4f60\u81ea\u52a8\u89e3\u538b\u7f29\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u62d6\u62fd ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," \u5230\u7cfb\u7edf\u5e94\u7528\u6587\u4ef6\u5939\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u53cc\u51fb VS Code \u5e94\u7528\u5373\u53ef\u6253\u5f00\u5e94\u7528\u3002"))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," Windows \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u5b89\u88c5\u7a0b\u5e8f\uff08VSCodeUserSetup-{version}.exe\uff09\u7b49\u5f85\u5b89\u88c5\u6210\u529f\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u9ed8\u8ba4\u60c5\u51b5\u4e0b VS Code \u4f1a\u5b89\u88c5\u5230 ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code")," \u8def\u5f84\u3002"))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"))),(0,r.kt)("h3",{id:"\u5b89\u88c5-remote-container-\u6269\u5c55"},"\u5b89\u88c5 Remote container \u6269\u5c55"),(0,r.kt)("p",null,"\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u5b89\u88c5 ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"\u83b7\u53d6-zealot-codespace"},"\u83b7\u53d6 Zealot Codespace"),(0,r.kt)("p",null,"Zealot Codespace \u540c\u6837\u5b58\u653e\u5728 Zealot \u9879\u76ee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/zealot/tree/develop/.devcontainer"},".devcontailer")," \u76ee\u5f55\uff0c\u4f60\u9700\u8981\u5148\u514b\u9686\u9879\u76ee\u6e90\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Codespace \u5305\u542b\u4e86\u4e00\u7cfb\u5217\u6587\u4ef6\uff1a"),(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},"\u6587\u4ef6\u540d"),(0,r.kt)("th",{parentName:"tr",align:null},"\u8bf4\u660e"))),(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"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer \u914d\u7f6e\u6587\u4ef6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"\u955c\u50cf\u6838\u5fc3\uff0c\u53d8\u66f4\u4f1a\u81ea\u52a8\u63a8\u9001\u5230\u4e0d\u540c registry \u4ed3\u5e93")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"\u95f4\u63a5\u955c\u50cf\uff0c\u4e3b\u8981\u662f\u8282\u7701\u7f16\u8bd1\u65f6\u95f4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"\u9879\u76ee\u670d\u52a1\u4f9d\u8d56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"\u7528\u4e8e\u521d\u59cb\u5316 Postgres \u9ed8\u8ba4\u7528\u6237\u53ca\u6743\u9650")))),(0,r.kt)("h2",{id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"},"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"),(0,r.kt)("p",null,"\u6253\u5f00 Visual Studio Code \u5e94\u7528\u540e\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," \u8f93\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," \u56de\u8f66\u9009\u62e9\u521a\u514b\u9686\u4e0b\u6765\u7684 Zealot \u9879\u76ee\u76ee\u5f55\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"\u9996\u6b21\u6267\u884c\u4f1a\u62c9\u53d6 Zealot Codespace \u955c\u50cf\u5e76\u5f00\u59cb\u6784\u5efa\uff0c\u8fc7\u7a0b\u4f1a\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\u671f\u95f4\u53ef\u70b9\u51fb ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," \u67e5\u770b\u6784\u5efa\u5b9e\u65f6\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"\u6784\u5efa\u5b8c\u6210\u5e76\u542f\u52a8\u5b8c\u6bd5\u4f1a\u52a0\u8f7d\u9879\u76ee\u6587\u4ef6\u548c zsh \u7ec8\u7aef\uff0c\u901a\u8fc7\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"\u5728\u5bbf\u4e3b\u673a\u4e5f\u80fd\u770b\u5230 Docker \u542f\u52a8\u4e86 docker-compose \u5728\u8fd0\u884c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"\u542f\u52a8\u9879\u76ee"},"\u542f\u52a8\u9879\u76ee"),(0,r.kt)("p",null,"\u5982\u679c\u6ca1\u6709\u6253\u5f00 VSCode \u5185\u7f6e\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u5feb\u6377\u952e ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," \u6253\u5f00\uff0c\u65b0\u6253\u5f00\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u53ef\u8fd0\u884c Zealot \u4f9d\u8d56\u7684\u6240\u6709\u670d\u52a1\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"},"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"),(0,r.kt)("p",null,"\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u4e00\u4f1a\u540e\u4f60\u4f1a\u5728\u53f3\u4e0b\u89d2\u7a97\u53e3\u770b\u5230 ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," \u7a97\u53e3\u70b9\u51fb\u53ef\u6253\u5f00 Zealot \u7f51\u9875\u670d\u52a1\u3002\u540c\u6837\u4e5f\u53ef\u4ee5\u901a\u8fc7\u7ec8\u7aef\u533a\u57df\u9876\u90e8 ",(0,r.kt)("strong",{parentName:"p"},"Ports")," \u9009\u9879\u67e5\u770b\u53ef\u8f6c\u53d1\u7aef\u53e3\u7684\u670d\u52a1\uff0c\u70b9\u51fb\u6d4f\u89c8\u5668\u56fe\u6807\u4f1a\u628a\u5bb9\u5668\u7684\u7aef\u53e3\u8f6c\u53d1\u5e76\u7ed1\u5b9a\u5230\u672c\u5730\u968f\u673a\u65ad\u5f00\u540e\u4e0a\u9762\u8bbf\u95ee\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}k.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/b38b46a9.55543957.js b/zh-Hans/assets/js/b38b46a9.a1fa7312.js similarity index 98% rename from zh-Hans/assets/js/b38b46a9.55543957.js rename to zh-Hans/assets/js/b38b46a9.a1fa7312.js index 43b148060..38deb592f 100644 --- a/zh-Hans/assets/js/b38b46a9.55543957.js +++ b/zh-Hans/assets/js/b38b46a9.a1fa7312.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8782],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.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,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[u,s]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=u??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=s[n].value;a!==i&&(d(t),u(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},r.createElement(h,(0,a.Z)({},e,t)),r.createElement(g,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},4020:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},u="Zealot iOS SDK",s={unversionedId:"developer-guide/sdk/ios",id:"version-5.0.0/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/zh-Hans/docs/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/zh-Hans/docs/category/sdks"},next:{title:"Android",permalink:"/zh-Hans/docs/developer-guide/sdk/android"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002"),(0,r.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://cocoapods.org"},"Cocoapods")," \u5b89\u88c5 Zealot \u9700\u8981\u628a\u5b83\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"\u4fdd\u5b58\u540e\u5f00\u59cb\u5b89\u88c5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u5728 AppDelegate \u6587\u4ef6\u5f15\u5165 Zealot \u6846\u67b6\u5934\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u63a5\u7740\u5728\u4e0a\u9762\u6587\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," \u65b9\u6cd5\u8ffd\u52a0\u542f\u52a8\u4ee3\u7801\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// \u5355\u4e2a\u6e20\u9053\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// \u5355\u4e2a\u6e20\u9053\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[8782],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.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,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[u,s]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=u??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=s[n].value;a!==i&&(d(t),u(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},r.createElement(h,(0,a.Z)({},e,t)),r.createElement(g,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},4020:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},u="Zealot iOS SDK",s={unversionedId:"developer-guide/sdk/ios",id:"version-5.0.0/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/zh-Hans/docs/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/developer-guide/sdk/ios.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/zh-Hans/docs/category/sdks"},next:{title:"Android",permalink:"/zh-Hans/docs/developer-guide/sdk/android"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002"),(0,r.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://cocoapods.org"},"Cocoapods")," \u5b89\u88c5 Zealot \u9700\u8981\u628a\u5b83\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"\u4fdd\u5b58\u540e\u5f00\u59cb\u5b89\u88c5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u5728 AppDelegate \u6587\u4ef6\u5f15\u5165 Zealot \u6846\u67b6\u5934\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u63a5\u7740\u5728\u4e0a\u9762\u6587\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," \u65b9\u6cd5\u8ffd\u52a0\u542f\u52a8\u4ee3\u7801\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// \u5355\u4e2a\u6e20\u9053\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// \u5355\u4e2a\u6e20\u9053\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/b43ef384.d041b537.js b/zh-Hans/assets/js/b43ef384.a46875fd.js similarity index 98% rename from zh-Hans/assets/js/b43ef384.d041b537.js rename to zh-Hans/assets/js/b43ef384.a46875fd.js index e603a03d2..111fcce04 100644 --- a/zh-Hans/assets/js/b43ef384.d041b537.js +++ b/zh-Hans/assets/js/b43ef384.a46875fd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6043],{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 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 u=r.createContext({}),s=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.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,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));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]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var s=2;s<l;s++)o[s]=n[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294),a=n(6010);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:n,className:o}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>x});var r=n(7462),a=n(7294),l=n(6010),o=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=p(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,s]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,l]),tabValues:l}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=s[n].value;r!==i&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:o}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},o,{className:(0,l.Z)("tabs__item",y.tabItem,o?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",y.tabList)},a.createElement(g,(0,r.Z)({},e,t)),a.createElement(h,(0,r.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},6684:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),l=n(4866),o=n(5162);const i={sidebar_label:"Android"},u="Zealot Android SDK",s={unversionedId:"developer-guide/sdk/android",id:"version-4.x/developer-guide/sdk/android",title:"Zealot Android SDK",description:"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/android.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/ios"},next:{title:"Fastlane \u63d2\u4ef6",permalink:"/zh-Hans/docs/4.x/developer-guide/fastlane"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"\u7528\u6237\u6743\u9650",id:"\u7528\u6237\u6743\u9650",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002"),(0,a.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," \u5b89\u88c5\uff0c\u5148\u9700\u8981\u6dfb\u52a0 maven \u4ed3\u5e93\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"\u4e4b\u540e\u5728\u4e3b app \u9879\u76ee\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," \u6dfb\u52a0 zealot\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"\u7528\u6237\u6743\u9650"},"\u7528\u6237\u6743\u9650"),(0,a.kt)("p",null,"\u4f7f\u7528 Zealot SDK \u9700\u8981\u5f00\u542f\u7f51\u7edc\u6743\u9650"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'<uses-permission android:name="android.permission.INTERNET" />\n')),(0,a.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,a.kt)("p",null,"\u5728\u4f60\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," \u6587\u4ef6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," \u65b9\u6cd5\u6dfb\u52a0\u542f\u52a8\u4ee3\u7801\uff1a"),(0,a.kt)(l.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(o.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(o.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6043],{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 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 u=r.createContext({}),s=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.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,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));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]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var s=2;s<l;s++)o[s]=n[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294),a=n(4334);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:n,className:o}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>x});var r=n(7462),a=n(7294),l=n(4334),o=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const r=(0,i.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=p(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,s]=f({queryString:n,groupId:r}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,l]),tabValues:l}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),r=s[n].value;r!==i&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:o}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},o,{className:(0,l.Z)("tabs__item",y.tabItem,o?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function k(e){const t=b(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",y.tabList)},a.createElement(g,(0,r.Z)({},e,t)),a.createElement(h,(0,r.Z)({},e,t)))}function x(e){const t=(0,v.Z)();return a.createElement(k,(0,r.Z)({key:String(t)},e))}},6684:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(7462),a=(n(7294),n(3905)),l=n(4866),o=n(5162);const i={sidebar_label:"Android"},u="Zealot Android SDK",s={unversionedId:"developer-guide/sdk/android",id:"version-4.x/developer-guide/sdk/android",title:"Zealot Android SDK",description:"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/android.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/android",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/android",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/android.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"Android"},sidebar:"developerGuide",previous:{title:"iOS",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/ios"},next:{title:"Fastlane \u63d2\u4ef6",permalink:"/zh-Hans/docs/4.x/developer-guide/fastlane"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"JitPack",id:"jitpack",level:3},{value:"\u7528\u6237\u6743\u9650",id:"\u7528\u6237\u6743\u9650",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"zealot-android-sdk"},"Zealot Android SDK"),(0,a.kt)("p",null,"Android \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Kotlin \u548c Java\u3002"),(0,a.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,a.kt)("h3",{id:"jitpack"},"JitPack"),(0,a.kt)("p",null,"\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://jitpack.io"},"jitpack")," \u5b89\u88c5\uff0c\u5148\u9700\u8981\u6dfb\u52a0 maven \u4ed3\u5e93\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"allprojects {\n repositories {\n ...\n maven { url 'https://jitpack.io' }\n }\n}\n")),(0,a.kt)("p",null,"\u4e4b\u540e\u5728\u4e3b app \u9879\u76ee\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"build.gradle")," \u6dfb\u52a0 zealot\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'\n}\n")),(0,a.kt)("h2",{id:"\u7528\u6237\u6743\u9650"},"\u7528\u6237\u6743\u9650"),(0,a.kt)("p",null,"\u4f7f\u7528 Zealot SDK \u9700\u8981\u5f00\u542f\u7f51\u7edc\u6743\u9650"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-xml"},'<uses-permission android:name="android.permission.INTERNET" />\n')),(0,a.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,a.kt)("p",null,"\u5728\u4f60\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Application")," \u6587\u4ef6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"onCreate")," \u65b9\u6cd5\u6dfb\u52a0\u542f\u52a8\u4ee3\u7801\uff1a"),(0,a.kt)(l.Z,{groupId:"android-zealot-sdk",mdxType:"Tabs"},(0,a.kt)(o.Z,{value:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch()\n'))),(0,a.kt)(o.Z,{value:"Java",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u5355\u4e2a\u6e20\u9053\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("...")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot.create(getActivity())\n .setEndpoint("https://zealot.com")\n .setChannelKey("xxxxxxx", "beta")\n .setCHannelKey("yyyyyyy", "test")\n .setBuildType(BuildConfig.BUILD_TYPE)\n .launch();\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/b572cb1f.d79c0217.js b/zh-Hans/assets/js/b572cb1f.45ba144c.js similarity index 99% rename from zh-Hans/assets/js/b572cb1f.d79c0217.js rename to zh-Hans/assets/js/b572cb1f.45ba144c.js index b13c5c4e7..d49d01eb5 100644 --- a/zh-Hans/assets/js/b572cb1f.d79c0217.js +++ b/zh-Hans/assets/js/b572cb1f.45ba144c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6981],{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 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({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(i.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,a=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;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 l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u<l;u++)o[u]=r[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},5162:(e,t,r)=>{r.d(t,{Z:()=>o});var n=r(7294),a=r(6010);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:r,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>N});var n=r(7462),a=r(7294),l=r(6010),o=r(2466),s=r(6550),i=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function k(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,l=d(e),[o,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[i,u]=f({queryString:r,groupId:n}),[p,k]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,c.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&l.set(e)}),[r,l])]}({groupId:n}),h=(()=>{const e=i??p;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{h&&s(h)}),[h]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),k(e)}),[u,k,l]),tabValues:l}}var h=r(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),n=u[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:o}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const l=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function N(e){const t=(0,h.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},7183:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>u,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),l=r(941),o=r(4996),s=r(4866),i=r(5162);const u={},c="\u53cd\u5411\u4ee3\u7406",p={unversionedId:"self-hosted/reverse-proxies",id:"version-4.x/self-hosted/reverse-proxies",title:"\u53cd\u5411\u4ee3\u7406",description:"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/zh-Hans/docs/4.x/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",tags:[],version:"4.x",frontMatter:{},sidebar:"selfHosted",previous:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/4.x/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/zh-Hans/docs/4.x/category/cloud-provider-guides"}},d={},m=[{value:"\u51c6\u5907\u5de5\u4f5c",id:"\u51c6\u5907\u5de5\u4f5c",level:2},{value:"Traefik",id:"traefik",level:2},{value:"\u914d\u7f6e\u89e3\u91ca",id:"\u914d\u7f6e\u89e3\u91ca",level:3},{value:"Traefik \u670d\u52a1",id:"traefik-\u670d\u52a1",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2 \u914d\u7f6e",id:"caddy-2-\u914d\u7f6e",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},k="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(k,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u53cd\u5411\u4ee3\u7406"},"\u53cd\u5411\u4ee3\u7406"),(0,a.kt)("p",null,"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002"),(0,a.kt)(l.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/zh-Hans/reverse-proxies-light.png"),dark:(0,o.Z)("/img/zh-Hans/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"\u51c6\u5907\u5de5\u4f5c"},"\u51c6\u5907\u5de5\u4f5c"),(0,a.kt)("p",null,"\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u9700\u8981\u51c6\u5907\u597d\u5982\u4e0b\u6570\u636e\uff1a"),(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},"\u540d\u79f0"),(0,a.kt)("th",{parentName:"tr",align:null},"\u8303\u4f8b\u503c"),(0,a.kt)("th",{parentName:"tr",align:null},"\u5907\u6ce8"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u57df\u540d"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406 IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee",(0,a.kt)("br",null),"\u540c\u4e00\u53f0\u670d\u52a1\u53ef\u6539\u4e3a 127.0.0.1")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5916\u90e8\u6620\u5c04\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5185\u90e8\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"\u65e0\u9700\u4fee\u6539")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt \u90ae\u7bb1"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," \u662f\u4e00\u6b3e\u5f00\u6e90\u7684\u53cd\u5411\u4ee3\u7406\u4e0e\u8d1f\u8f7d\u5747\u8861\u5de5\u5177\uff0c\u5b83\u81ea\u8eab\u63d0\u4f9b\u591a\u79cd Providers \u53ef\u4ee5\u5b9e\u73b0\u63a5\u5165\u53cd\u5411\u4ee3\u7406\u5e76\u914d\u7f6e SSL \u7684\u65b9\u5f0f\u3002"),(0,a.kt)("h3",{id:"\u914d\u7f6e\u89e3\u91ca"},"\u914d\u7f6e\u89e3\u91ca"),(0,a.kt)("p",null,"\u65e0\u8bba\u4f7f\u7528\u90a3\u79cd Provider \u6838\u5fc3\u7684\u914d\u7f6e\u9879\u662f\u76f8\u540c\u7684\uff0c\u6784\u6210\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u914d\u7f6e\u4e3b\u8981\u6709\u4e09\u90e8\u5206\u7ec4\u6210\uff1a\u53d1\u73b0\u7aef\u53e3\u53f7\u3001\u8def\u7531\u89c4\u5219\uff08\u5305\u542b\u8bbf\u95ee\u7aef\u53e3\u53f7\u3001\u57df\u540d\u7ed1\u5b9a\u548cSSL\uff09"),(0,a.kt)("h3",{id:"traefik-\u670d\u52a1"},"Traefik \u670d\u52a1"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," \u540e\u5728\u4fee\u6539 zealot \u7684 Docker Compose \u914d\u7f6e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # \u7531 Treafik \u63a5\u7ba1\u65e0\u9700\u5728\u5bf9\u5916\u66b4\u9732\u7aef\u53e3\u53f7\n # ports:\n # - "8901:80"\n network:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n - traefik-services\n\nnetworks:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Docker \u90e8\u7f72\u7684\u5c40\u9650\u4e8e Traefik \u548c Zealot \u670d\u52a1\u901a\u5e38\u5728\u540c\u4e00\u4e2a\u673a\u5668\u7684\u540c\u4e00\u4e2a OS \u7cfb\u7edf\u4e2d\uff0c\u8de8\u673a\u5668\u5c31\u6ca1\u6cd5\u5b9e\u73b0\u901a\u8baf\uff0c\u5bf9\u4e8e\u8de8\u673a\u5668\u5c31\u9700\u8981\u53c2\u8003\u4e0b\u9762\u4e24\u79cd\u914d\u7f6e\u65b9\u6848\uff1a"),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5229\u7528\u5b83\u7684 Key-Value \u5b58\u50a8\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," \u4e14 Nomad \u7248\u672c\u8981\u5927\u4e8e\u7b49\u4e8e 1.3 \u624d\u53ef\u4ee5\u54df\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2-\u914d\u7f6e"},"Caddy 2 \u914d\u7f6e"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# \u4f7f\u7528 Let's Encrypt \u670d\u52a1\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("p",null,"\u914d\u7f6e\u53ea\u9700\u914d\u7f6e ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy")," \u540e\u9762 IP \u5730\u5740\u548c\u7aef\u53e3\u90e8\u5206\u5373\u53ef\u3002"),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5982\u4e0b\u662f\u901a\u7528\u914d\u7f6e\uff0c\u5982\u679c\u4e0d\u53ef\u7528\u6b22\u8fce",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"\u63d0\u95ee\u9898"),"\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n listen [::]:443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # \u53ef\u9009\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"Nginx \u8fd8\u9700\u8981\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," \u4e2d\u914d\u7f6e\u6700\u5927\u4e0a\u4f20\u6587\u4ef6\u4e0a\u4f20\u5927\u5c0f\uff0c\u666e\u901a\u5e94\u7528\u5efa\u8bae\u662f\u5728 200MB \u5de6\u53f3\uff0c\u5982\u679c\u662f\u6e38\u620f\u53ef\u6839\u636e\u5b9e\u9645\u6587\u4ef6\u5927\u5c0f\u518d\u591a\u51fa 50% \u6253\u51fa\u5bcc\u4f59\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}h.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[6981],{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 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({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(i.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,a=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;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 l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var u=2;u<l;u++)o[u]=r[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},5162:(e,t,r)=>{r.d(t,{Z:()=>o});var n=r(7294),a=r(4334);const l={tabItem:"tabItem_Ymn6"};function o(e){let{children:t,hidden:r,className:o}=e;return n.createElement("div",{role:"tabpanel",className:(0,a.Z)(l.tabItem,o),hidden:r},t)}},4866:(e,t,r)=>{r.d(t,{Z:()=>N});var n=r(7462),a=r(7294),l=r(4334),o=r(2466),s=r(6550),i=r(1980),u=r(7392),c=r(12);function p(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}function d(e){const{values:t,children:r}=e;return(0,a.useMemo)((()=>{const e=t??p(r);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,r])}function m(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const n=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,i._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function k(e){const{defaultValue:t,queryString:r=!1,groupId:n}=e,l=d(e),[o,s]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:r}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[i,u]=f({queryString:r,groupId:n}),[p,k]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,c.Nk)(r);return[n,(0,a.useCallback)((e=>{r&&l.set(e)}),[r,l])]}({groupId:n}),h=(()=>{const e=i??p;return m({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{h&&s(h)}),[h]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),k(e)}),[u,k,l]),tabValues:l}}var h=r(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:r,selectedValue:s,selectValue:i,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,o.o5)(),d=e=>{const t=e.currentTarget,r=c.indexOf(t),n=u[r].value;n!==s&&(p(t),i(n))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":r},t)},u.map((e=>{let{value:t,label:r,attributes:o}=e;return a.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},o,{className:(0,l.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":s===t})}),r??t)})))}function g(e){let{lazy:t,children:r,selectedValue:n}=e;const l=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",v.tabList)},a.createElement(y,(0,n.Z)({},e,t)),a.createElement(g,(0,n.Z)({},e,t)))}function N(e){const t=(0,h.Z)();return a.createElement(b,(0,n.Z)({key:String(t)},e))}},7183:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>u,metadata:()=>p,toc:()=>m});var n=r(7462),a=(r(7294),r(3905)),l=r(941),o=r(4996),s=r(4866),i=r(5162);const u={},c="\u53cd\u5411\u4ee3\u7406",p={unversionedId:"self-hosted/reverse-proxies",id:"version-4.x/self-hosted/reverse-proxies",title:"\u53cd\u5411\u4ee3\u7406",description:"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/reverse-proxies.mdx",sourceDirName:"self-hosted",slug:"/self-hosted/reverse-proxies",permalink:"/zh-Hans/docs/4.x/self-hosted/reverse-proxies",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/self-hosted/reverse-proxies.mdx",tags:[],version:"4.x",frontMatter:{},sidebar:"selfHosted",previous:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/4.x/self-hosted/deployment/source-code"},next:{title:"Cloud Provider Guides",permalink:"/zh-Hans/docs/4.x/category/cloud-provider-guides"}},d={},m=[{value:"\u51c6\u5907\u5de5\u4f5c",id:"\u51c6\u5907\u5de5\u4f5c",level:2},{value:"Traefik",id:"traefik",level:2},{value:"\u914d\u7f6e\u89e3\u91ca",id:"\u914d\u7f6e\u89e3\u91ca",level:3},{value:"Traefik \u670d\u52a1",id:"traefik-\u670d\u52a1",level:3},{value:"Docker",id:"docker",level:3},{value:"Consul",id:"consul",level:3},{value:"Nomad",id:"nomad",level:3},{value:"Caddy 2 \u914d\u7f6e",id:"caddy-2-\u914d\u7f6e",level:2},{value:"Nginx",id:"nginx",level:2}],f={toc:m},k="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(k,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u53cd\u5411\u4ee3\u7406"},"\u53cd\u5411\u4ee3\u7406"),(0,a.kt)("p",null,"\u65b9\u4fbf SSL \u8bc1\u4e66\u7684\u7edf\u4e00\u7ba1\u7406\u548c\u5206\u53d1\u3001\u670d\u52a1\u7684\u6269\u5bb9\u53ca\u63a5\u5165\u73b0\u6210\u7684\u7f51\u5173\u670d\u52a1\uff0c\u6587\u6863\u63d0\u4f9b\u51e0\u79cd\u7ed9\u7f51\u5173\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u7684\u914d\u7f6e\u3002"),(0,a.kt)(l.Z,{alt:"Architecture",sources:{light:(0,o.Z)("/img/zh-Hans/reverse-proxies-light.png"),dark:(0,o.Z)("/img/zh-Hans/reverse-proxies-dark.png")},mdxType:"ThemedImage"}),(0,a.kt)("h2",{id:"\u51c6\u5907\u5de5\u4f5c"},"\u51c6\u5907\u5de5\u4f5c"),(0,a.kt)("p",null,"\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u9700\u8981\u51c6\u5907\u597d\u5982\u4e0b\u6570\u636e\uff1a"),(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},"\u540d\u79f0"),(0,a.kt)("th",{parentName:"tr",align:null},"\u8303\u4f8b\u503c"),(0,a.kt)("th",{parentName:"tr",align:null},"\u5907\u6ce8"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u57df\u540d"),(0,a.kt)("td",{parentName:"tr",align:null},"zealot.icyleaf.dev"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406 IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.1"),(0,a.kt)("td",{parentName:"tr",align:null})),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot IP \u5730\u5740"),(0,a.kt)("td",{parentName:"tr",align:null},"172.16.56.100"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee",(0,a.kt)("br",null),"\u540c\u4e00\u53f0\u670d\u52a1\u53ef\u6539\u4e3a 127.0.0.1")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5916\u90e8\u6620\u5c04\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"8901"),(0,a.kt)("td",{parentName:"tr",align:null},"\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u53ef\u8bbf\u95ee")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Zealot \u5185\u90e8\u7aef\u53e3\u53f7"),(0,a.kt)("td",{parentName:"tr",align:null},"80"),(0,a.kt)("td",{parentName:"tr",align:null},"\u65e0\u9700\u4fee\u6539")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Let's Encrypt \u90ae\u7bb1"),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"mailto:your-email@example.com"},"your-email@example.com")),(0,a.kt)("td",{parentName:"tr",align:null})))),(0,a.kt)("h2",{id:"traefik"},"Traefik"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/"},"Traefik")," \u662f\u4e00\u6b3e\u5f00\u6e90\u7684\u53cd\u5411\u4ee3\u7406\u4e0e\u8d1f\u8f7d\u5747\u8861\u5de5\u5177\uff0c\u5b83\u81ea\u8eab\u63d0\u4f9b\u591a\u79cd Providers \u53ef\u4ee5\u5b9e\u73b0\u63a5\u5165\u53cd\u5411\u4ee3\u7406\u5e76\u914d\u7f6e SSL \u7684\u65b9\u5f0f\u3002"),(0,a.kt)("h3",{id:"\u914d\u7f6e\u89e3\u91ca"},"\u914d\u7f6e\u89e3\u91ca"),(0,a.kt)("p",null,"\u65e0\u8bba\u4f7f\u7528\u90a3\u79cd Provider \u6838\u5fc3\u7684\u914d\u7f6e\u9879\u662f\u76f8\u540c\u7684\uff0c\u6784\u6210\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u914d\u7f6e\u4e3b\u8981\u6709\u4e09\u90e8\u5206\u7ec4\u6210\uff1a\u53d1\u73b0\u7aef\u53e3\u53f7\u3001\u8def\u7531\u89c4\u5219\uff08\u5305\u542b\u8bbf\u95ee\u7aef\u53e3\u53f7\u3001\u57df\u540d\u7ed1\u5b9a\u548cSSL\uff09"),(0,a.kt)("h3",{id:"traefik-\u670d\u52a1"},"Traefik \u670d\u52a1"),(0,a.kt)(s.Z,{groupId:"yaml",mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"yaml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'entryPoints:\n web:\n address: ":80"\n\n websecure:\n address: ":443"\n\ncertificatesResolvers:\n letsencrypt:\n acme:\n email: your-email@example.com\n storage: acme.json\n httpChallenge:\n entryPoint: web\n'))),(0,a.kt)(i.Z,{value:"toml",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[entryPoints]\n [entryPoints.web]\n address = ":80"\n\n [entryPoints.websecure]\n address = ":443"\n\n[certificatesResolvers.letsencrypt.acme]\n email = "your-email@example.com"\n storage = "acme.json"\n [certificatesResolvers.letsencrypt.acme.httpChallenge]\n # used during the challenge\n entryPoint = "web"\n'))),(0,a.kt)(i.Z,{value:"cli",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"--entrypoints.web.address=:80\n--entrypoints.websecure.address=:443\n\n--certificatesresolvers.letsencrypt.acme.email=your-email@example.com\n--certificatesresolvers.letsencrypt.acme.storage=acme.json\n--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n")))),(0,a.kt)("h3",{id:"docker"},"Docker"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/docker/#configuration-examples"},"Docker provider")," \u540e\u5728\u4fee\u6539 zealot \u7684 Docker Compose \u914d\u7f6e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'version: \'3\'\nservices:\n zealot:\n <<: *defaults\n labels:\n - "traefik.enable=true"\n - "traefik.http.services.zealot.loadbalancer.server.port=80"\n - "traefik.http.routers.zealot.service=zealot"\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"\n - "traefik.http.routers.zealot.tls=true"\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt"\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n # \u7531 Treafik \u63a5\u7ba1\u65e0\u9700\u5728\u5bf9\u5916\u66b4\u9732\u7aef\u53e3\u53f7\n # ports:\n # - "8901:80"\n network:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n - traefik-services\n\nnetworks:\n # \u6839\u636e traefik \u670d\u52a1\u7684 network \u6309\u9700\u8c03\u6574\n traefik-services:\n external: true\n')),(0,a.kt)("p",null,"Docker \u90e8\u7f72\u7684\u5c40\u9650\u4e8e Traefik \u548c Zealot \u670d\u52a1\u901a\u5e38\u5728\u540c\u4e00\u4e2a\u673a\u5668\u7684\u540c\u4e00\u4e2a OS \u7cfb\u7edf\u4e2d\uff0c\u8de8\u673a\u5668\u5c31\u6ca1\u6cd5\u5b9e\u73b0\u901a\u8baf\uff0c\u5bf9\u4e8e\u8de8\u673a\u5668\u5c31\u9700\u8981\u53c2\u8003\u4e0b\u9762\u4e24\u79cd\u914d\u7f6e\u65b9\u6848\uff1a"),(0,a.kt)("h3",{id:"consul"},"Consul"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul/"},"Consul provider")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/consul-catalog/"},"Consul Catalog provider"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5229\u7528\u5b83\u7684 Key-Value \u5b58\u50a8\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"consul kv put traefik/http/services/zealot/loadbalancer/server/port 5\nconsul kv put traefik/http/routers/zealot/service zealot\nconsul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'\nconsul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt\nconsul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev\nconsul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev\n")),(0,a.kt)("h3",{id:"nomad"},"Nomad"),(0,a.kt)("p",null,"\u9996\u5148\u9700\u8981\u5f00\u542f ",(0,a.kt)("a",{parentName:"p",href:"https://doc.traefik.io/traefik/providers/nomad/"},"Nomad provider")," \u4e14 Nomad \u7248\u672c\u8981\u5927\u4e8e\u7b49\u4e8e 1.3 \u624d\u53ef\u4ee5\u54df\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-hcl",metastring:'title="zealot.nomad"',title:'"zealot.nomad"'},'job "zealot" {\n datacenters = ["dc1"]\n type = "service"\n\n group "zealot" {\n count = 1\n\n network {\n port "http"{\n static = 80\n }\n }\n\n service {\n name = "zealot-http"\n provider = "nomad"\n port = "http"\n }\n\n task "server" {\n driver = "docker"\n config {\n image = "ghcr.io/tryzealot/zealot:nightly"\n ports = ["http"]\n args = [\n - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",\n - "traefik.http.routers.zealot.tls=true",\n - "traefik.http.routers.zealot.tls.certresolver=letsencrypt",\n - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",\n - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"\n ]\n }\n }\n }\n}\n')),(0,a.kt)("h2",{id:"caddy-2-\u914d\u7f6e"},"Caddy 2 \u914d\u7f6e"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="Caddyfile"',title:'"Caddyfile"'},":443\n\nlog\n\n# \u4f7f\u7528 Let's Encrypt \u670d\u52a1\ntls your-email@example.com\n\nreverse_proxy 172.16.56.100:8901\n")),(0,a.kt)("p",null,"\u914d\u7f6e\u53ea\u9700\u914d\u7f6e ",(0,a.kt)("inlineCode",{parentName:"p"},"tls")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"proxy")," \u540e\u9762 IP \u5730\u5740\u548c\u7aef\u53e3\u90e8\u5206\u5373\u53ef\u3002"),(0,a.kt)("h2",{id:"nginx"},"Nginx"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5982\u4e0b\u662f\u901a\u7528\u914d\u7f6e\uff0c\u5982\u679c\u4e0d\u53ef\u7528\u6b22\u8fce",(0,a.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/docs/issues/new"},"\u63d0\u95ee\u9898"),"\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="conf.d/zealot.conf"',title:'"conf.d/zealot.conf"'},"upstream zealot {\n zone upstreams 64K;\n server 172.16.56.100:8901;\n keepalive 32;\n}\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\nserver {\n listen 80;\n listen [::]:80;\n server_name zealot.icyleaf.dev;\n location /.well-known/acme-challenge/ { allow all; }\n location / { return 301 https://$host$request_uri; }\n}\n\nserver {\n listen 443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n listen [::]:443 ssl http2; # \u53ef\u9009\uff1ahttp2 \u53ef\u80fd\u9700\u8981\u5b89\u88c5\u989d\u5916\u6269\u5c55\uff0c\u4e0d\u9700\u8981\u53ef\u79fb\u9664\n server_name zealot.icyleaf.dev;\n\n ssl_certificate /etc/certs/zealot-cert.pem;\n ssl_certificate_key /etc/certs/zealot.pem;\n\n # Optional\n # ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;\n # ssl_session_timeout 5m;\n # ssl_session_cache shared:SSL:1m;\n # ssl_prefer_server_ciphers on;\n\n location / {\n proxy_pass http://zealot;\n proxy_redirect off;\n\n proxy_pass_header Authorization;\n proxy_set_header Host $host;\n # proxy_set_header X-Forwarded-Ssl on; # \u53ef\u9009\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n\n client_max_body_size 0;\n proxy_read_timeout 36000s;\n }\n}\n")),(0,a.kt)("p",null,"Nginx \u8fd8\u9700\u8981\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"http")," \u4e2d\u914d\u7f6e\u6700\u5927\u4e0a\u4f20\u6587\u4ef6\u4e0a\u4f20\u5927\u5c0f\uff0c\u666e\u901a\u5e94\u7528\u5efa\u8bae\u662f\u5728 200MB \u5de6\u53f3\uff0c\u5982\u679c\u662f\u6e38\u620f\u53ef\u6839\u636e\u5b9e\u9645\u6587\u4ef6\u5927\u5c0f\u518d\u591a\u51fa 50% \u6253\u51fa\u5bcc\u4f59\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-nginx",metastring:'title="nginx.conf"',title:'"nginx.conf"'},"http {\n [...]\n\n client_max_body_size 200M;\n}\n")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/c4f5d8e4.ce8f06be.js b/zh-Hans/assets/js/c4f5d8e4.83acb6e2.js similarity index 84% rename from zh-Hans/assets/js/c4f5d8e4.ce8f06be.js rename to zh-Hans/assets/js/c4f5d8e4.83acb6e2.js index 6a6726e3b..a7df33ae0 100644 --- a/zh-Hans/assets/js/c4f5d8e4.ce8f06be.js +++ b/zh-Hans/assets/js/c4f5d8e4.83acb6e2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4195],{5154:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1041.277,height:554.141,viewBox:"0 0 1041.277 554.141","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Powered by Rails"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 24"},n.createElement("g",{"data-name":"Group 23",transform:"translate(-.011 -.035)"},n.createElement("path",{fill:"#f2f2f2",d:"M961.48 438.21q-1.74 3.75-3.47 7.4-2.7 5.67-5.33 11.12c-.78 1.61-1.56 3.19-2.32 4.77-8.6 17.57-16.63 33.11-23.45 45.89a73.21 73.21 0 0 1-63.81 38.7l-151.65 1.65h-1.6l-13 .14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107 1.16-95.51 1-11.11.12-69 .75h-.08l-44.75.48h-.48l-141.5 1.53-42.33.46a87.991 87.991 0 0 1-10.79-.54c-1.22-.14-2.44-.3-3.65-.49a87.38 87.38 0 0 1-51.29-27.54c-18.21-20.03-31.46-43.4-40.36-68.76q-1.93-5.49-3.6-11.12c-30.81-104.15 6.75-238.52 74.35-328.44q4.25-5.64 8.64-11l.07-.08c20.79-25.52 44.1-46.84 68.93-62 44-26.91 92.75-34.49 140.7-11.9 40.57 19.12 78.45 28.11 115.17 30.55 3.71.24 7.42.42 11.11.53 84.23 2.65 163.17-27.7 255.87-47.29 3.69-.78 7.39-1.55 11.12-2.28C763 .54 836.36-6.4 923.6 8.19a189.089 189.089 0 0 1 26.76 6.4q5.77 1.86 11.12 4c41.64 16.94 64.35 48.24 74 87.46q1.37 5.46 2.37 11.11c17.11 94.34-33 228.16-76.37 321.05Z","data-name":"Path 299"}),n.createElement("path",{d:"M497.02 445.61a95.21 95.21 0 0 1-1.87 11.12h93.7v-11.12Zm-78.25 62.81 11.11-.09v-27.47c-3.81-.17-7.52-.34-11.11-.52Zm-232.92-62.81v11.12h198.5v-11.12Zm849.68-339.52h-74V18.6q-5.35-2.17-11.12-4v91.49H696.87V13.67c-3.73.73-7.43 1.5-11.12 2.28v90.14H429.88V63.24c-3.69-.11-7.4-.29-11.11-.53v43.38H162.9v-62c-24.83 15.16-48.14 36.48-68.93 62h-.07v.08q-4.4 5.4-8.64 11h8.64v328.44h-83q1.66 5.63 3.6 11.12h79.39v93.62a87 87 0 0 0 12.2 2.79c1.21.19 2.43.35 3.65.49a87.991 87.991 0 0 0 10.79.54l42.33-.46v-97h255.91v94.21l11.11-.12v-94.07h255.87v91.36l11.12-.12v-91.24h253.49v4.77c.76-1.58 1.54-3.16 2.32-4.77q2.63-5.45 5.33-11.12 1.73-3.64 3.47-7.4v-321h76.42q-1.01-5.69-2.37-11.12ZM162.9 445.61V117.17h255.87v328.44Zm267 0V117.17h255.85v328.44Zm520.48 0H696.87V117.17h253.49Z","data-name":"Path 300",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 301"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 302",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 303"}),n.createElement("path",{d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 304",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M298.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 305"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 137",d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{"data-name":"Rectangle 138",opacity:.1,d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 139",d:"M678.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{d:"M298.09 483.65v4.97l-47.17 1.26v-6.23Z","data-name":"Path 306",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M381.35 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 307"}),n.createElement("path",{d:"M185.85 308.41v181.2h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95Z","data-name":"Path 308",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M194.59 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 309"}),n.createElement("path",{d:"M726.09 483.65v6.41l-47.17-1.26v-5.15Z","data-name":"Path 310",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95l-191.69-5.1a4 4 0 0 1-3.85-3.95v-168.2a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.99 3.95Z","data-name":"Path 311"}),n.createElement("path",{d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95v-181.2a4 4 0 0 1 4 3.95Z","data-name":"Path 312",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M775.59 319.15h-177.5V467.4l177.5 4Z","data-name":"Path 313"}),n.createElement("path",{fill:"#65617d",d:"M583.85 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1a4 4 0 0 1-4-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 314"}),n.createElement("path",{fill:"#4267b2",d:"M397.09 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 315"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5 4.4-.02.98-.01Z","data-name":"Path 316",opacity:.1}),n.createElement("circle",{cx:51.33,cy:51.33,r:51.33,fill:"#fbbebe","data-name":"Ellipse 111",transform:"translate(435.93 246.82)"}),n.createElement("path",{fill:"#fbbebe",d:"M538.6 377.16s-99.5 12-90 0c3.44-4.34 4.39-17.2 4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41 77-8.5c-4 13.13-2.69 31.57.35 48.88.89 5.05 1.92 10 3 14.7a344.66 344.66 0 0 0 9.65 33.92Z","data-name":"Path 317"}),n.createElement("path",{fill:"#ff6584",d:"M506.13 373.09c11.51-2.13 23.7-6 34.53-1.54 2.85 1.17 5.47 2.88 8.39 3.86s6.12 1.22 9.16 1.91c10.68 2.42 19.34 10.55 24.9 20s8.44 20.14 11.26 30.72l6.9 25.83c6 22.45 12 45.09 13.39 68.3a2437.506 2437.506 0 0 1-250.84 1.43c5.44-10.34 11-21.31 10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34 6.57-13.39 9.64-20.22 8.75-19.52 1.94-45.79 17.32-60.65 6.92-6.68 17-9.21 26.63-8.89 12.28.41 24.85 4.24 37 6.11 15.56 2.36 30.26 3.76 45.94.88Z","data-name":"Path 318"}),n.createElement("path",{d:"m637.03 484.26-.1 1.43v.1l-.17 2.3-1.33 18.51-1.61 22.3-.46 6.28-1 13.44v.17l-107 1-175.59 1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53 10.53 0 0 1 11.42-10.17c4.72.4 10.85.89 18.18 1.41l3 .22c42.33 2.94 120.56 6.74 199.5 2 1.66-.09 3.33-.19 5-.31 12.24-.77 24.47-1.76 36.58-3a10.53 10.53 0 0 1 11.6 11.23Z","data-name":"Path 319",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M349.74 552.53v-.84l175.62-1.91 107-1h.3v-.17l1-13.44.43-6 1.64-22.61 1.29-17.9v-.44a10.617 10.617 0 0 0-.11-2.47.3.3 0 0 0 0-.1 10.391 10.391 0 0 0-2-4.64 10.54 10.54 0 0 0-9.42-4 937.419 937.419 0 0 1-36.58 3c-1.67.12-3.34.22-5 .31-78.94 4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54 10.54 0 0 0-11.24 8.53 11 11 0 0 0-.18 1.64l-.68 22.16-.93 28.07-.44 14.36v1.12Z","data-name":"Path 320"}),n.createElement("path",{d:"m637.33 491.27-1.23 15.33-1.83 22.85-.46 5.72-1 12.81-.06.64v.17l-.15 1.48.11-1.48h-.29l-107 1-175.65 1.9v-.28l.49-14.36 1-28.06.64-18.65a6.36 6.36 0 0 1 3.06-5.25 6.25 6.25 0 0 1 3.78-.9c2.1.17 4.68.37 7.69.59 4.89.36 10.92.78 17.94 1.22 13 .82 29.31 1.7 48 2.42 52 2 122.2 2.67 188.88-3.17 3-.26 6.1-.55 9.13-.84a6.26 6.26 0 0 1 3.48.66 5.159 5.159 0 0 1 .86.54 6.14 6.14 0 0 1 2 2.46 3.564 3.564 0 0 1 .25.61 6.279 6.279 0 0 1 .36 2.59Z","data-name":"Path 321",opacity:.1}),n.createElement("path",{d:"M298.1 504.96v3.19a6.13 6.13 0 0 1-3.5 5.54l-40.1.77a6.12 6.12 0 0 1-3.57-5.57v-3Z","data-name":"Path 322",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 323"}),n.createElement("path",{d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 324",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m300.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 325"}),n.createElement("path",{d:"M679.22 506.96v3.19a6.13 6.13 0 0 0 3.5 5.54l40.1.77a6.12 6.12 0 0 0 3.57-5.57v-3Z","data-name":"Path 326",opacity:.1}),n.createElement("path",{d:"m678.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 327",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m676.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 328"}),n.createElement("path",{fill:"#3f3d56",d:"M454.79 313.88c.08 7-3.16 13.6-5.91 20.07a163.491 163.491 0 0 0-12.66 74.71c.73 11 2.58 22 .73 32.9s-8.43 21.77-19 24.9c17.53 10.45 41.26 9.35 57.76-2.66 8.79-6.4 15.34-15.33 21.75-24.11a97.86 97.86 0 0 1-13.31 44.75 103.43 103.43 0 0 0 73.51-40.82c4.31-5.81 8.06-12.19 9.72-19.23 3.09-13-1.22-26.51-4.51-39.5a266.055 266.055 0 0 1-6.17-33c-.43-3.56-.78-7.22.1-10.7 1-4.07 3.67-7.51 5.64-11.22 5.6-10.54 5.73-23.3 2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47 1.48-16.14 8.32-22 15.34-4.59 5.46-15.81 15.71-16.6 22.86-.72 6.59 5.1 17.63 6.09 24.58 1.3 9 2.22 6 7.3 11.52 3.21 3.42 5.28 7.37 5.34 12.16Z","data-name":"Path 329"})))))}},6081:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1088,height:687.962,viewBox:"0 0 1088 687.962","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Easy to Use"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 12"},n.createElement("g",{"data-name":"Group 11"},n.createElement("path",{fill:"#3f3d56",d:"M961.81 454.442c-5.27 45.15-16.22 81.4-31.25 110.31-20 38.52-54.21 54.04-84.77 70.28a193.275 193.275 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.282 657.282 0 0 0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07 5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12 52.29-235.46 134.74-296.47 155.97-115.41 369.76-110.57 523.43 7.88 102.36 78.9 198.2 198.31 179.02 362.74Z","data-name":"Path 83"}),n.createElement("path",{fill:"#f2f2f2",d:"M930.56 564.752c-20 38.52-47.21 64.04-77.77 80.28a193.272 193.272 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.3 657.3 0 0 0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25 1.72c-100.17 7.36-253.82-6.43-321.42-143.29L326 177.962l62.95 161.619 20.09 51.59 55.37-75.98L493 275.962l130.2 149.27 36.8-81.27 254.78 207.919 14.21 11.59Z","data-name":"Path 84"}),n.createElement("path",{d:"m302 282.962 26-57 36 83-31-60Z","data-name":"Path 85",opacity:.1}),n.createElement("path",{d:"M554.5 647.802q-14.97-.675-29.97-.67l-115.49-255.96Z","data-name":"Path 86",opacity:.1}),n.createElement("path",{d:"M464.411 315.191 493 292.962l130 150-132-128Z","data-name":"Path 87",opacity:.1}),n.createElement("path",{d:"M852.79 645.032a193.265 193.265 0 0 1-27.46 11.94L623.2 425.232Z","data-name":"Path 88",opacity:.1}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 11",transform:"translate(479 98.962)"}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 12",transform:"translate(396 201.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 13",transform:"translate(600 220.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 14",transform:"translate(180 265.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 15",transform:"translate(612 96.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 16",transform:"translate(736 192.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 17",transform:"translate(858 344.962)"}),n.createElement("path",{fill:"#f2f2f2",d:"M306 121.222h-2.76v-2.76h-1.48v2.76H299v1.478h2.76v2.759h1.48V122.7H306Z","data-name":"Path 89"}),n.createElement("path",{fill:"#f2f2f2",d:"M848 424.222h-2.76v-2.76h-1.48v2.76H841v1.478h2.76v2.759h1.48V425.7H848Z","data-name":"Path 90"}),n.createElement("path",{fill:"#3f3d56",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 91"}),n.createElement("path",{d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 92",opacity:.1}),n.createElement("ellipse",{cx:544,cy:30,fill:"#3f3d56","data-name":"Ellipse 18",rx:544,ry:30,transform:"translate(0 583.962)"}),n.createElement("path",{fill:"#ff6584",d:"M568 571.962c0 33.137-14.775 24-33 24s-33 9.137-33-24 33-96 33-96 33 62.863 33 96Z","data-name":"Path 93"}),n.createElement("path",{d:"M550 584.641c0 15.062-6.716 10.909-15 10.909s-15 4.153-15-10.909 15-43.636 15-43.636 15 28.576 15 43.636Z","data-name":"Path 94",opacity:.1}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 97",rx:9,transform:"translate(489 604.962)"}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 98",rx:9,transform:"translate(489 586.962)"}),n.createElement("path",{fill:"#3f3d56",d:"M137 490.528c0 55.343 34.719 100.126 77.626 100.126","data-name":"Path 95"}),n.createElement("path",{fill:"#6c63ff",d:"M214.626 590.654c0-55.965 38.745-101.251 86.626-101.251","data-name":"Path 96"}),n.createElement("path",{fill:"#6c63ff",d:"M165.125 495.545c0 52.57 22.14 95.109 49.5 95.109","data-name":"Path 97"}),n.createElement("path",{fill:"#3f3d56",d:"M214.626 590.654c0-71.511 44.783-129.377 100.126-129.377","data-name":"Path 98"}),n.createElement("path",{fill:"#a8a8a8",d:"M198.3 591.36s11.009-.339 14.326-2.7 16.934-5.183 17.757-1.395 16.544 18.844 4.115 18.945-28.879-1.936-32.19-3.953-4.008-10.897-4.008-10.897Z","data-name":"Path 99"}),n.createElement("path",{d:"M234.716 604.89c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7 8.879 4.009 10.9 19.761 4.053 32.19 3.953c3.588-.029 4.827-1.305 4.759-3.2-.498 1.142-1.867 1.855-4.537 1.877Z","data-name":"Path 100",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M721.429 527.062c0 38.029 23.857 68.8 53.341 68.8","data-name":"Path 101"}),n.createElement("path",{fill:"#6c63ff",d:"M774.769 595.863c0-38.456 26.623-69.575 59.525-69.575","data-name":"Path 102"}),n.createElement("path",{fill:"#6c63ff",d:"M740.755 530.509c0 36.124 15.213 65.354 34.014 65.354","data-name":"Path 103"}),n.createElement("path",{fill:"#3f3d56",d:"M774.769 595.863c0-49.139 30.773-88.9 68.8-88.9","data-name":"Path 104"}),n.createElement("path",{fill:"#a8a8a8",d:"M763.548 596.348s7.565-.233 9.844-1.856 11.636-3.562 12.2-.958 11.368 12.949 2.828 13.018-19.844-1.33-22.119-2.716-2.753-7.488-2.753-7.488Z","data-name":"Path 105"}),n.createElement("path",{d:"M788.574 605.645c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479 6.1 2.755 7.487 13.579 2.785 22.119 2.716c2.465-.02 3.317-.9 3.27-2.2-.343.788-1.283 1.278-3.118 1.293Z","data-name":"Path 106",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M893.813 618.699s11.36-1.729 14.5-4.591 16.89-7.488 18.217-3.667 19.494 17.447 6.633 19.107-30.153 1.609-33.835-.065-5.515-10.784-5.515-10.784Z","data-name":"Path 107"}),n.createElement("path",{d:"M933.228 628.154c-12.86 1.659-30.153 1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833 9.109 5.516 10.783 20.975 1.725 33.835.065c3.712-.479 4.836-1.956 4.529-3.906-.375 1.246-1.703 2.156-4.466 2.512Z","data-name":"Path 108",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M614.26 617.881s9.587-1.459 12.237-3.875 14.255-6.32 15.374-3.095 16.452 14.725 5.6 16.125-25.448 1.358-28.555-.055-4.656-9.1-4.656-9.1Z","data-name":"Path 109"}),n.createElement("path",{d:"M647.524 625.856c-10.853 1.4-25.448 1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547 7.687 4.655 9.1 17.7 1.456 28.555.055c3.133-.4 4.081-1.651 3.822-3.3-.314 1.057-1.435 1.825-3.767 2.125Z","data-name":"Path 110",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M122.389 613.09s7.463-1.136 9.527-3.016 11.1-4.92 11.969-2.409 12.808 11.463 4.358 12.553-19.811 1.057-22.23-.043-3.624-7.085-3.624-7.085Z","data-name":"Path 111"}),n.createElement("path",{d:"M148.285 619.302c-8.449 1.09-19.811 1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2 5.984 3.624 7.085 13.781 1.133 22.23.043c2.439-.315 3.177-1.285 2.976-2.566-.246.818-1.119 1.416-2.934 1.65Z","data-name":"Path 112",opacity:.2}),n.createElement("path",{d:"M383.7 601.318c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.118-36.793 93.694-36.793 93.08 6.573 93.08 36.793Z","data-name":"Path 113",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M383.7 593.881c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.114-36.8 93.69-36.8 93.084 6.576 93.084 36.8Z","data-name":"Path 114"})))))}},5720:(e,t,a)=>{a.d(t,{Z:()=>B});var l,n,c,r,h,i,d,m,s,f,o,p,E,v,Z,u,y,g,M,P,x,w,b,O,q,N=a(7294);function S(){return S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},S.apply(this,arguments)}const B=e=>{let{title:t,titleId:a,...B}=e;return N.createElement("svg",S({xmlns:"http://www.w3.org/2000/svg",width:1129,height:663,viewBox:"0 0 1129 663","aria-labelledby":a},B),void 0===t?N.createElement("title",{id:a},"Focus on What Matters"):t?N.createElement("title",{id:a},t):null,l||(l=N.createElement("circle",{cx:321,cy:321,r:321,fill:"#f2f2f2"})),n||(n=N.createElement("ellipse",{cx:559,cy:635.5,fill:"#3f3d56",rx:514,ry:27.5})),c||(c=N.createElement("ellipse",{cx:558,cy:627,opacity:.2,rx:460,ry:22})),r||(r=N.createElement("path",{fill:"#3f3d56",d:"M131 152.5h840v50H131z"})),h||(h=N.createElement("path",{fill:"#3f3d56",d:"M131 606.8c0 5.8 2.3 11.3 6.4 15.3 4 4.1 9.5 6.4 15.3 6.4h796.6c5.8 0 11.3-2.3 15.3-6.4 4.1-4 6.4-9.5 6.4-15.3V175.5H131Z"})),i||(i=N.createElement("path",{fill:"#3f3d56",d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z"})),d||(d=N.createElement("path",{d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z",opacity:.2})),m||(m=N.createElement("circle",{cx:181,cy:147.5,r:13,fill:"#3f3d56"})),s||(s=N.createElement("circle",{cx:217,cy:147.5,r:13,fill:"#3f3d56"})),f||(f=N.createElement("circle",{cx:253,cy:147.5,r:13,fill:"#3f3d56"})),o||(o=N.createElement("rect",{width:337,height:386,x:168,y:213.5,fill:"#606060",rx:5.3})),p||(p=N.createElement("rect",{width:284,height:22,x:603,y:272.5,fill:"#243B49",rx:5.5})),E||(E=N.createElement("rect",{width:416,height:15,x:537,y:351.5,fill:"#203D49",rx:5.5})),v||(v=N.createElement("rect",{width:416,height:15,x:537,y:396.5,fill:"#263C49",rx:5.5})),Z||(Z=N.createElement("rect",{width:416,height:15,x:537,y:440.5,fill:"#26394D",rx:5.5})),u||(u=N.createElement("rect",{width:416,height:15,x:537,y:484.5,fill:"#233A4D",rx:5.5})),y||(y=N.createElement("rect",{width:88,height:26,x:865,y:552.5,fill:"#213450",rx:7})),g||(g=N.createElement("path",{fill:"#3f3d56",d:"M1053.1 506.1a30.1 30.1 0 0 0 4-15.3c0-13.8-8.5-25-19.1-25s-19.1 11.2-19.1 25a30.1 30.1 0 0 0 4 15.3 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 30.1 30.1 0 0 0-4 15.3c0 13.8 8.5 25 19.1 25s19.1-11.2 19.1-25a30.1 30.1 0 0 0-4-15.3 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5Z"})),M||(M=N.createElement("ellipse",{cx:1038,cy:460.3,fill:"#3f3d56",rx:19.1,ry:25})),P||(P=N.createElement("ellipse",{cx:1038,cy:429.8,fill:"#3f3d56",rx:19.1,ry:25})),x||(x=N.createElement("path",{fill:"#3E77CC",fillRule:"evenodd",d:"M1110.4 220.8c2.6-3.3 5-6.8 7.1-10.5l-50.1-8.2 54.2.4c10.5-22.9 11.1-49.1 1.7-72.4l-72.8 37.7 67.1-49.3c-17.2-29.5-49.4-46.9-83.5-45.2-34 1.7-64.3 22.2-78.5 53.2-14.2 31.1-10 67.4 11 94.3-4.1 5.2-7.5 10.8-10.4 16.7l65.1 33.8-69.4-23.3c-9.9 29.2-4.4 61.5 14.7 85.8-29.5 37.5-25.2 91.3 9.8 123.6 35.1 32.4 89 32.4 124.1 0 35-32.3 39.3-86.1 9.8-123.6 26.1-33.2 26.1-79.8 0-113Z"})),w||(w=N.createElement("path",{d:"M946.2 277.4a91 91 0 0 0 19.6 56.5 91.4 91.4 0 1 0 143.7 0c12.2-15.6-163.3-66.8-163.3-56.5Z",opacity:.1})),b||(b=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),O||(O=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),q||(q=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})))}},3261:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var l=a(7294),n=a(6010),c=a(9960),r=a(2263),h=a(7961),i=a(7462);const d={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var m=a(5999);const s=[{title:l.createElement(m.Z,null,"Easy to Use"),Svg:a(6081).Z,description:l.createElement(m.Z,null,"Zealot was designed from the ground up to be easily installed and running quickly.")},{title:l.createElement(m.Z,null,"Focus on What Matters"),Svg:a(5720).Z,description:l.createElement(m.Z,null,"Zealot lets you focus on your app, and we'll do the chores. Go ahead and upload your apps.")},{title:l.createElement(m.Z,null,"Open Source 100%"),Svg:a(5154).Z,description:l.createElement(m.Z,null,"Zealot is an open source project, Everyone could easy self hosted on own servers.")}];function f(e){let{Svg:t,title:a,description:c}=e;return l.createElement("div",{className:(0,n.Z)("col col--4")},l.createElement("div",{className:"text--center"},l.createElement(t,{className:d.featureSvg,role:"img"})),l.createElement("div",{className:"text--center padding-horiz--md"},l.createElement("h3",null,a),l.createElement("p",null,c)))}function o(){return l.createElement("section",{className:d.features},l.createElement("div",{className:"container"},l.createElement("div",{className:"row"},s.map(((e,t)=>l.createElement(f,(0,i.Z)({key:t},e)))))))}const p={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function E(){const{siteConfig:e}=(0,r.Z)();return l.createElement("header",{className:(0,n.Z)("hero hero--primary",p.heroBanner)},l.createElement("div",{className:"container"},l.createElement("h1",{className:"hero__title"},l.createElement(m.Z,{id:"homepage.header.title",description:"The title for homepage"},"Zealot")),l.createElement("p",{className:"hero__subtitle"},l.createElement(m.Z,{id:"homepage.header.subtitle",description:"The subtitle for homepage"},"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.")),l.createElement("div",{className:p.buttons},l.createElement(c.Z,{className:"button button--secondary button--lg",to:"/docs/user-guide/"},l.createElement(m.Z,null,"Getting started")))))}function v(){const{siteConfig:e}=(0,r.Z)();return l.createElement(h.Z,{title:(0,m.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"}),description:(0,m.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"})},l.createElement(E,null),l.createElement("main",null,l.createElement(o,null)))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4195],{5154:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1041.277,height:554.141,viewBox:"0 0 1041.277 554.141","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Powered by Rails"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 24"},n.createElement("g",{"data-name":"Group 23",transform:"translate(-.011 -.035)"},n.createElement("path",{fill:"#f2f2f2",d:"M961.48 438.21q-1.74 3.75-3.47 7.4-2.7 5.67-5.33 11.12c-.78 1.61-1.56 3.19-2.32 4.77-8.6 17.57-16.63 33.11-23.45 45.89a73.21 73.21 0 0 1-63.81 38.7l-151.65 1.65h-1.6l-13 .14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107 1.16-95.51 1-11.11.12-69 .75h-.08l-44.75.48h-.48l-141.5 1.53-42.33.46a87.991 87.991 0 0 1-10.79-.54c-1.22-.14-2.44-.3-3.65-.49a87.38 87.38 0 0 1-51.29-27.54c-18.21-20.03-31.46-43.4-40.36-68.76q-1.93-5.49-3.6-11.12c-30.81-104.15 6.75-238.52 74.35-328.44q4.25-5.64 8.64-11l.07-.08c20.79-25.52 44.1-46.84 68.93-62 44-26.91 92.75-34.49 140.7-11.9 40.57 19.12 78.45 28.11 115.17 30.55 3.71.24 7.42.42 11.11.53 84.23 2.65 163.17-27.7 255.87-47.29 3.69-.78 7.39-1.55 11.12-2.28C763 .54 836.36-6.4 923.6 8.19a189.089 189.089 0 0 1 26.76 6.4q5.77 1.86 11.12 4c41.64 16.94 64.35 48.24 74 87.46q1.37 5.46 2.37 11.11c17.11 94.34-33 228.16-76.37 321.05Z","data-name":"Path 299"}),n.createElement("path",{d:"M497.02 445.61a95.21 95.21 0 0 1-1.87 11.12h93.7v-11.12Zm-78.25 62.81 11.11-.09v-27.47c-3.81-.17-7.52-.34-11.11-.52Zm-232.92-62.81v11.12h198.5v-11.12Zm849.68-339.52h-74V18.6q-5.35-2.17-11.12-4v91.49H696.87V13.67c-3.73.73-7.43 1.5-11.12 2.28v90.14H429.88V63.24c-3.69-.11-7.4-.29-11.11-.53v43.38H162.9v-62c-24.83 15.16-48.14 36.48-68.93 62h-.07v.08q-4.4 5.4-8.64 11h8.64v328.44h-83q1.66 5.63 3.6 11.12h79.39v93.62a87 87 0 0 0 12.2 2.79c1.21.19 2.43.35 3.65.49a87.991 87.991 0 0 0 10.79.54l42.33-.46v-97h255.91v94.21l11.11-.12v-94.07h255.87v91.36l11.12-.12v-91.24h253.49v4.77c.76-1.58 1.54-3.16 2.32-4.77q2.63-5.45 5.33-11.12 1.73-3.64 3.47-7.4v-321h76.42q-1.01-5.69-2.37-11.12ZM162.9 445.61V117.17h255.87v328.44Zm267 0V117.17h255.85v328.44Zm520.48 0H696.87V117.17h253.49Z","data-name":"Path 300",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 301"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z","data-name":"Path 302",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 303"}),n.createElement("path",{d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 304",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M298.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z","data-name":"Path 305"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 137",d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{"data-name":"Rectangle 138",opacity:.1,d:"M680.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{fill:"#3f3d56","data-name":"Rectangle 139",d:"M678.92 483.65h47.17v31.5h-47.17z"}),n.createElement("path",{d:"M298.09 483.65v4.97l-47.17 1.26v-6.23Z","data-name":"Path 306",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M381.35 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 307"}),n.createElement("path",{d:"M185.85 308.41v181.2h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95Z","data-name":"Path 308",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M194.59 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 309"}),n.createElement("path",{d:"M726.09 483.65v6.41l-47.17-1.26v-5.15Z","data-name":"Path 310",opacity:.1}),n.createElement("path",{fill:"#65617d",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95l-191.69-5.1a4 4 0 0 1-3.85-3.95v-168.2a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.99 3.95Z","data-name":"Path 311"}),n.createElement("path",{d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95v-181.2a4 4 0 0 1 4 3.95Z","data-name":"Path 312",opacity:.1}),n.createElement("path",{fill:"#39374d",d:"M775.59 319.15h-177.5V467.4l177.5 4Z","data-name":"Path 313"}),n.createElement("path",{fill:"#65617d",d:"M583.85 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1a4 4 0 0 1-4-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z","data-name":"Path 314"}),n.createElement("path",{fill:"#4267b2",d:"M397.09 319.15h177.5V467.4l-177.5 4Z","data-name":"Path 315"}),n.createElement("path",{d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5 4.4-.02.98-.01Z","data-name":"Path 316",opacity:.1}),n.createElement("circle",{cx:51.33,cy:51.33,r:51.33,fill:"#fbbebe","data-name":"Ellipse 111",transform:"translate(435.93 246.82)"}),n.createElement("path",{fill:"#fbbebe",d:"M538.6 377.16s-99.5 12-90 0c3.44-4.34 4.39-17.2 4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41 77-8.5c-4 13.13-2.69 31.57.35 48.88.89 5.05 1.92 10 3 14.7a344.66 344.66 0 0 0 9.65 33.92Z","data-name":"Path 317"}),n.createElement("path",{fill:"#ff6584",d:"M506.13 373.09c11.51-2.13 23.7-6 34.53-1.54 2.85 1.17 5.47 2.88 8.39 3.86s6.12 1.22 9.16 1.91c10.68 2.42 19.34 10.55 24.9 20s8.44 20.14 11.26 30.72l6.9 25.83c6 22.45 12 45.09 13.39 68.3a2437.506 2437.506 0 0 1-250.84 1.43c5.44-10.34 11-21.31 10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34 6.57-13.39 9.64-20.22 8.75-19.52 1.94-45.79 17.32-60.65 6.92-6.68 17-9.21 26.63-8.89 12.28.41 24.85 4.24 37 6.11 15.56 2.36 30.26 3.76 45.94.88Z","data-name":"Path 318"}),n.createElement("path",{d:"m637.03 484.26-.1 1.43v.1l-.17 2.3-1.33 18.51-1.61 22.3-.46 6.28-1 13.44v.17l-107 1-175.59 1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53 10.53 0 0 1 11.42-10.17c4.72.4 10.85.89 18.18 1.41l3 .22c42.33 2.94 120.56 6.74 199.5 2 1.66-.09 3.33-.19 5-.31 12.24-.77 24.47-1.76 36.58-3a10.53 10.53 0 0 1 11.6 11.23Z","data-name":"Path 319",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M349.74 552.53v-.84l175.62-1.91 107-1h.3v-.17l1-13.44.43-6 1.64-22.61 1.29-17.9v-.44a10.617 10.617 0 0 0-.11-2.47.3.3 0 0 0 0-.1 10.391 10.391 0 0 0-2-4.64 10.54 10.54 0 0 0-9.42-4 937.419 937.419 0 0 1-36.58 3c-1.67.12-3.34.22-5 .31-78.94 4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54 10.54 0 0 0-11.24 8.53 11 11 0 0 0-.18 1.64l-.68 22.16-.93 28.07-.44 14.36v1.12Z","data-name":"Path 320"}),n.createElement("path",{d:"m637.33 491.27-1.23 15.33-1.83 22.85-.46 5.72-1 12.81-.06.64v.17l-.15 1.48.11-1.48h-.29l-107 1-175.65 1.9v-.28l.49-14.36 1-28.06.64-18.65a6.36 6.36 0 0 1 3.06-5.25 6.25 6.25 0 0 1 3.78-.9c2.1.17 4.68.37 7.69.59 4.89.36 10.92.78 17.94 1.22 13 .82 29.31 1.7 48 2.42 52 2 122.2 2.67 188.88-3.17 3-.26 6.1-.55 9.13-.84a6.26 6.26 0 0 1 3.48.66 5.159 5.159 0 0 1 .86.54 6.14 6.14 0 0 1 2 2.46 3.564 3.564 0 0 1 .25.61 6.279 6.279 0 0 1 .36 2.59Z","data-name":"Path 321",opacity:.1}),n.createElement("path",{d:"M298.1 504.96v3.19a6.13 6.13 0 0 1-3.5 5.54l-40.1.77a6.12 6.12 0 0 1-3.57-5.57v-3Z","data-name":"Path 322",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 323"}),n.createElement("path",{d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 324",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m300.59 515.57-52.25 1v-8.67l52.25-1Z","data-name":"Path 325"}),n.createElement("path",{d:"M679.22 506.96v3.19a6.13 6.13 0 0 0 3.5 5.54l40.1.77a6.12 6.12 0 0 0 3.57-5.57v-3Z","data-name":"Path 326",opacity:.1}),n.createElement("path",{d:"m678.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 327",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"m676.72 517.57 52.25 1v-8.67l-52.25-1Z","data-name":"Path 328"}),n.createElement("path",{fill:"#3f3d56",d:"M454.79 313.88c.08 7-3.16 13.6-5.91 20.07a163.491 163.491 0 0 0-12.66 74.71c.73 11 2.58 22 .73 32.9s-8.43 21.77-19 24.9c17.53 10.45 41.26 9.35 57.76-2.66 8.79-6.4 15.34-15.33 21.75-24.11a97.86 97.86 0 0 1-13.31 44.75 103.43 103.43 0 0 0 73.51-40.82c4.31-5.81 8.06-12.19 9.72-19.23 3.09-13-1.22-26.51-4.51-39.5a266.055 266.055 0 0 1-6.17-33c-.43-3.56-.78-7.22.1-10.7 1-4.07 3.67-7.51 5.64-11.22 5.6-10.54 5.73-23.3 2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47 1.48-16.14 8.32-22 15.34-4.59 5.46-15.81 15.71-16.6 22.86-.72 6.59 5.1 17.63 6.09 24.58 1.3 9 2.22 6 7.3 11.52 3.21 3.42 5.28 7.37 5.34 12.16Z","data-name":"Path 329"})))))}},6081:(e,t,a)=>{a.d(t,{Z:()=>r});var l,n=a(7294);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},c.apply(this,arguments)}const r=e=>{let{title:t,titleId:a,...r}=e;return n.createElement("svg",c({xmlns:"http://www.w3.org/2000/svg",width:1088,height:687.962,viewBox:"0 0 1088 687.962","aria-labelledby":a},r),void 0===t?n.createElement("title",{id:a},"Easy to Use"):t?n.createElement("title",{id:a},t):null,l||(l=n.createElement("g",{"data-name":"Group 12"},n.createElement("g",{"data-name":"Group 11"},n.createElement("path",{fill:"#3f3d56",d:"M961.81 454.442c-5.27 45.15-16.22 81.4-31.25 110.31-20 38.52-54.21 54.04-84.77 70.28a193.275 193.275 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.282 657.282 0 0 0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07 5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12 52.29-235.46 134.74-296.47 155.97-115.41 369.76-110.57 523.43 7.88 102.36 78.9 198.2 198.31 179.02 362.74Z","data-name":"Path 83"}),n.createElement("path",{fill:"#f2f2f2",d:"M930.56 564.752c-20 38.52-47.21 64.04-77.77 80.28a193.272 193.272 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.3 657.3 0 0 0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25 1.72c-100.17 7.36-253.82-6.43-321.42-143.29L326 177.962l62.95 161.619 20.09 51.59 55.37-75.98L493 275.962l130.2 149.27 36.8-81.27 254.78 207.919 14.21 11.59Z","data-name":"Path 84"}),n.createElement("path",{d:"m302 282.962 26-57 36 83-31-60Z","data-name":"Path 85",opacity:.1}),n.createElement("path",{d:"M554.5 647.802q-14.97-.675-29.97-.67l-115.49-255.96Z","data-name":"Path 86",opacity:.1}),n.createElement("path",{d:"M464.411 315.191 493 292.962l130 150-132-128Z","data-name":"Path 87",opacity:.1}),n.createElement("path",{d:"M852.79 645.032a193.265 193.265 0 0 1-27.46 11.94L623.2 425.232Z","data-name":"Path 88",opacity:.1}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 11",transform:"translate(479 98.962)"}),n.createElement("circle",{cx:3,cy:3,r:3,fill:"#f2f2f2","data-name":"Ellipse 12",transform:"translate(396 201.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 13",transform:"translate(600 220.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 14",transform:"translate(180 265.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 15",transform:"translate(612 96.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 16",transform:"translate(736 192.962)"}),n.createElement("circle",{cx:2,cy:2,r:2,fill:"#f2f2f2","data-name":"Ellipse 17",transform:"translate(858 344.962)"}),n.createElement("path",{fill:"#f2f2f2",d:"M306 121.222h-2.76v-2.76h-1.48v2.76H299v1.478h2.76v2.759h1.48V122.7H306Z","data-name":"Path 89"}),n.createElement("path",{fill:"#f2f2f2",d:"M848 424.222h-2.76v-2.76h-1.48v2.76H841v1.478h2.76v2.759h1.48V425.7H848Z","data-name":"Path 90"}),n.createElement("path",{fill:"#3f3d56",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 91"}),n.createElement("path",{d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z","data-name":"Path 92",opacity:.1}),n.createElement("ellipse",{cx:544,cy:30,fill:"#3f3d56","data-name":"Ellipse 18",rx:544,ry:30,transform:"translate(0 583.962)"}),n.createElement("path",{fill:"#ff6584",d:"M568 571.962c0 33.137-14.775 24-33 24s-33 9.137-33-24 33-96 33-96 33 62.863 33 96Z","data-name":"Path 93"}),n.createElement("path",{d:"M550 584.641c0 15.062-6.716 10.909-15 10.909s-15 4.153-15-10.909 15-43.636 15-43.636 15 28.576 15 43.636Z","data-name":"Path 94",opacity:.1}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 97",rx:9,transform:"translate(489 604.962)"}),n.createElement("rect",{width:92,height:18,fill:"#2f2e41","data-name":"Rectangle 98",rx:9,transform:"translate(489 586.962)"}),n.createElement("path",{fill:"#3f3d56",d:"M137 490.528c0 55.343 34.719 100.126 77.626 100.126","data-name":"Path 95"}),n.createElement("path",{fill:"#6c63ff",d:"M214.626 590.654c0-55.965 38.745-101.251 86.626-101.251","data-name":"Path 96"}),n.createElement("path",{fill:"#6c63ff",d:"M165.125 495.545c0 52.57 22.14 95.109 49.5 95.109","data-name":"Path 97"}),n.createElement("path",{fill:"#3f3d56",d:"M214.626 590.654c0-71.511 44.783-129.377 100.126-129.377","data-name":"Path 98"}),n.createElement("path",{fill:"#a8a8a8",d:"M198.3 591.36s11.009-.339 14.326-2.7 16.934-5.183 17.757-1.395 16.544 18.844 4.115 18.945-28.879-1.936-32.19-3.953-4.008-10.897-4.008-10.897Z","data-name":"Path 99"}),n.createElement("path",{d:"M234.716 604.89c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7 8.879 4.009 10.9 19.761 4.053 32.19 3.953c3.588-.029 4.827-1.305 4.759-3.2-.498 1.142-1.867 1.855-4.537 1.877Z","data-name":"Path 100",opacity:.2}),n.createElement("path",{fill:"#3f3d56",d:"M721.429 527.062c0 38.029 23.857 68.8 53.341 68.8","data-name":"Path 101"}),n.createElement("path",{fill:"#6c63ff",d:"M774.769 595.863c0-38.456 26.623-69.575 59.525-69.575","data-name":"Path 102"}),n.createElement("path",{fill:"#6c63ff",d:"M740.755 530.509c0 36.124 15.213 65.354 34.014 65.354","data-name":"Path 103"}),n.createElement("path",{fill:"#3f3d56",d:"M774.769 595.863c0-49.139 30.773-88.9 68.8-88.9","data-name":"Path 104"}),n.createElement("path",{fill:"#a8a8a8",d:"M763.548 596.348s7.565-.233 9.844-1.856 11.636-3.562 12.2-.958 11.368 12.949 2.828 13.018-19.844-1.33-22.119-2.716-2.753-7.488-2.753-7.488Z","data-name":"Path 105"}),n.createElement("path",{d:"M788.574 605.645c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479 6.1 2.755 7.487 13.579 2.785 22.119 2.716c2.465-.02 3.317-.9 3.27-2.2-.343.788-1.283 1.278-3.118 1.293Z","data-name":"Path 106",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M893.813 618.699s11.36-1.729 14.5-4.591 16.89-7.488 18.217-3.667 19.494 17.447 6.633 19.107-30.153 1.609-33.835-.065-5.515-10.784-5.515-10.784Z","data-name":"Path 107"}),n.createElement("path",{d:"M933.228 628.154c-12.86 1.659-30.153 1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833 9.109 5.516 10.783 20.975 1.725 33.835.065c3.712-.479 4.836-1.956 4.529-3.906-.375 1.246-1.703 2.156-4.466 2.512Z","data-name":"Path 108",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M614.26 617.881s9.587-1.459 12.237-3.875 14.255-6.32 15.374-3.095 16.452 14.725 5.6 16.125-25.448 1.358-28.555-.055-4.656-9.1-4.656-9.1Z","data-name":"Path 109"}),n.createElement("path",{d:"M647.524 625.856c-10.853 1.4-25.448 1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547 7.687 4.655 9.1 17.7 1.456 28.555.055c3.133-.4 4.081-1.651 3.822-3.3-.314 1.057-1.435 1.825-3.767 2.125Z","data-name":"Path 110",opacity:.2}),n.createElement("path",{fill:"#a8a8a8",d:"M122.389 613.09s7.463-1.136 9.527-3.016 11.1-4.92 11.969-2.409 12.808 11.463 4.358 12.553-19.811 1.057-22.23-.043-3.624-7.085-3.624-7.085Z","data-name":"Path 111"}),n.createElement("path",{d:"M148.285 619.302c-8.449 1.09-19.811 1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2 5.984 3.624 7.085 13.781 1.133 22.23.043c2.439-.315 3.177-1.285 2.976-2.566-.246.818-1.119 1.416-2.934 1.65Z","data-name":"Path 112",opacity:.2}),n.createElement("path",{d:"M383.7 601.318c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.118-36.793 93.694-36.793 93.08 6.573 93.08 36.793Z","data-name":"Path 113",opacity:.1}),n.createElement("path",{fill:"#3f3d56",d:"M383.7 593.881c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.114-36.8 93.69-36.8 93.084 6.576 93.084 36.8Z","data-name":"Path 114"})))))}},5720:(e,t,a)=>{a.d(t,{Z:()=>B});var l,n,c,r,i,h,d,m,f,s,o,p,E,v,u,y,Z,g,M,P,x,b,w,O,q,N=a(7294);function S(){return S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},S.apply(this,arguments)}const B=e=>{let{title:t,titleId:a,...B}=e;return N.createElement("svg",S({xmlns:"http://www.w3.org/2000/svg",width:1129,height:663,viewBox:"0 0 1129 663","aria-labelledby":a},B),void 0===t?N.createElement("title",{id:a},"Focus on What Matters"):t?N.createElement("title",{id:a},t):null,l||(l=N.createElement("circle",{cx:321,cy:321,r:321,fill:"#f2f2f2"})),n||(n=N.createElement("ellipse",{cx:559,cy:635.5,fill:"#3f3d56",rx:514,ry:27.5})),c||(c=N.createElement("ellipse",{cx:558,cy:627,opacity:.2,rx:460,ry:22})),r||(r=N.createElement("path",{fill:"#3f3d56",d:"M131 152.5h840v50H131z"})),i||(i=N.createElement("path",{fill:"#3f3d56",d:"M131 606.8c0 5.8 2.3 11.3 6.4 15.3 4 4.1 9.5 6.4 15.3 6.4h796.6c5.8 0 11.3-2.3 15.3-6.4 4.1-4 6.4-9.5 6.4-15.3V175.5H131Z"})),h||(h=N.createElement("path",{fill:"#3f3d56",d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z"})),d||(d=N.createElement("path",{d:"M949.3 117.5H152.7a21.7 21.7 0 0 0-21.7 21.7v38.3h840v-38.3a21.7 21.7 0 0 0-21.7-21.7Z",opacity:.2})),m||(m=N.createElement("circle",{cx:181,cy:147.5,r:13,fill:"#3f3d56"})),f||(f=N.createElement("circle",{cx:217,cy:147.5,r:13,fill:"#3f3d56"})),s||(s=N.createElement("circle",{cx:253,cy:147.5,r:13,fill:"#3f3d56"})),o||(o=N.createElement("rect",{width:337,height:386,x:168,y:213.5,fill:"#606060",rx:5.3})),p||(p=N.createElement("rect",{width:284,height:22,x:603,y:272.5,fill:"#243B49",rx:5.5})),E||(E=N.createElement("rect",{width:416,height:15,x:537,y:351.5,fill:"#203D49",rx:5.5})),v||(v=N.createElement("rect",{width:416,height:15,x:537,y:396.5,fill:"#263C49",rx:5.5})),u||(u=N.createElement("rect",{width:416,height:15,x:537,y:440.5,fill:"#26394D",rx:5.5})),y||(y=N.createElement("rect",{width:416,height:15,x:537,y:484.5,fill:"#233A4D",rx:5.5})),Z||(Z=N.createElement("rect",{width:88,height:26,x:865,y:552.5,fill:"#213450",rx:7})),g||(g=N.createElement("path",{fill:"#3f3d56",d:"M1053.1 506.1a30.1 30.1 0 0 0 4-15.3c0-13.8-8.5-25-19.1-25s-19.1 11.2-19.1 25a30.1 30.1 0 0 0 4 15.3 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 31.2 31.2 0 0 0 0 30.5 30.1 30.1 0 0 0-4 15.3c0 13.8 8.5 25 19.1 25s19.1-11.2 19.1-25a30.1 30.1 0 0 0-4-15.3 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5 31.2 31.2 0 0 0 0-30.5Z"})),M||(M=N.createElement("ellipse",{cx:1038,cy:460.3,fill:"#3f3d56",rx:19.1,ry:25})),P||(P=N.createElement("ellipse",{cx:1038,cy:429.8,fill:"#3f3d56",rx:19.1,ry:25})),x||(x=N.createElement("path",{fill:"#3E77CC",fillRule:"evenodd",d:"M1110.4 220.8c2.6-3.3 5-6.8 7.1-10.5l-50.1-8.2 54.2.4c10.5-22.9 11.1-49.1 1.7-72.4l-72.8 37.7 67.1-49.3c-17.2-29.5-49.4-46.9-83.5-45.2-34 1.7-64.3 22.2-78.5 53.2-14.2 31.1-10 67.4 11 94.3-4.1 5.2-7.5 10.8-10.4 16.7l65.1 33.8-69.4-23.3c-9.9 29.2-4.4 61.5 14.7 85.8-29.5 37.5-25.2 91.3 9.8 123.6 35.1 32.4 89 32.4 124.1 0 35-32.3 39.3-86.1 9.8-123.6 26.1-33.2 26.1-79.8 0-113Z"})),b||(b=N.createElement("path",{d:"M946.2 277.4a91 91 0 0 0 19.6 56.5 91.4 91.4 0 1 0 143.7 0c12.2-15.6-163.3-66.8-163.3-56.5Z",opacity:.1})),w||(w=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),O||(O=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})),q||(q=N.createElement("rect",{fill:"#243B49",x:603,y:272.5,width:284,height:22,rx:5.5})))}},5402:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294);function n(e){var t,a,l="";if("string"==typeof e||"number"==typeof e)l+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(a=n(e[t]))&&(l&&(l+=" "),l+=a);else for(t in e)e[t]&&(l&&(l+=" "),l+=t);return l}const c=function(){for(var e,t,a=0,l="";a<arguments.length;)(e=arguments[a++])&&(t=n(e))&&(l&&(l+=" "),l+=t);return l};var r=a(9960),i=a(2263),h=a(7961),d=a(7462);const m={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var f=a(5999);const s=[{title:l.createElement(f.Z,null,"Easy to Use"),Svg:a(6081).Z,description:l.createElement(f.Z,null,"Zealot was designed from the ground up to be easily installed and running quickly.")},{title:l.createElement(f.Z,null,"Focus on What Matters"),Svg:a(5720).Z,description:l.createElement(f.Z,null,"Zealot lets you focus on your app, and we'll do the chores. Go ahead and upload your apps.")},{title:l.createElement(f.Z,null,"Open Source 100%"),Svg:a(5154).Z,description:l.createElement(f.Z,null,"Zealot is an open source project, Everyone could easy self hosted on own servers.")}];function o(e){let{Svg:t,title:a,description:n}=e;return l.createElement("div",{className:c("col col--4")},l.createElement("div",{className:"text--center"},l.createElement(t,{className:m.featureSvg,role:"img"})),l.createElement("div",{className:"text--center padding-horiz--md"},l.createElement("h3",null,a),l.createElement("p",null,n)))}function p(){return l.createElement("section",{className:m.features},l.createElement("div",{className:"container"},l.createElement("div",{className:"row"},s.map(((e,t)=>l.createElement(o,(0,d.Z)({key:t},e)))))))}const E={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function v(){const{siteConfig:e}=(0,i.Z)();return l.createElement("header",{className:c("hero hero--primary",E.heroBanner)},l.createElement("div",{className:"container"},l.createElement("h1",{className:"hero__title"},l.createElement(f.Z,{id:"homepage.header.title",description:"The title for homepage"},"Zealot")),l.createElement("p",{className:"hero__subtitle"},l.createElement(f.Z,{id:"homepage.header.subtitle",description:"The subtitle for homepage"},"Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.")),l.createElement("div",{className:E.buttons},l.createElement(r.Z,{className:"button button--secondary button--lg",to:"/docs/user-guide/"},l.createElement(f.Z,null,"Getting started")))))}function u(){const{siteConfig:e}=(0,i.Z)();return l.createElement(h.Z,{title:(0,f.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"}),description:(0,f.I)({message:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",description:"The homepage title message"})},l.createElement(v,null),l.createElement("main",null,l.createElement(p,null)))}}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/c704004d.e3a8d780.js b/zh-Hans/assets/js/c704004d.2a51d453.js similarity index 98% rename from zh-Hans/assets/js/c704004d.e3a8d780.js rename to zh-Hans/assets/js/c704004d.2a51d453.js index 1f6a7451f..bfd8fa007 100644 --- a/zh-Hans/assets/js/c704004d.e3a8d780.js +++ b/zh-Hans/assets/js/c704004d.2a51d453.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4156],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.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,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[u,s]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=u??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=s[n].value;a!==i&&(d(t),u(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},r.createElement(h,(0,a.Z)({},e,t)),r.createElement(g,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},4681:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},u="Zealot iOS SDK",s={unversionedId:"developer-guide/sdk/ios",id:"version-4.x/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/ios.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/zh-Hans/docs/4.x/category/sdks"},next:{title:"Android",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/android"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002"),(0,r.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://cocoapods.org"},"Cocoapods")," \u5b89\u88c5 Zealot \u9700\u8981\u628a\u5b83\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"\u4fdd\u5b58\u540e\u5f00\u59cb\u5b89\u88c5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u5728 AppDelegate \u6587\u4ef6\u5f15\u5165 Zealot \u6846\u67b6\u5934\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u63a5\u7740\u5728\u4e0a\u9762\u6587\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," \u65b9\u6cd5\u8ffd\u52a0\u542f\u52a8\u4ee3\u7801\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// \u5355\u4e2a\u6e20\u9053\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// \u5355\u4e2a\u6e20\u9053\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[4156],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.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,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,f=d["".concat(u,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),u=n(1980),s=n(7392),c=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[u,s]=f({queryString:n,groupId:a}),[d,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=u??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),s(e),b(e)}),[s,b,o]),tabValues:o}}var v=n(2389);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function h(e){let{className:t,block:n,selectedValue:i,selectValue:u,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=c.indexOf(t),a=s[n].value;a!==i&&(d(t),u(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",y.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function g(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function k(e){const t=b(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",y.tabList)},r.createElement(h,(0,a.Z)({},e,t)),r.createElement(g,(0,a.Z)({},e,t)))}function w(e){const t=(0,v.Z)();return r.createElement(k,(0,a.Z)({key:String(t)},e))}},4681:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"iOS"},u="Zealot iOS SDK",s={unversionedId:"developer-guide/sdk/ios",id:"version-4.x/developer-guide/sdk/ios",title:"Zealot iOS SDK",description:"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/ios.md",sourceDirName:"developer-guide/sdk",slug:"/developer-guide/sdk/ios",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/ios",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-4.x/developer-guide/sdk/ios.md",tags:[],version:"4.x",frontMatter:{sidebar_label:"iOS"},sidebar:"developerGuide",previous:{title:"SDKs",permalink:"/zh-Hans/docs/4.x/category/sdks"},next:{title:"Android",permalink:"/zh-Hans/docs/4.x/developer-guide/sdk/android"}},c={},d=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Cocoapods",id:"cocoapods",level:3},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2}],p={toc:d},m="wrapper";function f(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zealot-ios-sdk"},"Zealot iOS SDK"),(0,r.kt)("p",null,"iOS \u7ec4\u4ef6\u63d0\u4f9b\u4e3a Zealot \u68c0\u67e5\u65b0\u7248\u672c\u548c\u5b89\u88c5\u7684\u670d\u52a1\uff0c\u652f\u6301 Swift \u548c Objective-C\u3002"),(0,r.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,r.kt)("h3",{id:"cocoapods"},"Cocoapods"),(0,r.kt)("p",null,"\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://cocoapods.org"},"Cocoapods")," \u5b89\u88c5 Zealot \u9700\u8981\u628a\u5b83\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Podfile"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ruby"},"pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'\n")),(0,r.kt)("p",null,"\u4fdd\u5b58\u540e\u5f00\u59cb\u5b89\u88c5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pod install\n")),(0,r.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u5728 AppDelegate \u6587\u4ef6\u5f15\u5165 Zealot \u6846\u67b6\u5934\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},"import Zealot\n"))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},"#import <Zealot/Zealot-Swift.h>\n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"\u63a5\u7740\u5728\u4e0a\u9762\u6587\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"application:didFinishLaunchingWithOptions:")," \u65b9\u6cd5\u8ffd\u52a0\u542f\u52a8\u4ee3\u7801\uff1a")),(0,r.kt)(o.Z,{groupId:"ios-zealot-sdk",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"Swift",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-swift"},'// \u5355\u4e2a\u6e20\u9053\nlet zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")\nzealot.checkVersion()\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nlet zealot = Zealot(endpoint: "http://zealot.com",\n channelKeys: [\n "beta": "xxxxxxx",\n "test": "yyyyyyy"],\n default_enviroment: "beta")\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\nzealot.checkVersion()\n'))),(0,r.kt)(l.Z,{value:"Objective-C",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-objectivec"},'// \u5355\u4e2a\u6e20\u9053\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKey:@"..."];\n\n// \u591a\u4e2a\u6e20\u9053\uff0c\u6bd4\u5982\u6d4b\u8bd5\u7248\u672c\uff0c\u5185\u6d4b\u7248\u672c\nZealot *zealot = [[Zealot alloc] initWithEndpoint:@"http://zealot.com"\n channelKeys:@{\n @"beta": @"xxxxxxx",\n @"gray": @"yyyyyyy"\n }\n default_enviroment:@"beta"];\n\n// \u6700\u540e\u89e6\u53d1\u76d1\u6d4b\u65b9\u6cd5\n[zealot checkVersion];\n')))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/c941fb92.591d8b92.js b/zh-Hans/assets/js/c941fb92.52305bd6.js similarity index 99% rename from zh-Hans/assets/js/c941fb92.591d8b92.js rename to zh-Hans/assets/js/c941fb92.52305bd6.js index f15a4fc9b..814796710 100644 --- a/zh-Hans/assets/js/c941fb92.591d8b92.js +++ b/zh-Hans/assets/js/c941fb92.52305bd6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7551],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.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 a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=i(a),m=n,b=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return a?r.createElement(b,s(s({ref:t},c),{},{components:a})):r.createElement(b,s({ref:t},c))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,s=new Array(l);s[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,s[1]=o;for(var i=2;i<l;i++)s[i]=a[i];return r.createElement.apply(null,s)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},5162:(e,t,a)=>{a.d(t,{Z:()=>s});var r=a(7294),n=a(6010);const l={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return r.createElement("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,s),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>N});var r=a(7462),n=a(7294),l=a(6010),s=a(2466),o=a(6550),u=a(1980),i=a(7392),c=a(12);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:a}=e;const r=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u._X)(l),(0,n.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,i]=b({queryString:a,groupId:r}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(a);return[r,(0,n.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,n.useLayoutEffect)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),g(e)}),[i,g,l]),tabValues:l}}var v=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function k(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),r=i[a].value;r!==o&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,l.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function y(e){const t=g(e);return n.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},n.createElement(k,(0,r.Z)({},e,t)),n.createElement(f,(0,r.Z)({},e,t)))}function N(e){const t=(0,v.Z)();return n.createElement(y,(0,r.Z)({key:String(t)},e))}},3317:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=a(7462),n=(a(7294),a(3905)),l=a(4866),s=a(5162);const o={sidebar_label:"\u6e90\u4ee3\u7801"},u="\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",i={unversionedId:"contributing-guide/local-development/source-code",id:"contributing-guide/local-development/source-code",title:"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",description:"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/source-code.md",tags:[],version:"current",frontMatter:{sidebar_label:"\u6e90\u4ee3\u7801"},sidebar:"contributingGuide",previous:{title:"Dev Container (Docker)",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",level:2},{value:"macOS",id:"macos",level:3},{value:"\u5b89\u88c5 homebrew",id:"\u5b89\u88c5-homebrew",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis",level:4},{value:"yarn",id:"yarn",level:4},{value:"\u7591\u96be\u6742\u75c7",id:"\u7591\u96be\u6742\u75c7",level:4},{value:"M1 \u82af\u7247 MacOS \u95ee\u9898",id:"m1-\u82af\u7247-macos-\u95ee\u9898",level:5},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-2",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-2",level:4},{value:"yarn",id:"yarn-1",level:4},{value:"\u5b89\u88c5 Ruby",id:"\u5b89\u88c5-ruby",level:2},{value:"\u514b\u9686\u6e90\u4ee3\u7801",id:"\u514b\u9686\u6e90\u4ee3\u7801",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-2",level:3},{value:"\u521d\u59cb\u5316\u6570\u636e\u5e93",id:"\u521d\u59cb\u5316\u6570\u636e\u5e93",level:3},{value:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",level:3},{value:"\u8fd0\u884c Zealot \u670d\u52a1",id:"\u8fd0\u884c-zealot-\u670d\u52a1",level:3}],p={toc:d},m="wrapper";function b(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"\u6e90\u7801\u90e8\u7f72-zealot-\u6307\u5357"},"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357"),(0,n.kt)("p",null,"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002"),(0,n.kt)("h2",{id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883"},"\u51c6\u5907\u90e8\u7f72\u73af\u5883"),(0,n.kt)("h3",{id:"macos"},"macOS"),(0,n.kt)("h4",{id:"\u5b89\u88c5-homebrew"},"\u5b89\u88c5 homebrew"),(0,n.kt)("p",null,"\u9996\u5148\u9700\u8981\u5b89\u88c5 Xcode Command tools:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,n.kt)("p",null,"\u5982\u679c\u63d0\u793a\u5b89\u88c5\u5931\u8d25\uff0c\u9700\u8981\u4ece ",(0,n.kt)("a",{parentName:"p",href:"https://developer.apple.com/downloads"},"https://developer.apple.com/downloads")," \u4e0b\u8f7d\u5b89\u88c5\u3002"),(0,n.kt)("p",null,"\u4e4b\u540e\u5b89\u88c5 macOS \u7684\u5305\u7ba1\u7406\u5de5\u5177 Homebrew"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("p",null,"\u4e4b\u540e\u5f00\u59cb\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,n.kt)("p",null,"M1 \u7528\u6237\u9700\u8981\u8bbe\u7f6e\u4f9d\u8d56\u7f16\u8bd1\u8def\u5f84\u5230 SHELL \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"export CPATH=/opt/homebrew/include/\nexport LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6743\u9650\u8fc7\u9ad8\u53ef\u4ee5\u53ea\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("p",null,"\u8fd0\u884c\u8d77\u6765\u540e\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")),(0,n.kt)("h4",{id:"\u7591\u96be\u6742\u75c7"},"\u7591\u96be\u6742\u75c7"),(0,n.kt)("h5",{id:"m1-\u82af\u7247-macos-\u95ee\u9898"},"M1 \u82af\u7247 MacOS \u95ee\u9898"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o\n")),(0,n.kt)("p",null,"\u4f7f\u7528 ",(0,n.kt)("inlineCode",{parentName:"p"},"bundle install")," \u4f1a\u9047\u5230\u5982\u4e0a\u95ee\u9898\u8fd9\u4e2a\u662f\u56e0\u4e3a homebrew \u5b89\u88c5 webp \u4f9d\u8d56\u4e4b\u540e\u7f16\u8bd1\u8def\u5f84\u65e0\u6cd5\u88ab\u627e\u5230\uff0c\u4e0a\u9762\u6709\u89e3\u51b3\u529e\u6cd5\u3002"),(0,n.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-1"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-1"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"node"},"node"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,n.kt)("p",null,"\u5982\u679c\u662f\u5728 ",(0,n.kt)("inlineCode",{parentName:"p"},"arm")," \u67b6\u6784\u5b89\u88c5\u8fd8\u9700\u8981\u989d\u5916\u5b89\u88c5 ",(0,n.kt)("inlineCode",{parentName:"p"},"gcompat"),' glib \u517c\u5bb9\u5c42\uff0c\u5426\u5219\u4f1a\u62a5 "',(0,n.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'" \u5f02\u5e38\u9519\u8bef\u3002'),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-2"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-2"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6570\u636e\u5e93\u7528\u6237\u6743\u9650\uff0c\u53ef\u4ec5\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn-1"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h2",{id:"\u5b89\u88c5-ruby"},"\u5b89\u88c5 Ruby"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7 asdf\u3001rvm \u4efb\u610f\u4e00\u79cd\u65b9\u5f0f\u5b89\u88c5\u3002"),(0,n.kt)(l.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,n.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,n.kt)("p",null,"\u4e00\u4e2a\u652f\u6301\u4e3b\u6d41\u5f00\u53d1\u8bed\u8a00\u7248\u672c\u5207\u6362\u7684\u5de5\u5177\uff0c\u8bf7\u6309\u7167",(0,n.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"\u5b98\u65b9\u5b89\u88c5\u6559\u7a0b"),"\u597d\u4e4b\u540e\u5b89\u88c5 ruby\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# \u5f00\u542f Ruby 3.2.0 YJIT \u65b0\u7279\u6027\u9700\u8981\u5b89\u88c5 rust 1.58+\n# \u53ef\u9009\u5b89\u88c5:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# \u5fc5\u987b\u5b89\u88c5\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,n.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,n.kt)("p",null,"\u5982\u4e0b\u547d\u4ee4\u662f\u5148\u5b89\u88c5 rvm \u5230\u5f53\u524d\u7cfb\u7edf\u7684\u7528\u6237\u540e\u5b89\u88c5 Ruby 3.0 \u7248\u672c\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,n.kt)("h2",{id:"\u514b\u9686\u6e90\u4ee3\u7801"},"\u514b\u9686\u6e90\u4ee3\u7801"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,n.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,n.kt)("p",null,"\u4ee5\u4e0b\u6b65\u9aa4\u5747\u9700\u8981\u5728 zealot \u6839\u76ee\u5f55\u6267\u884c\u3002"),(0,n.kt)("h3",{id:"bundler"},"bundler"),(0,n.kt)("p",null,"\u5b89\u88c5 Ruby gems \u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,n.kt)("h3",{id:"yarn-2"},"yarn"),(0,n.kt)("p",null,"\u5b89\u88c5\u524d\u7aef\u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u6570\u636e\u5e93"},"\u521d\u59cb\u5316\u6570\u636e\u5e93"),(0,n.kt)("p",null,"\u786e\u4fdd\u8fde\u63a5\u6570\u636e\u5e93\u4fe1\u606f\u6ca1\u6709\u95ee\u9898\uff0c\u540e\u5c06\u4f1a\u521b\u5efa\u6570\u636e\u5e93\u8868\u5e76\u521b\u5efa\u8868\u7ed3\u6784"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,n.kt)("p",null,"\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570\u53ef\u901a\u8fc7",(0,n.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"\u73af\u5883\u53d8\u91cf"),"\u6216\u66f4\u6539 ",(0,n.kt)("inlineCode",{parentName:"p"},"config/database.yml")," \u6587\u4ef6\u3002"),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"},"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"),(0,n.kt)("p",null,"\u521d\u59cb\u5316\u7ba1\u7406\u5458\u8d26\u53f7\u548c\u5e94\u7528\u6837\u4f8b"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,n.kt)("h3",{id:"\u8fd0\u884c-zealot-\u670d\u52a1"},"\u8fd0\u884c Zealot \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,n.kt)("p",null,"\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}b.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[7551],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.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 a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=i(a),m=n,b=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return a?r.createElement(b,s(s({ref:t},c),{},{components:a})):r.createElement(b,s({ref:t},c))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,s=new Array(l);s[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,s[1]=o;for(var i=2;i<l;i++)s[i]=a[i];return r.createElement.apply(null,s)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},5162:(e,t,a)=>{a.d(t,{Z:()=>s});var r=a(7294),n=a(4334);const l={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return r.createElement("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,s),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>N});var r=a(7462),n=a(7294),l=a(4334),s=a(2466),o=a(6550),u=a(1980),i=a(7392),c=a(12);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:a}=e;const r=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u._X)(l),(0,n.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,i]=b({queryString:a,groupId:r}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(a);return[r,(0,n.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,n.useLayoutEffect)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),g(e)}),[i,g,l]),tabValues:l}}var v=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function k(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),r=i[a].value;r!==o&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,l.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function y(e){const t=g(e);return n.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},n.createElement(k,(0,r.Z)({},e,t)),n.createElement(f,(0,r.Z)({},e,t)))}function N(e){const t=(0,v.Z)();return n.createElement(y,(0,r.Z)({key:String(t)},e))}},3317:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=a(7462),n=(a(7294),a(3905)),l=a(4866),s=a(5162);const o={sidebar_label:"\u6e90\u4ee3\u7801"},u="\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",i={unversionedId:"contributing-guide/local-development/source-code",id:"contributing-guide/local-development/source-code",title:"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",description:"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/source-code.md",tags:[],version:"current",frontMatter:{sidebar_label:"\u6e90\u4ee3\u7801"},sidebar:"contributingGuide",previous:{title:"Dev Container (Docker)",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",level:2},{value:"macOS",id:"macos",level:3},{value:"\u5b89\u88c5 homebrew",id:"\u5b89\u88c5-homebrew",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis",level:4},{value:"yarn",id:"yarn",level:4},{value:"\u7591\u96be\u6742\u75c7",id:"\u7591\u96be\u6742\u75c7",level:4},{value:"M1 \u82af\u7247 MacOS \u95ee\u9898",id:"m1-\u82af\u7247-macos-\u95ee\u9898",level:5},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-2",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-2",level:4},{value:"yarn",id:"yarn-1",level:4},{value:"\u5b89\u88c5 Ruby",id:"\u5b89\u88c5-ruby",level:2},{value:"\u514b\u9686\u6e90\u4ee3\u7801",id:"\u514b\u9686\u6e90\u4ee3\u7801",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-2",level:3},{value:"\u521d\u59cb\u5316\u6570\u636e\u5e93",id:"\u521d\u59cb\u5316\u6570\u636e\u5e93",level:3},{value:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",level:3},{value:"\u8fd0\u884c Zealot \u670d\u52a1",id:"\u8fd0\u884c-zealot-\u670d\u52a1",level:3}],p={toc:d},m="wrapper";function b(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"\u6e90\u7801\u90e8\u7f72-zealot-\u6307\u5357"},"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357"),(0,n.kt)("p",null,"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002"),(0,n.kt)("h2",{id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883"},"\u51c6\u5907\u90e8\u7f72\u73af\u5883"),(0,n.kt)("h3",{id:"macos"},"macOS"),(0,n.kt)("h4",{id:"\u5b89\u88c5-homebrew"},"\u5b89\u88c5 homebrew"),(0,n.kt)("p",null,"\u9996\u5148\u9700\u8981\u5b89\u88c5 Xcode Command tools:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,n.kt)("p",null,"\u5982\u679c\u63d0\u793a\u5b89\u88c5\u5931\u8d25\uff0c\u9700\u8981\u4ece ",(0,n.kt)("a",{parentName:"p",href:"https://developer.apple.com/downloads"},"https://developer.apple.com/downloads")," \u4e0b\u8f7d\u5b89\u88c5\u3002"),(0,n.kt)("p",null,"\u4e4b\u540e\u5b89\u88c5 macOS \u7684\u5305\u7ba1\u7406\u5de5\u5177 Homebrew"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("p",null,"\u4e4b\u540e\u5f00\u59cb\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,n.kt)("p",null,"M1 \u7528\u6237\u9700\u8981\u8bbe\u7f6e\u4f9d\u8d56\u7f16\u8bd1\u8def\u5f84\u5230 SHELL \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"export CPATH=/opt/homebrew/include/\nexport LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6743\u9650\u8fc7\u9ad8\u53ef\u4ee5\u53ea\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("p",null,"\u8fd0\u884c\u8d77\u6765\u540e\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")),(0,n.kt)("h4",{id:"\u7591\u96be\u6742\u75c7"},"\u7591\u96be\u6742\u75c7"),(0,n.kt)("h5",{id:"m1-\u82af\u7247-macos-\u95ee\u9898"},"M1 \u82af\u7247 MacOS \u95ee\u9898"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o\n")),(0,n.kt)("p",null,"\u4f7f\u7528 ",(0,n.kt)("inlineCode",{parentName:"p"},"bundle install")," \u4f1a\u9047\u5230\u5982\u4e0a\u95ee\u9898\u8fd9\u4e2a\u662f\u56e0\u4e3a homebrew \u5b89\u88c5 webp \u4f9d\u8d56\u4e4b\u540e\u7f16\u8bd1\u8def\u5f84\u65e0\u6cd5\u88ab\u627e\u5230\uff0c\u4e0a\u9762\u6709\u89e3\u51b3\u529e\u6cd5\u3002"),(0,n.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-1"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-1"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"node"},"node"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,n.kt)("p",null,"\u5982\u679c\u662f\u5728 ",(0,n.kt)("inlineCode",{parentName:"p"},"arm")," \u67b6\u6784\u5b89\u88c5\u8fd8\u9700\u8981\u989d\u5916\u5b89\u88c5 ",(0,n.kt)("inlineCode",{parentName:"p"},"gcompat"),' glib \u517c\u5bb9\u5c42\uff0c\u5426\u5219\u4f1a\u62a5 "',(0,n.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'" \u5f02\u5e38\u9519\u8bef\u3002'),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-2"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-2"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6570\u636e\u5e93\u7528\u6237\u6743\u9650\uff0c\u53ef\u4ec5\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn-1"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h2",{id:"\u5b89\u88c5-ruby"},"\u5b89\u88c5 Ruby"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7 asdf\u3001rvm \u4efb\u610f\u4e00\u79cd\u65b9\u5f0f\u5b89\u88c5\u3002"),(0,n.kt)(l.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,n.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,n.kt)("p",null,"\u4e00\u4e2a\u652f\u6301\u4e3b\u6d41\u5f00\u53d1\u8bed\u8a00\u7248\u672c\u5207\u6362\u7684\u5de5\u5177\uff0c\u8bf7\u6309\u7167",(0,n.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"\u5b98\u65b9\u5b89\u88c5\u6559\u7a0b"),"\u597d\u4e4b\u540e\u5b89\u88c5 ruby\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# \u5f00\u542f Ruby 3.2.0 YJIT \u65b0\u7279\u6027\u9700\u8981\u5b89\u88c5 rust 1.58+\n# \u53ef\u9009\u5b89\u88c5:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# \u5fc5\u987b\u5b89\u88c5\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,n.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,n.kt)("p",null,"\u5982\u4e0b\u547d\u4ee4\u662f\u5148\u5b89\u88c5 rvm \u5230\u5f53\u524d\u7cfb\u7edf\u7684\u7528\u6237\u540e\u5b89\u88c5 Ruby 3.0 \u7248\u672c\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,n.kt)("h2",{id:"\u514b\u9686\u6e90\u4ee3\u7801"},"\u514b\u9686\u6e90\u4ee3\u7801"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,n.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,n.kt)("p",null,"\u4ee5\u4e0b\u6b65\u9aa4\u5747\u9700\u8981\u5728 zealot \u6839\u76ee\u5f55\u6267\u884c\u3002"),(0,n.kt)("h3",{id:"bundler"},"bundler"),(0,n.kt)("p",null,"\u5b89\u88c5 Ruby gems \u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,n.kt)("h3",{id:"yarn-2"},"yarn"),(0,n.kt)("p",null,"\u5b89\u88c5\u524d\u7aef\u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u6570\u636e\u5e93"},"\u521d\u59cb\u5316\u6570\u636e\u5e93"),(0,n.kt)("p",null,"\u786e\u4fdd\u8fde\u63a5\u6570\u636e\u5e93\u4fe1\u606f\u6ca1\u6709\u95ee\u9898\uff0c\u540e\u5c06\u4f1a\u521b\u5efa\u6570\u636e\u5e93\u8868\u5e76\u521b\u5efa\u8868\u7ed3\u6784"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,n.kt)("p",null,"\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570\u53ef\u901a\u8fc7",(0,n.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"\u73af\u5883\u53d8\u91cf"),"\u6216\u66f4\u6539 ",(0,n.kt)("inlineCode",{parentName:"p"},"config/database.yml")," \u6587\u4ef6\u3002"),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"},"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"),(0,n.kt)("p",null,"\u521d\u59cb\u5316\u7ba1\u7406\u5458\u8d26\u53f7\u548c\u5e94\u7528\u6837\u4f8b"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,n.kt)("h3",{id:"\u8fd0\u884c-zealot-\u670d\u52a1"},"\u8fd0\u884c Zealot \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,n.kt)("p",null,"\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/cbffe0ba.a159fa65.js b/zh-Hans/assets/js/cbffe0ba.3d7e9944.js similarity index 99% rename from zh-Hans/assets/js/cbffe0ba.a159fa65.js rename to zh-Hans/assets/js/cbffe0ba.3d7e9944.js index 0a9170617..d01e2a858 100644 --- a/zh-Hans/assets/js/cbffe0ba.a159fa65.js +++ b/zh-Hans/assets/js/cbffe0ba.3d7e9944.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[594],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.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 a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=i(a),m=n,b=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return a?r.createElement(b,s(s({ref:t},c),{},{components:a})):r.createElement(b,s({ref:t},c))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,s=new Array(l);s[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,s[1]=o;for(var i=2;i<l;i++)s[i]=a[i];return r.createElement.apply(null,s)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},5162:(e,t,a)=>{a.d(t,{Z:()=>s});var r=a(7294),n=a(6010);const l={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return r.createElement("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,s),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>N});var r=a(7462),n=a(7294),l=a(6010),s=a(2466),o=a(6550),u=a(1980),i=a(7392),c=a(12);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:a}=e;const r=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u._X)(l),(0,n.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,i]=b({queryString:a,groupId:r}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(a);return[r,(0,n.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,n.useLayoutEffect)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),g(e)}),[i,g,l]),tabValues:l}}var v=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function k(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),r=i[a].value;r!==o&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,l.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function y(e){const t=g(e);return n.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},n.createElement(k,(0,r.Z)({},e,t)),n.createElement(f,(0,r.Z)({},e,t)))}function N(e){const t=(0,v.Z)();return n.createElement(y,(0,r.Z)({key:String(t)},e))}},5517:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=a(7462),n=(a(7294),a(3905)),l=a(4866),s=a(5162);const o={sidebar_label:"\u6e90\u4ee3\u7801"},u="\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",i={unversionedId:"contributing-guide/local-development/source-code",id:"version-5.0.0/contributing-guide/local-development/source-code",title:"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",description:"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/zh-Hans/docs/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"\u6e90\u4ee3\u7801"},sidebar:"contributingGuide",previous:{title:"Dev Container (Docker)",permalink:"/zh-Hans/docs/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",level:2},{value:"macOS",id:"macos",level:3},{value:"\u5b89\u88c5 homebrew",id:"\u5b89\u88c5-homebrew",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis",level:4},{value:"yarn",id:"yarn",level:4},{value:"\u7591\u96be\u6742\u75c7",id:"\u7591\u96be\u6742\u75c7",level:4},{value:"M1 \u82af\u7247 MacOS \u95ee\u9898",id:"m1-\u82af\u7247-macos-\u95ee\u9898",level:5},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-2",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-2",level:4},{value:"yarn",id:"yarn-1",level:4},{value:"\u5b89\u88c5 Ruby",id:"\u5b89\u88c5-ruby",level:2},{value:"\u514b\u9686\u6e90\u4ee3\u7801",id:"\u514b\u9686\u6e90\u4ee3\u7801",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-2",level:3},{value:"\u521d\u59cb\u5316\u6570\u636e\u5e93",id:"\u521d\u59cb\u5316\u6570\u636e\u5e93",level:3},{value:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",level:3},{value:"\u8fd0\u884c Zealot \u670d\u52a1",id:"\u8fd0\u884c-zealot-\u670d\u52a1",level:3}],p={toc:d},m="wrapper";function b(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"\u6e90\u7801\u90e8\u7f72-zealot-\u6307\u5357"},"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357"),(0,n.kt)("p",null,"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002"),(0,n.kt)("h2",{id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883"},"\u51c6\u5907\u90e8\u7f72\u73af\u5883"),(0,n.kt)("h3",{id:"macos"},"macOS"),(0,n.kt)("h4",{id:"\u5b89\u88c5-homebrew"},"\u5b89\u88c5 homebrew"),(0,n.kt)("p",null,"\u9996\u5148\u9700\u8981\u5b89\u88c5 Xcode Command tools:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,n.kt)("p",null,"\u5982\u679c\u63d0\u793a\u5b89\u88c5\u5931\u8d25\uff0c\u9700\u8981\u4ece ",(0,n.kt)("a",{parentName:"p",href:"https://developer.apple.com/downloads"},"https://developer.apple.com/downloads")," \u4e0b\u8f7d\u5b89\u88c5\u3002"),(0,n.kt)("p",null,"\u4e4b\u540e\u5b89\u88c5 macOS \u7684\u5305\u7ba1\u7406\u5de5\u5177 Homebrew"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("p",null,"\u4e4b\u540e\u5f00\u59cb\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,n.kt)("p",null,"M1 \u7528\u6237\u9700\u8981\u8bbe\u7f6e\u4f9d\u8d56\u7f16\u8bd1\u8def\u5f84\u5230 SHELL \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"export CPATH=/opt/homebrew/include/\nexport LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6743\u9650\u8fc7\u9ad8\u53ef\u4ee5\u53ea\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("p",null,"\u8fd0\u884c\u8d77\u6765\u540e\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")),(0,n.kt)("h4",{id:"\u7591\u96be\u6742\u75c7"},"\u7591\u96be\u6742\u75c7"),(0,n.kt)("h5",{id:"m1-\u82af\u7247-macos-\u95ee\u9898"},"M1 \u82af\u7247 MacOS \u95ee\u9898"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o\n")),(0,n.kt)("p",null,"\u4f7f\u7528 ",(0,n.kt)("inlineCode",{parentName:"p"},"bundle install")," \u4f1a\u9047\u5230\u5982\u4e0a\u95ee\u9898\u8fd9\u4e2a\u662f\u56e0\u4e3a homebrew \u5b89\u88c5 webp \u4f9d\u8d56\u4e4b\u540e\u7f16\u8bd1\u8def\u5f84\u65e0\u6cd5\u88ab\u627e\u5230\uff0c\u4e0a\u9762\u6709\u89e3\u51b3\u529e\u6cd5\u3002"),(0,n.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-1"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-1"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"node"},"node"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,n.kt)("p",null,"\u5982\u679c\u662f\u5728 ",(0,n.kt)("inlineCode",{parentName:"p"},"arm")," \u67b6\u6784\u5b89\u88c5\u8fd8\u9700\u8981\u989d\u5916\u5b89\u88c5 ",(0,n.kt)("inlineCode",{parentName:"p"},"gcompat"),' glib \u517c\u5bb9\u5c42\uff0c\u5426\u5219\u4f1a\u62a5 "',(0,n.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'" \u5f02\u5e38\u9519\u8bef\u3002'),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-2"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-2"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6570\u636e\u5e93\u7528\u6237\u6743\u9650\uff0c\u53ef\u4ec5\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn-1"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h2",{id:"\u5b89\u88c5-ruby"},"\u5b89\u88c5 Ruby"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7 asdf\u3001rvm \u4efb\u610f\u4e00\u79cd\u65b9\u5f0f\u5b89\u88c5\u3002"),(0,n.kt)(l.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,n.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,n.kt)("p",null,"\u4e00\u4e2a\u652f\u6301\u4e3b\u6d41\u5f00\u53d1\u8bed\u8a00\u7248\u672c\u5207\u6362\u7684\u5de5\u5177\uff0c\u8bf7\u6309\u7167",(0,n.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"\u5b98\u65b9\u5b89\u88c5\u6559\u7a0b"),"\u597d\u4e4b\u540e\u5b89\u88c5 ruby\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# \u5f00\u542f Ruby 3.2.0 YJIT \u65b0\u7279\u6027\u9700\u8981\u5b89\u88c5 rust 1.58+\n# \u53ef\u9009\u5b89\u88c5:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# \u5fc5\u987b\u5b89\u88c5\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,n.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,n.kt)("p",null,"\u5982\u4e0b\u547d\u4ee4\u662f\u5148\u5b89\u88c5 rvm \u5230\u5f53\u524d\u7cfb\u7edf\u7684\u7528\u6237\u540e\u5b89\u88c5 Ruby 3.0 \u7248\u672c\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,n.kt)("h2",{id:"\u514b\u9686\u6e90\u4ee3\u7801"},"\u514b\u9686\u6e90\u4ee3\u7801"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,n.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,n.kt)("p",null,"\u4ee5\u4e0b\u6b65\u9aa4\u5747\u9700\u8981\u5728 zealot \u6839\u76ee\u5f55\u6267\u884c\u3002"),(0,n.kt)("h3",{id:"bundler"},"bundler"),(0,n.kt)("p",null,"\u5b89\u88c5 Ruby gems \u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,n.kt)("h3",{id:"yarn-2"},"yarn"),(0,n.kt)("p",null,"\u5b89\u88c5\u524d\u7aef\u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u6570\u636e\u5e93"},"\u521d\u59cb\u5316\u6570\u636e\u5e93"),(0,n.kt)("p",null,"\u786e\u4fdd\u8fde\u63a5\u6570\u636e\u5e93\u4fe1\u606f\u6ca1\u6709\u95ee\u9898\uff0c\u540e\u5c06\u4f1a\u521b\u5efa\u6570\u636e\u5e93\u8868\u5e76\u521b\u5efa\u8868\u7ed3\u6784"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,n.kt)("p",null,"\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570\u53ef\u901a\u8fc7",(0,n.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"\u73af\u5883\u53d8\u91cf"),"\u6216\u66f4\u6539 ",(0,n.kt)("inlineCode",{parentName:"p"},"config/database.yml")," \u6587\u4ef6\u3002"),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"},"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"),(0,n.kt)("p",null,"\u521d\u59cb\u5316\u7ba1\u7406\u5458\u8d26\u53f7\u548c\u5e94\u7528\u6837\u4f8b"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,n.kt)("h3",{id:"\u8fd0\u884c-zealot-\u670d\u52a1"},"\u8fd0\u884c Zealot \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,n.kt)("p",null,"\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}b.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[594],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.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 a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=i(a),m=n,b=d["".concat(u,".").concat(m)]||d[m]||p[m]||l;return a?r.createElement(b,s(s({ref:t},c),{},{components:a})):r.createElement(b,s({ref:t},c))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,s=new Array(l);s[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,s[1]=o;for(var i=2;i<l;i++)s[i]=a[i];return r.createElement.apply(null,s)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},5162:(e,t,a)=>{a.d(t,{Z:()=>s});var r=a(7294),n=a(4334);const l={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return r.createElement("div",{role:"tabpanel",className:(0,n.Z)(l.tabItem,s),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>N});var r=a(7462),n=a(7294),l=a(4334),s=a(2466),o=a(6550),u=a(1980),i=a(7392),c=a(12);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:r,default:n}}=e;return{value:t,label:a,attributes:r,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:a}=e;const r=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u._X)(l),(0,n.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=a.find((e=>e.default))??a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,i]=b({queryString:a,groupId:r}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,c.Nk)(a);return[r,(0,n.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),v=(()=>{const e=u??d;return m({value:e,tabValues:l})?e:null})();(0,n.useLayoutEffect)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),g(e)}),[i,g,l]),tabValues:l}}var v=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function k(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.o5)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),r=i[a].value;r!==o&&(d(t),u(r))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,l.Z)("tabs__item",h.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function y(e){const t=g(e);return n.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},n.createElement(k,(0,r.Z)({},e,t)),n.createElement(f,(0,r.Z)({},e,t)))}function N(e){const t=(0,v.Z)();return n.createElement(y,(0,r.Z)({key:String(t)},e))}},5517:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=a(7462),n=(a(7294),a(3905)),l=a(4866),s=a(5162);const o={sidebar_label:"\u6e90\u4ee3\u7801"},u="\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",i={unversionedId:"contributing-guide/local-development/source-code",id:"version-5.0.0/contributing-guide/local-development/source-code",title:"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357",description:"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/source-code.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/source-code",permalink:"/zh-Hans/docs/contributing-guide/local-development/source-code",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/versioned_docs/version-5.0.0/contributing-guide/local-development/source-code.md",tags:[],version:"5.0.0",frontMatter:{sidebar_label:"\u6e90\u4ee3\u7801"},sidebar:"contributingGuide",previous:{title:"Dev Container (Docker)",permalink:"/zh-Hans/docs/contributing-guide/local-development/devcontainer"}},c={},d=[{value:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883",level:2},{value:"macOS",id:"macos",level:3},{value:"\u5b89\u88c5 homebrew",id:"\u5b89\u88c5-homebrew",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis",level:4},{value:"yarn",id:"yarn",level:4},{value:"\u7591\u96be\u6742\u75c7",id:"\u7591\u96be\u6742\u75c7",level:4},{value:"M1 \u82af\u7247 MacOS \u95ee\u9898",id:"m1-\u82af\u7247-macos-\u95ee\u9898",level:5},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-1",level:4},{value:"node",id:"node",level:4},{value:"Alpine Linux",id:"alpine-linux",level:3},{value:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56",id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1",level:4},{value:"\u5b89\u88c5\u4f9d\u8d56",id:"\u5b89\u88c5\u4f9d\u8d56-2",level:4},{value:"\u914d\u7f6e Postgres \u548c Redis",id:"\u914d\u7f6e-postgres-\u548c-redis-2",level:4},{value:"yarn",id:"yarn-1",level:4},{value:"\u5b89\u88c5 Ruby",id:"\u5b89\u88c5-ruby",level:2},{value:"\u514b\u9686\u6e90\u4ee3\u7801",id:"\u514b\u9686\u6e90\u4ee3\u7801",level:2},{value:"\u521d\u59cb\u5316",id:"\u521d\u59cb\u5316",level:2},{value:"bundler",id:"bundler",level:3},{value:"yarn",id:"yarn-2",level:3},{value:"\u521d\u59cb\u5316\u6570\u636e\u5e93",id:"\u521d\u59cb\u5316\u6570\u636e\u5e93",level:3},{value:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e",level:3},{value:"\u8fd0\u884c Zealot \u670d\u52a1",id:"\u8fd0\u884c-zealot-\u670d\u52a1",level:3}],p={toc:d},m="wrapper";function b(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"\u6e90\u7801\u90e8\u7f72-zealot-\u6307\u5357"},"\u6e90\u7801\u90e8\u7f72 Zealot \u6307\u5357"),(0,n.kt)("p",null,"\u5982\u4e0b\u6574\u7406\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684\u672c\u5730\u90e8\u7f72\u5f00\u53d1\u6559\u7a0b\u3002"),(0,n.kt)("h2",{id:"\u51c6\u5907\u90e8\u7f72\u73af\u5883"},"\u51c6\u5907\u90e8\u7f72\u73af\u5883"),(0,n.kt)("h3",{id:"macos"},"macOS"),(0,n.kt)("h4",{id:"\u5b89\u88c5-homebrew"},"\u5b89\u88c5 homebrew"),(0,n.kt)("p",null,"\u9996\u5148\u9700\u8981\u5b89\u88c5 Xcode Command tools:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ xcode-select --install\n")),(0,n.kt)("p",null,"\u5982\u679c\u63d0\u793a\u5b89\u88c5\u5931\u8d25\uff0c\u9700\u8981\u4ece ",(0,n.kt)("a",{parentName:"p",href:"https://developer.apple.com/downloads"},"https://developer.apple.com/downloads")," \u4e0b\u8f7d\u5b89\u88c5\u3002"),(0,n.kt)("p",null,"\u4e4b\u540e\u5b89\u88c5 macOS \u7684\u5305\u7ba1\u7406\u5de5\u5177 Homebrew"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"\n')),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("p",null,"\u4e4b\u540e\u5f00\u59cb\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew install redis postgresql webp imagemagick node git\n")),(0,n.kt)("p",null,"M1 \u7528\u6237\u9700\u8981\u8bbe\u7f6e\u4f9d\u8d56\u7f16\u8bd1\u8def\u5f84\u5230 SHELL \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"export CPATH=/opt/homebrew/include/\nexport LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ brew services start postgresql\n$ brew services start redis\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6743\u9650\u8fc7\u9ad8\u53ef\u4ee5\u53ea\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("p",null,"\u8fd0\u884c\u8d77\u6765\u540e\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")),(0,n.kt)("h4",{id:"\u7591\u96be\u6742\u75c7"},"\u7591\u96be\u6742\u75c7"),(0,n.kt)("h5",{id:"m1-\u82af\u7247-macos-\u95ee\u9898"},"M1 \u82af\u7247 MacOS \u95ee\u9898"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o\n")),(0,n.kt)("p",null,"\u4f7f\u7528 ",(0,n.kt)("inlineCode",{parentName:"p"},"bundle install")," \u4f1a\u9047\u5230\u5982\u4e0a\u95ee\u9898\u8fd9\u4e2a\u662f\u56e0\u4e3a homebrew \u5b89\u88c5 webp \u4f9d\u8d56\u4e4b\u540e\u7f16\u8bd1\u8def\u5f84\u65e0\u6cd5\u88ab\u627e\u5230\uff0c\u4e0a\u9762\u6709\u89e3\u51b3\u529e\u6cd5\u3002"),(0,n.kt)("h3",{id:"debian-ubuntu"},"Debian (Ubuntu)"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt update\n$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev\n")),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-1"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apt install -y redis postgresql-client node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-1"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ systemctl postgres start\n$ systemctl redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# If you are worried about the high privilege, you can only enable the create database privilege\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"node"},"node"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h3",{id:"alpine-linux"},"Alpine Linux"),(0,n.kt)("h4",{id:"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56-1"},"\u5b89\u88c5\u73af\u5883\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache add build-base libxml2 libxslt git \\\n libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \\\n tzdata\n")),(0,n.kt)("p",null,"\u5982\u679c\u662f\u5728 ",(0,n.kt)("inlineCode",{parentName:"p"},"arm")," \u67b6\u6784\u5b89\u88c5\u8fd8\u9700\u8981\u989d\u5916\u5b89\u88c5 ",(0,n.kt)("inlineCode",{parentName:"p"},"gcompat"),' glib \u517c\u5bb9\u5c42\uff0c\u5426\u5219\u4f1a\u62a5 "',(0,n.kt)("a",{parentName:"p",href:"https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library"},"Error loading shared library"),'" \u5f02\u5e38\u9519\u8bef\u3002'),(0,n.kt)("h4",{id:"\u5b89\u88c5\u4f9d\u8d56-2"},"\u5b89\u88c5\u4f9d\u8d56"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ apk --update --no-cache redis postgresql node\n")),(0,n.kt)("h4",{id:"\u914d\u7f6e-postgres-\u548c-redis-2"},"\u914d\u7f6e Postgres \u548c Redis"),(0,n.kt)("p",null,"\u8fd0\u884c postgresql \u548c redis \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rc-service postgres start\n$ rc-service redis start\n")),(0,n.kt)("p",null,"Postgresql \u8fd8\u9700\u8981\u521b\u5efa\u9ed8\u8ba4\u7528\u6237\u540d\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ initdb -D /var/lib/postgresql/data\n$ createuser --superuser zealot\n\n# \u5982\u679c\u62c5\u5fc3\u6570\u636e\u5e93\u7528\u6237\u6743\u9650\uff0c\u53ef\u4ec5\u5f00\u542f\u521b\u5efa\u6570\u636e\u5e93\u6743\u9650\n$ createuser --createdb zealot\n")),(0,n.kt)("h4",{id:"yarn-1"},"yarn"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ npm install -g yarn\n")),(0,n.kt)("h2",{id:"\u5b89\u88c5-ruby"},"\u5b89\u88c5 Ruby"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7 asdf\u3001rvm \u4efb\u610f\u4e00\u79cd\u65b9\u5f0f\u5b89\u88c5\u3002"),(0,n.kt)(l.Z,{groupId:"install-ruby",mdxType:"Tabs"},(0,n.kt)(s.Z,{value:"asdf",mdxType:"TabItem"},(0,n.kt)("p",null,"\u4e00\u4e2a\u652f\u6301\u4e3b\u6d41\u5f00\u53d1\u8bed\u8a00\u7248\u672c\u5207\u6362\u7684\u5de5\u5177\uff0c\u8bf7\u6309\u7167",(0,n.kt)("a",{parentName:"p",href:"http://asdf-vm.com/guide/getting-started.html"},"\u5b98\u65b9\u5b89\u88c5\u6559\u7a0b"),"\u597d\u4e4b\u540e\u5b89\u88c5 ruby\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"# \u5f00\u542f Ruby 3.2.0 YJIT \u65b0\u7279\u6027\u9700\u8981\u5b89\u88c5 rust 1.58+\n# \u53ef\u9009\u5b89\u88c5:\nasdf plugin add rust\nasdf install rust latest\nasdf global rust latest\nexport RUBY_CONFIGURE_OPTS=--enable-yjit\n\n# \u5fc5\u987b\u5b89\u88c5\nasdf plugin add ruby\nasdf install ruby 3.2.0\nasdf global ruby 3.2.0\n"))),(0,n.kt)(s.Z,{value:"rvm",mdxType:"TabItem"},(0,n.kt)("p",null,"\u5982\u4e0b\u547d\u4ee4\u662f\u5148\u5b89\u88c5 rvm \u5230\u5f53\u524d\u7cfb\u7edf\u7684\u7528\u6237\u540e\u5b89\u88c5 Ruby 3.0 \u7248\u672c\uff1a"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl -sSL https://get.rvm.io | bash -s stable\n$ rvm install 3.2.0 --disable-binary\n")))),(0,n.kt)("h2",{id:"\u514b\u9686\u6e90\u4ee3\u7801"},"\u514b\u9686\u6e90\u4ee3\u7801"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,n.kt)("h2",{id:"\u521d\u59cb\u5316"},"\u521d\u59cb\u5316"),(0,n.kt)("p",null,"\u4ee5\u4e0b\u6b65\u9aa4\u5747\u9700\u8981\u5728 zealot \u6839\u76ee\u5f55\u6267\u884c\u3002"),(0,n.kt)("h3",{id:"bundler"},"bundler"),(0,n.kt)("p",null,"\u5b89\u88c5 Ruby gems \u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ [sudo] gem install bundler\n$ bundle install\n")),(0,n.kt)("h3",{id:"yarn-2"},"yarn"),(0,n.kt)("p",null,"\u5b89\u88c5\u524d\u7aef\u7b2c\u4e09\u65b9\u7c7b\u5e93"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ yarn install\n")),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u6570\u636e\u5e93"},"\u521d\u59cb\u5316\u6570\u636e\u5e93"),(0,n.kt)("p",null,"\u786e\u4fdd\u8fde\u63a5\u6570\u636e\u5e93\u4fe1\u606f\u6ca1\u6709\u95ee\u9898\uff0c\u540e\u5c06\u4f1a\u521b\u5efa\u6570\u636e\u5e93\u8868\u5e76\u521b\u5efa\u8868\u7ed3\u6784"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:create\n$ rails db:migrate\n")),(0,n.kt)("p",null,"\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570\u53ef\u901a\u8fc7",(0,n.kt)("a",{parentName:"p",href:"/docs/self-hosted/configuration/environment-variables"},"\u73af\u5883\u53d8\u91cf"),"\u6216\u66f4\u6539 ",(0,n.kt)("inlineCode",{parentName:"p"},"config/database.yml")," \u6587\u4ef6\u3002"),(0,n.kt)("h3",{id:"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"},"\u521d\u59cb\u5316\u9884\u5236\u6570\u636e"),(0,n.kt)("p",null,"\u521d\u59cb\u5316\u7ba1\u7406\u5458\u8d26\u53f7\u548c\u5e94\u7528\u6837\u4f8b"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ rails db:seed\n")),(0,n.kt)("h3",{id:"\u8fd0\u884c-zealot-\u670d\u52a1"},"\u8fd0\u884c Zealot \u670d\u52a1"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ bin/dev\n")),(0,n.kt)("p",null,"\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee ",(0,n.kt)("inlineCode",{parentName:"p"},"http://localhost:3000")))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/cc8d1b20.2c4c0211.js b/zh-Hans/assets/js/cc8d1b20.e3ceee0f.js similarity index 99% rename from zh-Hans/assets/js/cc8d1b20.2c4c0211.js rename to zh-Hans/assets/js/cc8d1b20.e3ceee0f.js index 2c9f0b615..cdbd423d5 100644 --- a/zh-Hans/assets/js/cc8d1b20.2c4c0211.js +++ b/zh-Hans/assets/js/cc8d1b20.e3ceee0f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[721],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[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):l(l({},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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(6010),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=k({queryString:n,groupId:a}),[d,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),f(e)}),[c,f,o]),tabValues:o}}var v=n(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function N(e){const t=f(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(h,(0,a.Z)({},e,t)))}function y(e){const t=(0,v.Z)();return r.createElement(N,(0,a.Z)({key:String(t)},e))}},2897:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Dev Container (Docker)"},s="Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",description:"Dev Container (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/devcontainer.md",tags:[],version:"current",frontMatter:{sidebar_label:"Dev Container (Docker)"},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/zh-Hans/docs/next/category/local-development"},next:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/source-code"}},u={},d=[{value:"\u7cfb\u7edf\u4f9d\u8d56",id:"\u7cfb\u7edf\u4f9d\u8d56",level:2},{value:"\u5b89\u88c5 Git",id:"\u5b89\u88c5-git",level:3},{value:"\u5b89\u88c5 Docker & docker-compose",id:"\u5b89\u88c5-docker--docker-compose",level:3},{value:"\u5b89\u88c5 Visual Studio Code",id:"\u5b89\u88c5-visual-studio-code",level:3},{value:"\u5b89\u88c5 Remote container \u6269\u5c55",id:"\u5b89\u88c5-remote-container-\u6269\u5c55",level:3},{value:"\u83b7\u53d6 Zealot Codespace",id:"\u83b7\u53d6-zealot-codespace",level:2},{value:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",level:2},{value:"\u542f\u52a8\u9879\u76ee",id:"\u542f\u52a8\u9879\u76ee",level:2},{value:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",level:2}],p={toc:d},m="wrapper";function k(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-\u5f00\u53d1\u90e8\u7f72\u6307\u5357"},"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"Dev Container")," (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"\u7cfb\u7edf\u4f9d\u8d56"},"\u7cfb\u7edf\u4f9d\u8d56"),(0,r.kt)("p",null,"\u5728\u5f00\u53d1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Git\uff0cVirsual Studio Code\uff0cDocker \u548c docker-compose\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-git"},"\u5b89\u88c5 Git"),(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-docker--docker-compose"},"\u5b89\u88c5 Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: 10 Pro/Enterprise \u9700\u8981 ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," / Windows 10 Home (2004+) \u9700\u8981 Docker Desktop 2.3+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),"\u3002\uff08\u4e0d\u652f\u6301 Docker Toolbox \u548c Windows container images\uff09"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+\u3002"),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+\u3002\uff08\u4e0d\u652f\u6301 Ubuntu snap \u5305\uff09")),(0,r.kt)("h3",{id:"\u5b89\u88c5-visual-studio-code"},"\u5b89\u88c5 Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code \u662f\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fd0\u884c\u7684\u514d\u8d39\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u4f60\u7684\u5b89\u88c5\u65b9\u5f0f\uff1a"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," macOS \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u6253\u5f00\u6d4f\u89c8\u5668\u4e0b\u8f7d\u754c\u9762\u627e\u5230\u5df2\u4e0b\u8f7d\u7684\u5e94\u7528\u6587\u4ef6\u6216\u538b\u7f29\u6587\u4ef6\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u538b\u7f29\u6587\u4ef6\u5148\u8fdb\u884c\u89e3\u538b\u7f29\u64cd\u4f5c\uff0c\u5982\u679c\u4f7f\u7528 Safari \u4e0b\u8f7d\u901a\u5e38\u4f1a\u5e2e\u4f60\u81ea\u52a8\u89e3\u538b\u7f29\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u62d6\u62fd ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," \u5230\u7cfb\u7edf\u5e94\u7528\u6587\u4ef6\u5939\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u53cc\u51fb VS Code \u5e94\u7528\u5373\u53ef\u6253\u5f00\u5e94\u7528\u3002"))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," Windows \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u5b89\u88c5\u7a0b\u5e8f\uff08VSCodeUserSetup-{version}.exe\uff09\u7b49\u5f85\u5b89\u88c5\u6210\u529f\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u9ed8\u8ba4\u60c5\u51b5\u4e0b VS Code \u4f1a\u5b89\u88c5\u5230 ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code")," \u8def\u5f84\u3002"))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"))),(0,r.kt)("h3",{id:"\u5b89\u88c5-remote-container-\u6269\u5c55"},"\u5b89\u88c5 Remote container \u6269\u5c55"),(0,r.kt)("p",null,"\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u5b89\u88c5 ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"\u83b7\u53d6-zealot-codespace"},"\u83b7\u53d6 Zealot Codespace"),(0,r.kt)("p",null,"Zealot Codespace \u540c\u6837\u5b58\u653e\u5728 Zealot \u9879\u76ee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/zealot/tree/develop/.devcontainer"},".devcontailer")," \u76ee\u5f55\uff0c\u4f60\u9700\u8981\u5148\u514b\u9686\u9879\u76ee\u6e90\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Codespace \u5305\u542b\u4e86\u4e00\u7cfb\u5217\u6587\u4ef6\uff1a"),(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},"\u6587\u4ef6\u540d"),(0,r.kt)("th",{parentName:"tr",align:null},"\u8bf4\u660e"))),(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"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer \u914d\u7f6e\u6587\u4ef6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"\u955c\u50cf\u6838\u5fc3\uff0c\u53d8\u66f4\u4f1a\u81ea\u52a8\u63a8\u9001\u5230\u4e0d\u540c registry \u4ed3\u5e93")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"\u95f4\u63a5\u955c\u50cf\uff0c\u4e3b\u8981\u662f\u8282\u7701\u7f16\u8bd1\u65f6\u95f4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"\u9879\u76ee\u670d\u52a1\u4f9d\u8d56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"\u7528\u4e8e\u521d\u59cb\u5316 Postgres \u9ed8\u8ba4\u7528\u6237\u53ca\u6743\u9650")))),(0,r.kt)("h2",{id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"},"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"),(0,r.kt)("p",null,"\u6253\u5f00 Visual Studio Code \u5e94\u7528\u540e\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," \u8f93\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," \u56de\u8f66\u9009\u62e9\u521a\u514b\u9686\u4e0b\u6765\u7684 Zealot \u9879\u76ee\u76ee\u5f55\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"\u9996\u6b21\u6267\u884c\u4f1a\u62c9\u53d6 Zealot Codespace \u955c\u50cf\u5e76\u5f00\u59cb\u6784\u5efa\uff0c\u8fc7\u7a0b\u4f1a\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\u671f\u95f4\u53ef\u70b9\u51fb ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," \u67e5\u770b\u6784\u5efa\u5b9e\u65f6\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"\u6784\u5efa\u5b8c\u6210\u5e76\u542f\u52a8\u5b8c\u6bd5\u4f1a\u52a0\u8f7d\u9879\u76ee\u6587\u4ef6\u548c zsh \u7ec8\u7aef\uff0c\u901a\u8fc7\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"\u5728\u5bbf\u4e3b\u673a\u4e5f\u80fd\u770b\u5230 Docker \u542f\u52a8\u4e86 docker-compose \u5728\u8fd0\u884c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"\u542f\u52a8\u9879\u76ee"},"\u542f\u52a8\u9879\u76ee"),(0,r.kt)("p",null,"\u5982\u679c\u6ca1\u6709\u6253\u5f00 VSCode \u5185\u7f6e\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u5feb\u6377\u952e ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," \u6253\u5f00\uff0c\u65b0\u6253\u5f00\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u53ef\u8fd0\u884c Zealot \u4f9d\u8d56\u7684\u6240\u6709\u670d\u52a1\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"},"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"),(0,r.kt)("p",null,"\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u4e00\u4f1a\u540e\u4f60\u4f1a\u5728\u53f3\u4e0b\u89d2\u7a97\u53e3\u770b\u5230 ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," \u7a97\u53e3\u70b9\u51fb\u53ef\u6253\u5f00 Zealot \u7f51\u9875\u670d\u52a1\u3002\u540c\u6837\u4e5f\u53ef\u4ee5\u901a\u8fc7\u7ec8\u7aef\u533a\u57df\u9876\u90e8 ",(0,r.kt)("strong",{parentName:"p"},"Ports")," \u9009\u9879\u67e5\u770b\u53ef\u8f6c\u53d1\u7aef\u53e3\u7684\u670d\u52a1\uff0c\u70b9\u51fb\u6d4f\u89c8\u5668\u56fe\u6807\u4f1a\u628a\u5bb9\u5668\u7684\u7aef\u53e3\u8f6c\u53d1\u5e76\u7ed1\u5b9a\u5230\u672c\u5730\u968f\u673a\u65ad\u5f00\u540e\u4e0a\u9762\u8bbf\u95ee\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}k.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[721],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function 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){r(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,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[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):l(l({},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,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(4334);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:n,className:l}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(7462),r=n(7294),o=n(4334),l=n(2466),i=n(6550),s=n(1980),c=n(7392),u=n(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:n}=e;const a=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=p(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:o}))),[s,c]=k({queryString:n,groupId:a}),[d,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,u.Nk)(n);return[a,(0,r.useCallback)((e=>{n&&o.set(e)}),[n,o])]}({groupId:a}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),f(e)}),[c,f,o]),tabValues:o}}var v=n(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:t,block:n,selectedValue:i,selectValue:s,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),p=e=>{const t=e.currentTarget,n=u.indexOf(t),a=c[n].value;a!==i&&(d(t),s(a))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},c.map((e=>{let{value:t,label:n,attributes:l}=e;return r.createElement("li",(0,a.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>u.push(e),onKeyDown:m,onClick:p},l,{className:(0,o.Z)("tabs__item",b.tabItem,l?.className,{"tabs__item--active":i===t})}),n??t)})))}function h(e){let{lazy:t,children:n,selectedValue:a}=e;const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function N(e){const t=f(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b.tabList)},r.createElement(g,(0,a.Z)({},e,t)),r.createElement(h,(0,a.Z)({},e,t)))}function y(e){const t=(0,v.Z)();return r.createElement(N,(0,a.Z)({key:String(t)},e))}},2897:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(4866),l=n(5162);const i={sidebar_label:"Dev Container (Docker)"},s="Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",c={unversionedId:"contributing-guide/local-development/devcontainer",id:"contributing-guide/local-development/devcontainer",title:"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357",description:"Dev Container (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002",source:"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/devcontainer.md",sourceDirName:"contributing-guide/local-development",slug:"/contributing-guide/local-development/devcontainer",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer",draft:!1,editUrl:"https://github.com/tryzealot/docs/tree/main/docs/contributing-guide/local-development/devcontainer.md",tags:[],version:"current",frontMatter:{sidebar_label:"Dev Container (Docker)"},sidebar:"contributingGuide",previous:{title:"Local development",permalink:"/zh-Hans/docs/next/category/local-development"},next:{title:"\u6e90\u4ee3\u7801",permalink:"/zh-Hans/docs/next/contributing-guide/local-development/source-code"}},u={},d=[{value:"\u7cfb\u7edf\u4f9d\u8d56",id:"\u7cfb\u7edf\u4f9d\u8d56",level:2},{value:"\u5b89\u88c5 Git",id:"\u5b89\u88c5-git",level:3},{value:"\u5b89\u88c5 Docker & docker-compose",id:"\u5b89\u88c5-docker--docker-compose",level:3},{value:"\u5b89\u88c5 Visual Studio Code",id:"\u5b89\u88c5-visual-studio-code",level:3},{value:"\u5b89\u88c5 Remote container \u6269\u5c55",id:"\u5b89\u88c5-remote-container-\u6269\u5c55",level:3},{value:"\u83b7\u53d6 Zealot Codespace",id:"\u83b7\u53d6-zealot-codespace",level:2},{value:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee",level:2},{value:"\u542f\u52a8\u9879\u76ee",id:"\u542f\u52a8\u9879\u76ee",level:2},{value:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1",level:2}],p={toc:d},m="wrapper";function k(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"visual-studio-code-dev-container-\u5f00\u53d1\u90e8\u7f72\u6307\u5357"},"Visual Studio Code Dev Container \u5f00\u53d1\u90e8\u7f72\u6307\u5357"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/devcontainers/containers"},"Dev Container")," (Developing inside a Container) \u662f Visual Studio Code \u4f7f\u7528 Docker \u4f5c\u4e3a\u5f00\u53d1\u73af\u5883\u80fd\u591f\u5b9e\u73b0\u5728\u672c\u5730\u65e0\u9700\u914d\u7f6e\u5f00\u53d1\u73af\u5883\u5728\u5bb9\u5668\u5f00\u53d1\u6709\u8fd1\u4e4e\u672c\u5730\u4f53\u9a8c\u7684\u89e3\u51b3\u65b9\u6848\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png",alt:"VSCode devcontainer"})),(0,r.kt)("h2",{id:"\u7cfb\u7edf\u4f9d\u8d56"},"\u7cfb\u7edf\u4f9d\u8d56"),(0,r.kt)("p",null,"\u5728\u5f00\u53d1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Git\uff0cVirsual Studio Code\uff0cDocker \u548c docker-compose\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-git"},"\u5b89\u88c5 Git"),(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://github.com/git-guides/install-git"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"),(0,r.kt)("h3",{id:"\u5b89\u88c5-docker--docker-compose"},"\u5b89\u88c5 Docker & docker-compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Windows: 10 Pro/Enterprise \u9700\u8981 ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," / Windows 10 Home (2004+) \u9700\u8981 Docker Desktop 2.3+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://aka.ms/vscode-remote/containers/docker-wsl2"},"WSL 2 back-end"),"\u3002\uff08\u4e0d\u652f\u6301 Docker Toolbox \u548c Windows container images\uff09"),(0,r.kt)("li",{parentName:"ul"},"macOS: ",(0,r.kt)("a",{parentName:"li",href:"https://www.docker.com/products/docker-desktop"},"Docker Desktop")," 2.0+\u3002"),(0,r.kt)("li",{parentName:"ul"},"Linux: ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/install/#supported-platforms"},"Docker CE/EE")," 18.06+ \u548c ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")," 1.21+\u3002\uff08\u4e0d\u652f\u6301 Ubuntu snap \u5305\uff09")),(0,r.kt)("h3",{id:"\u5b89\u88c5-visual-studio-code"},"\u5b89\u88c5 Visual Studio Code"),(0,r.kt)("p",null,"Visual Studio Code \u662f\u4e00\u4e2a\u8de8\u5e73\u53f0\u8fd0\u884c\u7684\u514d\u8d39\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u4f60\u7684\u5b89\u88c5\u65b9\u5f0f\uff1a"),(0,r.kt)(o.Z,{groupId:"install-vscode",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"MacOS",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534106"},"Visual Studio Code")," macOS \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u6253\u5f00\u6d4f\u89c8\u5668\u4e0b\u8f7d\u754c\u9762\u627e\u5230\u5df2\u4e0b\u8f7d\u7684\u5e94\u7528\u6587\u4ef6\u6216\u538b\u7f29\u6587\u4ef6\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u538b\u7f29\u6587\u4ef6\u5148\u8fdb\u884c\u89e3\u538b\u7f29\u64cd\u4f5c\uff0c\u5982\u679c\u4f7f\u7528 Safari \u4e0b\u8f7d\u901a\u5e38\u4f1a\u5e2e\u4f60\u81ea\u52a8\u89e3\u538b\u7f29\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u62d6\u62fd ",(0,r.kt)("inlineCode",{parentName:"li"},"Visual Studio Code.app")," \u5230\u7cfb\u7edf\u5e94\u7528\u6587\u4ef6\u5939\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u53cc\u51fb VS Code \u5e94\u7528\u5373\u53ef\u6253\u5f00\u5e94\u7528\u3002"))),(0,r.kt)(l.Z,{value:"Windows",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d ",(0,r.kt)("a",{parentName:"li",href:"https://go.microsoft.com/fwlink/?LinkID=534107"},"Visual Studio Code installer")," Windows \u7248\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u5b89\u88c5\u7a0b\u5e8f\uff08VSCodeUserSetup-{version}.exe\uff09\u7b49\u5f85\u5b89\u88c5\u6210\u529f\u3002"),(0,r.kt)("li",{parentName:"ol"},"\u9ed8\u8ba4\u60c5\u51b5\u4e0b VS Code \u4f1a\u5b89\u88c5\u5230 ",(0,r.kt)("inlineCode",{parentName:"li"},"C:\\Users\\{Username}\\AppData\\Local\\Programs\\Microsoft VS Code")," \u8def\u5f84\u3002"))),(0,r.kt)(l.Z,{value:"Linux",mdxType:"TabItem"},(0,r.kt)("p",null,"\u56e0\u64cd\u4f5c\u7cfb\u7edf\u4e0d\u540c\uff0c\u5efa\u8bae\u6309\u7167\u5b98\u65b9",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/setup/linux"},"\u5b89\u88c5\u6559\u7a0b"),"\u64cd\u4f5c\u3002"))),(0,r.kt)("h3",{id:"\u5b89\u88c5-remote-container-\u6269\u5c55"},"\u5b89\u88c5 Remote container \u6269\u5c55"),(0,r.kt)("p",null,"\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u5b89\u88c5 ",(0,r.kt)("a",{parentName:"p",href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"},"Remote Container extension"),"\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode extension",src:n(9763).Z,width:"1000",height:"477"})),(0,r.kt)("h2",{id:"\u83b7\u53d6-zealot-codespace"},"\u83b7\u53d6 Zealot Codespace"),(0,r.kt)("p",null,"Zealot Codespace \u540c\u6837\u5b58\u653e\u5728 Zealot \u9879\u76ee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tryzealot/zealot/tree/develop/.devcontainer"},".devcontailer")," \u76ee\u5f55\uff0c\u4f60\u9700\u8981\u5148\u514b\u9686\u9879\u76ee\u6e90\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/tryzealot/zealot.git\n")),(0,r.kt)("p",null,"Codespace \u5305\u542b\u4e86\u4e00\u7cfb\u5217\u6587\u4ef6\uff1a"),(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},"\u6587\u4ef6\u540d"),(0,r.kt)("th",{parentName:"tr",align:null},"\u8bf4\u660e"))),(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"},"devcontainer.json")),(0,r.kt)("td",{parentName:"tr",align:null},"VSCode devcontainer \u914d\u7f6e\u6587\u4ef6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile.base")),(0,r.kt)("td",{parentName:"tr",align:null},"\u955c\u50cf\u6838\u5fc3\uff0c\u53d8\u66f4\u4f1a\u81ea\u52a8\u63a8\u9001\u5230\u4e0d\u540c registry \u4ed3\u5e93")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Dockerfile")),(0,r.kt)("td",{parentName:"tr",align:null},"\u95f4\u63a5\u955c\u50cf\uff0c\u4e3b\u8981\u662f\u8282\u7701\u7f16\u8bd1\u65f6\u95f4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"docker-compose.yml")),(0,r.kt)("td",{parentName:"tr",align:null},"\u9879\u76ee\u670d\u52a1\u4f9d\u8d56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create-db-user.sql")),(0,r.kt)("td",{parentName:"tr",align:null},"\u7528\u4e8e\u521d\u59cb\u5316 Postgres \u9ed8\u8ba4\u7528\u6237\u53ca\u6743\u9650")))),(0,r.kt)("h2",{id:"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"},"\u5728\u5bb9\u5668\u5185\u6253\u5f00\u9879\u76ee"),(0,r.kt)("p",null,"\u6253\u5f00 Visual Studio Code \u5e94\u7528\u540e\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette"},"Command Palette")," \u8f93\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"Dev Containers: Open Folder in Container...")," \u56de\u8f66\u9009\u62e9\u521a\u514b\u9686\u4e0b\u6765\u7684 Zealot \u9879\u76ee\u76ee\u5f55\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(8979).Z,width:"1752",height:"558"})),(0,r.kt)("p",null,"\u9996\u6b21\u6267\u884c\u4f1a\u62c9\u53d6 Zealot Codespace \u955c\u50cf\u5e76\u5f00\u59cb\u6784\u5efa\uff0c\u8fc7\u7a0b\u4f1a\u6301\u7eed\u4e00\u6bb5\u65f6\u95f4\u671f\u95f4\u53ef\u70b9\u51fb ",(0,r.kt)("strong",{parentName:"p"},"Starting Dev Container (show log)")," \u67e5\u770b\u6784\u5efa\u5b9e\u65f6\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Command Palette",src:n(7351).Z,width:"1736",height:"846"})),(0,r.kt)("p",null,"\u6784\u5efa\u5b8c\u6210\u5e76\u542f\u52a8\u5b8c\u6bd5\u4f1a\u52a0\u8f7d\u9879\u76ee\u6587\u4ef6\u548c zsh \u7ec8\u7aef\uff0c\u901a\u8fc7\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"[7293 ms] Start: Run in container: cat /proc/344/environ\n[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.\n[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e\n[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established\n[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close\n[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.\n[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close\n")),(0,r.kt)("p",null,"\u5728\u5bbf\u4e3b\u673a\u4e5f\u80fd\u770b\u5230 Docker \u542f\u52a8\u4e86 docker-compose \u5728\u8fd0\u884c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Docker-Compose containers",src:n(2641).Z,width:"2180",height:"238"})),(0,r.kt)("h2",{id:"\u542f\u52a8\u9879\u76ee"},"\u542f\u52a8\u9879\u76ee"),(0,r.kt)("p",null,"\u5982\u679c\u6ca1\u6709\u6253\u5f00 VSCode \u5185\u7f6e\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u5feb\u6377\u952e ",(0,r.kt)("inlineCode",{parentName:"p"},"Ctrl + `")," \u6253\u5f00\uff0c\u65b0\u6253\u5f00\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u53ef\u8fd0\u884c Zealot \u4f9d\u8d56\u7684\u6240\u6709\u670d\u52a1\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode Zealot in Container",src:n(5771).Z,width:"3170",height:"1794"})),(0,r.kt)("h2",{id:"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"},"\u6d4f\u89c8\u5668\u8bbf\u95ee\u670d\u52a1"),(0,r.kt)("p",null,"\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"bin/dev")," \u4e00\u4f1a\u540e\u4f60\u4f1a\u5728\u53f3\u4e0b\u89d2\u7a97\u53e3\u770b\u5230 ",(0,r.kt)("strong",{parentName:"p"},"Open in Browser")," \u7a97\u53e3\u70b9\u51fb\u53ef\u6253\u5f00 Zealot \u7f51\u9875\u670d\u52a1\u3002\u540c\u6837\u4e5f\u53ef\u4ee5\u901a\u8fc7\u7ec8\u7aef\u533a\u57df\u9876\u90e8 ",(0,r.kt)("strong",{parentName:"p"},"Ports")," \u9009\u9879\u67e5\u770b\u53ef\u8f6c\u53d1\u7aef\u53e3\u7684\u670d\u52a1\uff0c\u70b9\u51fb\u6d4f\u89c8\u5668\u56fe\u6807\u4f1a\u628a\u5bb9\u5668\u7684\u7aef\u53e3\u8f6c\u53d1\u5e76\u7ed1\u5b9a\u5230\u672c\u5730\u968f\u673a\u65ad\u5f00\u540e\u4e0a\u9762\u8bbf\u95ee\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"VSCode forwarded ports",src:n(5290).Z,width:"2646",height:"814"})))}k.isMDXComponent=!0},8979:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-command-palette-f37b4fd31c6cdc13244ea925b976f221.png"},2641:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-docker-containers-2a8afa4acc0d89438d14cd6539e432d8.png"},5290:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-forwarded-ports-4cf5d371a14b1201857d7c53b692b829.png"},7351:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-log-c904cb2312799a66dc6acc3ddde7e78f.png"},5771:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-devcontainer-zealot-592ecc98b9f83a304e22157fd1a31192.png"},9763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vscode-install-remote-containers-48120b06a2470bee04804c93fa4d881a.png"}}]); \ No newline at end of file diff --git a/zh-Hans/assets/js/main.20d5ef5c.js b/zh-Hans/assets/js/main.20d5ef5c.js new file mode 100644 index 000000000..37d241c3f --- /dev/null +++ b/zh-Hans/assets/js/main.20d5ef5c.js @@ -0,0 +1,2 @@ +/*! For license information please see main.20d5ef5c.js.LICENSE.txt */ +(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[179],{4334:(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}},7459:(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}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(7462),a=n(8356),s=n.n(a),i=n(6887);const l={"000e92dd":[()=>Promise.all([n.e(532),n.e(4123)]).then(n.bind(n,7766)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/android.md",7766],"00f34551":[()=>n.e(144).then(n.bind(n,6898)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/slack.md",6898],"0376ac8d":[()=>n.e(2171).then(n.t.bind(n,3526,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u8c03\u8bd5\u6587\u4ef6-144.json",3526],"0409ce86":[()=>n.e(4529).then(n.bind(n,1910)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/qa.md",1910],"04af2ec6":[()=>n.e(4219).then(n.bind(n,3464)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/storage.md",3464],"05c34111":[()=>n.e(3262).then(n.bind(n,8149)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/toolkits/teardown.md",8149],"0659cada":[()=>n.e(1854).then(n.bind(n,7810)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/feishu.md",7810],"06a7ce3e":[()=>n.e(1013).then(n.bind(n,6275)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/index.md",6275],"07e94b94":[()=>n.e(959).then(n.bind(n,8038)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_sync_devices.md",8038],"08927acb":[()=>n.e(7347).then(n.bind(n,4317)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_debug_file.md",4317],"089c33a0":[()=>n.e(7493).then(n.bind(n,4206)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/apple-team.mdx",4206],"097ad104":[()=>n.e(726).then(n.bind(n,3691)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/index.mdx",3691],"0b2dde68":[()=>n.e(7166).then(n.bind(n,9878)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/kubernetes.md",9878],"0b5c90e4":[()=>n.e(9555).then(n.bind(n,6035)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot.md",6035],"0c22aff4":[()=>Promise.all([n.e(532),n.e(3194)]).then(n.bind(n,400)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/source-code.md",400],"0da09c0c":[()=>n.e(8390).then(n.bind(n,3478)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/feishu.md",3478],"0ef4ad01":[()=>n.e(3313).then(n.bind(n,4572)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/index.md",4572],"0f991629":[()=>n.e(2254).then(n.bind(n,5571)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/create.mdx",5571],10743099:[()=>n.e(2571).then(n.bind(n,6028)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/storage.md",6028],"10ab72a2":[()=>n.e(8206).then(n.bind(n,6864)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/detail.mdx",6864],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(9455),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"1ab1b8b6":[()=>n.e(6447).then(n.bind(n,4740)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks.md",4740],"1ab7b698":[()=>n.e(7759).then(n.bind(n,1167)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/dashboard.md",1167],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c821441":[()=>n.e(9506).then(n.bind(n,1287)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/docker.md",1287],"1d59b05a":[()=>n.e(7181).then(n.bind(n,4109)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks.md",4109],"1ec5d4b5":[()=>n.e(8202).then(n.bind(n,4)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/nomad.md",4],"1f391b9e":[()=>Promise.all([n.e(532),n.e(9455),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"20570c26":[()=>n.e(639).then(n.bind(n,1749)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/requirements.md",1749],"20cbbbee":[()=>n.e(5405).then(n.bind(n,4510)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/toolkits/teardown.mdx",4510],"210ec931":[()=>n.e(2247).then(n.bind(n,3276)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/backup.mdx",3276],"23b09800":[()=>n.e(7817).then(n.bind(n,368)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/render.md",368],"23e1330d":[()=>n.e(3032).then(n.bind(n,8950)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/qa.md",8950],"247783bb":[()=>n.e(9334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"26cfe7d9":[()=>n.e(3091).then(n.bind(n,7626)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/system-info.mdx",7626],"28463b1d":[()=>n.e(4620).then(n.bind(n,2788)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/review.mdx",2788],"2a1b2070":[()=>n.e(2141).then(n.bind(n,1512)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/settings.mdx",1512],"2ac37e2a":[()=>n.e(5238).then(n.bind(n,9986)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/dingtalk.md",9986],"2ba4a649":[()=>n.e(5476).then(n.bind(n,2962)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/system-info.mdx",2962],"2da1a83d":[()=>n.e(7169).then(n.bind(n,7664)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/upload.mdx",7664],"2de1c1b9":[()=>n.e(105).then(n.t.bind(n,8148,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u8c03\u8bd5\u6587\u4ef6-25b.json",8148],"2ff16664":[()=>n.e(9327).then(n.bind(n,5997)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/background-jobs.mdx",5997],"30738da4":[()=>n.e(8170).then(n.bind(n,462)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/environment-variables.md",462],"320c81fa":[()=>n.e(6463).then(n.t.bind(n,1222,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u4e91\u670d\u52a1\u5546-459.json",1222],"3384f4b5":[()=>n.e(7772).then(n.bind(n,5812)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api/debug_files.md",5812],"33ad4946":[()=>n.e(5215).then(n.bind(n,6820)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/render.md",6820],"36ff01e5":[()=>n.e(2515).then(n.bind(n,5245)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/index.mdx",5245],"3731d319":[()=>n.e(3137).then(n.bind(n,7056)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/kubernetes.md",7056],"380655f7":[()=>Promise.all([n.e(532),n.e(9213)]).then(n.bind(n,7504)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/ios.md",7504],"381e4cde":[()=>n.e(8740).then(n.bind(n,7157)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/apple-team.mdx",7157],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"3b925495":[()=>n.e(2745).then(n.bind(n,2073)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane.md",2073],"3d079836":[()=>Promise.all([n.e(532),n.e(2922)]).then(n.bind(n,364)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/android.md",364],"3d648c75":[()=>n.e(7950).then(n.bind(n,6225)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/index.mdx",6225],"3e64385b":[()=>n.e(8307).then(n.bind(n,2418)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/index.mdx",2418],"3f7af0f1":[()=>n.e(9316).then(n.bind(n,3829)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/discord.md",3829],"405e4d0a":[()=>n.e(1233).then(n.bind(n,6590)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/apps/create.md",6590],40622858:[()=>n.e(9411).then(n.bind(n,955)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/requirements.md",955],42055627:[()=>n.e(6833).then(n.bind(n,8300)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/requirements.md",8300],"422bbee2":[()=>n.e(6082).then(n.bind(n,2451)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/background-jobs.mdx",2451],"46458cf8":[()=>n.e(4641).then(n.bind(n,9061)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/toolkits/fetch-udid.mdx",9061],"47c1865a":[()=>n.e(7755).then(n.t.bind(n,7724,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u5e94\u7528-2af.json",7724],"492fa892":[()=>n.e(7298).then(n.t.bind(n,8016,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u90e8\u7f72-a8b.json",8016],"493ecea9":[()=>n.e(6500).then(n.bind(n,2811)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/discord.md",2811],"4960790f":[()=>n.e(5185).then(n.bind(n,9788)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/index.md",9788],"498392b4":[()=>n.e(9164).then(n.bind(n,6373)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/index.md",6373],"4a0f0e0c":[()=>n.e(2986).then(n.bind(n,4520)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/railway.md",4520],"4aeacf08":[()=>n.e(6184).then(n.bind(n,9071)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/docker.md",9071],"4aefe824":[()=>n.e(6276).then(n.t.bind(n,2955,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u7ba1\u7406\u9762\u677f-802.json",2955],"4b5eb73a":[()=>n.e(8037).then(n.bind(n,4473)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/database-analytics.mdx",4473],"4b6154ab":[()=>n.e(8228).then(n.bind(n,1106)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/schedule-jobs.md",1106],"4bc9e19e":[()=>Promise.all([n.e(532),n.e(5342)]).then(n.bind(n,9543)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/reverse-proxies.mdx",9543],"4daa79cc":[()=>n.e(7030).then(n.bind(n,2052)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_version_check.md",2052],"500b40a2":[()=>n.e(6735).then(n.bind(n,2423)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/environment-variables.md",2423],"5171b55b":[()=>n.e(1075).then(n.bind(n,918)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/backup.md",918],"533b3bff":[()=>n.e(9882).then(n.bind(n,7177)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/docker.md",7177],"53ae73f2":[()=>n.e(9390).then(n.t.bind(n,5565,19)),"~docs/default/category-zh-hansdocsnext-contributingguide-category-\u672c\u5730\u5f00\u53d1-ac6.json",5565],"546445a3":[()=>n.e(7190).then(n.bind(n,2576)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api.md",2576],"56786dcf":[()=>Promise.all([n.e(532),n.e(6788)]).then(n.bind(n,9186)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",9186],"575c49fd":[()=>n.e(1821).then(n.bind(n,6232)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/best_practices.md",6232],"580231d5":[()=>n.e(5745).then(n.bind(n,2547)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/upload.mdx",2547],"5914602b":[()=>Promise.all([n.e(532),n.e(8797)]).then(n.bind(n,6406)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/reverse-proxies.mdx",6406],"5b48482c":[()=>n.e(7355).then(n.t.bind(n,6521,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u76d1\u63a7-bbd.json",6521],"5e69b000":[()=>n.e(9557).then(n.bind(n,1960)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/database-analytics.md",1960],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f6e077b":[()=>n.e(1300).then(n.bind(n,8527)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/logging.mdx",8527],"5fe54c51":[()=>n.e(1042).then(n.bind(n,3275)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/docker/step-by-step.md",3275],"6025cfa3":[()=>n.e(859).then(n.bind(n,3034)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/third-party-authentication.md",3034],"61b3b8ce":[()=>n.e(4343).then(n.bind(n,7895)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/index.md",7895],"63d75c88":[()=>n.e(6519).then(n.bind(n,9847)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/wecom.md",9847],"65f8d4cd":[()=>n.e(5632).then(n.bind(n,1771)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/best_practices.md",1771],"66a79633":[()=>n.e(7121).then(n.bind(n,1701)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/apple-team.mdx",1701],"67d72155":[()=>n.e(3434).then(n.bind(n,2043)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/credits.md",2043],"6821510c":[()=>n.e(5732).then(n.bind(n,5808)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/feishu.md",5808],"68518edc":[()=>n.e(3144).then(n.t.bind(n,8734,19)),"~docs/default/category-zh-hansdocsnext-developerguide-category-\u79fb\u52a8-sdk-c0b.json",8734],"68604c4e":[()=>n.e(6442).then(n.bind(n,194)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/dingtalk.md",194],"6988bd10":[()=>n.e(4061).then(n.bind(n,9704)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api.md",9704],"6a6b352a":[()=>n.e(652).then(n.t.bind(n,9024,19)),"~docs/default/category-zh-hansdocs-4-x-developerguide-category-\u79fb\u52a8-sdk-ba3.json",9024],"6aeebc73":[()=>n.e(3165).then(n.bind(n,1672)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_sync_devices.md",1672],"6c1f465d":[()=>n.e(6766).then(n.bind(n,5252)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/schedule-jobs.md",5252],"6de0a3bc":[()=>n.e(3369).then(n.bind(n,6224)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot.md",6224],"6fa94343":[()=>n.e(8832).then(n.bind(n,8922)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/toolkits/fetch-udid.mdx",8922],"709f7e27":[()=>n.e(6170).then(n.t.bind(n,5199,19)),"~docs/default/category-zh-hansdocs-developerguide-category-\u79fb\u52a8-sdk-401.json",5199],"70a2637b":[()=>n.e(8007).then(n.t.bind(n,3319,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u5de5\u5177\u7bb1-f53.json",3319],"71cdea68":[()=>n.e(8552).then(n.bind(n,1464)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api/apps.md",1464],"731441ba":[()=>n.e(6432).then(n.bind(n,2683)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/index.md",2683],"756ae957":[()=>n.e(6751).then(n.bind(n,6292)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/docker/step-by-step.md",6292],"77ad6583":[()=>n.e(6988).then(n.bind(n,4104)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/index.md",4104],"77ba73fa":[()=>n.e(4085).then(n.bind(n,7784)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_version_check.md",7784],"78d3bc26":[()=>n.e(2347).then(n.bind(n,362)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/environment-variables.md",362],"78f6b461":[()=>n.e(7531).then(n.bind(n,3258)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/toolkits/teardown.mdx",3258],"797c3697":[()=>n.e(7053).then(n.bind(n,6745)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api.md",6745],"7a31e8eb":[()=>n.e(39).then(n.t.bind(n,7772,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u7ba1\u7406\u9762\u677f-f40.json",7772],"7b50d085":[()=>n.e(7299).then(n.bind(n,4419)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/index.md",4419],"7e2cd3a9":[()=>n.e(9347).then(n.bind(n,7401)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/project-settings.md",7401],"7e84284a":[()=>n.e(7700).then(n.t.bind(n,6817,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u4e91\u670d\u52a1\u5546-4e2.json",6817],"7f084e8e":[()=>n.e(6801).then(n.t.bind(n,5092,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u914d\u7f6e-680.json",5092],"808d5cf9":[()=>n.e(4552).then(n.bind(n,6667)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/qa.md",6667],"88e109fd":[()=>n.e(3975).then(n.bind(n,1866)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/schedule-jobs.md",1866],"89a1149b":[()=>n.e(9697).then(n.bind(n,6895)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/changelog.md",6895],"8c755c24":[()=>n.e(6543).then(n.bind(n,6883)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/slack.md",6883],"8c7fed4d":[()=>n.e(7207).then(n.bind(n,5057)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/system-info.md",5057],"8dbd9405":[()=>n.e(536).then(n.bind(n,7794)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/debug-files/upload.md",7794],"8e4c1cdf":[()=>n.e(4069).then(n.bind(n,9842)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_debug_file.md",9842],"927828a2":[()=>n.e(5086).then(n.bind(n,3715)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/settings.mdx",3715],"92f17503":[()=>n.e(7704).then(n.bind(n,3465)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane.md",3465],"93332d63":[()=>n.e(7754).then(n.bind(n,1713)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/railway.md",1713],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9387e8f1":[()=>n.e(6620).then(n.bind(n,5085)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api/debug_files.md",5085],"93e83d03":[()=>n.e(270).then(n.bind(n,4658)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/fly.md",4658],"94a70f3c":[()=>n.e(9902).then(n.bind(n,7396)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/nomad.md",7396],"980d6c79":[()=>n.e(5100).then(n.bind(n,3304)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/wecom.md",3304],"986b83c2":[()=>n.e(7659).then(n.bind(n,2178)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/upload.mdx",2178],"9a46955c":[()=>n.e(2300).then(n.bind(n,5515)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/dashboard.md",5515],"9aa09611":[()=>n.e(6031).then(n.bind(n,6552)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/credits.md",6552],"9c76208a":[()=>n.e(7925).then(n.bind(n,9179)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/permissions.md",9179],"9d0a861d":[()=>n.e(3868).then(n.t.bind(n,8818,19)),"~docs/default/category-zh-hansdocs-contributingguide-category-\u672c\u5730\u5f00\u53d1-474.json",8818],"9d0b921d":[()=>Promise.all([n.e(532),n.e(2239)]).then(n.bind(n,3664)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/devcontainer.md",3664],"9d7c6944":[()=>n.e(8189).then(n.t.bind(n,4812,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u8c03\u8bd5\u6587\u4ef6-521.json",4812],"9eed9fa1":[()=>n.e(6346).then(n.bind(n,5147)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/changelog.md",5147],a06cc266:[()=>n.e(4288).then(n.bind(n,9988)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/index.mdx",9988],a21619df:[()=>n.e(3020).then(n.bind(n,3764)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/index.mdx",3764],a73dab33:[()=>n.e(7781).then(n.bind(n,5293)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api/apps.md",5293],a7434565:[()=>n.e(7645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a9736a03:[()=>n.e(3240).then(n.t.bind(n,3786,19)),"~docs/default/category-zh-hansdocs-4-x-contributingguide-category-\u672c\u5730\u5f00\u53d1-0f1.json",3786],aa45ed72:[()=>n.e(713).then(n.bind(n,120)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/dingtalk.md",120],ab09b93d:[()=>n.e(1839).then(n.t.bind(n,6721,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u90e8\u7f72-7eb.json",6721],abf33808:[()=>n.e(3705).then(n.bind(n,8129)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/nomad.md",8129],ac20dd04:[()=>n.e(4114).then(n.bind(n,1659)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/detail.mdx",1659],ad5e89b7:[()=>n.e(3946).then(n.bind(n,3119)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/changelog.md",3119],ae0b00ed:[()=>n.e(131).then(n.bind(n,9468)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot.md",9468],b0190f04:[()=>n.e(5497).then(n.bind(n,3294)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/wecom.md",3294],b0b6b74b:[()=>n.e(2608).then(n.t.bind(n,7324,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u5de5\u5177\u7bb1-eff.json",7324],b0d48a44:[()=>n.e(184).then(n.bind(n,4067)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/permissions.md",4067],b155671d:[()=>n.e(5924).then(n.bind(n,6490)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_debug_file.md",6490],b168d81c:[()=>n.e(7284).then(n.bind(n,1278)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/fly.md",1278],b2ef10a5:[()=>n.e(2406).then(n.bind(n,4692)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/slack.md",4692],b38b46a9:[()=>Promise.all([n.e(532),n.e(8782)]).then(n.bind(n,4020)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/ios.md",4020],b43ef384:[()=>Promise.all([n.e(532),n.e(6043)]).then(n.bind(n,6684)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/android.md",6684],b51b060c:[()=>n.e(8447).then(n.bind(n,8442)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/fly.md",8442],b572cb1f:[()=>Promise.all([n.e(532),n.e(6981)]).then(n.bind(n,7183)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/reverse-proxies.mdx",7183],b667b6c3:[()=>n.e(4259).then(n.bind(n,9589)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/backup.mdx",9589],b6e49d05:[()=>n.e(1224).then(n.bind(n,4929)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/index.md",4929],b8ca8336:[()=>n.e(4127).then(n.bind(n,7248)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/source-code.md",7248],bbb0fa6e:[()=>n.e(2570).then(n.bind(n,3557)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/discord.md",3557],bc4a1c03:[()=>n.e(1147).then(n.t.bind(n,2985,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u7ba1\u7406\u9762\u677f-841.json",2985],c1af49ed:[()=>n.e(80).then(n.t.bind(n,5460,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u76d1\u63a7-654.json",5460],c3412635:[()=>n.e(5929).then(n.bind(n,1060)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane.md",1060],c3697579:[()=>n.e(631).then(n.bind(n,1300)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/source-code.md",1300],c38ecdbc:[()=>n.e(4360).then(n.bind(n,921)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/permissions.md",921],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,5402)),"@site/src/pages/index.js",5402],c5a4c00b:[()=>n.e(2208).then(n.bind(n,1957)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/logging.md",1957],c6bdf690:[()=>n.e(2705).then(n.bind(n,6114)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/upload.mdx",6114],c6fb1e3c:[()=>n.e(8876).then(n.bind(n,2873)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api/apps.md",2873],c704004d:[()=>Promise.all([n.e(532),n.e(4156)]).then(n.bind(n,4681)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/ios.md",4681],c7c3383a:[()=>n.e(5343).then(n.t.bind(n,8885,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u5de5\u5177\u7bb1-615.json",8885],c869843a:[()=>n.e(2170).then(n.bind(n,6602)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/background-jobs.md",6602],c89e1d41:[()=>n.e(2559).then(n.bind(n,8623)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/logging.mdx",8623],c941fb92:[()=>Promise.all([n.e(532),n.e(7551)]).then(n.bind(n,3317)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/source-code.md",3317],c9b278a8:[()=>n.e(9181).then(n.t.bind(n,5e3,19)),"~docs/default/version-5-0-0-metadata-prop-0b8.json",5e3],cae0f04b:[()=>n.e(5709).then(n.t.bind(n,4166,19)),"~docs/default/version-4-x-metadata-prop-21f.json",4166],cbffe0ba:[()=>Promise.all([n.e(532),n.e(594)]).then(n.bind(n,5517)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/source-code.md",5517],cc8d1b20:[()=>Promise.all([n.e(532),n.e(721)]).then(n.bind(n,2897)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/devcontainer.md",2897],cd05e63c:[()=>n.e(4775).then(n.bind(n,1343)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/docker/step-by-step.md",1343],cf72ee6a:[()=>n.e(324).then(n.bind(n,2948)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/render.md",2948],d02aa106:[()=>n.e(4590).then(n.bind(n,5421)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/project-settings.md",5421],d0f9f7b0:[()=>n.e(1931).then(n.bind(n,2446)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/toolkits/fetch-udid.mdx",2446],d75d92bc:[()=>n.e(8450).then(n.bind(n,9750)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks.md",9750],d7c763e8:[()=>n.e(1297).then(n.bind(n,7331)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/database-analytics.mdx",7331],dc9db4d6:[()=>n.e(8794).then(n.bind(n,3175)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_sync_devices.md",3175],dd90aca1:[()=>n.e(7679).then(n.bind(n,8501)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_version_check.md",8501],de6e37e2:[()=>n.e(6222).then(n.bind(n,5880)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/architecture.mdx",5880],e177b72e:[()=>n.e(847).then(n.bind(n,4938)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/review.mdx",4938],e25c1561:[()=>n.e(3775).then(n.bind(n,3863)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/credits.md",3863],e471e2c1:[()=>n.e(2238).then(n.bind(n,1631)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/railway.md",1631],e649ac20:[()=>n.e(8650).then(n.t.bind(n,3542,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u914d\u7f6e-4ad.json",3542],e676557f:[()=>n.e(3082).then(n.t.bind(n,9411,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u5e94\u7528-297.json",9411],e74b89a8:[()=>n.e(5256).then(n.bind(n,6977)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/create.mdx",6977],e84771ae:[()=>n.e(5468).then(n.bind(n,2833)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/storage.md",2833],eb842df6:[()=>n.e(5855).then(n.bind(n,3618)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/architecture.mdx",3618],eb89accb:[()=>n.e(2390).then(n.bind(n,1786)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/best_practices.md",1786],ec4538ed:[()=>n.e(4328).then(n.bind(n,6109)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/dashboard.md",6109],ef9024f9:[()=>n.e(7452).then(n.bind(n,3410)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api/debug_files.md",3410],f057e2be:[()=>n.e(6164).then(n.t.bind(n,2780,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u5e94\u7528-129.json",2780],f25fc619:[()=>n.e(2353).then(n.t.bind(n,1161,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u914d\u7f6e-e07.json",1161],f3b6e326:[()=>n.e(1717).then(n.bind(n,4990)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/architecture.mdx",4990],f3e148a8:[()=>n.e(4938).then(n.bind(n,3244)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/source-code.md",3244],f3ecbbb7:[()=>n.e(861).then(n.t.bind(n,5098,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u4e91\u670d\u52a1\u5546-0ff.json",5098],f500fe2a:[()=>n.e(7575).then(n.t.bind(n,7063,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u90e8\u7f72-bbf.json",7063],f576f290:[()=>n.e(1290).then(n.t.bind(n,85,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u76d1\u63a7-5d6.json",85],fa6a7c71:[()=>n.e(1125).then(n.bind(n,7283)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/index.mdx",7283],faaf8c96:[()=>n.e(2994).then(n.bind(n,1471)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/third-party-authentication.md",1471],fe394c5b:[()=>n.e(6229).then(n.bind(n,4234)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/kubernetes.md",4234],ffe0e092:[()=>n.e(8810).then(n.bind(n,1649)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/third-party-authentication.md",1649]};function u(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 c=n(9670),d=n(226);function p(e,t){if("*"===e)return s()({loading:u,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=i[`${e}-${t}`],p={},f=[],h=[],g=(0,c.Z)(a);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),h.push(r[2]))})),s().Map({loading:u,loader:p,modules:f,webpack:()=>h,render(t,n){const s=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=s;const i=n.split(".");i.slice(0,-1).forEach((e=>{a=a[e]})),a[i[i.length-1]]=o}));const i=s.__comp;delete s.__comp;const l=s.__context;return delete s.__context,r.createElement(d.z,{value:l},r.createElement(i,(0,o.Z)({},s,n)))}})}const f=[{path:"/zh-Hans/markdown-page",component:p("/zh-Hans/markdown-page","75e"),exact:!0},{path:"/zh-Hans/docs/4.x",component:p("/zh-Hans/docs/4.x","da2"),routes:[{path:"/zh-Hans/docs/4.x/category/administrator",component:p("/zh-Hans/docs/4.x/category/administrator","d7f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/apps",component:p("/zh-Hans/docs/4.x/category/apps","2ef"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/cloud-provider-guides",component:p("/zh-Hans/docs/4.x/category/cloud-provider-guides","3e0"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/configuration",component:p("/zh-Hans/docs/4.x/category/configuration","139"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/debug-files",component:p("/zh-Hans/docs/4.x/category/debug-files","bfa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/deployment",component:p("/zh-Hans/docs/4.x/category/deployment","518"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/local-development",component:p("/zh-Hans/docs/4.x/category/local-development","c2c"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/category/monitoring",component:p("/zh-Hans/docs/4.x/category/monitoring","066"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/sdks",component:p("/zh-Hans/docs/4.x/category/sdks","cd7"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/category/toolkits",component:p("/zh-Hans/docs/4.x/category/toolkits","9b1"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/",component:p("/zh-Hans/docs/4.x/contributing-guide/","0bd"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer","7b7"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/4.x/contributing-guide/local-development/source-code","314"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/",component:p("/zh-Hans/docs/4.x/developer-guide/","396"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api",component:p("/zh-Hans/docs/4.x/developer-guide/api","d53"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api/apps",component:p("/zh-Hans/docs/4.x/developer-guide/api/apps","b1c"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api/debug_files",component:p("/zh-Hans/docs/4.x/developer-guide/api/debug_files","ae9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane","baa"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot","684"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file","8bd"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices","1c5"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check","55a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/sdk/android",component:p("/zh-Hans/docs/4.x/developer-guide/sdk/android","57e"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/sdk/ios",component:p("/zh-Hans/docs/4.x/developer-guide/sdk/ios","e20"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/self-hosted/",component:p("/zh-Hans/docs/4.x/self-hosted/","518"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables","3c6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs","a07"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication","586"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/architecture","ea9"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/docker",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/docker","143"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step","4fe"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/fly",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/fly","b4e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes","779"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/nomad","902"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/railway",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/railway","548"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/render",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/render","db8"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/requirements","4df"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/source-code","4c4"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/4.x/self-hosted/reverse-proxies","9ee"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/storage",component:p("/zh-Hans/docs/4.x/self-hosted/storage","380"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/user-guide/",component:p("/zh-Hans/docs/4.x/user-guide/","f14"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/4.x/user-guide/administrator/apple-team","2b0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/backup",component:p("/zh-Hans/docs/4.x/user-guide/administrator/backup","f68"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs","a4d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics","462"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging","3aa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info","8f2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/permissions",component:p("/zh-Hans/docs/4.x/user-guide/administrator/permissions","cbb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/project-settings",component:p("/zh-Hans/docs/4.x/user-guide/administrator/project-settings","bbb"),exact:!0},{path:"/zh-Hans/docs/4.x/user-guide/apps/create",component:p("/zh-Hans/docs/4.x/user-guide/apps/create","574"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/best_practices",component:p("/zh-Hans/docs/4.x/user-guide/best_practices","9f7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/changelog",component:p("/zh-Hans/docs/4.x/user-guide/changelog","af2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/credits",component:p("/zh-Hans/docs/4.x/user-guide/credits","672"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/dashboard",component:p("/zh-Hans/docs/4.x/user-guide/dashboard","2c7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/debug-files/upload",component:p("/zh-Hans/docs/4.x/user-guide/debug-files/upload","f8f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/qa",component:p("/zh-Hans/docs/4.x/user-guide/qa","a9f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid","31b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/4.x/user-guide/toolkits/teardown","915"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks",component:p("/zh-Hans/docs/4.x/user-guide/webhooks","d21"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk","078"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/discord",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/discord","0f6"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/feishu","c9c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/slack",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/slack","4ac"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/wecom","f3a"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/docs/next",component:p("/zh-Hans/docs/next","e3e"),routes:[{path:"/zh-Hans/docs/next/category/administrator",component:p("/zh-Hans/docs/next/category/administrator","72c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/apps",component:p("/zh-Hans/docs/next/category/apps","260"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/cloud-provider-guides",component:p("/zh-Hans/docs/next/category/cloud-provider-guides","ddb"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/configuration",component:p("/zh-Hans/docs/next/category/configuration","e3d"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/debug-files",component:p("/zh-Hans/docs/next/category/debug-files","1e7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/deployment",component:p("/zh-Hans/docs/next/category/deployment","730"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/local-development",component:p("/zh-Hans/docs/next/category/local-development","3a2"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/category/monitoring",component:p("/zh-Hans/docs/next/category/monitoring","5fb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/sdks",component:p("/zh-Hans/docs/next/category/sdks","dd4"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/category/toolkits",component:p("/zh-Hans/docs/next/category/toolkits","dcc"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/contributing-guide/",component:p("/zh-Hans/docs/next/contributing-guide/","24b"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/next/contributing-guide/local-development/devcontainer","033"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/next/contributing-guide/local-development/source-code","d9f"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/developer-guide/",component:p("/zh-Hans/docs/next/developer-guide/","81a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api",component:p("/zh-Hans/docs/next/developer-guide/api","d7a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api/apps",component:p("/zh-Hans/docs/next/developer-guide/api/apps","8f3"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api/debug_files",component:p("/zh-Hans/docs/next/developer-guide/api/debug_files","0f2"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane",component:p("/zh-Hans/docs/next/developer-guide/fastlane","637"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot","8f6"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file","e8c"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices","ae9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check","ff2"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/sdk/android",component:p("/zh-Hans/docs/next/developer-guide/sdk/android","6e9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/sdk/ios",component:p("/zh-Hans/docs/next/developer-guide/sdk/ios","27f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/self-hosted/",component:p("/zh-Hans/docs/next/self-hosted/","5e5"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/next/self-hosted/configuration/environment-variables","9da"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs","043"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication","357"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/next/self-hosted/deployment/architecture","751"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/docker",component:p("/zh-Hans/docs/next/self-hosted/deployment/docker","a4f"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step","d7b"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/fly",component:p("/zh-Hans/docs/next/self-hosted/deployment/fly","17c"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/next/self-hosted/deployment/kubernetes","11d"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/next/self-hosted/deployment/nomad","f41"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/railway",component:p("/zh-Hans/docs/next/self-hosted/deployment/railway","ca6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/render",component:p("/zh-Hans/docs/next/self-hosted/deployment/render","4ce"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/next/self-hosted/deployment/requirements","f08"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/next/self-hosted/deployment/source-code","ded"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/next/self-hosted/reverse-proxies","49a"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/storage",component:p("/zh-Hans/docs/next/self-hosted/storage","0ff"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/user-guide/",component:p("/zh-Hans/docs/next/user-guide/","1fb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/next/user-guide/administrator/apple-team","383"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/backup",component:p("/zh-Hans/docs/next/user-guide/administrator/backup","4ae"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs","b4c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics","847"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/logging","b1a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info","056"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/permissions",component:p("/zh-Hans/docs/next/user-guide/administrator/permissions","bfc"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/settings",component:p("/zh-Hans/docs/next/user-guide/administrator/settings","a7e"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/",component:p("/zh-Hans/docs/next/user-guide/apps/","7fe"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/create",component:p("/zh-Hans/docs/next/user-guide/apps/create","faa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/detail",component:p("/zh-Hans/docs/next/user-guide/apps/detail","78f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/upload",component:p("/zh-Hans/docs/next/user-guide/apps/upload","d44"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/best_practices",component:p("/zh-Hans/docs/next/user-guide/best_practices","49f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/changelog",component:p("/zh-Hans/docs/next/user-guide/changelog","f9a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/credits",component:p("/zh-Hans/docs/next/user-guide/credits","054"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/dashboard",component:p("/zh-Hans/docs/next/user-guide/dashboard","581"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/",component:p("/zh-Hans/docs/next/user-guide/debug-files/","d57"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/review",component:p("/zh-Hans/docs/next/user-guide/debug-files/review","6df"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/upload",component:p("/zh-Hans/docs/next/user-guide/debug-files/upload","99a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/qa",component:p("/zh-Hans/docs/next/user-guide/qa","f7a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/next/user-guide/toolkits/fetch-udid","204"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/next/user-guide/toolkits/teardown","a6c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks",component:p("/zh-Hans/docs/next/user-guide/webhooks","66b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/next/user-guide/webhooks/dingtalk","784"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/discord",component:p("/zh-Hans/docs/next/user-guide/webhooks/discord","946"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/next/user-guide/webhooks/feishu","42f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/slack",component:p("/zh-Hans/docs/next/user-guide/webhooks/slack","7cb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/next/user-guide/webhooks/wecom","644"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/docs",component:p("/zh-Hans/docs","a28"),routes:[{path:"/zh-Hans/docs/category/administrator",component:p("/zh-Hans/docs/category/administrator","097"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/apps",component:p("/zh-Hans/docs/category/apps","8cd"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/cloud-provider-guides",component:p("/zh-Hans/docs/category/cloud-provider-guides","fbc"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/configuration",component:p("/zh-Hans/docs/category/configuration","346"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/debug-files",component:p("/zh-Hans/docs/category/debug-files","ea0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/deployment",component:p("/zh-Hans/docs/category/deployment","1b8"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/local-development",component:p("/zh-Hans/docs/category/local-development","34b"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/category/monitoring",component:p("/zh-Hans/docs/category/monitoring","adb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/sdks",component:p("/zh-Hans/docs/category/sdks","38f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/category/toolkits",component:p("/zh-Hans/docs/category/toolkits","a3c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/contributing-guide/",component:p("/zh-Hans/docs/contributing-guide/","73c"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/contributing-guide/local-development/devcontainer","862"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/contributing-guide/local-development/source-code","ad0"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/developer-guide/",component:p("/zh-Hans/docs/developer-guide/","274"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api",component:p("/zh-Hans/docs/developer-guide/api","722"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api/apps",component:p("/zh-Hans/docs/developer-guide/api/apps","40f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api/debug_files",component:p("/zh-Hans/docs/developer-guide/api/debug_files","869"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane",component:p("/zh-Hans/docs/developer-guide/fastlane","73d"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot","3fc"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file","4df"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices","d4f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_version_check","ac5"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/sdk/android",component:p("/zh-Hans/docs/developer-guide/sdk/android","cf3"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/sdk/ios",component:p("/zh-Hans/docs/developer-guide/sdk/ios","e8f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/self-hosted/",component:p("/zh-Hans/docs/self-hosted/","78e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/self-hosted/configuration/environment-variables","d54"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/self-hosted/configuration/schedule-jobs","bb1"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/self-hosted/configuration/third-party-authentication","0c6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/self-hosted/deployment/architecture","91f"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/docker",component:p("/zh-Hans/docs/self-hosted/deployment/docker","189"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/self-hosted/deployment/docker/step-by-step","57b"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/fly",component:p("/zh-Hans/docs/self-hosted/deployment/fly","fc2"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/self-hosted/deployment/kubernetes","6b6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/self-hosted/deployment/nomad","719"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/railway",component:p("/zh-Hans/docs/self-hosted/deployment/railway","9ef"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/render",component:p("/zh-Hans/docs/self-hosted/deployment/render","934"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/self-hosted/deployment/requirements","5d9"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/self-hosted/deployment/source-code","415"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/self-hosted/reverse-proxies","a9e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/storage",component:p("/zh-Hans/docs/self-hosted/storage","969"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/user-guide/",component:p("/zh-Hans/docs/user-guide/","859"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/user-guide/administrator/apple-team","38b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/backup",component:p("/zh-Hans/docs/user-guide/administrator/backup","84e"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs","497"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics","4bd"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/logging","f50"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/system-info","bd8"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/permissions",component:p("/zh-Hans/docs/user-guide/administrator/permissions","ac0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/project-settings",component:p("/zh-Hans/docs/user-guide/administrator/project-settings","aec"),exact:!0},{path:"/zh-Hans/docs/user-guide/administrator/settings",component:p("/zh-Hans/docs/user-guide/administrator/settings","408"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/",component:p("/zh-Hans/docs/user-guide/apps/","243"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/create",component:p("/zh-Hans/docs/user-guide/apps/create","27d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/detail",component:p("/zh-Hans/docs/user-guide/apps/detail","ce1"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/upload",component:p("/zh-Hans/docs/user-guide/apps/upload","0e8"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/best_practices",component:p("/zh-Hans/docs/user-guide/best_practices","7a2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/changelog",component:p("/zh-Hans/docs/user-guide/changelog","6e5"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/credits",component:p("/zh-Hans/docs/user-guide/credits","6de"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/dashboard",component:p("/zh-Hans/docs/user-guide/dashboard","5aa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/",component:p("/zh-Hans/docs/user-guide/debug-files/","8d4"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/review",component:p("/zh-Hans/docs/user-guide/debug-files/review","24d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/upload",component:p("/zh-Hans/docs/user-guide/debug-files/upload","503"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/qa",component:p("/zh-Hans/docs/user-guide/qa","8b7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/user-guide/toolkits/fetch-udid","847"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/user-guide/toolkits/teardown","8ee"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks",component:p("/zh-Hans/docs/user-guide/webhooks","936"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/user-guide/webhooks/dingtalk","e82"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/discord",component:p("/zh-Hans/docs/user-guide/webhooks/discord","f58"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/user-guide/webhooks/feishu","5bb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/slack",component:p("/zh-Hans/docs/user-guide/webhooks/slack","4b3"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/user-guide/webhooks/wecom","82b"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/",component:p("/zh-Hans/","df2"),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),s=n(405),i=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),h=n(5742),g=n(2263),m=n(4996),b=n(6668),v=n(1944),y=n(4711),x=n(9727),w=n(3320),k=n(8780),z=n(197);function _(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(h.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(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),o=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,c.TH)();return e+(0,k.applyTrailingSlash)((0,m.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:o;return r.createElement(h.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function H(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(h.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:x.h})),n&&r.createElement(v.d,{image:n}),r.createElement(E,null),r.createElement(_,null),r.createElement(z.Z,{tag:w.HX,locale:e}),r.createElement(h.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const S=new Map;function C(e){if(S.has(e.pathname))return{...e,pathname:S.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return S.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return S.set(e.pathname,t),{...e,pathname:t}}var T=n(8934),L=n(8940);function A(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 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:s}=t;if(s){const e=decodeURIComponent(s.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:o}),A("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=i.Z.canUseDOM?A("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=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=O,R="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",M="__docusaurus-base-url-issue-banner-suggestion-container",G="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return`\nwindow['${G}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${G}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${R}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${D}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${M}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${M}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function B(){const{siteConfig:{baseUrl:e}}=(0,g.Z)();return(0,r.useLayoutEffect)((()=>{window[G]=!1}),[]),r.createElement(r.Fragment,null,!i.Z.canUseDOM&&r.createElement(h.Z,null,r.createElement("script",null,F(e))),r.createElement("div",{id:R}))}function j(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(B,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:a}}=(0,g.Z)(),s=(0,m.Z)(e),{htmlLang:i,direction:l}=a[o];return r.createElement(h.Z,null,r.createElement("html",{lang:i,dir:l}),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:s}))}var U=n(4763),Z=n(2389);function V(){const e=(0,Z.Z)();return r.createElement(h.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function q(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(U.Z,null,r.createElement(L.M,null,r.createElement(T.t,null,r.createElement(p,null,r.createElement($,null),r.createElement(H,null),r.createElement(j,null),r.createElement(I,{location:C(t)},e)),r.createElement(V,null))))}var W=n(6887);const Y=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 K=n(9670);const X=new Set,Q=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Q.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.f)(u.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,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Q.has(e))(e)&&(Q.add(e),P(e))},te=Object.freeze(ee);if(i.Z.canUseDOM){window.docusaurus=te;const e=o.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(s.B6,null,r.createElement(a.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/zh-Hans/docs","versions":[{"name":"current","label":"\u5f00\u53d1\u7248\u672c \ud83d\udea7","isLast":false,"path":"/zh-Hans/docs/next","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/next/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/next/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/next/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/next/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/next/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/next/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/next/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/next/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/next/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/next/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/next/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/next/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/next/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/next/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/next/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/next/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/next/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/next/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/next/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/next/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/next/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/next/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/next/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/next/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/next/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/zh-Hans/docs/next/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/next/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/zh-Hans/docs/next/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/zh-Hans/docs/next/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/zh-Hans/docs/next/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/next/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/next/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/next/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/next/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/zh-Hans/docs/next/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/zh-Hans/docs/next/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/next/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/next/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/next/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/next/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/next/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/next/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/next/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/next/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/next/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/next/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/next/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/next/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/next/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/next/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/next/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/next/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/next/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/next/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/next/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/next/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/next/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/next/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/next/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/next/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}},{"name":"5.0.0","label":"5.0.0","isLast":true,"path":"/zh-Hans/docs","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/zh-Hans/docs/user-guide/administrator/project-settings"},{"id":"user-guide/administrator/settings","path":"/zh-Hans/docs/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/zh-Hans/docs/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/zh-Hans/docs/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/zh-Hans/docs/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/zh-Hans/docs/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/zh-Hans/docs/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}},{"name":"4.x","label":"4.x","isLast":false,"path":"/zh-Hans/docs/4.x","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/4.x/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/4.x/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/4.x/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/4.x/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/4.x/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/4.x/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/4.x/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/4.x/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/4.x/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/4.x/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/4.x/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/4.x/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/4.x/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/4.x/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/4.x/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/4.x/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/4.x/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/4.x/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/4.x/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/4.x/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/4.x/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/4.x/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/zh-Hans/docs/4.x/user-guide/administrator/project-settings"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/4.x/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/4.x/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/4.x/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/4.x/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/4.x/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/4.x/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/4.x/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/4.x/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/4.x/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/4.x/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/4.x/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/4.x/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/4.x/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/4.x/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/4.x/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/4.x/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/4.x/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/4.x/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/4.x/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/4.x/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/4.x/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/4.x/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/4.x/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/4.x/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/4.x/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/4.x/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/4.x/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/4.x/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}}],"breadcrumbs":true}}}'),s=JSON.parse('{"defaultLocale":"en","locales":["en","zh-Hans"],"path":"i18n","currentLocale":"zh-Hans","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var i=n(7529);const l=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-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"}}}'),u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:s,codeTranslations:i},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(412),a=n(5742),s=n(8780),i=n(7961);function l(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(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,s.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,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),s=n(8780),i=n(2263),l=n(3919),u=n(412);const c=o.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,i.Z)(),{withBaseUrl:w}=(0,d.C)(),k=(0,o.useContext)(c),z=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>z.current));const _=p||f;const E=(0,l.Z)(_),H=_?.replace("pathname://","");let S=void 0!==H?(C=H,b&&(e=>e.startsWith("/"))(C)?w(C):C):void 0;var C;S&&E&&(S=(0,s.applyTrailingSlash)(S,{trailingSlash:y,baseUrl:x}));const T=(0,o.useRef)(!1),L=n?a.OL:a.rU,A=u.Z.canUseIntersectionObserver,N=(0,o.useRef)(),P=()=>{T.current||null==S||(window.docusaurus.preload(S),T.current=!0)};(0,o.useEffect)((()=>(!A&&E&&null!=S&&window.docusaurus.prefetch(S),()=>{A&&N.current&&N.current.disconnect()})),[N,S,A,E]);const O=S?.startsWith("#")??!1,I=!S||!E||O;return I||m||k.collectLink(S),I?o.createElement("a",(0,r.Z)({ref:z,href:S},_&&!E&&{target:"_blank",rel:"noopener noreferrer"},v)):o.createElement(L,(0,r.Z)({},v,{onMouseEnter:P,onTouchStart:P,innerRef:e=>{z.current=e,A&&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!=S&&window.docusaurus.prefetch(S))}))})),N.current.observe(e))},to:S},n&&{isActive:g,activeClassName:h}))}const f=o.forwardRef(p)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>i});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 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 a[t??n]??n??t}function i(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function l(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 i=s({message:t,id:n});return r.createElement(r.Fragment,null,o(i,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:()=>s,Z:()=>i});var r=n(7294),o=n(2263),a=n(3919);function s(){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:s=!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 i=n.startsWith(t)?n:t+n.replace(/^\//,"");return s?e+i:i}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=s();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,s]=n;const i=o?`${o}.${a}`:a;r(s)?e(s,i):t[i]=s}))}(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),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:a,value:n})),[a,n]);return r.createElement(o.Provider,{value:s},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>c,Jo:()=>m,zh:()=>d,yW:()=>h,gB:()=>f});var r=n(6550),o=n(2263),a=n(9935);function s(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 i=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=i(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(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={},c=()=>s("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=s(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 p(e){void 0===e&&(e={});const t=c(),{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 f(e){return d(e).versions}function h(e){const t=d(e);return i(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},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(1472)(`./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"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var r=n(7294),o=n(4334),a=n(4763),s=n(1944),i=n(7462),l=n(6550),u=n(5999),c=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,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,u.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 g(e){const t=e.children??h,{containerRef:n,onClick:o}=f();return r.createElement("div",{ref:n,role:"region","aria-label":h},r.createElement("a",(0,i.Z)({},e,{href:`#${d}`,onClick:o}),t))}var m=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var x=n(6668),w=n(9689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:s,...l}=e;return r.createElement("svg",(0,i.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const z={closeButton:"closeButton_CVFx"};function _(e){return r.createElement("button",(0,i.Z)({type:"button","aria-label":(0,u.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",z.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const E={content:"content_knG7"};function H(e){const{announcementBar:t}=(0,x.L)(),{content:n}=t;return r.createElement("div",(0,i.Z)({},e,{className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const S={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,x.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:o,textColor:a,isCloseable:s}=e;return r.createElement("div",{className:S.announcementBar,style:{backgroundColor:o,color:a},role:"banner"},s&&r.createElement("div",{className:S.announcementBarPlaceholder}),r.createElement(H,{className:S.announcementBarContent}),s&&r.createElement(_,{onClick:n,className:S.announcementBarClose}))}var T=n(3163),L=n(2466);var A=n(902),N=n(3102);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,T.e)(),t=(0,N.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,s=(0,A.D9)(a);return(0,r.useEffect)((()=>{a&&!s&&o(!0)}),[a,s]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return r.createElement(P.Provider,{value:n},t)}function I(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(P);if(!e)throw new A.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:I(a)})),[o,a,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:s}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":s})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var M=n(2949),G=n(2389);function F(e){return r.createElement("svg",(0,i.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 B(e){return r.createElement("svg",(0,i.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 j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:a,onChange:s}=e;const i=(0,G.Z)(),l=(0,u.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,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.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)(j.toggle,t)},r.createElement("button",{className:(0,o.Z)("clean-btn",j.toggleButton,!i&&j.toggleButtonDisabled,n),type:"button",onClick:()=>s("dark"===a?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(F,{className:(0,o.Z)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(B,{className:(0,o.Z)(j.toggleIcon,j.darkToggleIcon)})))}const U=r.memo($),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.L)().navbar.style,o=(0,x.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:s}=(0,M.I)();return o?null:r.createElement(U,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:s})}var q=n(1327);function W(){return r.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,T.e)();return r.createElement("button",{type:"button","aria-label":(0,u.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 K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:s,html:l,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const p=(0,Q.Z)(o),f=(0,Q.Z)(t),h=(0,Q.Z)(a,{forcePrependBaseUrl:!0}),g=s&&a&&!(0,J.Z)(a),m=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,s,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return a?r.createElement(X.Z,(0,i.Z)({href:c?h:a},d,m)):r.createElement(X.Z,(0,i.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},d,m))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const s=r.createElement(ne,(0,i.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},a));return n?r.createElement("li",null,s):s}function oe(e){let{className:t,isDropdownItem:n,...a}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,i.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,i.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(6043),ie=n(8596),le=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:s,...l}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.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)}}),[u]),r.createElement("div",{ref:u,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,i.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.Z)("navbar__link",a)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(_e,(0,i.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:a,onClick:s,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,se.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,i.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),f()}}),u.children??u.label),r.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(_e,(0,i.Z)({mobile:!0,isDropdownItem:!0,onClick:s,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const o=t?de:ce;return r.createElement(o,n)}var fe=n(4711);function he(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,i.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 ge="iconLanguage_nlXk";var me=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,be.searchBox)},t)}var ye=n(143),xe=n(3438);var we=n(373);const ke=e=>e.docs.find((t=>t.id===e.mainDocId));const ze={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,...a}=e;const{i18n:{currentLocale:s,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:h}=(0,l.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===s?t?"menu__link--active":"dropdown__link--active":""}})),...o],m=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[s].label;return r.createElement(pe,(0,i.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(he,{className:ge}),m),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(me.Z,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:s=!1}=e;const i=s?"li":"div";return r.createElement(i,{className:(0,o.Z)({navbar__item:!a&&!s,"menu__list-item":a},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:s}=(0,ye.Iw)(o),l=(0,xe.vY)(t,o);return null===l?null:r.createElement(ae,(0,i.Z)({exact:!0},a,{isActive:()=>s?.path===l.path||!!s?.sidebar&&s.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:s}=(0,ye.Iw)(o),l=(0,xe.oz)(t,o).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,i.Z)({exact:!0},a,{isActive:()=>s?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const s=(0,xe.lO)(o)[0],l=t??s.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(s).path;return r.createElement(ae,(0,i.Z)({},a,{label:l,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:s,...c}=e;const{search:d,hash:p}=(0,l.TH)(),f=(0,ye.Iw)(n),h=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,we.J)(n),m=[...a,...h.map((e=>{const t=f.alternateDocVersions[e.name]??ke(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...s],b=(0,xe.lO)(n)[0],v=t&&m.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&m.length>1?void 0:ke(b).path;return m.length<=1?r.createElement(ae,(0,i.Z)({},c,{mobile:t,label:v,to:y,isActive:o?()=>!1:void 0})):r.createElement(pe,(0,i.Z)({},c,{mobile:t,label:v,to:y,items:m,isActive:o?()=>!1:void 0}))}};function _e(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=ze[o];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(a,n)}function Ee(){const e=(0,T.e)(),t=(0,x.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(_e,(0,i.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function He(e){return r.createElement("button",(0,i.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.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 Se(){const e=0===(0,x.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(He,{onClick:()=>t.hide()}),t.content)}function Ce(){const e=(0,T.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(D,{header:r.createElement(K,null),primaryMenu:r.createElement(Ee,null),secondaryMenu:r.createElement(Se,null)}):null}const Te={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return r.createElement("div",(0,i.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Ae(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.L)(),s=(0,T.e)(),{navbarRef:i,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),s=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((t,r)=>{let{scrollY:s}=t;if(!e)return;if(s<a.current)return void n(!0);if(o.current)return void(o.current=!1);const i=r?.scrollY,l=document.documentElement.scrollHeight-a.current,u=window.innerHeight;i&&s>=i?n(!1):s+u<l&&n(!0)})),(0,c.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:s,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:i,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Te.navbarHideable,!l&&Te.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":s.shown})},t,r.createElement(Le,{onClick:s.toggle}),r.createElement(Ce,null))}var Ne=n(8780);const Pe={errorBoundaryError:"errorBoundaryError_a6uf"};function Oe(e){return r.createElement("button",(0,i.Z)({type:"button"},e),r.createElement(u.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 Ie(e){let{error:t}=e;const n=(0,Ne.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Pe.errorBoundaryError},n)}class Re extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const De="right";function Me(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,i.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 Ge(){const{toggle:e,shown:t}=(0,T.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.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(Me,null))}const Fe={colorModeToggle:"colorModeToggle_DEke"};function Be(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Re,{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(_e,e)))))}function je(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 $e(){const e=(0,T.e)(),t=(0,x.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??De)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement(je,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ge,null),r.createElement(W,null),r.createElement(Be,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Be,{items:o}),r.createElement(V,{className:Fe.colorModeToggle}),!a&&r.createElement(ve,null,r.createElement(me.Z,null)))})}function Ue(){return r.createElement(Ae,null,r.createElement($e,null))}function Ze(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:s,...l}=t,u=(0,Q.Z)(n),c=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,i.Z)({className:"footer__link-item"},o?{href:s?c:o}:{to:u},l),a,o&&!(0,J.Z)(o)&&r.createElement(te.Z,null))}function Ve(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(Ze,{item:t}))}function qe(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(Ve,{key:t,item:e})))))}function We(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(qe,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function Xe(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(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(We,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:a,copyright:s}=e;return r.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(a||s)&&r.createElement("div",{className:"footer__bottom text--center"},a&&r.createElement("div",{className:"margin-bottom--sm"},a),s)))}function at(){const{footer:e}=(0,x.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(ot,{style:a,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:o&&r.createElement(nt,{logo:o}),copyright:t&&r.createElement(rt,{copyright:t})})}const st=r.memo(at),it=(0,A.Qc)([M.S,w.pl,L.OC,we.L5,s.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(T.M,null,r.createElement(O,null,t)))}]);function lt(e){let{children:t}=e;return r.createElement(it,null,t)}function ut(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.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(Oe,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Ie,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:i,title:l,description:u}=e;return(0,b.t)(),r.createElement(lt,null,r.createElement(s.d,{title:l,description:u}),r.createElement(y,null),r.createElement(C,null),r.createElement(Ue,null),r.createElement("div",{id:d,className:(0,o.Z)(m.k.wrapper.main,ct.mainWrapper,i)},r.createElement(a.Z,{fallback:e=>r.createElement(ut,e)},t)),!n&&r.createElement(st,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),o=n(7294),a=n(9960),s=n(4996),i=n(2263),l=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,s.Z)(t.src),dark:(0,s.Z)(t.srcDark||t.src)},i=o.createElement(u.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},i):i}function d(e){const{siteConfig:{title:t}}=(0,i.Z)(),{navbar:{title:n,logo:u}}=(0,l.L)(),{imageClassName:d,titleClassName:p,...f}=e,h=(0,s.Z)(u?.href||"/"),g=n?"":t,m=u?.alt??g;return o.createElement(a.Z,(0,r.Z)({to:h},f,u?.target&&{target:u.target}),u&&o.createElement(c,{logo:u,alt:m,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 s=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}),s&&r.createElement("meta",{name:"docsearch:language",content:s}),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:()=>u});var r=n(7462),o=n(7294),a=n(4334),s=n(2389),i=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,s.Z)(),{colorMode:n}=(0,i.I)(),{sources:u,className:c,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:u[e],alt:d,className:(0,a.Z)(l.themedImage,l[`themedImage--${e}`],c)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>m});var r=n(7462),o=n(7294),a=n(412),s=n(1442);const i="ease-in-out";function l(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 u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;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,s.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??i}`,height:`${t}px`}}function l(){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?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!a.Z.canUseDOM)return e?u:c}function h(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:s,className:i,disableSSRStyle:l}=e;const u=(0,o.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),o.createElement(t,{ref:u,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),s?.(n))},className:i},r)}function g(e){let{collapsed:t,...n}=e;const[a,s]=(0,o.useState)(!t),[i,l]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||s(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&l(t)}),[a,t]),a?o.createElement(h,(0,r.Z)({},n,{collapsed:i})):null}function m(e){let{lazy:t,...n}=e;const r=t?g:h;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>f});var r=n(7294),o=n(2389),a=n(12),s=n(902),i=n(6668);const l=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),c=()=>"true"===l.get(),d=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,i.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const s=(0,r.useCallback)((()=>{d(!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&&d(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:s})),[e,n,s])}();return r.createElement(p.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>m,S:()=>g});var r=n(7294),o=n(412),a=n(902),s=n(12),i=n(6668);const l=r.createContext(void 0),u="theme",c=(0,s.WA)(u),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),h=e=>{c.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),[o,a]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(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?d.dark:d.light:e),c.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!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);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:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===d.dark},setLightTheme(){s(d.light)},setDarkTheme(){s(d.dark)}})),[o,s])}();return r.createElement(l.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(l);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:()=>m});var r=n(7294),o=n(143),a=n(9935),s=n(6668),i=n(3438),l=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,o._r)(),t=(0,s.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,i]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{i(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),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(f.Provider,{value:n},t)}function m(e){let{children:t}=e;return i.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,s]=b(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find((e=>e.name===i))??null,savePreferredVersionName:(0,r.useCallback)((t=>{s.savePreferredVersion(e,t)}),[s,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>i});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),s=r.createContext(a);function i(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(s.Provider,{value:a},t)}function l(){const e=(0,r.useContext)(s);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>i,q:()=>s});var r=n(7294),o=n(902);const a=r.createContext(null);function s(e){let{children:t,version:n}=e;return r.createElement(a.Provider,{value:n},t)}function i(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");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),s=n(1980),i=n(6668),l=n(902);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,i.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,u]=(0,r.useState)(!1);(0,s.Rb)((()=>{if(l)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>i,Zo:()=>l,n2:()=>s});var r=n(7294),o=n(902);const a=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function i(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const s=(0,r.useContext)(a);if(!s)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,i]=s,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{i({component:t,props:l})}),[i,t,l]),(0,r.useEffect)((()=>()=>i({component:null,props:null})),[i]),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)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},s=996;function i(){return o.Z.canUseDOM?window.innerWidth>s?a.desktop:a.mobile:a.ssr}const l=!1;function u(){const[e,t]=(0,r.useState)((()=>l?"ssr":i()));return(0,r.useEffect)((()=>{function e(){t(i())}const n=l?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})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>E,Wl:()=>h,_F:()=>v,cE:()=>p,hI:()=>_,jA:()=>g,lO:()=>w,oz:()=>k,s1:()=>x,vY:()=>z,xz:()=>f});var r=n(7294),o=n(6550),a=n(8790),s=n(143),i=n(373),l=n(4477),u=n(1116),c=n(7392),d=n(8596);const p=!!s._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function h(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=h(t);if(e)return e}}}function g(){const{pathname:e}=(0,o.TH)(),t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||b(e.items,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.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,u.V)(),{pathname:t}=(0,o.TH)(),n=(0,s.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,s.Iw)(e),{preferredVersion:n}=(0,i.J)(e),o=(0,s.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([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 z(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- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),s=t.routes,i=s.find((e=>(0,o.LX)(r.pathname,e)));if(!i)return null;const l=i.sidebar,u=l?n.docsSidebars[l]:void 0;return{docElement:(0,a.H)(s),sidebarName:l,sidebarItems:u}}function E(e){return e.filter((e=>"category"!==e.type||!!h(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(7294),o=n(6550),a=n(1688),s=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,s.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(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)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>c,VC:()=>f});var r=n(7294),o=n(7459),a=n(5742),s=n(226);function i(){const e=r.useContext(s._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:o,image:s,children:i}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=s?d(s,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),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}),i)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const s=r.useContext(d),i=(0,o.Z)(s,t);return r.createElement(d.Provider,{value:i},r.createElement(a.Z,null,r.createElement("html",{className:i})),n)}function f(e){let{children:t}=e;const n=i(),a=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const s=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,o.Z)(a,s)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>l,i6:()=>i,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 s(e){const t=(0,r.useRef)();return o((()=>{t.current=e})),t.current}class i 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 l(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 r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>s,Ns:()=>i});var r=n(7294),o=n(723),a=n(2263);function s(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){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:()=>f,OC:()=>l,RF:()=>d,o5:()=>p});var r=n(7294),o=n(412),a=n(2389),s=n(902);const i=r.createContext(void 0);function l(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(i.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(i);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const c=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(c()),a=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();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=u(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function f(){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:()=>r,os:()=>o});n(2263);const r="default";function o(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>c});var r=n(7294),o=n(1688);const a="localStorage";function s(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const u={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(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=i(t?.persistence);return null===n?u:{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),s({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),s({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),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?u:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,o.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(2263),o=n(6550),a=n(8780);function s(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:s,currentLocale:i}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),u=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=i===s?e:e.replace(`/${i}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===s?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>s});var r=n(7294),o=n(6550),a=n(902);function s(e){const t=(0,o.TH)(),n=(0,a.D9)(t),s=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&s({location:t,previousLocation:n})}),[s,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}},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:(s=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(s):function(e){return e.endsWith("/")?e.slice(0,-1):e}(s));var s;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}})},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>x,q_:()=>H,ob:()=>f,PP:()=>C,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 s=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],s=t&&t.split("/")||[],i=e&&o(e),l=t&&o(t),u=i||l;if(e&&o(e)?s=r:r.length&&(s.pop(),s=s.concat(r)),!s.length)return"/";if(s.length){var c=s[s.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,p=s.length;p>=0;p--){var f=s[p];"."===f?a(s,p):".."===f?(a(s,p),d++):d&&(a(s,p),d--)}if(!u)for(;d--;d)s.unshift("..");!u||""===s[0]||s[0]&&o(s[0])||s.unshift("");var h=s.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var i=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function 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(i){throw i instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=s(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){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 g=!("undefined"==typeof window||!window.document||!window.document.createElement);function m(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={}),g||(0,i.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")),s=e,u=s.forceRefresh,x=void 0!==u&&u,w=s.getUserConfirmation,k=void 0===w?m:w,z=s.keyLength,_=void 0===z?6:z,E=e.basename?d(l(e.basename)):"";function H(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return E&&(a=c(a,E)),f(a,r,n)}function S(){return Math.random().toString(36).substr(2,_)}var C=h();function T(e){(0,r.Z)(B,e),B.length=n.length,C.notifyListeners(B.location,B.action)}function L(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(H(e.state))}function A(){P(H(y()))}var N=!1;function P(e){if(N)N=!1,T();else{C.confirmTransitionTo(e,"POP",k,(function(t){t?T({action:"POP",location:e}):function(e){var t=B.location,n=I.indexOf(t.key);-1===n&&(n=0);var r=I.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(N=!0,D(o))}(e)}))}}var O=H(y()),I=[O.key];function R(e){return E+p(e)}function D(e){n.go(e)}var M=0;function G(e){1===(M+=e)&&1===e?(window.addEventListener(b,L),a&&window.addEventListener(v,A)):0===M&&(window.removeEventListener(b,L),a&&window.removeEventListener(v,A))}var F=!1;var B={length:n.length,action:"POP",location:O,createHref:R,push:function(e,t){var r="PUSH",a=f(e,t,S(),B.location);C.confirmTransitionTo(a,r,k,(function(e){if(e){var t=R(a),s=a.key,i=a.state;if(o)if(n.pushState({key:s,state:i},null,t),x)window.location.href=t;else{var l=I.indexOf(B.location.key),u=I.slice(0,l+1);u.push(a.key),I=u,T({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,S(),B.location);C.confirmTransitionTo(a,r,k,(function(e){if(e){var t=R(a),s=a.key,i=a.state;if(o)if(n.replaceState({key:s,state:i},null,t),x)window.location.replace(t);else{var l=I.indexOf(B.location.key);-1!==l&&(I[l]=a.key),T({action:r,location:a})}else window.location.replace(t)}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return F||(G(1),F=!0),function(){return F&&(F=!1,G(-1)),t()}},listen:function(e){var t=C.appendListener(e);return G(1),function(){G(-1),t()}}};return B}var w="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+u(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:u,decodePath:l},slash:{encodePath:l,decodePath:l}};function z(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(z(window.location.href)+"#"+e)}function H(e){void 0===e&&(e={}),g||(0,i.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?m:o,s=n.hashType,u=void 0===s?"slash":s,b=e.basename?d(l(e.basename)):"",v=k[u],y=v.encodePath,x=v.decodePath;function H(){var e=x(_());return b&&(e=c(e,b)),f(e)}var S=h();function C(e){(0,r.Z)(F,e),F.length=t.length,S.notifyListeners(F.location,F.action)}var T=!1,L=null;function A(){var e,t,n=_(),r=y(n);if(n!==r)E(r);else{var o=H(),s=F.location;if(!T&&(t=o,(e=s).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(L===p(o))return;L=null,function(e){if(T)T=!1,C();else{var t="POP";S.confirmTransitionTo(e,t,a,(function(n){n?C({action:t,location:e}):function(e){var t=F.location,n=I.lastIndexOf(p(t));-1===n&&(n=0);var r=I.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(T=!0,R(o))}(e)}))}}(o)}}var N=_(),P=y(N);N!==P&&E(P);var O=H(),I=[p(O)];function R(e){t.go(e)}var D=0;function M(e){1===(D+=e)&&1===e?window.addEventListener(w,A):0===D&&window.removeEventListener(w,A)}var G=!1;var F={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=z(window.location.href)),n+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,F.location);S.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);if(_()!==o){L=t,function(e){window.location.hash=e}(o);var a=I.lastIndexOf(p(F.location)),s=I.slice(0,a+1);s.push(t),I=s,C({action:n,location:r})}else C()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,F.location);S.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);_()!==o&&(L=t,E(o));var a=I.indexOf(p(F.location));-1!==a&&(I[a]=t),C({action:n,location:r})}}))},go:R,goBack:function(){R(-1)},goForward:function(){R(1)},block:function(e){void 0===e&&(e=!1);var t=S.setPrompt(e);return G||(M(1),G=!0),function(){return G&&(G=!1,M(-1)),t()}},listen:function(e){var t=S.appendListener(e);return M(1),function(){M(-1),t()}}};return F}function S(e,t,n){return Math.min(Math.max(e,t),n)}function C(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,s=t.initialIndex,i=void 0===s?0:s,l=t.keyLength,u=void 0===l?6:l,c=h();function d(e){(0,r.Z)(x,e),x.length=x.entries.length,c.notifyListeners(x.location,x.action)}function g(){return Math.random().toString(36).substr(2,u)}var m=S(i,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?g():e.key||g())})),v=p;function y(e){var t=S(x.index+e,0,x.entries.length-1),r=x.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var x={length:b.length,action:"POP",location:b[m],index:m,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,g(),x.location);c.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,g(),x.location);c.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),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return x}},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},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function l(e){return r.isMemo(e)?s:i[e.$$typeof]||o}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[r.Memo]=s;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var s=c(n);d&&(s=s.concat(d(n)));for(var i=l(t),g=l(n),m=0;m<s.length;++m){var b=s[m];if(!(a[b]||r&&r[b]||g&&g[b]||i&&i[b])){var v=p(n,b);try{u(t,b,v)}catch(y){}}}}return t}},1143:e=>{"use strict";e.exports=function(e,t,n,r,o,a,s,i){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 u=[n,r,o,a,s,i],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},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 s(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),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,i((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,s(e,c,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,s=t.querySelector(r.barSelector),i=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return l(s,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&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 i=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 u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(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,s,i=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l<arguments.length;l++){for(var u in a=Object(arguments[l]))n.call(a,u)&&(i[u]=a[u]);if(t){s=t(a);for(var c=0;c<s.length;c++)r.call(a,s[c])&&(i[s[c]]=a[s[c]])}}return i}},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 s in o={},n[a]=o,t)t.hasOwnProperty(s)&&(o[s]=e(t[s],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],s={};for(var i in a)if(a.hasOwnProperty(i)){if(i==t)for(var l in n)n.hasOwnProperty(l)&&(s[l]=n[l]);n.hasOwnProperty(i)||(s[i]=a[i])}var u=o[e];return o[e]=s,r.languages.DFS(r.languages,(function(t,n){n===u&&t!=e&&(this[t]=s)})),s},DFS:function e(t,n,o,a){a=a||{};var s=r.util.objId;for(var i in t)if(t.hasOwnProperty(i)){n.call(t,i,t[i],o||i);var l=t[i],u=r.util.type(l);"Object"!==u||a[s(l)]?"Array"!==u||a[s(l)]||(a[s(l)]=!0,e(l,n,i,a)):(a[s(l)]=!0,e(l,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 i;return l(o,o.head,e),s(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 s(e,t,n,i,c,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var h=0;h<f.length;++h){if(d&&d.cause==p+","+h)return;var g=f[h],m=g.inside,b=!!g.lookbehind,v=!!g.greedy,y=g.alias;if(v&&!g.pattern.global){var x=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,x+"g")}for(var w=g.pattern||g,k=i.next,z=c;k!==t.tail&&!(d&&z>=d.reach);z+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,H=1;if(v){if(!(E=a(w,z,e,b))||E.index>=e.length)break;var S=E.index,C=E.index+E[0].length,T=z;for(T+=k.value.length;S>=T;)T+=(k=k.next).value.length;if(z=T-=k.value.length,k.value instanceof o)continue;for(var L=k;L!==t.tail&&(T<C||"string"==typeof L.value);L=L.next)H++,T+=L.value.length;H--,_=e.slice(z,T),E.index-=z}else if(!(E=a(w,0,_,b)))continue;S=E.index;var A=E[0],N=_.slice(0,S),P=_.slice(S+A.length),O=z+_.length;d&&O>d.reach&&(d.reach=O);var I=k.prev;if(N&&(I=l(t,I,N),z+=N.length),u(t,I,H),k=l(t,I,new o(p,m?r.tokenize(A,m):A,y,A)),P&&l(t,k,P),H>1){var R={cause:p+","+h,reach:O};s(e,t,n,k.prev,z,R),d&&R.reach>d.reach&&(d.reach=R.reach)}}}}}}function i(){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 u(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},s=t.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(a.classes,s):a.classes.push(s)),r.hooks.run("wrap",a);var i="";for(var l in a.attributes)i+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+i+">"+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,s=0;s<o.length;s++)a[o[s]]=e.languages.bash[o[s]];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 s(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:s(/\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:s(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:s(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:s(a),lookbehind:!0,greedy:!0},number:{pattern:s(/[+-]?(?: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],s=o.content[3];if(a&&s&&"code-language"===a.type&&"code-block"===s.type&&"string"==typeof a.content){var i=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),l="language-"+(i=(/[a-z][\w-]*/i.exec(i)||[""])[0].toLowerCase());s.alias?"string"==typeof s.alias?s.alias=[s.alias,l]:s.alias.push(l):s.alias=[l]}}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],u=/language-(.+)/.exec(a);if(u){n=u[1];break}}var c,d=e.languages[n];if(d)t.content=e.highlight((c=t.content,c.replace(s,"").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)),l(n);var r=i[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 s=RegExp(e.languages.markup.tag.pattern.source,"gi"),i={amp:"&",lt:"<",gt:">",quot:'"'},l=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"])&&"("===c(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var s=c(0);"variable"===s.type&&(f(s,"variable-input"),o.push(s.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===c(0).content&&(n++,f(c(0),"property-mutation"),o.length>0)){var i=p(/^\{$/,/^\}$/);if(-1===i)continue;for(var l=n;l<i;l++){var u=t[l];"variable"===u.type&&o.indexOf(u.content)>=0&&f(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function p(e,r){for(var o=1,a=n;a<t.length;a++){var s=t[a],i=s.content;if("punctuation"===s.type&&"string"==typeof i)if(e.test(i))o++;else if(r.test(i)&&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 s(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 i(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(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 u(t){var n={};n["interpolation-punctuation"]=o;var a=e.tokenize(t,n);if(3===a.length){var s=[1,1];s.push.apply(s,l(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,s)}return new e.Token("interpolation",a,r.alias,t)}function c(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),s=0,c={},d=l(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=i(s++,r)););return c[n]=o,n})).join(""),n,r),p=Object.keys(c);return s=0,function e(t){for(var n=0;n<t.length;n++){if(s>=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var o=p[s],a="string"==typeof r?r:r.content,i=a.indexOf(o);if(-1!==i){++s;var l=a.substring(0,i),d=u(c[o]),f=a.substring(i+o.length),h=[];if(l&&h.push(l),h.push(d),f){var g=[f];e(g),h.push.apply(h,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(h)),n+=h.length-1):r.content=h}}else{var m=r.content;Array.isArray(m)?e(m):e([m])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[s("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),s("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),s("svg",/\bsvg/.source),s("markdown",/\b(?:markdown|md)/.source),s("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),s("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 s=a.content;if(Array.isArray(s))if("template-string"===a.type){var i=s[1];if(3===s.length&&"string"!=typeof i&&"embedded-code"===i.type){var l=p(i),u=i.alias,d=Array.isArray(u)?u[0]:u,f=e.languages[d];if(!f)continue;s[1]=c(l,f,d)}}else t(s);else"string"!=typeof s&&t([s])}}}(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 s=a.inside||{};a.inside=s,s["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 s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""},i=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===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}):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 l=s(o);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(l+=s(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=s(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}o.content&&"string"!=typeof o.content&&i(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(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 s=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,i=s.length;-1!==n.code.indexOf(o=t(r,i));)++i;return s[i]=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 s(i){for(var l=0;l<i.length&&!(o>=a.length);l++){var u=i[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=a[o],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),h=p.indexOf(f);if(h>-1){++o;var g=p.substring(0,h),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),v=[];g&&v.push.apply(v,s([g])),v.push(m),b&&v.push.apply(v,s([b])),"string"==typeof u?i.splice.apply(i,[l,1].concat(v)):u.content=v}}else u.content&&s(u.content)}return i}(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},485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},4677:()=>{Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},3436:()=>{!function(e){var t=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:t}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:t}},punctuation:/[{};]/}}(Prism)},9385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},874:()=>{Prism.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:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},1472:(e,t,n)=>{var r={"./prism-groovy":485,"./prism-hcl":4677,"./prism-java":2503,"./prism-kotlin":2334,"./prism-nginx":3436,"./prism-ruby":9385,"./prism-swift":874,"./prism-toml":9930};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=1472},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,s){if(s!==r){var i=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 i.name="Invariant Violation",i}}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 s(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(s(227));var i=new Set,l={};function u(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)i.add(t[e])}var 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,h={},g={};function m(e,t,n,r,o,a,s){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=s}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function x(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(g,e)||!f.call(h,e)&&(p.test(e)?g[e]=!0:(h[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 m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,z=60106,_=60107,E=60108,H=60114,S=60109,C=60110,T=60112,L=60113,A=60120,N=60115,P=60116,O=60121,I=60128,R=60129,D=60130,M=60131;if("function"==typeof Symbol&&Symbol.for){var G=Symbol.for;k=G("react.element"),z=G("react.portal"),_=G("react.fragment"),E=G("react.strict_mode"),H=G("react.profiler"),S=G("react.provider"),C=G("react.context"),T=G("react.forward_ref"),L=G("react.suspense"),A=G("react.suspense_list"),N=G("react.memo"),P=G("react.lazy"),O=G("react.block"),G("react.scope"),I=G("react.opaque.id"),R=G("react.debug_trace_mode"),D=G("react.offscreen"),M=G("react.legacy_hidden")}var F,B="function"==typeof Symbol&&Symbol.iterator;function j(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=B&&e[B]||e["@@iterator"])?e:null}function $(e){if(void 0===F)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);F=t&&t[1]||""}return"\n"+F+e}var U=!1;function Z(e,t){if(!e||U)return"";U=!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(l){var r=l}Reflect.construct(e,[],t)}else{try{t.call()}catch(l){r=l}e.call(t.prototype)}else{try{throw Error()}catch(l){r=l}e()}}catch(l){if(l&&r&&"string"==typeof l.stack){for(var o=l.stack.split("\n"),a=r.stack.split("\n"),s=o.length-1,i=a.length-1;1<=s&&0<=i&&o[s]!==a[i];)i--;for(;1<=s&&0<=i;s--,i--)if(o[s]!==a[i]){if(1!==s||1!==i)do{if(s--,0>--i||o[s]!==a[i])return"\n"+o[s].replace(" at new "," at ")}while(1<=s&&0<=i);break}}}finally{U=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?$(e):""}function V(e){switch(e.tag){case 5:return $(e.type);case 16:return $("Lazy");case 13:return $("Suspense");case 19:return $("SuspenseList");case 0:case 2:case 15:return e=Z(e.type,!1);case 11:return e=Z(e.type.render,!1);case 22:return e=Z(e.type._render,!1);case 1:return e=Z(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case _:return"Fragment";case z:return"Portal";case H:return"Profiler";case E:return"StrictMode";case L:return"Suspense";case A:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case C:return(e.displayName||"Context")+".Consumer";case S:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case N:return q(e.type);case O:return q(e._render);case P:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var 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 X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return 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)&&x(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&&Q(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 se(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 ie(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(s(91));return o({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function le(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(s(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(s(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function ue(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={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 he,ge,me=(ge=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((he=he||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=he.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ge(e,t)}))}:ge);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var 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 xe(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 we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=xe(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 ze(e,t){if(t){if(ke[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(s(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(s(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(s(62))}}function _e(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 Ee(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var He=null,Se=null,Ce=null;function Te(e){if(e=no(e)){if("function"!=typeof He)throw Error(s(280));var t=e.stateNode;t&&(t=oo(t),He(e.stateNode,e.type,t))}}function Le(e){Se?Ce?Ce.push(e):Ce=[e]:Se=e}function Ae(){if(Se){var e=Se,t=Ce;if(Ce=Se=null,Te(e),t)for(e=0;e<t.length;e++)Te(t[e])}}function Ne(e,t){return e(t)}function Pe(e,t,n,r,o){return e(t,n,r,o)}function Oe(){}var Ie=Ne,Re=!1,De=!1;function Me(){null===Se&&null===Ce||(Oe(),Ae())}function Ge(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(s(231,t,typeof n));return n}var Fe=!1;if(d)try{var Be={};Object.defineProperty(Be,"passive",{get:function(){Fe=!0}}),window.addEventListener("test",Be,Be),window.removeEventListener("test",Be,Be)}catch(ge){Fe=!1}function je(e,t,n,r,o,a,s,i,l){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(c){this.onError(c)}}var $e=!1,Ue=null,Ze=!1,Ve=null,qe={onError:function(e){$e=!0,Ue=e}};function We(e,t,n,r,o,a,s,i,l){$e=!1,Ue=null,je.apply(qe,arguments)}function Ye(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 Ke(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(s(188))}function Qe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(e)))throw Error(s(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 Xe(o),e;if(a===r)return Xe(o),t;a=a.sibling}throw Error(s(188))}if(n.return!==r.return)n=o,r=a;else{for(var i=!1,l=o.child;l;){if(l===n){i=!0,n=o,r=a;break}if(l===r){i=!0,r=o,n=a;break}l=l.sibling}if(!i){for(l=a.child;l;){if(l===n){i=!0,n=a,r=o;break}if(l===r){i=!0,r=a,n=o;break}l=l.sibling}if(!i)throw Error(s(189))}}if(n.alternate!==r)throw Error(s(190))}if(3!==n.tag)throw Error(s(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=[],st=null,it=null,lt=null,ut=new Map,ct=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 ht(e,t){switch(e){case"focusin":case"focusout":st=null;break;case"dragenter":case"dragleave":it=null;break;case"mouseover":case"mouseout":lt=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function gt(e,t,n,r,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 mt(e){var t=to(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ke(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=Qt(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=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&at.shift()}null!==st&&bt(st)&&(st=null),null!==it&&bt(it)&&(it=null),null!==lt&&bt(lt)&&(lt=null),ut.forEach(vt),ct.forEach(vt)}function xt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,yt)))}function wt(e){function t(t){return xt(t,e)}if(0<at.length){xt(at[0],e);for(var n=1;n<at.length;n++){var r=at[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==st&&xt(st,e),null!==it&&xt(it,e),null!==lt&&xt(lt,e),ut.forEach(t),ct.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)mt(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 zt={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},_t={},Et={};function Ht(e){if(_t[e])return _t[e];if(!zt[e])return e;var t,n=zt[e];for(t in n)if(n.hasOwnProperty(t)&&t in Et)return _t[e]=n[t];return e}d&&(Et=document.createElement("div").style,"AnimationEvent"in window||(delete zt.animationend.animation,delete zt.animationiteration.animation,delete zt.animationstart.animation),"TransitionEvent"in window||delete zt.transitionend.transition);var St=Ht("animationend"),Ct=Ht("animationiteration"),Tt=Ht("animationstart"),Lt=Ht("transitionend"),At=new Map,Nt=new Map,Pt=["abort","abort",St,"animationEnd",Ct,"animationIteration",Tt,"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",Lt,"transitionEnd","waiting","waiting"];function Ot(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),At.set(r,o),u(o,[r])}}(0,a.unstable_now)();var It=8;function Rt(e){if(0!=(1&e))return It=15,1;if(0!=(2&e))return It=14,2;if(0!=(4&e))return It=13,4;var t=24&e;return 0!==t?(It=12,t):0!=(32&e)?(It=11,32):0!==(t=192&e)?(It=10,t):0!=(256&e)?(It=9,256):0!==(t=3584&e)?(It=8,t):0!=(4096&e)?(It=7,4096):0!==(t=4186112&e)?(It=6,t):0!==(t=62914560&e)?(It=5,t):67108864&e?(It=4,67108864):0!=(134217728&e)?(It=3,134217728):0!==(t=805306368&e)?(It=2,t):0!=(1073741824&e)?(It=1,1073741824):(It=8,e)}function Dt(e,t){var n=e.pendingLanes;if(0===n)return It=0;var r=0,o=0,a=e.expiredLanes,s=e.suspendedLanes,i=e.pingedLanes;if(0!==a)r=a,o=It=15;else if(0!==(a=134217727&n)){var l=a&~s;0!==l?(r=Rt(l),o=It):0!==(i&=a)&&(r=Rt(i),o=It)}else 0!==(a=n&~s)?(r=Rt(a),o=It):0!==i&&(r=Rt(i),o=It);if(0===r)return 0;if(r=n&((0>(r=31-$t(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&s)){if(Rt(t),o<=It)return t;It=o}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-$t(t)),r|=e[n],t&=~o;return r}function Mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function Gt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Ft(24&~t))?Gt(10,t):e;case 10:return 0===(e=Ft(192&~t))?Gt(8,t):e;case 8:return 0===(e=Ft(3584&~t))&&(0===(e=Ft(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Ft(805306368&~t))&&(t=268435456),t}throw Error(s(358,e))}function Ft(e){return e&-e}function Bt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function jt(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-$t(t)]=n}var $t=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ut(e)/Zt|0)|0},Ut=Math.log,Zt=Math.LN2;var Vt=a.unstable_UserBlockingPriority,qt=a.unstable_runWithPriority,Wt=!0;function Yt(e,t,n,r){Re||Oe();var o=Xt,a=Re;Re=!0;try{Pe(o,e,t,n,r)}finally{(Re=a)||Me()}}function Kt(e,t,n,r){qt(Vt,Xt.bind(null,e,t,n,r))}function Xt(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=Qt(e,t,n,r);if(null===a)o&&ht(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 st=gt(st,e,t,n,r,o),!0;case"dragenter":return it=gt(it,e,t,n,r,o),!0;case"mouseover":return lt=gt(lt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return ut.set(a,gt(ut.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,ct.set(a,gt(ct.get(a)||null,e,t,n,r,o)),!0}return!1}(a,e,t,n,r))return;ht(e,r)}Or(e,t,r,null,n)}}}function Qt(e,t,n,r){var o=Ee(r);if(null!==(o=to(o))){var a=Ye(o);if(null===a)o=null;else{var s=a.tag;if(13===s){if(null!==(o=Ke(a)))return o;o=null}else if(3===s){if(a.stateNode.hydrate)return 3===a.tag?a.stateNode.containerInfo:null;o=null}else a!==o&&(o=null)}}return Or(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 s=r-e;for(t=1;t<=s&&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 sn(e){function t(t,n,r,o,a){for(var s in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(s)&&(t=e[s],this[s]=t?t(o):o[s]);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 ln,un,cn,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(dn),fn=o({},dn,{view:0,detail:0}),hn=sn(fn),gn=o({},fn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Sn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==cn&&(cn&&"mousemove"===e.type?(ln=e.screenX-cn.screenX,un=e.screenY-cn.screenY):un=ln=0,cn=e),ln)},movementY:function(e){return"movementY"in e?e.movementY:un}}),mn=sn(gn),bn=sn(o({},gn,{dataTransfer:0})),vn=sn(o({},fn,{relatedTarget:0})),yn=sn(o({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),xn=o({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=sn(xn),kn=sn(o({},dn,{data:0})),zn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},_n={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"},En={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Hn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=En[e])&&!!t[e]}function Sn(){return Hn}var Cn=o({},fn,{key:function(e){if(e.key){var t=zn[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?_n[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Sn,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}}),Tn=sn(Cn),Ln=sn(o({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),An=sn(o({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Sn})),Nn=sn(o({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Pn=o({},gn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),On=sn(Pn),In=[9,13,27,32],Rn=d&&"CompositionEvent"in window,Dn=null;d&&"documentMode"in document&&(Dn=document.documentMode);var Mn=d&&"TextEvent"in window&&!Dn,Gn=d&&(!Rn||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),Bn=!1;function jn(e,t){switch(e){case"keyup":return-1!==In.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 Zn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Zn[e.type]:"textarea"===t}function qn(e,t,n,r){Le(r),0<(t=Rr(t,"onChange")).length&&(n=new pn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,Yn=null;function Kn(e){Cr(e,0)}function Xn(e){if(X(ro(e)))return e}function Qn(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),Yn=Wn=null)}function or(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,Ee(e)),e=Kn,Re)e(t);else{Re=!0;try{Ne(e,t)}finally{Re=!1,Me()}}}}function ar(e,t,n){"focusin"===e?(rr(),Yn=n,(Wn=t).attachEvent("onpropertychange",or)):"focusout"===e&&rr()}function sr(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function ir(e,t){if("click"===e)return Xn(t)}function lr(e,t){if("input"===e||"change"===e)return Xn(t)}var ur="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},cr=Object.prototype.hasOwnProperty;function dr(e,t){if(ur(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!ur(e[n[r]],t[n[r]]))return!1;return!0}function 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 hr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?hr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function gr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function mr(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,xr=null,wr=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wr||null==vr||vr!==Q(r)||("selectionStart"in(r=vr)&&mr(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},xr&&dr(xr,r)||(xr=r,0<(r=Rr(yr,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}Ot("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),Ot("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),Ot(Pt,2);for(var zr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),_r=0;_r<zr.length;_r++)Nt.set(zr[_r],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),u("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),u("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),u("onBeforeInput",["compositionend","keypress","textInput","paste"]),u("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Er="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Hr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Er));function Sr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,i,l,u){if(We.apply(this,arguments),$e){if(!$e)throw Error(s(198));var c=Ue;$e=!1,Ue=null,Ze||(Ze=!0,Ve=c)}}(r,t,void 0,e),e.currentTarget=null}function Cr(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 s=r.length-1;0<=s;s--){var i=r[s],l=i.instance,u=i.currentTarget;if(i=i.listener,l!==a&&o.isPropagationStopped())break e;Sr(o,i,u),a=l}else for(s=0;s<r.length;s++){if(l=(i=r[s]).instance,u=i.currentTarget,i=i.listener,l!==a&&o.isPropagationStopped())break e;Sr(o,i,u),a=l}}}if(Ze)throw e=Ve,Ze=!1,Ve=null,e}function Tr(e,t){var n=ao(t),r=e+"__bubble";n.has(r)||(Pr(t,e,2,!1),n.add(r))}var Lr="_reactListening"+Math.random().toString(36).slice(2);function Ar(e){e[Lr]||(e[Lr]=!0,i.forEach((function(t){Hr.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&&Hr.has(e)){if("scroll"!==e)return;o|=2,a=r}var s=ao(a),i=e+"__"+(t?"capture":"bubble");s.has(i)||(t&&(o|=4),Pr(a,e,o,t),s.add(i))}function Pr(e,t,n,r){var o=Nt.get(t);switch(void 0===o?2:o){case 0:o=Yt;break;case 1:o=Kt;break;default:o=Xt}n=o.bind(null,t,n,e),o=void 0,!Fe||"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 Or(e,t,n,r,o){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var s=r.tag;if(3===s||4===s){var i=r.stateNode.containerInfo;if(i===o||8===i.nodeType&&i.parentNode===o)break;if(4===s)for(s=r.return;null!==s;){var l=s.tag;if((3===l||4===l)&&((l=s.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;s=s.return}for(;null!==i;){if(null===(s=to(i)))return;if(5===(l=s.tag)||6===l){r=a=s;continue e}i=i.parentNode}}r=r.return}!function(e,t,n){if(De)return e(t,n);De=!0;try{return Ie(e,t,n)}finally{De=!1,Me()}}((function(){var r=a,o=Ee(n),s=[];e:{var i=At.get(e);if(void 0!==i){var l=pn,u=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":l=Tn;break;case"focusin":u="focus",l=vn;break;case"focusout":u="blur",l=vn;break;case"beforeblur":case"afterblur":l=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":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=An;break;case St:case Ct:case Tt:l=yn;break;case Lt:l=Nn;break;case"scroll":l=hn;break;case"wheel":l=On;break;case"copy":case"cut":case"paste":l=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=Ln}var c=0!=(4&t),d=!c&&"scroll"===e,p=c?null!==i?i+"Capture":null:i;c=[];for(var f,h=r;null!==h;){var g=(f=h).stateNode;if(5===f.tag&&null!==g&&(f=g,null!==p&&(null!=(g=Ge(h,p))&&c.push(Ir(h,g,f)))),d)break;h=h.return}0<c.length&&(i=new l(i,u,null,n,o),s.push({event:i,listeners:c}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(i="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(u=n.relatedTarget||n.fromElement)||!to(u)&&!u[Jr])&&(l||i)&&(i=o.window===o?o:(i=o.ownerDocument)?i.defaultView||i.parentWindow:window,l?(l=r,null!==(u=(u=n.relatedTarget||n.toElement)?to(u):null)&&(u!==(d=Ye(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(l=null,u=r),l!==u)){if(c=mn,g="onMouseLeave",p="onMouseEnter",h="mouse","pointerout"!==e&&"pointerover"!==e||(c=Ln,g="onPointerLeave",p="onPointerEnter",h="pointer"),d=null==l?i:ro(l),f=null==u?i:ro(u),(i=new c(g,h+"leave",l,n,o)).target=d,i.relatedTarget=f,g=null,to(o)===r&&((c=new c(p,h+"enter",u,n,o)).target=f,c.relatedTarget=d,g=c),d=g,l&&u)e:{for(p=u,h=0,f=c=l;f;f=Dr(f))h++;for(f=0,g=p;g;g=Dr(g))f++;for(;0<h-f;)c=Dr(c),h--;for(;0<f-h;)p=Dr(p),f--;for(;h--;){if(c===p||null!==p&&c===p.alternate)break e;c=Dr(c),p=Dr(p)}c=null}else c=null;null!==l&&Mr(s,i,l,c,!1),null!==u&&null!==d&&Mr(s,d,u,c,!0)}if("select"===(l=(i=r?ro(r):window).nodeName&&i.nodeName.toLowerCase())||"input"===l&&"file"===i.type)var m=Qn;else if(Vn(i))if(Jn)m=lr;else{m=sr;var b=ar}else(l=i.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===i.type||"radio"===i.type)&&(m=ir);switch(m&&(m=m(e,r))?qn(s,m,n,o):(b&&b(e,i,r),"focusout"===e&&(b=i._wrapperState)&&b.controlled&&"number"===i.type&&oe(i,"number",i.value)),b=r?ro(r):window,e){case"focusin":(Vn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,xr=null);break;case"focusout":xr=yr=vr=null;break;case"mousedown":wr=!0;break;case"contextmenu":case"mouseup":case"dragend":wr=!1,kr(s,n,o);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(s,n,o)}var v;if(Rn)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?jn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Gn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=nn()):(en="value"in(Jt=o)?Jt.value:Jt.textContent,Un=!0)),0<(b=Rr(r,y)).length&&(y=new kn(y,e,null,n,o),s.push({event:y,listeners:b}),v?y.data=v:null!==(v=$n(n))&&(y.data=v))),(v=Mn?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(Bn=!0,Fn);case"textInput":return(e=t.data)===Fn&&Bn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!Rn&&jn(e,t)?(e=nn(),tn=en=Jt=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 Gn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Rr(r,"onBeforeInput")).length&&(o=new kn("onBeforeInput","beforeinput",null,n,o),s.push({event:o,listeners:r}),o.data=v))}Cr(s,t)}))}function Ir(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Rr(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=Ge(e,n))&&r.unshift(Ir(e,a,o)),null!=(a=Ge(e,t))&&r.push(Ir(e,a,o))),e=e.return}return r}function Dr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Mr(e,t,n,r,o){for(var a=t._reactName,s=[];null!==n&&n!==r;){var i=n,l=i.alternate,u=i.stateNode;if(null!==l&&l===r)break;5===i.tag&&null!==u&&(i=u,o?null!=(l=Ge(n,a))&&s.unshift(Ir(n,l,i)):o||null!=(l=Ge(n,a))&&s.push(Ir(n,l,i))),n=n.return}0!==s.length&&e.push({event:t,listeners:s})}function Gr(){}var Fr=null,Br=null;function jr(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function $r(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 Ur="function"==typeof setTimeout?setTimeout:void 0,Zr="function"==typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function 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 Yr=0;var Kr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Kr,Qr="__reactProps$"+Kr,Jr="__reactContainer$"+Kr,eo="__reactEvents$"+Kr;function to(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wr(e);null!==e;){if(n=e[Xr])return n;e=Wr(e)}return t}n=(e=n).parentNode}return null}function no(e){return!(e=e[Xr]||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(s(33))}function oo(e){return e[Qr]||null}function ao(e){var t=e[eo];return void 0===t&&(t=e[eo]=new Set),t}var so=[],io=-1;function lo(e){return{current:e}}function uo(e){0>io||(e.current=so[io],so[io]=null,io--)}function co(e,t){io++,so[io]=e.current,e.current=t}var po={},fo=lo(po),ho=lo(!1),go=po;function mo(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(){uo(ho),uo(fo)}function yo(e,t,n){if(fo.current!==po)throw Error(s(168));co(fo,t),co(ho,n)}function xo(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(s(108,q(t)||"Unknown",a));return o({},n,r)}function wo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||po,go=fo.current,co(fo,e),co(ho,ho.current),!0}function ko(e,t,n){var r=e.stateNode;if(!r)throw Error(s(169));n?(e=xo(e,t,go),r.__reactInternalMemoizedMergedChildContext=e,uo(ho),uo(fo),co(fo,e)):uo(ho),co(ho,n)}var zo=null,_o=null,Eo=a.unstable_runWithPriority,Ho=a.unstable_scheduleCallback,So=a.unstable_cancelCallback,Co=a.unstable_shouldYield,To=a.unstable_requestPaint,Lo=a.unstable_now,Ao=a.unstable_getCurrentPriorityLevel,No=a.unstable_ImmediatePriority,Po=a.unstable_UserBlockingPriority,Oo=a.unstable_NormalPriority,Io=a.unstable_LowPriority,Ro=a.unstable_IdlePriority,Do={},Mo=void 0!==To?To:function(){},Go=null,Fo=null,Bo=!1,jo=Lo(),$o=1e4>jo?Lo:function(){return Lo()-jo};function Uo(){switch(Ao()){case No:return 99;case Po:return 98;case Oo:return 97;case Io:return 96;case Ro:return 95;default:throw Error(s(332))}}function Zo(e){switch(e){case 99:return No;case 98:return Po;case 97:return Oo;case 96:return Io;case 95:return Ro;default:throw Error(s(332))}}function Vo(e,t){return e=Zo(e),Eo(e,t)}function qo(e,t,n){return e=Zo(e),Ho(e,t,n)}function Wo(){if(null!==Fo){var e=Fo;Fo=null,So(e)}Yo()}function Yo(){if(!Bo&&null!==Go){Bo=!0;var e=0;try{var t=Go;Vo(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Go=null}catch(n){throw null!==Go&&(Go=Go.slice(e+1)),Ho(No,Wo),n}finally{Bo=!1}}}var Ko=w.ReactCurrentBatchConfig;function Xo(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 Qo=lo(null),Jo=null,ea=null,ta=null;function na(){ta=ea=Jo=null}function ra(e){var t=Qo.current;uo(Qo),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)&&(Rs=!0),e.firstContext=null)}function sa(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(s(308));ea=t,Jo.dependencies={lanes:0,firstContext:t,responders:null}}else ea=ea.next=t;return e._currentValue}var ia=!1;function la(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function ua(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 ca(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 s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=s:a=a.next=s,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;ia=!1;var s=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var u=l,c=u.next;u.next=null,null===i?s=c:i.next=c,i=u;var d=e.alternate;if(null!==d){var p=(d=d.updateQueue).lastBaseUpdate;p!==i&&(null===p?d.firstBaseUpdate=c:p.next=c,d.lastBaseUpdate=u)}}if(null!==s){for(p=a.baseState,i=0,d=c=u=null;;){l=s.lane;var f=s.eventTime;if((r&l)===l){null!==d&&(d=d.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var h=e,g=s;switch(l=t,f=n,g.tag){case 1:if("function"==typeof(h=g.payload)){p=h.call(f,p,l);break e}p=h;break e;case 3:h.flags=-4097&h.flags|64;case 0:if(null==(l="function"==typeof(h=g.payload)?h.call(f,p,l):h))break e;p=o({},p,l);break e;case 2:ia=!0}}null!==s.callback&&(e.flags|=32,null===(l=a.effects)?a.effects=[s]:l.push(s))}else f={eventTime:f,lane:l,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===d?(c=d=f,u=p):d=d.next=f,i|=l;if(null===(s=s.next)){if(null===(l=a.shared.pending))break;s=l.next,l.next=null,a.lastBaseUpdate=l,a.shared.pending=null}}null===d&&(u=p),a.baseState=u,a.firstBaseUpdate=c,a.lastBaseUpdate=d,Bi|=i,e.lanes=i,e.memoizedState=p}}function ha(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(s(191,o));o.call(r)}}}var ga=(new r.Component).refs;function ma(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)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.payload=t,null!=n&&(a.callback=n),da(e,a),hl(e,o,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),da(e,a),hl(e,o,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=pl(),r=fl(e),o=ca(n,r);o.tag=2,null!=t&&(o.callback=t),da(e,o),hl(e,r,n)}};function va(e,t,n,r,o,a,s){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,s):!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=sa(a):(o=bo(t)?go:fo.current,a=(r=null!=(r=t.contextTypes))?mo(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 xa(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 wa(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=ga,la(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=sa(a):(a=bo(t)?go:fo.current,o.context=mo(e,a)),fa(e,n,o,r),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(ma(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 za(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(s(309));var r=n.stateNode}if(!r)throw Error(s(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===ga&&(t=r.refs={}),null===e?delete t[o]:t[o]=e},t._stringRef=o,t)}if("string"!=typeof e)throw Error(s(284));if(!n._owner)throw Error(s(290,e))}return e}function _a(e,t){if("textarea"!==e.type)throw Error(s(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function Ea(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=Vl(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 i(t){return e&&null===t.alternate&&(t.flags=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Kl(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function u(e,t,n,r){return null!==t&&t.elementType===n.type?((r=o(t,n.props)).ref=za(e,t,n),r.return=e,r):((r=ql(n.type,n.key,n.props,null,e.mode,r)).ref=za(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xl(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=Wl(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=Kl(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=ql(t.type,t.key,t.props,null,e.mode,n)).ref=za(e,null,t),n.return=e,n;case z:return(t=Xl(t,e.mode,n)).return=e,t}if(ka(t)||j(t))return(t=Wl(t,e.mode,n,null)).return=e,t;_a(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:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?n.type===_?d(e,t,n.props.children,r,o):u(e,t,n,r):null;case z:return n.key===o?c(e,t,n,r):null}if(ka(n)||j(n))return null!==o?null:d(e,t,n,r,null);_a(e,n)}return null}function h(e,t,n,r,o){if("string"==typeof r||"number"==typeof r)return l(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===_?d(t,e,r.props.children,o,r.key):u(t,e,r,o);case z:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o)}if(ka(r)||j(r))return d(t,e=e.get(n)||null,r,o,null);_a(t,r)}return null}function g(o,s,i,l){for(var u=null,c=null,d=s,g=s=0,m=null;null!==d&&g<i.length;g++){d.index>g?(m=d,d=null):m=d.sibling;var b=f(o,d,i[g],l);if(null===b){null===d&&(d=m);break}e&&d&&null===b.alternate&&t(o,d),s=a(b,s,g),null===c?u=b:c.sibling=b,c=b,d=m}if(g===i.length)return n(o,d),u;if(null===d){for(;g<i.length;g++)null!==(d=p(o,i[g],l))&&(s=a(d,s,g),null===c?u=d:c.sibling=d,c=d);return u}for(d=r(o,d);g<i.length;g++)null!==(m=h(d,o,g,i[g],l))&&(e&&null!==m.alternate&&d.delete(null===m.key?g:m.key),s=a(m,s,g),null===c?u=m:c.sibling=m,c=m);return e&&d.forEach((function(e){return t(o,e)})),u}function m(o,i,l,u){var c=j(l);if("function"!=typeof c)throw Error(s(150));if(null==(l=c.call(l)))throw Error(s(151));for(var d=c=null,g=i,m=i=0,b=null,v=l.next();null!==g&&!v.done;m++,v=l.next()){g.index>m?(b=g,g=null):b=g.sibling;var y=f(o,g,v.value,u);if(null===y){null===g&&(g=b);break}e&&g&&null===y.alternate&&t(o,g),i=a(y,i,m),null===d?c=y:d.sibling=y,d=y,g=b}if(v.done)return n(o,g),c;if(null===g){for(;!v.done;m++,v=l.next())null!==(v=p(o,v.value,u))&&(i=a(v,i,m),null===d?c=v:d.sibling=v,d=v);return c}for(g=r(o,g);!v.done;m++,v=l.next())null!==(v=h(g,o,m,v.value,u))&&(e&&null!==v.alternate&&g.delete(null===v.key?m:v.key),i=a(v,i,m),null===d?c=v:d.sibling=v,d=v);return e&&g.forEach((function(e){return t(o,e)})),c}return function(e,r,a,l){var u="object"==typeof a&&null!==a&&a.type===_&&null===a.key;u&&(a=a.props.children);var c="object"==typeof a&&null!==a;if(c)switch(a.$$typeof){case k:e:{for(c=a.key,u=r;null!==u;){if(u.key===c){if(7===u.tag){if(a.type===_){n(e,u.sibling),(r=o(u,a.props.children)).return=e,e=r;break e}}else if(u.elementType===a.type){n(e,u.sibling),(r=o(u,a.props)).ref=za(e,u,a),r.return=e,e=r;break e}n(e,u);break}t(e,u),u=u.sibling}a.type===_?((r=Wl(a.props.children,e.mode,l,a.key)).return=e,e=r):((l=ql(a.type,a.key,a.props,null,e.mode,l)).ref=za(e,r,a),l.return=e,e=l)}return i(e);case z:e:{for(u=a.key;null!==r;){if(r.key===u){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=Xl(a,e.mode,l)).return=e,e=r}return i(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=Kl(a,e.mode,l)).return=e,e=r),i(e);if(ka(a))return g(e,r,a,l);if(j(a))return m(e,r,a,l);if(c&&_a(e,a),void 0===a&&!u)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(s(152,q(e.type)||"Component"))}return n(e,r)}}var Ha=Ea(!0),Sa=Ea(!1),Ca={},Ta=lo(Ca),La=lo(Ca),Aa=lo(Ca);function Na(e){if(e===Ca)throw Error(s(174));return e}function Pa(e,t){switch(co(Aa,t),co(La,e),co(Ta,Ca),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)}uo(Ta),co(Ta,t)}function Oa(){uo(Ta),uo(La),uo(Aa)}function Ia(e){Na(Aa.current);var t=Na(Ta.current),n=fe(t,e.type);t!==n&&(co(La,e),co(Ta,n))}function Ra(e){La.current===e&&(uo(Ta),uo(La))}var Da=lo(0);function Ma(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 Ga=null,Fa=null,Ba=!1;function ja(e,t){var n=Ul(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 $a(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 Ua(e){if(Ba){var t=Fa;if(t){var n=t;if(!$a(e,t)){if(!(t=qr(n.nextSibling))||!$a(e,t))return e.flags=-1025&e.flags|2,Ba=!1,void(Ga=e);ja(Ga,n)}Ga=e,Fa=qr(t.firstChild)}else e.flags=-1025&e.flags|2,Ba=!1,Ga=e}}function Za(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Ga=e}function Va(e){if(e!==Ga)return!1;if(!Ba)return Za(e),Ba=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!$r(t,e.memoizedProps))for(t=Fa;t;)ja(e,t),t=qr(t.nextSibling);if(Za(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(s(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Fa=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Fa=null}}else Fa=Ga?qr(e.stateNode.nextSibling):null;return!0}function qa(){Fa=Ga=null,Ba=!1}var Wa=[];function Ya(){for(var e=0;e<Wa.length;e++)Wa[e]._workInProgressVersionPrimary=null;Wa.length=0}var Ka=w.ReactCurrentDispatcher,Xa=w.ReactCurrentBatchConfig,Qa=0,Ja=null,es=null,ts=null,ns=!1,rs=!1;function os(){throw Error(s(321))}function as(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ur(e[n],t[n]))return!1;return!0}function ss(e,t,n,r,o,a){if(Qa=a,Ja=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Ka.current=null===e||null===e.memoizedState?Ns:Ps,e=n(r,o),rs){a=0;do{if(rs=!1,!(25>a))throw Error(s(301));a+=1,ts=es=null,t.updateQueue=null,Ka.current=Os,e=n(r,o)}while(rs)}if(Ka.current=As,t=null!==es&&null!==es.next,Qa=0,ts=es=Ja=null,ns=!1,t)throw Error(s(300));return e}function is(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ts?Ja.memoizedState=ts=e:ts=ts.next=e,ts}function ls(){if(null===es){var e=Ja.alternate;e=null!==e?e.memoizedState:null}else e=es.next;var t=null===ts?Ja.memoizedState:ts.next;if(null!==t)ts=t,es=e;else{if(null===e)throw Error(s(310));e={memoizedState:(es=e).memoizedState,baseState:es.baseState,baseQueue:es.baseQueue,queue:es.queue,next:null},null===ts?Ja.memoizedState=ts=e:ts=ts.next=e}return ts}function us(e,t){return"function"==typeof t?t(e):t}function cs(e){var t=ls(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var r=es,o=r.baseQueue,a=n.pending;if(null!==a){if(null!==o){var i=o.next;o.next=a.next,a.next=i}r.baseQueue=o=a,n.pending=null}if(null!==o){o=o.next,r=r.baseState;var l=i=a=null,u=o;do{var c=u.lane;if((Qa&c)===c)null!==l&&(l=l.next={lane:0,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null}),r=u.eagerReducer===e?u.eagerState:e(r,u.action);else{var d={lane:c,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null};null===l?(i=l=d,a=r):l=l.next=d,Ja.lanes|=c,Bi|=c}u=u.next}while(null!==u&&u!==o);null===l?a=r:l.next=i,ur(r,t.memoizedState)||(Rs=!0),t.memoizedState=r,t.baseState=a,t.baseQueue=l,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function ds(e){var t=ls(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var i=o=o.next;do{a=e(a,i.action),i=i.next}while(i!==o);ur(a,t.memoizedState)||(Rs=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function ps(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=(Qa&e)===e)&&(t._workInProgressVersionPrimary=r,Wa.push(t))),e)return n(t._source);throw Wa.push(t),Error(s(350))}function fs(e,t,n,r){var o=Pi;if(null===o)throw Error(s(349));var a=t._getVersion,i=a(t._source),l=Ka.current,u=l.useState((function(){return ps(o,t,n)})),c=u[1],d=u[0];u=ts;var p=e.memoizedState,f=p.refs,h=f.getSnapshot,g=p.source;p=p.subscribe;var m=Ja;return e.memoizedState={refs:f,source:t,subscribe:r},l.useEffect((function(){f.getSnapshot=n,f.setSnapshot=c;var e=a(t._source);if(!ur(i,e)){e=n(t._source),ur(d,e)||(c(e),e=fl(m),o.mutableReadLanes|=e&o.pendingLanes),e=o.mutableReadLanes,o.entangledLanes|=e;for(var r=o.entanglements,s=e;0<s;){var l=31-$t(s),u=1<<l;r[l]|=e,s&=~u}}}),[n,t,r]),l.useEffect((function(){return r(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var r=fl(m);o.mutableReadLanes|=r&o.pendingLanes}catch(a){n((function(){throw a}))}}))}),[t,r]),ur(h,n)&&ur(g,t)&&ur(p,r)||((e={pending:null,dispatch:null,lastRenderedReducer:us,lastRenderedState:d}).dispatch=c=Ls.bind(null,Ja,e),u.queue=e,u.baseQueue=null,d=ps(o,t,n),u.memoizedState=u.baseState=d),d}function hs(e,t,n){return fs(ls(),e,t,n)}function gs(e){var t=is();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:us,lastRenderedState:e}).dispatch=Ls.bind(null,Ja,e),[t.memoizedState,e]}function ms(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 bs(e){return e={current:e},is().memoizedState=e}function vs(){return ls().memoizedState}function ys(e,t,n,r){var o=is();Ja.flags|=e,o.memoizedState=ms(1|t,n,void 0,void 0===r?null:r)}function xs(e,t,n,r){var o=ls();r=void 0===r?null:r;var a=void 0;if(null!==es){var s=es.memoizedState;if(a=s.destroy,null!==r&&as(r,s.deps))return void ms(t,n,a,r)}Ja.flags|=e,o.memoizedState=ms(1|t,n,a,r)}function ws(e,t){return ys(516,4,e,t)}function ks(e,t){return xs(516,4,e,t)}function zs(e,t){return xs(4,2,e,t)}function _s(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 Es(e,t,n){return n=null!=n?n.concat([e]):null,xs(4,2,_s.bind(null,t,e),n)}function Hs(){}function Ss(e,t){var n=ls();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&as(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Cs(e,t){var n=ls();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&as(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ts(e,t){var n=Uo();Vo(98>n?98:n,(function(){e(!0)})),Vo(97<n?97:n,(function(){var n=Xa.transition;Xa.transition=1;try{e(!1),t()}finally{Xa.transition=n}}))}function Ls(e,t,n){var r=pl(),o=fl(e),a={lane:o,action:n,eagerReducer:null,eagerState:null,next:null},s=t.pending;if(null===s?a.next=a:(a.next=s.next,s.next=a),t.pending=a,s=e.alternate,e===Ja||null!==s&&s===Ja)rs=ns=!0;else{if(0===e.lanes&&(null===s||0===s.lanes)&&null!==(s=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=s(i,n);if(a.eagerReducer=s,a.eagerState=l,ur(l,i))return}catch(u){}hl(e,o,r)}}var As={readContext:sa,useCallback:os,useContext:os,useEffect:os,useImperativeHandle:os,useLayoutEffect:os,useMemo:os,useReducer:os,useRef:os,useState:os,useDebugValue:os,useDeferredValue:os,useTransition:os,useMutableSource:os,useOpaqueIdentifier:os,unstable_isNewReconciler:!1},Ns={readContext:sa,useCallback:function(e,t){return is().memoizedState=[e,void 0===t?null:t],e},useContext:sa,useEffect:ws,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ys(4,2,_s.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ys(4,2,e,t)},useMemo:function(e,t){var n=is();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=is();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=Ls.bind(null,Ja,e),[r.memoizedState,e]},useRef:bs,useState:gs,useDebugValue:Hs,useDeferredValue:function(e){var t=gs(e),n=t[0],r=t[1];return ws((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=gs(!1),t=e[0];return bs(e=Ts.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=is();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fs(r,e,t,n)},useOpaqueIdentifier:function(){if(Ba){var e=!1,t=function(e){return{$$typeof:I,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Yr++).toString(36))),Error(s(355))})),n=gs(t)[1];return 0==(2&Ja.mode)&&(Ja.flags|=516,ms(5,(function(){n("r:"+(Yr++).toString(36))}),void 0,null)),t}return gs(t="r:"+(Yr++).toString(36)),t},unstable_isNewReconciler:!1},Ps={readContext:sa,useCallback:Ss,useContext:sa,useEffect:ks,useImperativeHandle:Es,useLayoutEffect:zs,useMemo:Cs,useReducer:cs,useRef:vs,useState:function(){return cs(us)},useDebugValue:Hs,useDeferredValue:function(e){var t=cs(us),n=t[0],r=t[1];return ks((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=cs(us)[0];return[vs().current,e]},useMutableSource:hs,useOpaqueIdentifier:function(){return cs(us)[0]},unstable_isNewReconciler:!1},Os={readContext:sa,useCallback:Ss,useContext:sa,useEffect:ks,useImperativeHandle:Es,useLayoutEffect:zs,useMemo:Cs,useReducer:ds,useRef:vs,useState:function(){return ds(us)},useDebugValue:Hs,useDeferredValue:function(e){var t=ds(us),n=t[0],r=t[1];return ks((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=ds(us)[0];return[vs().current,e]},useMutableSource:hs,useOpaqueIdentifier:function(){return ds(us)[0]},unstable_isNewReconciler:!1},Is=w.ReactCurrentOwner,Rs=!1;function Ds(e,t,n,r){t.child=null===e?Sa(t,null,n,r):Ha(t,e.child,n,r)}function Ms(e,t,n,r,o){n=n.render;var a=t.ref;return aa(t,o),r=ss(e,t,n,r,a,o),null===e||Rs?(t.flags|=1,Ds(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,ai(e,t,o))}function Gs(e,t,n,r,o,a){if(null===e){var s=n.type;return"function"!=typeof s||Zl(s)||void 0!==s.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=ql(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=s,Fs(e,t,s,r,o,a))}return s=e.child,0==(o&a)&&(o=s.memoizedProps,(n=null!==(n=n.compare)?n:dr)(o,r)&&e.ref===t.ref)?ai(e,t,a):(t.flags|=1,(e=Vl(s,r)).ref=t.ref,e.return=t,t.child=e)}function Fs(e,t,n,r,o,a){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Rs=!1,0==(a&o))return t.lanes=e.lanes,ai(e,t,a);0!=(16384&e.flags)&&(Rs=!0)}return $s(e,t,n,r,a)}function Bs(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},kl(t,n);else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},kl(t,e),null;t.memoizedState={baseLanes:0},kl(t,null!==a?a.baseLanes:n)}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,kl(t,r);return Ds(e,t,o,n),t.child}function js(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function $s(e,t,n,r,o){var a=bo(n)?go:fo.current;return a=mo(t,a),aa(t,o),n=ss(e,t,n,r,a,o),null===e||Rs?(t.flags|=1,Ds(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,ai(e,t,o))}function Us(e,t,n,r,o){if(bo(n)){var a=!0;wo(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),wa(t,n,r,o),r=!0;else if(null===e){var s=t.stateNode,i=t.memoizedProps;s.props=i;var l=s.context,u=n.contextType;"object"==typeof u&&null!==u?u=sa(u):u=mo(t,u=bo(n)?go:fo.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof s.getSnapshotBeforeUpdate;d||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(i!==r||l!==u)&&xa(t,s,r,u),ia=!1;var p=t.memoizedState;s.state=p,fa(t,r,s,o),l=t.memoizedState,i!==r||p!==l||ho.current||ia?("function"==typeof c&&(ma(t,n,c,r),l=t.memoizedState),(i=ia||va(t,n,i,r,p,l,u))?(d||"function"!=typeof s.UNSAFE_componentWillMount&&"function"!=typeof s.componentWillMount||("function"==typeof s.componentWillMount&&s.componentWillMount(),"function"==typeof s.UNSAFE_componentWillMount&&s.UNSAFE_componentWillMount()),"function"==typeof s.componentDidMount&&(t.flags|=4)):("function"==typeof s.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=l),s.props=r,s.state=l,s.context=u,r=i):("function"==typeof s.componentDidMount&&(t.flags|=4),r=!1)}else{s=t.stateNode,ua(e,t),i=t.memoizedProps,u=t.type===t.elementType?i:Xo(t.type,i),s.props=u,d=t.pendingProps,p=s.context,"object"==typeof(l=n.contextType)&&null!==l?l=sa(l):l=mo(t,l=bo(n)?go:fo.current);var f=n.getDerivedStateFromProps;(c="function"==typeof f||"function"==typeof s.getSnapshotBeforeUpdate)||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(i!==d||p!==l)&&xa(t,s,r,l),ia=!1,p=t.memoizedState,s.state=p,fa(t,r,s,o);var h=t.memoizedState;i!==d||p!==h||ho.current||ia?("function"==typeof f&&(ma(t,n,f,r),h=t.memoizedState),(u=ia||va(t,n,u,r,p,h,l))?(c||"function"!=typeof s.UNSAFE_componentWillUpdate&&"function"!=typeof s.componentWillUpdate||("function"==typeof s.componentWillUpdate&&s.componentWillUpdate(r,h,l),"function"==typeof s.UNSAFE_componentWillUpdate&&s.UNSAFE_componentWillUpdate(r,h,l)),"function"==typeof s.componentDidUpdate&&(t.flags|=4),"function"==typeof s.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof s.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=h),s.props=r,s.state=h,s.context=l,r=u):("function"!=typeof s.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),r=!1)}return Zs(e,t,n,r,a,o)}function Zs(e,t,n,r,o,a){js(e,t);var s=0!=(64&t.flags);if(!r&&!s)return o&&ko(t,n,!1),ai(e,t,a);r=t.stateNode,Is.current=t;var i=s&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&s?(t.child=Ha(t,e.child,null,a),t.child=Ha(t,null,i,a)):Ds(e,t,i,a),t.memoizedState=r.state,o&&ko(t,n,!0),t.child}function Vs(e){var t=e.stateNode;t.pendingContext?yo(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yo(0,t.context,!1),Pa(e,t.containerInfo)}var qs,Ws,Ys,Ks,Xs={dehydrated:null,retryLane:0};function Qs(e,t,n){var r,o=t.pendingProps,a=Da.current,s=!1;return(r=0!=(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!=(2&a)),r?(s=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===o.fallback||!0===o.unstable_avoidThisFallback||(a|=1),co(Da,1&a),null===e?(void 0!==o.fallback&&Ua(t),e=o.children,a=o.fallback,s?(e=Js(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xs,e):"number"==typeof o.unstable_expectedLoadTime?(e=Js(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xs,t.lanes=33554432,e):((n=Yl({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,s?(o=ti(e,t,o.children,o.fallback,n),s=t.child,a=e.child.memoizedState,s.memoizedState=null===a?{baseLanes:n}:{baseLanes:a.baseLanes|n},s.childLanes=e.childLanes&~n,t.memoizedState=Xs,o):(n=ei(e,t,o.children,n),t.memoizedState=null,n))}function Js(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=Yl(t,o,0,null),n=Wl(n,o,r,null),a.return=e,n.return=e,a.sibling=n,e.child=a,n}function ei(e,t,n,r){var o=e.child;return e=o.sibling,n=Vl(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 ti(e,t,n,r,o){var a=t.mode,s=e.child;e=s.sibling;var i={mode:"hidden",children:n};return 0==(2&a)&&t.child!==s?((n=t.child).childLanes=0,n.pendingProps=i,null!==(s=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=s,s.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Vl(s,i),null!==e?r=Vl(e,r):(r=Wl(r,a,o,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function ni(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),oa(e.return,t)}function ri(e,t,n,r,o,a){var s=e.memoizedState;null===s?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o,lastEffect:a}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=r,s.tail=n,s.tailMode=o,s.lastEffect=a)}function oi(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Ds(e,t,r.children,n),0!=(2&(r=Da.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&&ni(e,n);else if(19===e.tag)ni(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(co(Da,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===Ma(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),ri(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===Ma(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}ri(t,!0,n,null,a,t.lastEffect);break;case"together":ri(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function ai(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Bi|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(s(153));if(null!==t.child){for(n=Vl(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Vl(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function si(e,t){if(!Ba)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 ii(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 Oa(),uo(ho),uo(fo),Ya(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Va(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Ws(t),null;case 5:Ra(t);var a=Na(Aa.current);if(n=t.type,null!==e&&null!=t.stateNode)Ys(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(s(166));return null}if(e=Na(Ta.current),Va(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[Xr]=t,r[Qr]=i,n){case"dialog":Tr("cancel",r),Tr("close",r);break;case"iframe":case"object":case"embed":Tr("load",r);break;case"video":case"audio":for(e=0;e<Er.length;e++)Tr(Er[e],r);break;case"source":Tr("error",r);break;case"img":case"image":case"link":Tr("error",r),Tr("load",r);break;case"details":Tr("toggle",r);break;case"input":ee(r,i),Tr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},Tr("invalid",r);break;case"textarea":le(r,i),Tr("invalid",r)}for(var u in ze(n,i),e=null,i)i.hasOwnProperty(u)&&(a=i[u],"children"===u?"string"==typeof a?r.textContent!==a&&(e=["children",a]):"number"==typeof a&&r.textContent!==""+a&&(e=["children",""+a]):l.hasOwnProperty(u)&&null!=a&&"onScroll"===u&&Tr("scroll",r));switch(n){case"input":K(r),re(r,i,!0);break;case"textarea":K(r),ce(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Gr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(u=9===a.nodeType?a:a.ownerDocument,e===de.html&&(e=pe(n)),e===de.html?"script"===n?((e=u.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),"select"===n&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Xr]=t,e[Qr]=r,qs(e,t,!1,!1),t.stateNode=e,u=_e(n,r),n){case"dialog":Tr("cancel",e),Tr("close",e),a=r;break;case"iframe":case"object":case"embed":Tr("load",e),a=r;break;case"video":case"audio":for(a=0;a<Er.length;a++)Tr(Er[a],e);a=r;break;case"source":Tr("error",e),a=r;break;case"img":case"image":case"link":Tr("error",e),Tr("load",e),a=r;break;case"details":Tr("toggle",e),a=r;break;case"input":ee(e,r),a=J(e,r),Tr("invalid",e);break;case"option":a=ae(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=o({},r,{value:void 0}),Tr("invalid",e);break;case"textarea":le(e,r),a=ie(e,r),Tr("invalid",e);break;default:a=r}ze(n,a);var c=a;for(i in c)if(c.hasOwnProperty(i)){var d=c[i];"style"===i?we(e,d):"dangerouslySetInnerHTML"===i?null!=(d=d?d.__html:void 0)&&me(e,d):"children"===i?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(l.hasOwnProperty(i)?null!=d&&"onScroll"===i&&Tr("scroll",e):null!=d&&x(e,i,d,u))}switch(n){case"input":K(e),re(e,r,!1);break;case"textarea":K(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?se(e,!!r.multiple,i,!1):null!=r.defaultValue&&se(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=Gr)}jr(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Ks(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(s(166));n=Na(Aa.current),Na(Ta.current),Va(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return uo(Da),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Va(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Da.current)?0===Mi&&(Mi=3):(0!==Mi&&3!==Mi||(Mi=4),null===Pi||0==(134217727&Bi)&&0==(134217727&ji)||vl(Pi,Ii))),(r||n)&&(t.flags|=4),null);case 4:return Oa(),Ws(t),null===e&&Ar(t.stateNode.containerInfo),null;case 10:return ra(t),null;case 19:if(uo(Da),null===(r=t.memoizedState))return null;if(i=0!=(64&t.flags),null===(u=r.rendering))if(i)si(r,!1);else{if(0!==Mi||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(u=Ma(e))){for(t.flags|=64,si(r,!1),null!==(i=u.updateQueue)&&(t.updateQueue=i,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=2,i.nextEffect=null,i.firstEffect=null,i.lastEffect=null,null===(u=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=u.childLanes,i.lanes=u.lanes,i.child=u.child,i.memoizedProps=u.memoizedProps,i.memoizedState=u.memoizedState,i.updateQueue=u.updateQueue,i.type=u.type,e=u.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return co(Da,1&Da.current|2),t.child}e=e.sibling}null!==r.tail&&$o()>Vi&&(t.flags|=64,i=!0,si(r,!1),t.lanes=33554432)}else{if(!i)if(null!==(e=Ma(u))){if(t.flags|=64,i=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),si(r,!0),null===r.tail&&"hidden"===r.tailMode&&!u.alternate&&!Ba)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*$o()-r.renderingStartTime>Vi&&1073741824!==n&&(t.flags|=64,i=!0,si(r,!1),t.lanes=33554432);r.isBackwards?(u.sibling=t.child,t.child=u):(null!==(n=r.last)?n.sibling=u:t.child=u,r.last=u)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=$o(),n.sibling=null,t=Da.current,co(Da,i?1&t|2:1&t),n):null;case 23:case 24:return zl(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(s(156,t.tag))}function li(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(Oa(),uo(ho),uo(fo),Ya(),0!=(64&(t=e.flags)))throw Error(s(285));return e.flags=-4097&t|64,e;case 5:return Ra(e),null;case 13:return uo(Da),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return uo(Da),null;case 4:return Oa(),null;case 10:return ra(e),null;case 23:case 24:return zl(),null;default:return null}}function ui(e,t){try{var n="",r=t;do{n+=V(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 ci(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qs=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}},Ws=function(){},Ys=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Na(Ta.current);var s,i=null;switch(n){case"input":a=J(e,a),r=J(e,r),i=[];break;case"option":a=ae(e,a),r=ae(e,r),i=[];break;case"select":a=o({},a,{value:void 0}),r=o({},r,{value:void 0}),i=[];break;case"textarea":a=ie(e,a),r=ie(e,r),i=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Gr)}for(d in ze(n,r),n=null,a)if(!r.hasOwnProperty(d)&&a.hasOwnProperty(d)&&null!=a[d])if("style"===d){var u=a[d];for(s in u)u.hasOwnProperty(s)&&(n||(n={}),n[s]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(l.hasOwnProperty(d)?i||(i=[]):(i=i||[]).push(d,null));for(d in r){var c=r[d];if(u=null!=a?a[d]:void 0,r.hasOwnProperty(d)&&c!==u&&(null!=c||null!=u))if("style"===d)if(u){for(s in u)!u.hasOwnProperty(s)||c&&c.hasOwnProperty(s)||(n||(n={}),n[s]="");for(s in c)c.hasOwnProperty(s)&&u[s]!==c[s]&&(n||(n={}),n[s]=c[s])}else n||(i||(i=[]),i.push(d,n)),n=c;else"dangerouslySetInnerHTML"===d?(c=c?c.__html:void 0,u=u?u.__html:void 0,null!=c&&u!==c&&(i=i||[]).push(d,c)):"children"===d?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(d,""+c):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(l.hasOwnProperty(d)?(null!=c&&"onScroll"===d&&Tr("scroll",e),i||u===c||(i=[])):"object"==typeof c&&null!==c&&c.$$typeof===I?c.toString():(i=i||[]).push(d,c))}n&&(i=i||[]).push("style",n);var d=i;(t.updateQueue=d)&&(t.flags|=4)}},Ks=function(e,t,n,r){n!==r&&(t.flags|=4)};var di="function"==typeof WeakMap?WeakMap:Map;function pi(e,t,n){(n=ca(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ki||(Ki=!0,Xi=r),ci(0,t)},n}function fi(e,t,n){(n=ca(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return ci(0,t),r(o)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Qi?Qi=new Set([this]):Qi.add(this),ci(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var hi="function"==typeof WeakSet?WeakSet:Set;function gi(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){Fl(e,n)}else t.current=null}function mi(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:Xo(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(s(163))}function bi(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)&&(Dl(n,e),Rl(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:Xo(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&ha(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}ha(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&jr(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&wt(n)))))}throw Error(s(163))}function vi(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=xe("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 yi(e,t){if(_o&&"function"==typeof _o.onCommitFiberUnmount)try{_o.onCommitFiberUnmount(zo,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))Dl(t,n);else{r=t;try{o()}catch(a){Fl(r,a)}}n=n.next}while(n!==e)}break;case 1:if(gi(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(a){Fl(t,a)}break;case 5:gi(t);break;case 4:Ei(e,t)}}function xi(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 wi(e){return 5===e.tag||3===e.tag||4===e.tag}function ki(e){e:{for(var t=e.return;null!==t;){if(wi(t))break e;t=t.return}throw Error(s(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(s(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||wi(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?zi(e,n,t):_i(e,n,t)}function zi(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=Gr));else if(4!==r&&null!==(e=e.child))for(zi(e,t,n),e=e.sibling;null!==e;)zi(e,t,n),e=e.sibling}function _i(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(_i(e,t,n),e=e.sibling;null!==e;)_i(e,t,n),e=e.sibling}function Ei(e,t){for(var n,r,o=t,a=!1;;){if(!a){a=o.return;e:for(;;){if(null===a)throw Error(s(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 i=e,l=o,u=l;;)if(yi(i,u),null!==u.child&&4!==u.tag)u.child.return=u,u=u.child;else{if(u===l)break e;for(;null===u.sibling;){if(null===u.return||u.return===l)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}r?(i=n,l=o.stateNode,8===i.nodeType?i.parentNode.removeChild(l):i.removeChild(l)):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(yi(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 Hi(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[Qr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),_e(e,o),t=_e(e,r),o=0;o<a.length;o+=2){var i=a[o],l=a[o+1];"style"===i?we(n,l):"dangerouslySetInnerHTML"===i?me(n,l):"children"===i?be(n,l):x(n,i,l,t)}switch(e){case"input":ne(n,r);break;case"textarea":ue(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(a=r.value)?se(n,!!r.multiple,a,!1):e!==!!r.multiple&&(null!=r.defaultValue?se(n,!!r.multiple,r.defaultValue,!0):se(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(s(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Zi=$o(),vi(t.child,!0)),void Si(t);case 19:return void Si(t);case 23:case 24:return void vi(t,null!==t.memoizedState)}throw Error(s(163))}function Si(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new hi),t.forEach((function(t){var r=jl.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Ci(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ti=Math.ceil,Li=w.ReactCurrentDispatcher,Ai=w.ReactCurrentOwner,Ni=0,Pi=null,Oi=null,Ii=0,Ri=0,Di=lo(0),Mi=0,Gi=null,Fi=0,Bi=0,ji=0,$i=0,Ui=null,Zi=0,Vi=1/0;function qi(){Vi=$o()+500}var Wi,Yi=null,Ki=!1,Xi=null,Qi=null,Ji=!1,el=null,tl=90,nl=[],rl=[],ol=null,al=0,sl=null,il=-1,ll=0,ul=0,cl=null,dl=!1;function pl(){return 0!=(48&Ni)?$o():-1!==il?il:il=$o()}function fl(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Uo()?1:2;if(0===ll&&(ll=Fi),0!==Ko.transition){0!==ul&&(ul=null!==Ui?Ui.pendingLanes:0),e=ll;var t=4186112&~ul;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Uo(),0!=(4&Ni)&&98===e?e=Gt(12,ll):e=Gt(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),ll),e}function hl(e,t,n){if(50<al)throw al=0,sl=null,Error(s(185));if(null===(e=gl(e,t)))return null;jt(e,t,n),e===Pi&&(ji|=t,4===Mi&&vl(e,Ii));var r=Uo();1===t?0!=(8&Ni)&&0==(48&Ni)?yl(e):(ml(e,n),0===Ni&&(qi(),Wo())):(0==(4&Ni)||98!==r&&99!==r||(null===ol?ol=new Set([e]):ol.add(e)),ml(e,n)),Ui=e}function gl(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 ml(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,o=e.pingedLanes,a=e.expirationTimes,i=e.pendingLanes;0<i;){var l=31-$t(i),u=1<<l,c=a[l];if(-1===c){if(0==(u&r)||0!=(u&o)){c=t,Rt(u);var d=It;a[l]=10<=d?c+250:6<=d?c+5e3:-1}}else c<=t&&(e.expiredLanes|=u);i&=~u}if(r=Dt(e,e===Pi?Ii:0),t=It,0===r)null!==n&&(n!==Do&&So(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Do&&So(n)}15===t?(n=yl.bind(null,e),null===Go?(Go=[n],Fo=Ho(No,Yo)):Go.push(n),n=Do):14===t?n=qo(99,yl.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(s(358,e))}}(t),n=qo(n,bl.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bl(e){if(il=-1,ul=ll=0,0!=(48&Ni))throw Error(s(327));var t=e.callbackNode;if(Il()&&e.callbackNode!==t)return null;var n=Dt(e,e===Pi?Ii:0);if(0===n)return null;var r=n,o=Ni;Ni|=16;var a=Hl();for(Pi===e&&Ii===r||(qi(),_l(e,r));;)try{Tl();break}catch(l){El(e,l)}if(na(),Li.current=a,Ni=o,null!==Oi?r=0:(Pi=null,Ii=0,r=Mi),0!=(Fi&ji))_l(e,0);else if(0!==r){if(2===r&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=Mt(e))&&(r=Sl(e,n))),1===r)throw t=Gi,_l(e,0),vl(e,n),ml(e,$o()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(s(345));case 2:case 5:Nl(e);break;case 3:if(vl(e,n),(62914560&n)===n&&10<(r=Zi+500-$o())){if(0!==Dt(e,0))break;if(((o=e.suspendedLanes)&n)!==n){pl(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=Ur(Nl.bind(null,e),r);break}Nl(e);break;case 4:if(vl(e,n),(4186112&n)===n)break;for(r=e.eventTimes,o=-1;0<n;){var i=31-$t(n);a=1<<i,(i=r[i])>o&&(o=i),n&=~a}if(n=o,10<(n=(120>(n=$o()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ti(n/1960))-n)){e.timeoutHandle=Ur(Nl.bind(null,e),n);break}Nl(e);break;default:throw Error(s(329))}}return ml(e,$o()),e.callbackNode===t?bl.bind(null,e):null}function vl(e,t){for(t&=~$i,t&=~ji,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-$t(t),r=1<<n;e[n]=-1,t&=~r}}function yl(e){if(0!=(48&Ni))throw Error(s(327));if(Il(),e===Pi&&0!=(e.expiredLanes&Ii)){var t=Ii,n=Sl(e,t);0!=(Fi&ji)&&(n=Sl(e,t=Dt(e,t)))}else n=Sl(e,t=Dt(e,0));if(0!==e.tag&&2===n&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=Mt(e))&&(n=Sl(e,t))),1===n)throw n=Gi,_l(e,0),vl(e,t),ml(e,$o()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Nl(e),ml(e,$o()),null}function xl(e,t){var n=Ni;Ni|=1;try{return e(t)}finally{0===(Ni=n)&&(qi(),Wo())}}function wl(e,t){var n=Ni;Ni&=-2,Ni|=8;try{return e(t)}finally{0===(Ni=n)&&(qi(),Wo())}}function kl(e,t){co(Di,Ri),Ri|=t,Fi|=t}function zl(){Ri=Di.current,uo(Di)}function _l(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Zr(n)),null!==Oi)for(n=Oi.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&vo();break;case 3:Oa(),uo(ho),uo(fo),Ya();break;case 5:Ra(r);break;case 4:Oa();break;case 13:case 19:uo(Da);break;case 10:ra(r);break;case 23:case 24:zl()}n=n.return}Pi=e,Oi=Vl(e.current,null),Ii=Ri=Fi=t,Mi=0,Gi=null,$i=ji=Bi=0}function El(e,t){for(;;){var n=Oi;try{if(na(),Ka.current=As,ns){for(var r=Ja.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ns=!1}if(Qa=0,ts=es=Ja=null,rs=!1,Ai.current=null,null===n||null===n.return){Mi=1,Gi=t,Oi=null;break}e:{var a=e,s=n.return,i=n,l=t;if(t=Ii,i.flags|=2048,i.firstEffect=i.lastEffect=null,null!==l&&"object"==typeof l&&"function"==typeof l.then){var u=l;if(0==(2&i.mode)){var c=i.alternate;c?(i.updateQueue=c.updateQueue,i.memoizedState=c.memoizedState,i.lanes=c.lanes):(i.updateQueue=null,i.memoizedState=null)}var d=0!=(1&Da.current),p=s;do{var f;if(f=13===p.tag){var h=p.memoizedState;if(null!==h)f=null!==h.dehydrated;else{var g=p.memoizedProps;f=void 0!==g.fallback&&(!0!==g.unstable_avoidThisFallback||!d)}}if(f){var m=p.updateQueue;if(null===m){var b=new Set;b.add(u),p.updateQueue=b}else m.add(u);if(0==(2&p.mode)){if(p.flags|=64,i.flags|=16384,i.flags&=-2981,1===i.tag)if(null===i.alternate)i.tag=17;else{var v=ca(-1,1);v.tag=2,da(i,v)}i.lanes|=1;break e}l=void 0,i=t;var y=a.pingCache;if(null===y?(y=a.pingCache=new di,l=new Set,y.set(u,l)):void 0===(l=y.get(u))&&(l=new Set,y.set(u,l)),!l.has(i)){l.add(i);var x=Bl.bind(null,a,u,i);u.then(x,x)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);l=Error((q(i.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!==Mi&&(Mi=2),l=ui(l,i),p=s;do{switch(p.tag){case 3:a=l,p.flags|=4096,t&=-t,p.lanes|=t,pa(p,pi(0,a,t));break e;case 1:a=l;var w=p.type,k=p.stateNode;if(0==(64&p.flags)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Qi||!Qi.has(k)))){p.flags|=4096,t&=-t,p.lanes|=t,pa(p,fi(p,a,t));break e}}p=p.return}while(null!==p)}Al(n)}catch(z){t=z,Oi===n&&null!==n&&(Oi=n=n.return);continue}break}}function Hl(){var e=Li.current;return Li.current=As,null===e?As:e}function Sl(e,t){var n=Ni;Ni|=16;var r=Hl();for(Pi===e&&Ii===t||_l(e,t);;)try{Cl();break}catch(o){El(e,o)}if(na(),Ni=n,Li.current=r,null!==Oi)throw Error(s(261));return Pi=null,Ii=0,Mi}function Cl(){for(;null!==Oi;)Ll(Oi)}function Tl(){for(;null!==Oi&&!Co();)Ll(Oi)}function Ll(e){var t=Wi(e.alternate,e,Ri);e.memoizedProps=e.pendingProps,null===t?Al(e):Oi=t,Ai.current=null}function Al(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ii(n,t,Ri)))return void(Oi=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ri)||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=li(t)))return n.flags&=2047,void(Oi=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Oi=t);Oi=t=e}while(null!==t);0===Mi&&(Mi=5)}function Nl(e){var t=Uo();return Vo(99,Pl.bind(null,e,t)),null}function Pl(e,t){do{Il()}while(null!==el);if(0!=(48&Ni))throw Error(s(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(s(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 i=e.eventTimes,l=e.expirationTimes;0<a;){var u=31-$t(a),c=1<<u;o[u]=0,i[u]=-1,l[u]=-1,a&=~c}if(null!==ol&&0==(24&r)&&ol.has(e)&&ol.delete(e),e===Pi&&(Oi=Pi=null,Ii=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(o=Ni,Ni|=32,Ai.current=null,Fr=Wt,mr(i=gr())){if("selectionStart"in i)l={start:i.selectionStart,end:i.selectionEnd};else e:if(l=(l=i.ownerDocument)&&l.defaultView||window,(c=l.getSelection&&l.getSelection())&&0!==c.rangeCount){l=c.anchorNode,a=c.anchorOffset,u=c.focusNode,c=c.focusOffset;try{l.nodeType,u.nodeType}catch(H){l=null;break e}var d=0,p=-1,f=-1,h=0,g=0,m=i,b=null;t:for(;;){for(var v;m!==l||0!==a&&3!==m.nodeType||(p=d+a),m!==u||0!==c&&3!==m.nodeType||(f=d+c),3===m.nodeType&&(d+=m.nodeValue.length),null!==(v=m.firstChild);)b=m,m=v;for(;;){if(m===i)break t;if(b===l&&++h===a&&(p=d),b===u&&++g===c&&(f=d),null!==(v=m.nextSibling))break;b=(m=b).parentNode}m=v}l=-1===p||-1===f?null:{start:p,end:f}}else l=null;l=l||{start:0,end:0}}else l=null;Br={focusedElem:i,selectionRange:l},Wt=!1,cl=null,dl=!1,Yi=r;do{try{Ol()}catch(H){if(null===Yi)throw Error(s(330));Fl(Yi,H),Yi=Yi.nextEffect}}while(null!==Yi);cl=null,Yi=r;do{try{for(i=e;null!==Yi;){var y=Yi.flags;if(16&y&&be(Yi.stateNode,""),128&y){var x=Yi.alternate;if(null!==x){var w=x.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:ki(Yi),Yi.flags&=-3;break;case 6:ki(Yi),Yi.flags&=-3,Hi(Yi.alternate,Yi);break;case 1024:Yi.flags&=-1025;break;case 1028:Yi.flags&=-1025,Hi(Yi.alternate,Yi);break;case 4:Hi(Yi.alternate,Yi);break;case 8:Ei(i,l=Yi);var k=l.alternate;xi(l),null!==k&&xi(k)}Yi=Yi.nextEffect}}catch(H){if(null===Yi)throw Error(s(330));Fl(Yi,H),Yi=Yi.nextEffect}}while(null!==Yi);if(w=Br,x=gr(),y=w.focusedElem,i=w.selectionRange,x!==y&&y&&y.ownerDocument&&hr(y.ownerDocument.documentElement,y)){null!==i&&mr(y)&&(x=i.start,void 0===(w=i.end)&&(w=x),"selectionStart"in y?(y.selectionStart=x,y.selectionEnd=Math.min(w,y.value.length)):(w=(x=y.ownerDocument||document)&&x.defaultView||window).getSelection&&(w=w.getSelection(),l=y.textContent.length,k=Math.min(i.start,l),i=void 0===i.end?k:Math.min(i.end,l),!w.extend&&k>i&&(l=i,i=k,k=l),l=fr(y,k),a=fr(y,i),l&&a&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==a.node||w.focusOffset!==a.offset)&&((x=x.createRange()).setStart(l.node,l.offset),w.removeAllRanges(),k>i?(w.addRange(x),w.extend(a.node,a.offset)):(x.setEnd(a.node,a.offset),w.addRange(x))))),x=[];for(w=y;w=w.parentNode;)1===w.nodeType&&x.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<x.length;y++)(w=x[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Wt=!!Fr,Br=Fr=null,e.current=n,Yi=r;do{try{for(y=e;null!==Yi;){var z=Yi.flags;if(36&z&&bi(y,Yi.alternate,Yi),128&z){x=void 0;var _=Yi.ref;if(null!==_){var E=Yi.stateNode;Yi.tag,x=E,"function"==typeof _?_(x):_.current=x}}Yi=Yi.nextEffect}}catch(H){if(null===Yi)throw Error(s(330));Fl(Yi,H),Yi=Yi.nextEffect}}while(null!==Yi);Yi=null,Mo(),Ni=o}else e.current=n;if(Ji)Ji=!1,el=e,tl=t;else for(Yi=r;null!==Yi;)t=Yi.nextEffect,Yi.nextEffect=null,8&Yi.flags&&((z=Yi).sibling=null,z.stateNode=null),Yi=t;if(0===(r=e.pendingLanes)&&(Qi=null),1===r?e===sl?al++:(al=0,sl=e):al=0,n=n.stateNode,_o&&"function"==typeof _o.onCommitFiberRoot)try{_o.onCommitFiberRoot(zo,n,void 0,64==(64&n.current.flags))}catch(H){}if(ml(e,$o()),Ki)throw Ki=!1,e=Xi,Xi=null,e;return 0!=(8&Ni)||Wo(),null}function Ol(){for(;null!==Yi;){var e=Yi.alternate;dl||null===cl||(0!=(8&Yi.flags)?Je(Yi,cl)&&(dl=!0):13===Yi.tag&&Ci(e,Yi)&&Je(Yi,cl)&&(dl=!0));var t=Yi.flags;0!=(256&t)&&mi(e,Yi),0==(512&t)||Ji||(Ji=!0,qo(97,(function(){return Il(),null}))),Yi=Yi.nextEffect}}function Il(){if(90!==tl){var e=97<tl?97:tl;return tl=90,Vo(e,Ml)}return!1}function Rl(e,t){nl.push(t,e),Ji||(Ji=!0,qo(97,(function(){return Il(),null})))}function Dl(e,t){rl.push(t,e),Ji||(Ji=!0,qo(97,(function(){return Il(),null})))}function Ml(){if(null===el)return!1;var e=el;if(el=null,0!=(48&Ni))throw Error(s(331));var t=Ni;Ni|=32;var n=rl;rl=[];for(var r=0;r<n.length;r+=2){var o=n[r],a=n[r+1],i=o.destroy;if(o.destroy=void 0,"function"==typeof i)try{i()}catch(u){if(null===a)throw Error(s(330));Fl(a,u)}}for(n=nl,nl=[],r=0;r<n.length;r+=2){o=n[r],a=n[r+1];try{var l=o.create;o.destroy=l()}catch(u){if(null===a)throw Error(s(330));Fl(a,u)}}for(l=e.current.firstEffect;null!==l;)e=l.nextEffect,l.nextEffect=null,8&l.flags&&(l.sibling=null,l.stateNode=null),l=e;return Ni=t,Wo(),!0}function Gl(e,t,n){da(e,t=pi(0,t=ui(n,t),1)),t=pl(),null!==(e=gl(e,1))&&(jt(e,1,t),ml(e,t))}function Fl(e,t){if(3===e.tag)Gl(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Gl(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Qi||!Qi.has(r))){var o=fi(n,e=ui(t,e),1);if(da(n,o),o=pl(),null!==(n=gl(n,1)))jt(n,1,o),ml(n,o);else if("function"==typeof r.componentDidCatch&&(null===Qi||!Qi.has(r)))try{r.componentDidCatch(t,e)}catch(a){}break}}n=n.return}}function Bl(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=pl(),e.pingedLanes|=e.suspendedLanes&n,Pi===e&&(Ii&n)===n&&(4===Mi||3===Mi&&(62914560&Ii)===Ii&&500>$o()-Zi?_l(e,0):$i|=n),ml(e,t)}function jl(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===Uo()?1:2:(0===ll&&(ll=Fi),0===(t=Ft(62914560&~ll))&&(t=4194304))),n=pl(),null!==(e=gl(e,t))&&(jt(e,t,n),ml(e,n))}function $l(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 Ul(e,t,n,r){return new $l(e,t,n,r)}function Zl(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vl(e,t){var n=e.alternate;return null===n?((n=Ul(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 ql(e,t,n,r,o,a){var i=2;if(r=e,"function"==typeof e)Zl(e)&&(i=1);else if("string"==typeof e)i=5;else e:switch(e){case _:return Wl(n.children,o,a,t);case R:i=8,o|=16;break;case E:i=8,o|=1;break;case H:return(e=Ul(12,n,t,8|o)).elementType=H,e.type=H,e.lanes=a,e;case L:return(e=Ul(13,n,t,o)).type=L,e.elementType=L,e.lanes=a,e;case A:return(e=Ul(19,n,t,o)).elementType=A,e.lanes=a,e;case D:return Yl(n,o,a,t);case M:return(e=Ul(24,n,t,o)).elementType=M,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case S:i=10;break e;case C:i=9;break e;case T:i=11;break e;case N:i=14;break e;case P:i=16,r=null;break e;case O:i=22;break e}throw Error(s(130,null==e?e:typeof e,""))}return(t=Ul(i,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Wl(e,t,n,r){return(e=Ul(7,e,r,t)).lanes=n,e}function Yl(e,t,n,r){return(e=Ul(23,e,r,t)).elementType=D,e.lanes=n,e}function Kl(e,t,n){return(e=Ul(6,e,null,t)).lanes=n,e}function Xl(e,t,n){return(t=Ul(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ql(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=Bt(0),this.expirationTimes=Bt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bt(0),this.mutableSourceEagerHydrationData=null}function Jl(e,t,n,r){var o=t.current,a=pl(),i=fl(o);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(s(170));var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(bo(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}l=l.return}while(null!==l);throw Error(s(171))}if(1===n.tag){var u=n.type;if(bo(u)){n=xo(n,u,l);break e}}n=l}else n=po;return null===t.context?t.context=n:t.pendingContext=n,(t=ca(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),da(o,t),hl(o,i,a),i}function eu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nu(e,t){tu(e,t),(e=e.alternate)&&tu(e,t)}function ru(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Ql(e,t,null!=n&&!0===n.hydrate),t=Ul(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,la(t),e[Jr]=n.current,Ar(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 ou(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function au(e,t,n,r,o){var a=n._reactRootContainer;if(a){var s=a._internalRoot;if("function"==typeof o){var i=o;o=function(){var e=eu(s);i.call(e)}}Jl(t,s,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 ru(e,0,t?{hydrate:!0}:void 0)}(n,r),s=a._internalRoot,"function"==typeof o){var l=o;o=function(){var e=eu(s);l.call(e)}}wl((function(){Jl(t,s,e,o)}))}return eu(s)}function su(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ou(t))throw Error(s(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:z,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Wi=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||ho.current)Rs=!0;else{if(0==(n&r)){switch(Rs=!1,t.tag){case 3:Vs(t),qa();break;case 5:Ia(t);break;case 1:bo(t.type)&&wo(t);break;case 4:Pa(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var o=t.type._context;co(Qo,o._currentValue),o._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Qs(e,t,n):(co(Da,1&Da.current),null!==(t=ai(e,t,n))?t.sibling:null);co(Da,1&Da.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return oi(e,t,n);t.flags|=64}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),co(Da,Da.current),r)break;return null;case 23:case 24:return t.lanes=0,Bs(e,t,n)}return ai(e,t,n)}Rs=0!=(16384&e.flags)}else Rs=!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=mo(t,fo.current),aa(t,n),o=ss(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;wo(t)}else a=!1;t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,la(t);var i=r.getDerivedStateFromProps;"function"==typeof i&&ma(t,r,i,e),o.updater=ba,t.stateNode=o,o._reactInternals=t,wa(t,r,e,n),t=Zs(null,t,r,!0,a,n)}else t.tag=0,Ds(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 Zl(e)?1:0;if(null!=e){if((e=e.$$typeof)===T)return 11;if(e===N)return 14}return 2}(o),e=Xo(o,e),a){case 0:t=$s(null,t,o,e,n);break e;case 1:t=Us(null,t,o,e,n);break e;case 11:t=Ms(null,t,o,e,n);break e;case 14:t=Gs(null,t,o,Xo(o.type,e),r,n);break e}throw Error(s(306,o,""))}return t;case 0:return r=t.type,o=t.pendingProps,$s(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 1:return r=t.type,o=t.pendingProps,Us(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 3:if(Vs(t),r=t.updateQueue,null===e||null===r)throw Error(s(282));if(r=t.pendingProps,o=null!==(o=t.memoizedState)?o.element:null,ua(e,t),fa(t,r,null,n),(r=t.memoizedState.element)===o)qa(),t=ai(e,t,n);else{if((a=(o=t.stateNode).hydrate)&&(Fa=qr(t.stateNode.containerInfo.firstChild),Ga=t,a=Ba=!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=Sa(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Ds(e,t,r,n),qa();t=t.child}return t;case 5:return Ia(t),null===e&&Ua(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,i=o.children,$r(r,o)?i=null:null!==a&&$r(r,a)&&(t.flags|=16),js(e,t),Ds(e,t,i,n),t.child;case 6:return null===e&&Ua(t),null;case 13:return Qs(e,t,n);case 4:return Pa(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ha(t,null,r,n):Ds(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Ms(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 7:return Ds(e,t,t.pendingProps,n),t.child;case 8:case 12:return Ds(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,o=t.pendingProps,i=t.memoizedProps,a=o.value;var l=t.type._context;if(co(Qo,l._currentValue),l._currentValue=a,null!==i)if(l=i.value,0===(a=ur(l,a)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,a):1073741823))){if(i.children===o.children&&!ho.current){t=ai(e,t,n);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){var u=l.dependencies;if(null!==u){i=l.child;for(var c=u.firstContext;null!==c;){if(c.context===r&&0!=(c.observedBits&a)){1===l.tag&&((c=ca(-1,n&-n)).tag=2,da(l,c)),l.lanes|=n,null!==(c=l.alternate)&&(c.lanes|=n),oa(l.return,n),u.lanes|=n;break}c=c.next}}else i=10===l.tag&&l.type===t.type?null:l.child;if(null!==i)i.return=l;else for(i=l;null!==i;){if(i===t){i=null;break}if(null!==(l=i.sibling)){l.return=i.return,i=l;break}i=i.return}l=i}Ds(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=sa(o,a.unstable_observedBits)),t.flags|=1,Ds(e,t,r,n),t.child;case 14:return a=Xo(o=t.type,t.pendingProps),Gs(e,t,o,a=Xo(o.type,a),r,n);case 15:return Fs(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:Xo(r,o),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,bo(r)?(e=!0,wo(t)):e=!1,aa(t,n),ya(t,r,o),wa(t,r,o,n),Zs(null,t,r,!0,e,n);case 19:return oi(e,t,n);case 23:case 24:return Bs(e,t,n)}throw Error(s(156,t.tag))},ru.prototype.render=function(e){Jl(e,this._internalRoot,null,null)},ru.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jl(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(hl(e,4,pl()),nu(e,4))},tt=function(e){13===e.tag&&(hl(e,67108864,pl()),nu(e,67108864))},nt=function(e){if(13===e.tag){var t=pl(),n=fl(e);hl(e,n,t),nu(e,n)}},rt=function(e,t){return t()},He=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(s(90));X(r),ne(r,o)}}}break;case"textarea":ue(e,n);break;case"select":null!=(t=n.value)&&se(e,!!n.multiple,t,!1)}},Ne=xl,Pe=function(e,t,n,r,o){var a=Ni;Ni|=4;try{return Vo(98,e.bind(null,t,n,r,o))}finally{0===(Ni=a)&&(qi(),Wo())}},Oe=function(){0==(49&Ni)&&(function(){if(null!==ol){var e=ol;ol=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,ml(e,$o())}))}Wo()}(),Il())},Ie=function(e,t){var n=Ni;Ni|=2;try{return e(t)}finally{0===(Ni=n)&&(qi(),Wo())}};var iu={Events:[no,ro,oo,Le,Ae,Il,{current:!1}]},lu={findFiberByHostInstance:to,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},uu={bundleType:lu.bundleType,version:lu.version,rendererPackageName:lu.rendererPackageName,rendererConfig:lu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Qe(e))?null:e.stateNode},findFiberByHostInstance:lu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cu=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cu.isDisabled&&cu.supportsFiber)try{zo=cu.inject(uu),_o=cu}catch(ge){}}t.hydrate=function(e,t,n){if(!ou(t))throw Error(s(200));return au(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,s){if(e===s)return!0;if(e&&s&&"object"==typeof e&&"object"==typeof s){if(e.constructor!==s.constructor)return!1;var i,l,u,c;if(Array.isArray(e)){if((i=e.length)!=s.length)return!1;for(l=i;0!=l--;)if(!a(e[l],s[l]))return!1;return!0}if(n&&e instanceof Map&&s instanceof Map){if(e.size!==s.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!s.has(l.value[0]))return!1;for(c=e.entries();!(l=c.next()).done;)if(!a(l.value[1],s.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&s instanceof Set){if(e.size!==s.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!s.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(s)){if((i=e.length)!=s.length)return!1;for(l=i;0!=l--;)if(e[l]!==s[l])return!1;return!0}if(e.constructor===RegExp)return e.source===s.source&&e.flags===s.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof s.valueOf)return e.valueOf()===s.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof s.toString)return e.toString()===s.toString();if((i=(u=Object.keys(e)).length)!==Object.keys(s).length)return!1;for(l=i;0!=l--;)if(!Object.prototype.hasOwnProperty.call(s,u[l]))return!1;if(t&&e instanceof Element)return!1;for(l=i;0!=l--;)if(("_owner"!==u[l]&&"__v"!==u[l]&&"__o"!==u[l]||!e.$$typeof)&&!a(e[u[l]],s[u[l]]))return!1;return!0}return e!=e&&s!=s}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:()=>Z,ql:()=>J});var r=n(7294),o=n(5697),a=n.n(o),s=n(9590),i=n.n(s),l=n(1143),u=n.n(l),c=n(6774),d=n.n(c);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,h(e,t)}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function g(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 m={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(m).map((function(e){return m[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}),{}),z=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=z(e,m.TITLE),n=z(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=z(e,"defaultTitle");return t||r||void 0},E=function(e){return z(e,"onChangeClientState")||function(){}},H=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)}),{})},S=function(e,t){return t.filter((function(e){return void 0!==e[m.BASE]})).map((function(e){return e[m.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}),[])},C=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),s=0;s<a.length;s+=1){var i=a[s],l=i.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(i)||"innerHTML"!==i&&"cssText"!==i&&"itemprop"!==i||(n=i)}if(!n||!e[n])return!1;var u=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][u]&&(o[n][u]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),s=0;s<a.length;s+=1){var i=a[s],l=p({},r[i],o[i]);r[i]=l}return e}),[]).reverse()},T=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},L=function(e){return Array.isArray(e)?e.join(""):e},A=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=[m.NOSCRIPT,m.SCRIPT,m.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,"'")},I=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}),"")},R=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},D=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)}))},M=function(e,t,n){switch(e){case m.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=R(n,o),[r.createElement(m.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=I(n),a=L(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 R(t)},toString:function(){return I(t)}};default:return{toComponent:function(){return D(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||"",s=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(s?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},G=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,s=e.styleTags,i=e.title,l=void 0===i?"":i,u=e.titleAttributes,c=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var h=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=A(e.metaTags,y),a=A(t,b),s=A(n,v);return{priorityMethods:{toComponent:function(){return[].concat(D(m.META,o.priority),D(m.LINK,a.priority),D(m.SCRIPT,s.priority))},toString:function(){return M(m.META,o.priority,r)+" "+M(m.LINK,a.priority,r)+" "+M(m.SCRIPT,s.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:s.default}}(e);f=h.priorityMethods,c=h.linkTags,d=h.metaTags,p=h.scriptTags}return{priority:f,base:M(m.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",o,r),link:M(m.LINK,c,r),meta:M(m.META,d,r),noscript:M(m.NOSCRIPT,a,r),script:M(m.SCRIPT,p,r),style:M(m.STYLE,s,r),title:M(m.TITLE,{title:l,titleAttributes:u},r)}},F=[],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?F:n.instances},add:function(e){(n.canUseDOM?F:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?F:n.instances).indexOf(e);(n.canUseDOM?F:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=G({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},j=r.createContext({}),$=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),U="undefined"!=typeof document,Z=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new B(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(j.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);Z.canUseDOM=U,Z.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},Z.defaultProps={context:{}},Z.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(m.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),s=[];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):s.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),s.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:s}},q=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),s=Object.keys(t),i=0;i<s.length;i+=1){var l=s[i],u=t[l]||"";n.getAttribute(l)!==u&&n.setAttribute(l,u),-1===o.indexOf(l)&&o.push(l);var c=a.indexOf(l);-1!==c&&a.splice(c,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")!==s.join(",")&&n.setAttribute("data-rh",s.join(","))}},W=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,s=e.noscriptTags,i=e.onChangeClientState,l=e.scriptTags,u=e.styleTags,c=e.title,d=e.titleAttributes;q(m.BODY,e.bodyAttributes),q(m.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=L(e)),q(m.TITLE,t)}(c,d);var p={baseTag:V(m.BASE,n),linkTags:V(m.LINK,o),metaTags:V(m.META,a),noscriptTags:V(m.NOSCRIPT,s),scriptTags:V(m.SCRIPT,l),styleTags:V(m.STYLE,u)},f={},h={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(h[e]=p[e].oldTags)})),t&&t(),i(e,f,h)},Y=null,K=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:S(["href"],e),bodyAttributes:H("bodyAttributes",e),defer:z(e,"defer"),encode:z(e,"encodeSpecialCharacters"),htmlAttributes:H("htmlAttributes",e),linkTags:C(m.LINK,["rel","href"],e),metaTags:C(m.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:C(m.NOSCRIPT,["innerHTML"],e),onChangeClientState:E(e),scriptTags:C(m.SCRIPT,["src","innerHTML"],e),styleTags:C(m.STYLE,["cssText"],e),title:_(e),titleAttributes:H("titleAttributes",e),prioritizeSeoTags:T(e,"prioritizeSeoTags")});Z.canUseDOM?(t=a,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){W(t,(function(){Y=null}))})):(W(t),Y=null)):G&&(o=G(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);K.propTypes={context:$.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Q=["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!i()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case m.SCRIPT:case m.NOSCRIPT:return{innerHTML:t};case m.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,s=e.nestedChildren;switch(r.type){case m.TITLE:return p({},o,((t={})[r.type]=s,t.titleAttributes=p({},a),t));case m.BODY:return p({},o,{bodyAttributes:p({},a)});case m.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 u()(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."),u()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,s=g(r,X),i=Object.keys(s).reduce((function(e,t){return e[k[t]||t]=s[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case m.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case m.LINK:case m.META:case m.NOSCRIPT:case m.SCRIPT:case m.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:i,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,Q),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof B||(a=new B(a.context,a.instances)),a?r.createElement(K,p({},o,{context:a.value,helmetData:void 0})):r.createElement(j.Consumer,null,(function(e){return r.createElement(K,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,s=n?Symbol.for("react.strict_mode"):60108,i=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,h=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,m=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 c:case d:case a:case i:case s:case f:return e;default:switch(e=e&&e.$$typeof){case u:case p:case m:case g:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=m,t.Memo=g,t.Portal=o,t.Profiler=i,t.StrictMode=s,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===u},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)===m},t.isMemo=function(e){return w(e)===g},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===i},t.isStrictMode=function(e){return w(e)===s},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===i||e===s||e===f||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===g||e.$$typeof===l||e.$$typeof===u||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},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 s(){return s=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},s.apply(this,arguments)}var i=n(7294),l=n(5697),u=[],c=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function 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 i.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function h(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var h=s({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),g=null;function m(){return g||(g=e(h.loader)),g.promise}return u.push(m),"function"==typeof h.webpack&&c.push((function(){if((0,h.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return m()})),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}),g=e(h.loader),r._loadModule()})),m(),r.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.loaded},r}r(n,t),n.preload=function(){return m()};var s=n.prototype;return s.UNSAFE_componentWillMount=function(){this._loadModule()},s.componentDidMount=function(){this._mounted=!0},s._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(h.modules)&&h.modules.forEach((function(t){e.context.loadable.report(t)})),g.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof h.delay&&(0===h.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),h.delay)),"number"==typeof h.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),h.timeout));var n=function(){t({error:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},s.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},s._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},s.render=function(){return this.state.loading||this.state.error?i.createElement(h.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?h.render(this.state.loaded,this.props):null},n}(i.Component),a(d,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),p}function g(e){return h(d,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return h(p,e)};var m=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 i.Children.only(this.props.children)},t}(i.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(m,"propTypes",{report:l.func.isRequired}),a(m,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),g.Capture=m,g.preloadAll=function(){return new Promise((function(e,t){b(u).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=g},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>i,f:()=>s});var r=n(6550),o=n(7462),a=n(7294);function s(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&&s(e.routes,t,n)),o})),n}function i(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:()=>c,rU:()=>m});var r=n(6550),o=n(5068),a=n(7294),s=n(9318),i=n(7462),l=n(3366),u=n(8776),c=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,s.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,s.ob)(e,null,null,t):e},f=function(e){return e},h=a.forwardRef;void 0===h&&(h=f);var g=h((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,s=(0,l.Z)(e,["innerRef","navigate","onClick"]),u=s.target,c=(0,i.Z)({},s,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||u&&"_self"!==u||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=f!==h&&t||n,a.createElement("a",c)}));var m=h((function(e,t){var n=e.component,o=void 0===n?g:n,c=e.replace,m=e.to,b=e.innerRef,v=(0,l.Z)(e,["component","replace","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,u.Z)(!1);var n=e.history,r=p(d(m,e.location),e.location),l=r?n.createHref(r):"",g=(0,i.Z)({},v,{href:l,navigate:function(){var t=d(m,e.location),r=(0,s.Ep)(e.location)===(0,s.Ep)(p(t));(c||r?n.replace:n.push)(t)}});return f!==h?g.ref=t||b:g.innerRef=b,a.createElement(o,g)}))})),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,s=e.activeClassName,c=void 0===s?"active":s,f=e.activeStyle,h=e.className,g=e.exact,y=e.isActive,x=e.location,w=e.sensitive,k=e.strict,z=e.style,_=e.to,E=e.innerRef,H=(0,l.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,u.Z)(!1);var n=x||e.location,s=p(d(_,n),n),l=s.pathname,S=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),C=S?(0,r.LX)(n.pathname,{path:S,exact:g,sensitive:w,strict:k}):null,T=!!(y?y(C,n):C),L="function"==typeof h?h(T):h,A="function"==typeof z?z(T):z;T&&(L=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(" ")}(L,c),A=(0,i.Z)({},A,f));var N=(0,i.Z)({"aria-current":T&&o||null,className:L,style:A,to:s},H);return b!==v?N.ref=t||E:N.innerRef=E,a.createElement(m,N)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>_,F0:()=>y,LX:()=>z,TH:()=>P,k6:()=>N,rs:()=>L,s6:()=>v});var r=n(5068),o=n(7294),a=n(5697),s=n.n(a),i=n(9318),l=n(8776),u=n(7462),c=n(9658),d=n.n(c),p=(n(9864),n(3366)),f=(n(8679),1073741823),h="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var g=o.createContext||function(e,t){var n,a,i="__create-react-context-"+function(){var e="__global_unique_id__";return h[e]=(h[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];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={})[i]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(s=o)?0!==a||1/a==1/s:a!=a&&s!=s)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,s},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[i]=s().object.isRequired,n);var u=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[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},o.getValue=function(){return this.context[i]?this.context[i].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 u.contextTypes=((a={})[i]=s().object,a),{Provider:l,Consumer:u}},m=function(e){var t=g();return t.displayName=e,t},b=m("Router-History"),v=m("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 x={},w=1e4,k=0;function z(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,s=n.strict,i=void 0!==s&&s,l=n.sensitive,u=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:i,sensitive:u}),o=r.regexp,s=r.keys,l=o.exec(e);if(!l)return null;var c=l[0],p=l.slice(1),f=e===c;return a&&!f?null:{path:n,url:"/"===n&&""===c?"/":c,isExact:f,params:s.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.Z)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,l.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?z(n.pathname,e.props):t.match,a=(0,u.Z)({},t,{location:n,match:r}),s=e.props,i=s.children,c=s.component,d=s.render;return Array.isArray(i)&&function(e){return 0===o.Children.count(e)}(i)&&(i=null),o.createElement(v.Provider,{value:a},a.match?i?"function"==typeof i?i(a):i:c?o.createElement(c,a):d?d(a):null:"function"==typeof i?i(a):null)}))},t}(o.Component);function E(e){return"/"===e.charAt(0)?e:"/"+e}function H(e,t){if(!e)return t;var n=E(e);return 0!==t.pathname.indexOf(n)?t:(0,u.Z)({},t,{pathname:t.pathname.substr(n.length)})}function S(e){return"string"==typeof e?e:(0,i.Ep)(e)}function C(e){return function(){(0,l.Z)(!1)}}function T(){}o.Component;var L=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,l.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 s=e.props.path||e.props.from;r=s?z(a.pathname,(0,u.Z)({},e.props,{path:s})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var A=o.useContext;function N(){return A(b)}function P(){return A(v).location}},9658:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return i(a(e,t),t)},e.exports.tokensToFunction=i,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,s=0,i="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(i+=e.slice(s,f),s=f+d.length,p)i+=p[1];else{var h=e[s],g=n[2],m=n[3],b=n[4],v=n[5],y=n[6],x=n[7];i&&(r.push(i),i="");var w=null!=g&&null!=h&&h!==g,k="+"===y||"*"===y,z="?"===y||"*"===y,_=n[2]||c,E=b||v;r.push({name:m||a++,prefix:g||"",delimiter:_,optional:z,repeat:k,partial:w,asterisk:!!x,pattern:E?u(E):x?".*":"[^"+l(_)+"]+?"})}}return s<e.length&&(i+=e.substr(s)),i&&r.push(i),r}function s(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function i(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="",i=t||{},l=(o||{}).pretty?s:encodeURIComponent,u=0;u<e.length;u++){var c=e[u];if("string"!=typeof c){var d,p=i[c.name];if(null==p){if(c.optional){c.partial&&(a+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(p)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=l(p[f]),!n[u].test(d))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===f?c.prefix:c.delimiter)+d}}else{if(d=c.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(p),!n[u].test(d))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+d+'"');a+=c.prefix+d}}else a+=c}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,s="",i=0;i<e.length;i++){var u=e[i];if("string"==typeof u)s+=l(u);else{var p=l(u.prefix),f="(?:"+u.pattern+")";t.push(u),u.repeat&&(f+="(?:"+p+f+")*"),s+=f=u.optional?u.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var h=l(n.delimiter||"/"),g=s.slice(-h.length)===h;return o||(s=(g?s.slice(0,-h.length):s)+"(?:"+h+"(?=$))?"),s+=a?"$":o&&g?"":"(?="+h+"|$)",c(new RegExp("^"+s,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 c(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 c(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},2408:(e,t,n)=>{"use strict";var r=n(7418),o=60103,a=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var s=60109,i=60110,l=60112;t.Suspense=60113;var u=60115,c=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"),s=d("react.provider"),i=d("react.context"),l=d("react.forward_ref"),t.Suspense=d("react.suspense"),u=d("react.memo"),c=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 h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function m(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}m.prototype.isReactComponent={},m.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")},m.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=m.prototype;var y=v.prototype=new b;y.constructor=v,r(y,m.prototype),y.isPureReactComponent=!0;var x={current:null},w=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function z(e,t,n){var r,a={},s=null,i=null;if(null!=t)for(r in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)w.call(t,r)&&!k.hasOwnProperty(r)&&(a[r]=t[r]);var l=arguments.length-2;if(1===l)a.children=n;else if(1<l){for(var u=Array(l),c=0;c<l;c++)u[c]=arguments[c+2];a.children=u}if(e&&e.defaultProps)for(r in l=e.defaultProps)void 0===a[r]&&(a[r]=l[r]);return{$$typeof:o,type:e,key:s,ref:i,props:a,_owner:x.current}}function _(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var E=/\/+/g;function H(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 S(e,t,n,r,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var l=!1;if(null===e)l=!0;else switch(i){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case o:case a:l=!0}}if(l)return s=s(l=e),e=""===r?"."+H(l,0):r,Array.isArray(s)?(n="",null!=e&&(n=e.replace(E,"$&/")+"/"),S(s,t,n,"",(function(e){return e}))):null!=s&&(_(s)&&(s=function(e,t){return{$$typeof:o,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,n+(!s.key||l&&l.key===s.key?"":(""+s.key).replace(E,"$&/")+"/")+e)),t.push(s)),1;if(l=0,r=""===r?".":r+":",Array.isArray(e))for(var u=0;u<e.length;u++){var c=r+H(i=e[u],u);l+=S(i,t,n,c,s)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(i=e.next()).done;)l+=S(i=i.value,t,n,c=r+H(i,u++),s);else if("object"===i)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return l}function C(e,t,n){if(null==e)return e;var r=[],o=0;return S(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function T(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 L={current:null};function A(){var e=L.current;if(null===e)throw Error(f(321));return e}var N={ReactCurrentDispatcher:L,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:x,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:C,forEach:function(e,t,n){C(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return C(e,(function(){t++})),t},toArray:function(e){return C(e,(function(e){return e}))||[]},only:function(e){if(!_(e))throw Error(f(143));return e}},t.Component=m,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),s=e.key,i=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,l=x.current),void 0!==t.key&&(s=""+t.key),e.type&&e.type.defaultProps)var u=e.type.defaultProps;for(c in t)w.call(t,c)&&!k.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==u?u[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=n;else if(1<c){u=Array(c);for(var d=0;d<c;d++)u[d]=arguments[d+2];a.children=u}return{$$typeof:o,type:e.type,key:s,ref:i,props:a,_owner:l}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:i,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=z,t.createFactory=function(e){var t=z.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=_,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:T}},t.memo=function(e,t){return{$$typeof:u,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return A().useCallback(e,t)},t.useContext=function(e,t){return A().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return A().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return A().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return A().useLayoutEffect(e,t)},t.useMemo=function(e,t){return A().useMemo(e,t)},t.useReducer=function(e,t,n){return A().useReducer(e,t,n)},t.useRef=function(e){return A().useRef(e)},t.useState=function(e){return A().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 s=performance;t.unstable_now=function(){return s.now()}}else{var i=Date,l=i.now();t.unstable_now=function(){return i.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var u=null,c=null,d=function(){if(null!==u)try{var e=t.unstable_now();u(!0,e),u=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==u?setTimeout(n,0,e):(u=e,setTimeout(d,0))},r=function(e,t){c=setTimeout(e,t)},o=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var h=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 h&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,m=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 x=new MessageChannel,w=x.port2;x.port1.onmessage=function(){if(null!==m){var e=t.unstable_now();y=e+v;try{m(!0,e)?w.postMessage(null):(g=!1,m=null)}catch(n){throw w.postMessage(null),n}}else g=!1},n=function(e){m=e,g||(g=!0,w.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<E(o,t)))break e;e[r]=t,e[n]=o,n=r}}function z(e){return void 0===(e=e[0])?null:e}function _(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,s=e[a],i=a+1,l=e[i];if(void 0!==s&&0>E(s,n))void 0!==l&&0>E(l,s)?(e[r]=l,e[i]=n,r=i):(e[r]=s,e[a]=n,r=a);else{if(!(void 0!==l&&0>E(l,n)))break e;e[r]=l,e[i]=n,r=i}}}return t}return null}function E(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var H=[],S=[],C=1,T=null,L=3,A=!1,N=!1,P=!1;function O(e){for(var t=z(S);null!==t;){if(null===t.callback)_(S);else{if(!(t.startTime<=e))break;_(S),t.sortIndex=t.expirationTime,k(H,t)}t=z(S)}}function I(e){if(P=!1,O(e),!N)if(null!==z(H))N=!0,n(R);else{var t=z(S);null!==t&&r(I,t.startTime-e)}}function R(e,n){N=!1,P&&(P=!1,o()),A=!0;var a=L;try{for(O(n),T=z(H);null!==T&&(!(T.expirationTime>n)||e&&!t.unstable_shouldYield());){var s=T.callback;if("function"==typeof s){T.callback=null,L=T.priorityLevel;var i=s(T.expirationTime<=n);n=t.unstable_now(),"function"==typeof i?T.callback=i:T===z(H)&&_(H),O(n)}else _(H);T=z(H)}if(null!==T)var l=!0;else{var u=z(S);null!==u&&r(I,u.startTime-n),l=!1}return l}finally{T=null,L=a,A=!1}}var D=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||A||(N=!0,n(R))},t.unstable_getCurrentPriorityLevel=function(){return L},t.unstable_getFirstCallbackNode=function(){return z(H)},t.unstable_next=function(e){switch(L){case 1:case 2:case 3:var t=3;break;default:t=L}var n=L;L=t;try{return e()}finally{L=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=D,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=L;L=e;try{return t()}finally{L=n}},t.unstable_scheduleCallback=function(e,a,s){var i=t.unstable_now();switch("object"==typeof s&&null!==s?s="number"==typeof(s=s.delay)&&0<s?i+s:i:s=i,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:C++,callback:a,priorityLevel:e,startTime:s,expirationTime:l=s+l,sortIndex:-1},s>i?(e.sortIndex=s,k(S,e),null===z(H)&&e===z(S)&&(P?o():P=!0,r(I,s-i))):(e.sortIndex=l,k(H,e),N||A||(N=!0,n(R))),e},t.unstable_wrapCallback=function(e){var t=L;return function(){var n=L;L=t;try{return e.apply(this,arguments)}finally{L=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),s=Object.keys(t);if(a.length!==s.length)return!1;for(var i=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var u=a[l];if(!i(u))return!1;var c=e[u],d=t[u];if(!1===(o=n?n.call(r,c,d,u):void 0)||void 0===o&&c!==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,s=r.useEffect,i=r.useLayoutEffect,l=r.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var c="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,c=r[1];return i((function(){o.value=n,o.getSnapshot=t,u(o)&&c({inst:o})}),[e,n,t]),s((function(){return u(o)&&c({inst:o}),e((function(){u(o)&&c({inst:o})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:c},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:"Zealot",tagline:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",url:"https://zealot.ews.im",baseUrl:"/zh-Hans/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/zealot.png",i18n:{defaultLocale:"en",locales:["en","zh-Hans"],path:"i18n",localeConfigs:{}},organizationName:"tryzealot",projectName:"docs",presets:[["classic",{docs:{sidebarPath:"/home/runner/work/docs/docs/sidebars.js",editUrl:"https://github.com/tryzealot/docs/tree/main/",lastVersion:"5.0.0",versions:{current:{label:"Next \ud83d\udea7"}}},theme:{customCss:"/home/runner/work/docs/docs/src/css/custom.css"},sitemap:{changefreq:"weekly",priority:.5,ignorePatterns:["/tags/**"],filename:"sitemap.xml"}}]],themeConfig:{navbar:{title:"Zealot",logo:{alt:"Zealot Logo",src:"img/zealot.png",srcDark:"img/zealot-dark.png"},items:[{type:"doc",docId:"self-hosted/index",label:"\u81ea\u5efa\u670d\u52a1\u6307\u5357",position:"left"},{type:"doc",docId:"developer-guide/index",position:"left",label:"\u5f00\u53d1\u8005\u8d44\u6e90"},{type:"doc",docId:"user-guide/index",position:"left",label:"\u7528\u6237\u624b\u518c"},{type:"doc",docId:"contributing-guide/index",position:"left",label:"\u8d21\u732e\u8005\u6307\u5357"},{type:"doc",docId:"user-guide/changelog",position:"left",label:"\u53d8\u66f4\u65e5\u5fd7"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsAfter:[{type:"html",value:'<hr class="dropdown-separator">'},{href:"https://tryzealot.github.io/docs-legacy",label:"Legacy docs"}],dropdownItemsBefore:[]},{type:"localeDropdown",position:"right",dropdownItemsBefore:[],dropdownItemsAfter:[]}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Community",items:[{label:"Github Discussions",href:"https://github.com/tryzealot/zealot/discussions"},{label:"Telegram",href:"https://t.me/+csa3Y2KOx44wMGRl"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/tryzealot/zealot"}]}],copyright:"Copyright \xa9 2023 icyleaf. Built with Docusaurus."},prism:{additionalLanguages:["kotlin","java","swift","groovy","ruby","nginx","toml","hcl"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}},{className:"code-block-error-line",line:"This will error"}],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:{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"}}]}},colorMode:{defaultMode:"light",disableSwitch:!1,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=JSON.parse('{"theme.AnnouncementBar.closeButtonAriaLabel":"\u5173\u95ed","theme.BackToTopButton.buttonAriaLabel":"\u56de\u5230\u9876\u90e8","theme.CodeBlock.copied":"\u590d\u5236\u6210\u529f","theme.CodeBlock.copy":"\u590d\u5236","theme.CodeBlock.copyButtonAriaLabel":"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f","theme.CodeBlock.wordWrapToggle":"\u5207\u6362\u81ea\u52a8\u6362\u884c","theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel":"\u6253\u5f00/\u6536\u8d77\u4fa7\u8fb9\u680f\u83dc\u5355\u300c{label}\u300d","theme.ErrorPageContent.title":"\u9875\u9762\u5df2\u5d29\u6e83\u3002","theme.ErrorPageContent.tryAgain":"\u91cd\u8bd5","theme.NavBar.navAriaLabel":"\u4e3b\u5bfc\u822a","theme.NotFound.p1":"\u6211\u4eec\u627e\u4e0d\u5230\u60a8\u8981\u627e\u7684\u9875\u9762\u3002","theme.NotFound.p2":"\u8bf7\u8054\u7cfb\u539f\u59cb\u94fe\u63a5\u6765\u6e90\u7f51\u7ad9\u7684\u6240\u6709\u8005\uff0c\u5e76\u544a\u77e5\u4ed6\u4eec\u94fe\u63a5\u5df2\u635f\u574f\u3002","theme.NotFound.title":"\u627e\u4e0d\u5230\u9875\u9762","theme.TOCCollapsible.toggleButtonLabel":"\u672c\u9875\u603b\u89c8","theme.admonition.caution":"\u8b66\u544a","theme.admonition.danger":"\u5371\u9669","theme.admonition.info":"\u4fe1\u606f","theme.admonition.note":"\u5907\u6ce8","theme.admonition.tip":"\u63d0\u793a","theme.blog.archive.description":"\u5386\u53f2\u535a\u6587","theme.blog.archive.title":"\u5386\u53f2\u535a\u6587","theme.blog.paginator.navAriaLabel":"\u535a\u6587\u5217\u8868\u5206\u9875\u5bfc\u822a","theme.blog.paginator.newerEntries":"\u8f83\u65b0\u7684\u535a\u6587","theme.blog.paginator.olderEntries":"\u8f83\u65e7\u7684\u535a\u6587","theme.blog.post.paginator.navAriaLabel":"\u535a\u6587\u5206\u9875\u5bfc\u822a","theme.blog.post.paginator.newerPost":"\u8f83\u65b0\u4e00\u7bc7","theme.blog.post.paginator.olderPost":"\u8f83\u65e7\u4e00\u7bc7","theme.blog.post.plurals":"{count} \u7bc7\u535a\u6587","theme.blog.post.readMore":"\u9605\u8bfb\u66f4\u591a","theme.blog.post.readMoreLabel":"\u9605\u8bfb {title} \u7684\u5168\u6587","theme.blog.post.readingTime.plurals":"\u9605\u8bfb\u9700 {readingTime} \u5206\u949f","theme.blog.sidebar.navAriaLabel":"\u6700\u8fd1\u535a\u6587\u5bfc\u822a","theme.blog.tagTitle":"{nPosts} \u542b\u6709\u6807\u7b7e\u300c{tagName}\u300d","theme.colorToggle.ariaLabel":"\u5207\u6362\u6d45\u8272/\u6697\u9ed1\u6a21\u5f0f\uff08\u5f53\u524d\u4e3a{mode}\uff09","theme.colorToggle.ariaLabel.mode.dark":"\u6697\u9ed1\u6a21\u5f0f","theme.colorToggle.ariaLabel.mode.light":"\u6d45\u8272\u6a21\u5f0f","theme.common.editThisPage":"\u7f16\u8f91\u6b64\u9875","theme.common.headingLinkTitle":"\u6807\u9898\u7684\u76f4\u63a5\u94fe\u63a5","theme.common.skipToMainContent":"\u8df3\u5230\u4e3b\u8981\u5185\u5bb9","theme.docs.DocCard.categoryDescription":"{count} \u4e2a\u9879\u76ee","theme.docs.breadcrumbs.home":"\u4e3b\u9875\u9762","theme.docs.breadcrumbs.navAriaLabel":"\u9875\u9762\u8def\u5f84","theme.docs.paginator.navAriaLabel":"\u6587\u6863\u5206\u9875\u5bfc\u822a","theme.docs.paginator.next":"\u4e0b\u4e00\u9875","theme.docs.paginator.previous":"\u4e0a\u4e00\u9875","theme.docs.sidebar.closeSidebarButtonAriaLabel":"Close navigation bar","theme.docs.sidebar.collapseButtonAriaLabel":"\u6536\u8d77\u4fa7\u8fb9\u680f","theme.docs.sidebar.collapseButtonTitle":"\u6536\u8d77\u4fa7\u8fb9\u680f","theme.docs.sidebar.expandButtonAriaLabel":"\u5c55\u5f00\u4fa7\u8fb9\u680f","theme.docs.sidebar.expandButtonTitle":"\u5c55\u5f00\u4fa7\u8fb9\u680f","theme.docs.sidebar.navAriaLabel":"\u6587\u6863\u4fa7\u8fb9\u680f","theme.docs.sidebar.toggleSidebarButtonAriaLabel":"Toggle navigation bar","theme.docs.tagDocListPageTitle":"{nDocsTagged}\u300c{tagName}\u300d","theme.docs.tagDocListPageTitle.nDocsTagged":"{count} \u7bc7\u6587\u6863\u5e26\u6709\u6807\u7b7e","theme.docs.versionBadge.label":"\u7248\u672c\uff1a{versionLabel}","theme.docs.versions.latestVersionLinkLabel":"\u6700\u65b0\u7248\u672c","theme.docs.versions.latestVersionSuggestionLabel":"\u6700\u65b0\u7684\u6587\u6863\u8bf7\u53c2\u9605 {latestVersionLink} ({versionLabel})\u3002","theme.docs.versions.unmaintainedVersionLabel":"\u6b64\u4e3a {siteTitle} {versionLabel} \u7248\u7684\u6587\u6863\uff0c\u73b0\u5df2\u4e0d\u518d\u79ef\u6781\u7ef4\u62a4\u3002","theme.docs.versions.unreleasedVersionLabel":"\u6b64\u4e3a {siteTitle} {versionLabel} \u7248\u5c1a\u672a\u53d1\u884c\u7684\u6587\u6863\u3002","theme.lastUpdated.atDate":"\u4e8e {date} ","theme.lastUpdated.byUser":"\u7531 {user} ","theme.lastUpdated.lastUpdatedAtBy":"\u6700\u540e{byUser}{atDate}\u66f4\u65b0","theme.navbar.mobileLanguageDropdown.label":"\u9009\u62e9\u8bed\u8a00","theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel":"\u2190 \u56de\u5230\u4e3b\u83dc\u5355","theme.navbar.mobileVersionsDropdown.label":"\u9009\u62e9\u7248\u672c","theme.tags.tagsListLabel":"\u6807\u7b7e\uff1a","theme.tags.tagsPageLink":"\u67e5\u770b\u6240\u6709\u6807\u7b7e","theme.tags.tagsPageTitle":"\u6807\u7b7e","Easy to Use":"\u8f7b\u677e\u4f7f\u7528","Focus on What Matters":"\u4e13\u6ce8\u4e8e\u91cd\u8981\u7684\u4e8b\u60c5","Open Source 100%":"100% \u5f00\u6e90\u9879\u76ee","Zealot was designed from the ground up to be easily installed and running quickly.":"Zealot \u63d0\u4f9b\u7b80\u5355\u4fbf\u6377\u7684\u90e8\u7f72\u65b9\u5f0f\u5b9e\u73b0\u4e00\u952e\u5b89\u88c5\u548c\u8fd0\u884c\u3002","Zealot lets you focus on your app, and we\'ll do the chores. Go ahead and upload your apps.":"Zealot \u4f7f\u5f97\u5f00\u53d1\u8005\u53ef\u4ee5\u5173\u6ce8\u4e8e\u5e94\u7528\u5f00\u53d1\u672c\u8eab\uff0c\u6211\u4eec\u6765\u5904\u7406\u6301\u7eed\u4ea4\u4ed8\u548c\u6d4b\u8bd5\u7684\u5de5\u4f5c\uff0c\u7acb\u5373\u4e0a\u4f20\u5e94\u7528\u5427\u3002","Zealot is an open source project, Everyone could easy self hosted on own servers.":"Zealot \u662f\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u6bcf\u4e2a\u4eba\u90fd\u53ef\u4ee5\u79c1\u6709\u5316\u90e8\u7f72\u5728\u81ea\u5df1\u7684\u670d\u52a1\u5668\u3002","Getting started":"\u5feb\u901f\u4e0a\u624b","homepage.header.title":"Zealot","homepage.header.subtitle":"\u5f00\u6e90\u81ea\u90e8\u7f72\u6301\u7eed\u96c6\u6210\u4e00\u5207\u8ddf\u5e94\u7528\u6709\u5173\u4e8b\u60c5\uff0c\u63a5\u5165\u4efb\u610f CI \u7cfb\u7edf\u4e00\u5207\u81ea\u52a8\u5316\u5904\u7406\uff0c\u4f01\u4e1a\u591a\u5e74\u5b9e\u6218\u7ecf\u9a8c\uff0c\u72ec\u7acb\u90e8\u7f72\u63d0\u4f9b\u4f01\u4e1a\u6253\u5305\u5206\u53d1\u6d41\u7a0b\u3001\u4e0a\u4f20\u5e94\u7528\u5168\u5957\u6d41\u7a0b\u65b9\u6848","Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.":"\u79c1\u6709\u5316\u90e8\u7f72 Android\u3001iOS\u3001macOS\u3001Windows \u548c Linux \u5e94\u7528\u6258\u7ba1\u670d\u52a1"}')},6887:e=>{"use strict";e.exports=JSON.parse('{"/zh-Hans/markdown-page-75e":{"__comp":"1f391b9e","__context":{"plugin":"a7434565"},"content":"393be207"},"/zh-Hans/docs/4.x-da2":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"cae0f04b"},"/zh-Hans/docs/4.x/category/administrator-d7f":{"__comp":"14eb3368","categoryGeneratedIndex":"7a31e8eb"},"/zh-Hans/docs/4.x/category/apps-2ef":{"__comp":"14eb3368","categoryGeneratedIndex":"47c1865a"},"/zh-Hans/docs/4.x/category/cloud-provider-guides-3e0":{"__comp":"14eb3368","categoryGeneratedIndex":"7e84284a"},"/zh-Hans/docs/4.x/category/configuration-139":{"__comp":"14eb3368","categoryGeneratedIndex":"7f084e8e"},"/zh-Hans/docs/4.x/category/debug-files-bfa":{"__comp":"14eb3368","categoryGeneratedIndex":"2de1c1b9"},"/zh-Hans/docs/4.x/category/deployment-518":{"__comp":"14eb3368","categoryGeneratedIndex":"492fa892"},"/zh-Hans/docs/4.x/category/local-development-c2c":{"__comp":"14eb3368","categoryGeneratedIndex":"a9736a03"},"/zh-Hans/docs/4.x/category/monitoring-066":{"__comp":"14eb3368","categoryGeneratedIndex":"5b48482c"},"/zh-Hans/docs/4.x/category/sdks-cd7":{"__comp":"14eb3368","categoryGeneratedIndex":"6a6b352a"},"/zh-Hans/docs/4.x/category/toolkits-9b1":{"__comp":"14eb3368","categoryGeneratedIndex":"b0b6b74b"},"/zh-Hans/docs/4.x/contributing-guide/-0bd":{"__comp":"17896441","content":"77ad6583"},"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer-7b7":{"__comp":"17896441","content":"9d0b921d"},"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code-314":{"__comp":"17896441","content":"0c22aff4"},"/zh-Hans/docs/4.x/developer-guide/-396":{"__comp":"17896441","content":"731441ba"},"/zh-Hans/docs/4.x/developer-guide/api-d53":{"__comp":"17896441","content":"6988bd10"},"/zh-Hans/docs/4.x/developer-guide/api/apps-b1c":{"__comp":"17896441","content":"71cdea68"},"/zh-Hans/docs/4.x/developer-guide/api/debug_files-ae9":{"__comp":"17896441","content":"9387e8f1"},"/zh-Hans/docs/4.x/developer-guide/fastlane-baa":{"__comp":"17896441","content":"3b925495"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot-684":{"__comp":"17896441","content":"6de0a3bc"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file-8bd":{"__comp":"17896441","content":"08927acb"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices-1c5":{"__comp":"17896441","content":"dc9db4d6"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check-55a":{"__comp":"17896441","content":"77ba73fa"},"/zh-Hans/docs/4.x/developer-guide/sdk/android-57e":{"__comp":"17896441","content":"b43ef384"},"/zh-Hans/docs/4.x/developer-guide/sdk/ios-e20":{"__comp":"17896441","content":"c704004d"},"/zh-Hans/docs/4.x/self-hosted/-518":{"__comp":"17896441","content":"b6e49d05"},"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables-3c6":{"__comp":"17896441","content":"78d3bc26"},"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs-a07":{"__comp":"17896441","content":"6c1f465d"},"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication-586":{"__comp":"17896441","content":"6025cfa3"},"/zh-Hans/docs/4.x/self-hosted/deployment/architecture-ea9":{"__comp":"17896441","content":"eb842df6"},"/zh-Hans/docs/4.x/self-hosted/deployment/docker-143":{"__comp":"17896441","content":"4aeacf08"},"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step-4fe":{"__comp":"17896441","content":"5fe54c51"},"/zh-Hans/docs/4.x/self-hosted/deployment/fly-b4e":{"__comp":"17896441","content":"b168d81c"},"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes-779":{"__comp":"17896441","content":"3731d319"},"/zh-Hans/docs/4.x/self-hosted/deployment/nomad-902":{"__comp":"17896441","content":"1ec5d4b5"},"/zh-Hans/docs/4.x/self-hosted/deployment/railway-548":{"__comp":"17896441","content":"e471e2c1"},"/zh-Hans/docs/4.x/self-hosted/deployment/render-db8":{"__comp":"17896441","content":"33ad4946"},"/zh-Hans/docs/4.x/self-hosted/deployment/requirements-4df":{"__comp":"17896441","content":"42055627"},"/zh-Hans/docs/4.x/self-hosted/deployment/source-code-4c4":{"__comp":"17896441","content":"f3e148a8"},"/zh-Hans/docs/4.x/self-hosted/reverse-proxies-9ee":{"__comp":"17896441","content":"b572cb1f"},"/zh-Hans/docs/4.x/self-hosted/storage-380":{"__comp":"17896441","content":"10743099"},"/zh-Hans/docs/4.x/user-guide/-f14":{"__comp":"17896441","content":"3e64385b"},"/zh-Hans/docs/4.x/user-guide/administrator/apple-team-2b0":{"__comp":"17896441","content":"66a79633"},"/zh-Hans/docs/4.x/user-guide/administrator/backup-f68":{"__comp":"17896441","content":"5171b55b"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs-a4d":{"__comp":"17896441","content":"c869843a"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics-462":{"__comp":"17896441","content":"5e69b000"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging-3aa":{"__comp":"17896441","content":"c5a4c00b"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info-8f2":{"__comp":"17896441","content":"8c7fed4d"},"/zh-Hans/docs/4.x/user-guide/administrator/permissions-cbb":{"__comp":"17896441","content":"c38ecdbc"},"/zh-Hans/docs/4.x/user-guide/administrator/project-settings-bbb":{"__comp":"17896441","content":"7e2cd3a9"},"/zh-Hans/docs/4.x/user-guide/apps/create-574":{"__comp":"17896441","content":"405e4d0a"},"/zh-Hans/docs/4.x/user-guide/best_practices-9f7":{"__comp":"17896441","content":"575c49fd"},"/zh-Hans/docs/4.x/user-guide/changelog-af2":{"__comp":"17896441","content":"89a1149b"},"/zh-Hans/docs/4.x/user-guide/credits-672":{"__comp":"17896441","content":"67d72155"},"/zh-Hans/docs/4.x/user-guide/dashboard-2c7":{"__comp":"17896441","content":"1ab7b698"},"/zh-Hans/docs/4.x/user-guide/debug-files/upload-f8f":{"__comp":"17896441","content":"8dbd9405"},"/zh-Hans/docs/4.x/user-guide/qa-a9f":{"__comp":"17896441","content":"0409ce86"},"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid-31b":{"__comp":"17896441","content":"6fa94343"},"/zh-Hans/docs/4.x/user-guide/toolkits/teardown-915":{"__comp":"17896441","content":"05c34111"},"/zh-Hans/docs/4.x/user-guide/webhooks-d21":{"__comp":"17896441","content":"1d59b05a"},"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk-078":{"__comp":"17896441","content":"68604c4e"},"/zh-Hans/docs/4.x/user-guide/webhooks/discord-0f6":{"__comp":"17896441","content":"493ecea9"},"/zh-Hans/docs/4.x/user-guide/webhooks/feishu-c9c":{"__comp":"17896441","content":"6821510c"},"/zh-Hans/docs/4.x/user-guide/webhooks/slack-4ac":{"__comp":"17896441","content":"00f34551"},"/zh-Hans/docs/4.x/user-guide/webhooks/wecom-f3a":{"__comp":"17896441","content":"63d75c88"},"/zh-Hans/docs/next-e3e":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"935f2afb"},"/zh-Hans/docs/next/category/administrator-72c":{"__comp":"14eb3368","categoryGeneratedIndex":"4aefe824"},"/zh-Hans/docs/next/category/apps-260":{"__comp":"14eb3368","categoryGeneratedIndex":"f057e2be"},"/zh-Hans/docs/next/category/cloud-provider-guides-ddb":{"__comp":"14eb3368","categoryGeneratedIndex":"f3ecbbb7"},"/zh-Hans/docs/next/category/configuration-e3d":{"__comp":"14eb3368","categoryGeneratedIndex":"e649ac20"},"/zh-Hans/docs/next/category/debug-files-1e7":{"__comp":"14eb3368","categoryGeneratedIndex":"0376ac8d"},"/zh-Hans/docs/next/category/deployment-730":{"__comp":"14eb3368","categoryGeneratedIndex":"ab09b93d"},"/zh-Hans/docs/next/category/local-development-3a2":{"__comp":"14eb3368","categoryGeneratedIndex":"53ae73f2"},"/zh-Hans/docs/next/category/monitoring-5fb":{"__comp":"14eb3368","categoryGeneratedIndex":"c1af49ed"},"/zh-Hans/docs/next/category/sdks-dd4":{"__comp":"14eb3368","categoryGeneratedIndex":"68518edc"},"/zh-Hans/docs/next/category/toolkits-dcc":{"__comp":"14eb3368","categoryGeneratedIndex":"c7c3383a"},"/zh-Hans/docs/next/contributing-guide/-24b":{"__comp":"17896441","content":"4960790f"},"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer-033":{"__comp":"17896441","content":"cc8d1b20"},"/zh-Hans/docs/next/contributing-guide/local-development/source-code-d9f":{"__comp":"17896441","content":"c941fb92"},"/zh-Hans/docs/next/developer-guide/-81a":{"__comp":"17896441","content":"61b3b8ce"},"/zh-Hans/docs/next/developer-guide/api-d7a":{"__comp":"17896441","content":"546445a3"},"/zh-Hans/docs/next/developer-guide/api/apps-8f3":{"__comp":"17896441","content":"c6fb1e3c"},"/zh-Hans/docs/next/developer-guide/api/debug_files-0f2":{"__comp":"17896441","content":"ef9024f9"},"/zh-Hans/docs/next/developer-guide/fastlane-637":{"__comp":"17896441","content":"92f17503"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot-8f6":{"__comp":"17896441","content":"ae0b00ed"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file-e8c":{"__comp":"17896441","content":"b155671d"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices-ae9":{"__comp":"17896441","content":"07e94b94"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check-ff2":{"__comp":"17896441","content":"4daa79cc"},"/zh-Hans/docs/next/developer-guide/sdk/android-6e9":{"__comp":"17896441","content":"000e92dd"},"/zh-Hans/docs/next/developer-guide/sdk/ios-27f":{"__comp":"17896441","content":"380655f7"},"/zh-Hans/docs/next/self-hosted/-5e5":{"__comp":"17896441","content":"498392b4"},"/zh-Hans/docs/next/self-hosted/configuration/environment-variables-9da":{"__comp":"17896441","content":"30738da4"},"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs-043":{"__comp":"17896441","content":"4b6154ab"},"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication-357":{"__comp":"17896441","content":"ffe0e092"},"/zh-Hans/docs/next/self-hosted/deployment/architecture-751":{"__comp":"17896441","content":"f3b6e326"},"/zh-Hans/docs/next/self-hosted/deployment/docker-a4f":{"__comp":"17896441","content":"533b3bff"},"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step-d7b":{"__comp":"17896441","content":"756ae957"},"/zh-Hans/docs/next/self-hosted/deployment/fly-17c":{"__comp":"17896441","content":"93e83d03"},"/zh-Hans/docs/next/self-hosted/deployment/kubernetes-11d":{"__comp":"17896441","content":"0b2dde68"},"/zh-Hans/docs/next/self-hosted/deployment/nomad-f41":{"__comp":"17896441","content":"94a70f3c"},"/zh-Hans/docs/next/self-hosted/deployment/railway-ca6":{"__comp":"17896441","content":"4a0f0e0c"},"/zh-Hans/docs/next/self-hosted/deployment/render-4ce":{"__comp":"17896441","content":"23b09800"},"/zh-Hans/docs/next/self-hosted/deployment/requirements-f08":{"__comp":"17896441","content":"40622858"},"/zh-Hans/docs/next/self-hosted/deployment/source-code-ded":{"__comp":"17896441","content":"b8ca8336"},"/zh-Hans/docs/next/self-hosted/reverse-proxies-49a":{"__comp":"17896441","content":"4bc9e19e"},"/zh-Hans/docs/next/self-hosted/storage-0ff":{"__comp":"17896441","content":"e84771ae"},"/zh-Hans/docs/next/user-guide/-1fb":{"__comp":"17896441","content":"36ff01e5"},"/zh-Hans/docs/next/user-guide/administrator/apple-team-383":{"__comp":"17896441","content":"381e4cde"},"/zh-Hans/docs/next/user-guide/administrator/backup-4ae":{"__comp":"17896441","content":"b667b6c3"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs-b4c":{"__comp":"17896441","content":"422bbee2"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics-847":{"__comp":"17896441","content":"d7c763e8"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging-b1a":{"__comp":"17896441","content":"5f6e077b"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info-056":{"__comp":"17896441","content":"2ba4a649"},"/zh-Hans/docs/next/user-guide/administrator/permissions-bfc":{"__comp":"17896441","content":"b0d48a44"},"/zh-Hans/docs/next/user-guide/administrator/settings-a7e":{"__comp":"17896441","content":"927828a2"},"/zh-Hans/docs/next/user-guide/apps/-7fe":{"__comp":"17896441","content":"097ad104"},"/zh-Hans/docs/next/user-guide/apps/create-faa":{"__comp":"17896441","content":"0f991629"},"/zh-Hans/docs/next/user-guide/apps/detail-78f":{"__comp":"17896441","content":"ac20dd04"},"/zh-Hans/docs/next/user-guide/apps/upload-d44":{"__comp":"17896441","content":"580231d5"},"/zh-Hans/docs/next/user-guide/best_practices-49f":{"__comp":"17896441","content":"65f8d4cd"},"/zh-Hans/docs/next/user-guide/changelog-f9a":{"__comp":"17896441","content":"ad5e89b7"},"/zh-Hans/docs/next/user-guide/credits-054":{"__comp":"17896441","content":"9aa09611"},"/zh-Hans/docs/next/user-guide/dashboard-581":{"__comp":"17896441","content":"ec4538ed"},"/zh-Hans/docs/next/user-guide/debug-files/-d57":{"__comp":"17896441","content":"a21619df"},"/zh-Hans/docs/next/user-guide/debug-files/review-6df":{"__comp":"17896441","content":"e177b72e"},"/zh-Hans/docs/next/user-guide/debug-files/upload-99a":{"__comp":"17896441","content":"c6bdf690"},"/zh-Hans/docs/next/user-guide/qa-f7a":{"__comp":"17896441","content":"808d5cf9"},"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid-204":{"__comp":"17896441","content":"d0f9f7b0"},"/zh-Hans/docs/next/user-guide/toolkits/teardown-a6c":{"__comp":"17896441","content":"78f6b461"},"/zh-Hans/docs/next/user-guide/webhooks-66b":{"__comp":"17896441","content":"1ab1b8b6"},"/zh-Hans/docs/next/user-guide/webhooks/dingtalk-784":{"__comp":"17896441","content":"aa45ed72"},"/zh-Hans/docs/next/user-guide/webhooks/discord-946":{"__comp":"17896441","content":"bbb0fa6e"},"/zh-Hans/docs/next/user-guide/webhooks/feishu-42f":{"__comp":"17896441","content":"0da09c0c"},"/zh-Hans/docs/next/user-guide/webhooks/slack-7cb":{"__comp":"17896441","content":"8c755c24"},"/zh-Hans/docs/next/user-guide/webhooks/wecom-644":{"__comp":"17896441","content":"980d6c79"},"/zh-Hans/docs-a28":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"c9b278a8"},"/zh-Hans/docs/category/administrator-097":{"__comp":"14eb3368","categoryGeneratedIndex":"bc4a1c03"},"/zh-Hans/docs/category/apps-8cd":{"__comp":"14eb3368","categoryGeneratedIndex":"e676557f"},"/zh-Hans/docs/category/cloud-provider-guides-fbc":{"__comp":"14eb3368","categoryGeneratedIndex":"320c81fa"},"/zh-Hans/docs/category/configuration-346":{"__comp":"14eb3368","categoryGeneratedIndex":"f25fc619"},"/zh-Hans/docs/category/debug-files-ea0":{"__comp":"14eb3368","categoryGeneratedIndex":"9d7c6944"},"/zh-Hans/docs/category/deployment-1b8":{"__comp":"14eb3368","categoryGeneratedIndex":"f500fe2a"},"/zh-Hans/docs/category/local-development-34b":{"__comp":"14eb3368","categoryGeneratedIndex":"9d0a861d"},"/zh-Hans/docs/category/monitoring-adb":{"__comp":"14eb3368","categoryGeneratedIndex":"f576f290"},"/zh-Hans/docs/category/sdks-38f":{"__comp":"14eb3368","categoryGeneratedIndex":"709f7e27"},"/zh-Hans/docs/category/toolkits-a3c":{"__comp":"14eb3368","categoryGeneratedIndex":"70a2637b"},"/zh-Hans/docs/contributing-guide/-73c":{"__comp":"17896441","content":"06a7ce3e"},"/zh-Hans/docs/contributing-guide/local-development/devcontainer-862":{"__comp":"17896441","content":"56786dcf"},"/zh-Hans/docs/contributing-guide/local-development/source-code-ad0":{"__comp":"17896441","content":"cbffe0ba"},"/zh-Hans/docs/developer-guide/-274":{"__comp":"17896441","content":"7b50d085"},"/zh-Hans/docs/developer-guide/api-722":{"__comp":"17896441","content":"797c3697"},"/zh-Hans/docs/developer-guide/api/apps-40f":{"__comp":"17896441","content":"a73dab33"},"/zh-Hans/docs/developer-guide/api/debug_files-869":{"__comp":"17896441","content":"3384f4b5"},"/zh-Hans/docs/developer-guide/fastlane-73d":{"__comp":"17896441","content":"c3412635"},"/zh-Hans/docs/developer-guide/fastlane/zealot-3fc":{"__comp":"17896441","content":"0b5c90e4"},"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file-4df":{"__comp":"17896441","content":"8e4c1cdf"},"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices-d4f":{"__comp":"17896441","content":"6aeebc73"},"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check-ac5":{"__comp":"17896441","content":"dd90aca1"},"/zh-Hans/docs/developer-guide/sdk/android-cf3":{"__comp":"17896441","content":"3d079836"},"/zh-Hans/docs/developer-guide/sdk/ios-e8f":{"__comp":"17896441","content":"b38b46a9"},"/zh-Hans/docs/self-hosted/-78e":{"__comp":"17896441","content":"0ef4ad01"},"/zh-Hans/docs/self-hosted/configuration/environment-variables-d54":{"__comp":"17896441","content":"500b40a2"},"/zh-Hans/docs/self-hosted/configuration/schedule-jobs-bb1":{"__comp":"17896441","content":"88e109fd"},"/zh-Hans/docs/self-hosted/configuration/third-party-authentication-0c6":{"__comp":"17896441","content":"faaf8c96"},"/zh-Hans/docs/self-hosted/deployment/architecture-91f":{"__comp":"17896441","content":"de6e37e2"},"/zh-Hans/docs/self-hosted/deployment/docker-189":{"__comp":"17896441","content":"1c821441"},"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step-57b":{"__comp":"17896441","content":"cd05e63c"},"/zh-Hans/docs/self-hosted/deployment/fly-fc2":{"__comp":"17896441","content":"b51b060c"},"/zh-Hans/docs/self-hosted/deployment/kubernetes-6b6":{"__comp":"17896441","content":"fe394c5b"},"/zh-Hans/docs/self-hosted/deployment/nomad-719":{"__comp":"17896441","content":"abf33808"},"/zh-Hans/docs/self-hosted/deployment/railway-9ef":{"__comp":"17896441","content":"93332d63"},"/zh-Hans/docs/self-hosted/deployment/render-934":{"__comp":"17896441","content":"cf72ee6a"},"/zh-Hans/docs/self-hosted/deployment/requirements-5d9":{"__comp":"17896441","content":"20570c26"},"/zh-Hans/docs/self-hosted/deployment/source-code-415":{"__comp":"17896441","content":"c3697579"},"/zh-Hans/docs/self-hosted/reverse-proxies-a9e":{"__comp":"17896441","content":"5914602b"},"/zh-Hans/docs/self-hosted/storage-969":{"__comp":"17896441","content":"04af2ec6"},"/zh-Hans/docs/user-guide/-859":{"__comp":"17896441","content":"a06cc266"},"/zh-Hans/docs/user-guide/administrator/apple-team-38b":{"__comp":"17896441","content":"089c33a0"},"/zh-Hans/docs/user-guide/administrator/backup-84e":{"__comp":"17896441","content":"210ec931"},"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs-497":{"__comp":"17896441","content":"2ff16664"},"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics-4bd":{"__comp":"17896441","content":"4b5eb73a"},"/zh-Hans/docs/user-guide/administrator/monitoring/logging-f50":{"__comp":"17896441","content":"c89e1d41"},"/zh-Hans/docs/user-guide/administrator/monitoring/system-info-bd8":{"__comp":"17896441","content":"26cfe7d9"},"/zh-Hans/docs/user-guide/administrator/permissions-ac0":{"__comp":"17896441","content":"9c76208a"},"/zh-Hans/docs/user-guide/administrator/project-settings-aec":{"__comp":"17896441","content":"d02aa106"},"/zh-Hans/docs/user-guide/administrator/settings-408":{"__comp":"17896441","content":"2a1b2070"},"/zh-Hans/docs/user-guide/apps/-243":{"__comp":"17896441","content":"fa6a7c71"},"/zh-Hans/docs/user-guide/apps/create-27d":{"__comp":"17896441","content":"e74b89a8"},"/zh-Hans/docs/user-guide/apps/detail-ce1":{"__comp":"17896441","content":"10ab72a2"},"/zh-Hans/docs/user-guide/apps/upload-0e8":{"__comp":"17896441","content":"2da1a83d"},"/zh-Hans/docs/user-guide/best_practices-7a2":{"__comp":"17896441","content":"eb89accb"},"/zh-Hans/docs/user-guide/changelog-6e5":{"__comp":"17896441","content":"9eed9fa1"},"/zh-Hans/docs/user-guide/credits-6de":{"__comp":"17896441","content":"e25c1561"},"/zh-Hans/docs/user-guide/dashboard-5aa":{"__comp":"17896441","content":"9a46955c"},"/zh-Hans/docs/user-guide/debug-files/-8d4":{"__comp":"17896441","content":"3d648c75"},"/zh-Hans/docs/user-guide/debug-files/review-24d":{"__comp":"17896441","content":"28463b1d"},"/zh-Hans/docs/user-guide/debug-files/upload-503":{"__comp":"17896441","content":"986b83c2"},"/zh-Hans/docs/user-guide/qa-8b7":{"__comp":"17896441","content":"23e1330d"},"/zh-Hans/docs/user-guide/toolkits/fetch-udid-847":{"__comp":"17896441","content":"46458cf8"},"/zh-Hans/docs/user-guide/toolkits/teardown-8ee":{"__comp":"17896441","content":"20cbbbee"},"/zh-Hans/docs/user-guide/webhooks-936":{"__comp":"17896441","content":"d75d92bc"},"/zh-Hans/docs/user-guide/webhooks/dingtalk-e82":{"__comp":"17896441","content":"2ac37e2a"},"/zh-Hans/docs/user-guide/webhooks/discord-f58":{"__comp":"17896441","content":"3f7af0f1"},"/zh-Hans/docs/user-guide/webhooks/feishu-5bb":{"__comp":"17896441","content":"0659cada"},"/zh-Hans/docs/user-guide/webhooks/slack-4b3":{"__comp":"17896441","content":"b2ef10a5"},"/zh-Hans/docs/user-guide/webhooks/wecom-82b":{"__comp":"17896441","content":"b0190f04"},"/zh-Hans/-df2":{"__comp":"c4f5d8e4","__context":{"plugin":"a7434565"},"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/zh-Hans/assets/js/main.8a3c5de7.js.LICENSE.txt b/zh-Hans/assets/js/main.20d5ef5c.js.LICENSE.txt similarity index 100% rename from zh-Hans/assets/js/main.8a3c5de7.js.LICENSE.txt rename to zh-Hans/assets/js/main.20d5ef5c.js.LICENSE.txt diff --git a/zh-Hans/assets/js/main.8a3c5de7.js b/zh-Hans/assets/js/main.8a3c5de7.js deleted file mode 100644 index 5a7b4de8f..000000000 --- a/zh-Hans/assets/js/main.8a3c5de7.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.8a3c5de7.js.LICENSE.txt */ -(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(7462),a=n(8356),s=n.n(a),i=n(6887);const l={"000e92dd":[()=>Promise.all([n.e(532),n.e(4123)]).then(n.bind(n,7766)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/android.md",7766],"00f34551":[()=>n.e(144).then(n.bind(n,6898)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/slack.md",6898],"0376ac8d":[()=>n.e(2171).then(n.t.bind(n,3526,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u8c03\u8bd5\u6587\u4ef6-144.json",3526],"0409ce86":[()=>n.e(4529).then(n.bind(n,1910)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/qa.md",1910],"04af2ec6":[()=>n.e(4219).then(n.bind(n,3464)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/storage.md",3464],"05c34111":[()=>n.e(3262).then(n.bind(n,8149)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/toolkits/teardown.md",8149],"0659cada":[()=>n.e(1854).then(n.bind(n,7810)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/feishu.md",7810],"06a7ce3e":[()=>n.e(1013).then(n.bind(n,6275)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/index.md",6275],"07e94b94":[()=>n.e(959).then(n.bind(n,8038)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_sync_devices.md",8038],"08927acb":[()=>n.e(7347).then(n.bind(n,4317)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_debug_file.md",4317],"089c33a0":[()=>n.e(7493).then(n.bind(n,4206)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/apple-team.mdx",4206],"097ad104":[()=>n.e(726).then(n.bind(n,3691)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/index.mdx",3691],"0b2dde68":[()=>n.e(7166).then(n.bind(n,9878)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/kubernetes.md",9878],"0b5c90e4":[()=>n.e(9555).then(n.bind(n,6035)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot.md",6035],"0c22aff4":[()=>Promise.all([n.e(532),n.e(3194)]).then(n.bind(n,400)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/source-code.md",400],"0da09c0c":[()=>n.e(8390).then(n.bind(n,3478)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/feishu.md",3478],"0ef4ad01":[()=>n.e(3313).then(n.bind(n,4572)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/index.md",4572],"0f991629":[()=>n.e(2254).then(n.bind(n,5571)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/create.mdx",5571],10743099:[()=>n.e(2571).then(n.bind(n,6028)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/storage.md",6028],"10ab72a2":[()=>n.e(8206).then(n.bind(n,6864)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/detail.mdx",6864],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(9455),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"1ab1b8b6":[()=>n.e(6447).then(n.bind(n,4740)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks.md",4740],"1ab7b698":[()=>n.e(7759).then(n.bind(n,1167)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/dashboard.md",1167],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c821441":[()=>n.e(9506).then(n.bind(n,1287)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/docker.md",1287],"1d59b05a":[()=>n.e(7181).then(n.bind(n,4109)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks.md",4109],"1ec5d4b5":[()=>n.e(8202).then(n.bind(n,4)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/nomad.md",4],"1f391b9e":[()=>Promise.all([n.e(532),n.e(9455),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"20570c26":[()=>n.e(639).then(n.bind(n,1749)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/requirements.md",1749],"20cbbbee":[()=>n.e(5405).then(n.bind(n,4510)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/toolkits/teardown.mdx",4510],"210ec931":[()=>n.e(2247).then(n.bind(n,3276)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/backup.mdx",3276],"23b09800":[()=>n.e(7817).then(n.bind(n,368)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/render.md",368],"23e1330d":[()=>n.e(3032).then(n.bind(n,8950)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/qa.md",8950],"247783bb":[()=>n.e(9334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"26cfe7d9":[()=>n.e(3091).then(n.bind(n,7626)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/system-info.mdx",7626],"28463b1d":[()=>n.e(4620).then(n.bind(n,7459)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/review.mdx",7459],"2a1b2070":[()=>n.e(2141).then(n.bind(n,1512)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/settings.mdx",1512],"2ac37e2a":[()=>n.e(5238).then(n.bind(n,9986)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/dingtalk.md",9986],"2ba4a649":[()=>n.e(5476).then(n.bind(n,2962)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/system-info.mdx",2962],"2da1a83d":[()=>n.e(7169).then(n.bind(n,7664)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/upload.mdx",7664],"2de1c1b9":[()=>n.e(105).then(n.t.bind(n,8148,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u8c03\u8bd5\u6587\u4ef6-25b.json",8148],"2ff16664":[()=>n.e(9327).then(n.bind(n,5997)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/background-jobs.mdx",5997],"30738da4":[()=>n.e(8170).then(n.bind(n,462)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/environment-variables.md",462],"320c81fa":[()=>n.e(6463).then(n.t.bind(n,1222,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u4e91\u670d\u52a1\u5546-459.json",1222],"3384f4b5":[()=>n.e(7772).then(n.bind(n,5812)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api/debug_files.md",5812],"33ad4946":[()=>n.e(5215).then(n.bind(n,6820)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/render.md",6820],"36ff01e5":[()=>n.e(2515).then(n.bind(n,5245)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/index.mdx",5245],"3731d319":[()=>n.e(3137).then(n.bind(n,7056)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/kubernetes.md",7056],"380655f7":[()=>Promise.all([n.e(532),n.e(9213)]).then(n.bind(n,7504)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/ios.md",7504],"381e4cde":[()=>n.e(8740).then(n.bind(n,7157)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/apple-team.mdx",7157],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"3b925495":[()=>n.e(2745).then(n.bind(n,2073)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane.md",2073],"3d079836":[()=>Promise.all([n.e(532),n.e(2922)]).then(n.bind(n,364)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/android.md",364],"3d648c75":[()=>n.e(7950).then(n.bind(n,6225)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/index.mdx",6225],"3e64385b":[()=>n.e(8307).then(n.bind(n,2418)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/index.mdx",2418],"3f7af0f1":[()=>n.e(9316).then(n.bind(n,3829)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/discord.md",3829],"405e4d0a":[()=>n.e(1233).then(n.bind(n,6590)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/apps/create.md",6590],40622858:[()=>n.e(9411).then(n.bind(n,955)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/requirements.md",955],42055627:[()=>n.e(6833).then(n.bind(n,8300)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/requirements.md",8300],"422bbee2":[()=>n.e(6082).then(n.bind(n,2451)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/background-jobs.mdx",2451],"46458cf8":[()=>n.e(4641).then(n.bind(n,9061)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/toolkits/fetch-udid.mdx",9061],"47c1865a":[()=>n.e(7755).then(n.t.bind(n,7724,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u5e94\u7528-2af.json",7724],"492fa892":[()=>n.e(7298).then(n.t.bind(n,8016,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u90e8\u7f72-a8b.json",8016],"493ecea9":[()=>n.e(6500).then(n.bind(n,2811)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/discord.md",2811],"4960790f":[()=>n.e(5185).then(n.bind(n,9788)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/index.md",9788],"498392b4":[()=>n.e(9164).then(n.bind(n,6373)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/index.md",6373],"4a0f0e0c":[()=>n.e(2986).then(n.bind(n,4520)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/railway.md",4520],"4aeacf08":[()=>n.e(6184).then(n.bind(n,9071)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/docker.md",9071],"4aefe824":[()=>n.e(6276).then(n.t.bind(n,2955,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u7ba1\u7406\u9762\u677f-802.json",2955],"4b5eb73a":[()=>n.e(8037).then(n.bind(n,4473)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/database-analytics.mdx",4473],"4b6154ab":[()=>n.e(8228).then(n.bind(n,1106)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/schedule-jobs.md",1106],"4bc9e19e":[()=>Promise.all([n.e(532),n.e(5342)]).then(n.bind(n,9543)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/reverse-proxies.mdx",9543],"4daa79cc":[()=>n.e(7030).then(n.bind(n,2052)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_version_check.md",2052],"500b40a2":[()=>n.e(6735).then(n.bind(n,2423)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/environment-variables.md",2423],"5171b55b":[()=>n.e(1075).then(n.bind(n,918)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/backup.md",918],"533b3bff":[()=>n.e(9882).then(n.bind(n,7177)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/docker.md",7177],"53ae73f2":[()=>n.e(9390).then(n.t.bind(n,5565,19)),"~docs/default/category-zh-hansdocsnext-contributingguide-category-\u672c\u5730\u5f00\u53d1-ac6.json",5565],"546445a3":[()=>n.e(7190).then(n.bind(n,2576)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api.md",2576],"56786dcf":[()=>Promise.all([n.e(532),n.e(6788)]).then(n.bind(n,9186)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",9186],"575c49fd":[()=>n.e(1821).then(n.bind(n,6232)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/best_practices.md",6232],"580231d5":[()=>n.e(5745).then(n.bind(n,2547)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/upload.mdx",2547],"5914602b":[()=>Promise.all([n.e(532),n.e(8797)]).then(n.bind(n,6406)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/reverse-proxies.mdx",6406],"5b48482c":[()=>n.e(7355).then(n.t.bind(n,6521,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u76d1\u63a7-bbd.json",6521],"5e69b000":[()=>n.e(9557).then(n.bind(n,1960)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/database-analytics.md",1960],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f6e077b":[()=>n.e(1300).then(n.bind(n,8527)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/logging.mdx",8527],"5fe54c51":[()=>n.e(1042).then(n.bind(n,3275)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/docker/step-by-step.md",3275],"6025cfa3":[()=>n.e(859).then(n.bind(n,3034)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/third-party-authentication.md",3034],"61b3b8ce":[()=>n.e(4343).then(n.bind(n,7895)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/index.md",7895],"63d75c88":[()=>n.e(6519).then(n.bind(n,9847)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/wecom.md",9847],"65f8d4cd":[()=>n.e(5632).then(n.bind(n,1771)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/best_practices.md",1771],"66a79633":[()=>n.e(7121).then(n.bind(n,1701)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/apple-team.mdx",1701],"67d72155":[()=>n.e(3434).then(n.bind(n,2043)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/credits.md",2043],"6821510c":[()=>n.e(5732).then(n.bind(n,5808)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/feishu.md",5808],"68518edc":[()=>n.e(3144).then(n.t.bind(n,8734,19)),"~docs/default/category-zh-hansdocsnext-developerguide-category-\u79fb\u52a8-sdk-c0b.json",8734],"68604c4e":[()=>n.e(6442).then(n.bind(n,194)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/dingtalk.md",194],"6988bd10":[()=>n.e(4061).then(n.bind(n,9704)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api.md",9704],"6a6b352a":[()=>n.e(652).then(n.t.bind(n,9024,19)),"~docs/default/category-zh-hansdocs-4-x-developerguide-category-\u79fb\u52a8-sdk-ba3.json",9024],"6aeebc73":[()=>n.e(3165).then(n.bind(n,1672)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_sync_devices.md",1672],"6c1f465d":[()=>n.e(6766).then(n.bind(n,5252)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/schedule-jobs.md",5252],"6de0a3bc":[()=>n.e(3369).then(n.bind(n,6224)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot.md",6224],"6fa94343":[()=>n.e(8832).then(n.bind(n,8922)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/toolkits/fetch-udid.mdx",8922],"709f7e27":[()=>n.e(6170).then(n.t.bind(n,5199,19)),"~docs/default/category-zh-hansdocs-developerguide-category-\u79fb\u52a8-sdk-401.json",5199],"70a2637b":[()=>n.e(8007).then(n.t.bind(n,3319,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u5de5\u5177\u7bb1-f53.json",3319],"71cdea68":[()=>n.e(8552).then(n.bind(n,1464)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api/apps.md",1464],"731441ba":[()=>n.e(6432).then(n.bind(n,2683)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/index.md",2683],"756ae957":[()=>n.e(6751).then(n.bind(n,6292)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/docker/step-by-step.md",6292],"77ad6583":[()=>n.e(6988).then(n.bind(n,4104)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/index.md",4104],"77ba73fa":[()=>n.e(4085).then(n.bind(n,7784)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_version_check.md",7784],"78d3bc26":[()=>n.e(2347).then(n.bind(n,362)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/environment-variables.md",362],"78f6b461":[()=>n.e(7531).then(n.bind(n,3258)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/toolkits/teardown.mdx",3258],"797c3697":[()=>n.e(7053).then(n.bind(n,6745)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api.md",6745],"7a31e8eb":[()=>n.e(39).then(n.t.bind(n,7772,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u7ba1\u7406\u9762\u677f-f40.json",7772],"7b50d085":[()=>n.e(7299).then(n.bind(n,4419)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/index.md",4419],"7e2cd3a9":[()=>n.e(9347).then(n.bind(n,7401)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/project-settings.md",7401],"7e84284a":[()=>n.e(7700).then(n.t.bind(n,6817,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u4e91\u670d\u52a1\u5546-4e2.json",6817],"7f084e8e":[()=>n.e(6801).then(n.t.bind(n,5092,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u914d\u7f6e-680.json",5092],"808d5cf9":[()=>n.e(4552).then(n.bind(n,6667)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/qa.md",6667],"88e109fd":[()=>n.e(3975).then(n.bind(n,1866)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/schedule-jobs.md",1866],"89a1149b":[()=>n.e(9697).then(n.bind(n,6895)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/changelog.md",6895],"8c755c24":[()=>n.e(6543).then(n.bind(n,6883)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/slack.md",6883],"8c7fed4d":[()=>n.e(7207).then(n.bind(n,5057)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/system-info.md",5057],"8dbd9405":[()=>n.e(536).then(n.bind(n,7794)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/debug-files/upload.md",7794],"8e4c1cdf":[()=>n.e(4069).then(n.bind(n,9842)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_debug_file.md",9842],"927828a2":[()=>n.e(5086).then(n.bind(n,3715)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/settings.mdx",3715],"92f17503":[()=>n.e(7704).then(n.bind(n,3465)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane.md",3465],"93332d63":[()=>n.e(7754).then(n.bind(n,1713)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/railway.md",1713],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9387e8f1":[()=>n.e(6620).then(n.bind(n,5085)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api/debug_files.md",5085],"93e83d03":[()=>n.e(270).then(n.bind(n,4658)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/fly.md",4658],"94a70f3c":[()=>n.e(9902).then(n.bind(n,7396)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/nomad.md",7396],"980d6c79":[()=>n.e(5100).then(n.bind(n,3304)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/wecom.md",3304],"986b83c2":[()=>n.e(7659).then(n.bind(n,2178)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/upload.mdx",2178],"9a46955c":[()=>n.e(2300).then(n.bind(n,5515)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/dashboard.md",5515],"9aa09611":[()=>n.e(6031).then(n.bind(n,6552)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/credits.md",6552],"9c76208a":[()=>n.e(7925).then(n.bind(n,9179)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/permissions.md",9179],"9d0a861d":[()=>n.e(3868).then(n.t.bind(n,8818,19)),"~docs/default/category-zh-hansdocs-contributingguide-category-\u672c\u5730\u5f00\u53d1-474.json",8818],"9d0b921d":[()=>Promise.all([n.e(532),n.e(2239)]).then(n.bind(n,3664)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/devcontainer.md",3664],"9d7c6944":[()=>n.e(8189).then(n.t.bind(n,4812,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u8c03\u8bd5\u6587\u4ef6-521.json",4812],"9eed9fa1":[()=>n.e(6346).then(n.bind(n,5147)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/changelog.md",5147],a06cc266:[()=>n.e(4288).then(n.bind(n,9988)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/index.mdx",9988],a21619df:[()=>n.e(3020).then(n.bind(n,3764)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/index.mdx",3764],a73dab33:[()=>n.e(7781).then(n.bind(n,5293)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api/apps.md",5293],a7434565:[()=>n.e(7645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a9736a03:[()=>n.e(3240).then(n.t.bind(n,3786,19)),"~docs/default/category-zh-hansdocs-4-x-contributingguide-category-\u672c\u5730\u5f00\u53d1-0f1.json",3786],aa45ed72:[()=>n.e(713).then(n.bind(n,120)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/dingtalk.md",120],ab09b93d:[()=>n.e(1839).then(n.t.bind(n,6721,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u90e8\u7f72-7eb.json",6721],abf33808:[()=>n.e(3705).then(n.bind(n,8129)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/nomad.md",8129],ac20dd04:[()=>n.e(4114).then(n.bind(n,1659)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/detail.mdx",1659],ad5e89b7:[()=>n.e(3946).then(n.bind(n,3119)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/changelog.md",3119],ae0b00ed:[()=>n.e(131).then(n.bind(n,9468)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot.md",9468],b0190f04:[()=>n.e(5497).then(n.bind(n,3294)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/wecom.md",3294],b0b6b74b:[()=>n.e(2608).then(n.t.bind(n,7324,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u5de5\u5177\u7bb1-eff.json",7324],b0d48a44:[()=>n.e(184).then(n.bind(n,4067)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/permissions.md",4067],b155671d:[()=>n.e(5924).then(n.bind(n,6490)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_debug_file.md",6490],b168d81c:[()=>n.e(7284).then(n.bind(n,1278)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/fly.md",1278],b2ef10a5:[()=>n.e(2406).then(n.bind(n,4692)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/slack.md",4692],b38b46a9:[()=>Promise.all([n.e(532),n.e(8782)]).then(n.bind(n,4020)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/ios.md",4020],b43ef384:[()=>Promise.all([n.e(532),n.e(6043)]).then(n.bind(n,6684)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/android.md",6684],b51b060c:[()=>n.e(8447).then(n.bind(n,8442)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/fly.md",8442],b572cb1f:[()=>Promise.all([n.e(532),n.e(6981)]).then(n.bind(n,7183)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/reverse-proxies.mdx",7183],b667b6c3:[()=>n.e(4259).then(n.bind(n,9589)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/backup.mdx",9589],b6e49d05:[()=>n.e(1224).then(n.bind(n,4929)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/index.md",4929],b8ca8336:[()=>n.e(4127).then(n.bind(n,7248)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/source-code.md",7248],bbb0fa6e:[()=>n.e(2570).then(n.bind(n,3557)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/discord.md",3557],bc4a1c03:[()=>n.e(1147).then(n.t.bind(n,2985,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u7ba1\u7406\u9762\u677f-841.json",2985],c1af49ed:[()=>n.e(80).then(n.t.bind(n,5460,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u76d1\u63a7-654.json",5460],c3412635:[()=>n.e(5929).then(n.bind(n,1060)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane.md",1060],c3697579:[()=>n.e(631).then(n.bind(n,1300)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/source-code.md",1300],c38ecdbc:[()=>n.e(4360).then(n.bind(n,921)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/permissions.md",921],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c5a4c00b:[()=>n.e(2208).then(n.bind(n,1957)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/logging.md",1957],c6bdf690:[()=>n.e(2705).then(n.bind(n,6114)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/upload.mdx",6114],c6fb1e3c:[()=>n.e(8876).then(n.bind(n,2873)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api/apps.md",2873],c704004d:[()=>Promise.all([n.e(532),n.e(4156)]).then(n.bind(n,4681)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/ios.md",4681],c7c3383a:[()=>n.e(5343).then(n.t.bind(n,8885,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u5de5\u5177\u7bb1-615.json",8885],c869843a:[()=>n.e(2170).then(n.bind(n,6602)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/background-jobs.md",6602],c89e1d41:[()=>n.e(2559).then(n.bind(n,8623)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/logging.mdx",8623],c941fb92:[()=>Promise.all([n.e(532),n.e(7551)]).then(n.bind(n,3317)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/source-code.md",3317],c9b278a8:[()=>n.e(9181).then(n.t.bind(n,5e3,19)),"~docs/default/version-5-0-0-metadata-prop-0b8.json",5e3],cae0f04b:[()=>n.e(5709).then(n.t.bind(n,4166,19)),"~docs/default/version-4-x-metadata-prop-21f.json",4166],cbffe0ba:[()=>Promise.all([n.e(532),n.e(594)]).then(n.bind(n,5517)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/source-code.md",5517],cc8d1b20:[()=>Promise.all([n.e(532),n.e(721)]).then(n.bind(n,2897)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/devcontainer.md",2897],cd05e63c:[()=>n.e(4775).then(n.bind(n,1343)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/docker/step-by-step.md",1343],cf72ee6a:[()=>n.e(324).then(n.bind(n,2948)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/render.md",2948],d02aa106:[()=>n.e(4590).then(n.bind(n,5421)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/project-settings.md",5421],d0f9f7b0:[()=>n.e(1931).then(n.bind(n,2446)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/toolkits/fetch-udid.mdx",2446],d75d92bc:[()=>n.e(8450).then(n.bind(n,9750)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks.md",9750],d7c763e8:[()=>n.e(1297).then(n.bind(n,7331)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/database-analytics.mdx",7331],dc9db4d6:[()=>n.e(8794).then(n.bind(n,3175)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_sync_devices.md",3175],dd90aca1:[()=>n.e(7679).then(n.bind(n,8501)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_version_check.md",8501],de6e37e2:[()=>n.e(6222).then(n.bind(n,5880)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/architecture.mdx",5880],e177b72e:[()=>n.e(847).then(n.bind(n,4938)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/review.mdx",4938],e25c1561:[()=>n.e(3775).then(n.bind(n,3863)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/credits.md",3863],e471e2c1:[()=>n.e(2238).then(n.bind(n,1631)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/railway.md",1631],e649ac20:[()=>n.e(8650).then(n.t.bind(n,3542,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u914d\u7f6e-4ad.json",3542],e676557f:[()=>n.e(3082).then(n.t.bind(n,9411,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u5e94\u7528-297.json",9411],e74b89a8:[()=>n.e(5256).then(n.bind(n,6977)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/create.mdx",6977],e84771ae:[()=>n.e(5468).then(n.bind(n,2833)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/storage.md",2833],eb842df6:[()=>n.e(5855).then(n.bind(n,3618)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/architecture.mdx",3618],eb89accb:[()=>n.e(2390).then(n.bind(n,1786)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/best_practices.md",1786],ec4538ed:[()=>n.e(4328).then(n.bind(n,6109)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/dashboard.md",6109],ef9024f9:[()=>n.e(7452).then(n.bind(n,3410)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api/debug_files.md",3410],f057e2be:[()=>n.e(6164).then(n.t.bind(n,2780,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u5e94\u7528-129.json",2780],f25fc619:[()=>n.e(2353).then(n.t.bind(n,1161,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u914d\u7f6e-e07.json",1161],f3b6e326:[()=>n.e(1717).then(n.bind(n,4990)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/architecture.mdx",4990],f3e148a8:[()=>n.e(4938).then(n.bind(n,3244)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/source-code.md",3244],f3ecbbb7:[()=>n.e(861).then(n.t.bind(n,5098,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u4e91\u670d\u52a1\u5546-0ff.json",5098],f500fe2a:[()=>n.e(7575).then(n.t.bind(n,7063,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u90e8\u7f72-bbf.json",7063],f576f290:[()=>n.e(1290).then(n.t.bind(n,85,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u76d1\u63a7-5d6.json",85],fa6a7c71:[()=>n.e(1125).then(n.bind(n,7283)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/index.mdx",7283],faaf8c96:[()=>n.e(2994).then(n.bind(n,1471)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/third-party-authentication.md",1471],fe394c5b:[()=>n.e(6229).then(n.bind(n,4234)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/kubernetes.md",4234],ffe0e092:[()=>n.e(8810).then(n.bind(n,1649)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/third-party-authentication.md",1649]};function u(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 c=n(9670),d=n(226);function p(e,t){if("*"===e)return s()({loading:u,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=i[`${e}-${t}`],p={},f=[],h=[],g=(0,c.Z)(a);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),h.push(r[2]))})),s().Map({loading:u,loader:p,modules:f,webpack:()=>h,render(t,n){const s=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=s;const i=n.split(".");i.slice(0,-1).forEach((e=>{a=a[e]})),a[i[i.length-1]]=o}));const i=s.__comp;delete s.__comp;const l=s.__context;return delete s.__context,r.createElement(d.z,{value:l},r.createElement(i,(0,o.Z)({},s,n)))}})}const f=[{path:"/zh-Hans/markdown-page",component:p("/zh-Hans/markdown-page","75e"),exact:!0},{path:"/zh-Hans/docs/4.x",component:p("/zh-Hans/docs/4.x","da2"),routes:[{path:"/zh-Hans/docs/4.x/category/administrator",component:p("/zh-Hans/docs/4.x/category/administrator","d7f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/apps",component:p("/zh-Hans/docs/4.x/category/apps","2ef"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/cloud-provider-guides",component:p("/zh-Hans/docs/4.x/category/cloud-provider-guides","3e0"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/configuration",component:p("/zh-Hans/docs/4.x/category/configuration","139"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/debug-files",component:p("/zh-Hans/docs/4.x/category/debug-files","bfa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/deployment",component:p("/zh-Hans/docs/4.x/category/deployment","518"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/local-development",component:p("/zh-Hans/docs/4.x/category/local-development","c2c"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/category/monitoring",component:p("/zh-Hans/docs/4.x/category/monitoring","066"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/sdks",component:p("/zh-Hans/docs/4.x/category/sdks","cd7"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/category/toolkits",component:p("/zh-Hans/docs/4.x/category/toolkits","9b1"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/",component:p("/zh-Hans/docs/4.x/contributing-guide/","0bd"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer","7b7"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/4.x/contributing-guide/local-development/source-code","314"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/",component:p("/zh-Hans/docs/4.x/developer-guide/","396"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api",component:p("/zh-Hans/docs/4.x/developer-guide/api","d53"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api/apps",component:p("/zh-Hans/docs/4.x/developer-guide/api/apps","b1c"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api/debug_files",component:p("/zh-Hans/docs/4.x/developer-guide/api/debug_files","ae9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane","baa"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot","684"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file","8bd"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices","1c5"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check","55a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/sdk/android",component:p("/zh-Hans/docs/4.x/developer-guide/sdk/android","57e"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/sdk/ios",component:p("/zh-Hans/docs/4.x/developer-guide/sdk/ios","e20"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/self-hosted/",component:p("/zh-Hans/docs/4.x/self-hosted/","518"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables","3c6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs","a07"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication","586"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/architecture","ea9"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/docker",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/docker","143"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step","4fe"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/fly",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/fly","b4e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes","779"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/nomad","902"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/railway",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/railway","548"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/render",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/render","db8"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/requirements","4df"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/source-code","4c4"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/4.x/self-hosted/reverse-proxies","9ee"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/storage",component:p("/zh-Hans/docs/4.x/self-hosted/storage","380"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/user-guide/",component:p("/zh-Hans/docs/4.x/user-guide/","f14"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/4.x/user-guide/administrator/apple-team","2b0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/backup",component:p("/zh-Hans/docs/4.x/user-guide/administrator/backup","f68"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs","a4d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics","462"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging","3aa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info","8f2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/permissions",component:p("/zh-Hans/docs/4.x/user-guide/administrator/permissions","cbb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/project-settings",component:p("/zh-Hans/docs/4.x/user-guide/administrator/project-settings","bbb"),exact:!0},{path:"/zh-Hans/docs/4.x/user-guide/apps/create",component:p("/zh-Hans/docs/4.x/user-guide/apps/create","574"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/best_practices",component:p("/zh-Hans/docs/4.x/user-guide/best_practices","9f7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/changelog",component:p("/zh-Hans/docs/4.x/user-guide/changelog","af2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/credits",component:p("/zh-Hans/docs/4.x/user-guide/credits","672"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/dashboard",component:p("/zh-Hans/docs/4.x/user-guide/dashboard","2c7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/debug-files/upload",component:p("/zh-Hans/docs/4.x/user-guide/debug-files/upload","f8f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/qa",component:p("/zh-Hans/docs/4.x/user-guide/qa","a9f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid","31b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/4.x/user-guide/toolkits/teardown","915"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks",component:p("/zh-Hans/docs/4.x/user-guide/webhooks","d21"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk","078"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/discord",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/discord","0f6"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/feishu","c9c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/slack",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/slack","4ac"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/wecom","f3a"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/docs/next",component:p("/zh-Hans/docs/next","e3e"),routes:[{path:"/zh-Hans/docs/next/category/administrator",component:p("/zh-Hans/docs/next/category/administrator","72c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/apps",component:p("/zh-Hans/docs/next/category/apps","260"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/cloud-provider-guides",component:p("/zh-Hans/docs/next/category/cloud-provider-guides","ddb"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/configuration",component:p("/zh-Hans/docs/next/category/configuration","e3d"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/debug-files",component:p("/zh-Hans/docs/next/category/debug-files","1e7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/deployment",component:p("/zh-Hans/docs/next/category/deployment","730"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/local-development",component:p("/zh-Hans/docs/next/category/local-development","3a2"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/category/monitoring",component:p("/zh-Hans/docs/next/category/monitoring","5fb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/sdks",component:p("/zh-Hans/docs/next/category/sdks","dd4"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/category/toolkits",component:p("/zh-Hans/docs/next/category/toolkits","dcc"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/contributing-guide/",component:p("/zh-Hans/docs/next/contributing-guide/","24b"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/next/contributing-guide/local-development/devcontainer","033"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/next/contributing-guide/local-development/source-code","d9f"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/developer-guide/",component:p("/zh-Hans/docs/next/developer-guide/","81a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api",component:p("/zh-Hans/docs/next/developer-guide/api","d7a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api/apps",component:p("/zh-Hans/docs/next/developer-guide/api/apps","8f3"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api/debug_files",component:p("/zh-Hans/docs/next/developer-guide/api/debug_files","0f2"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane",component:p("/zh-Hans/docs/next/developer-guide/fastlane","637"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot","8f6"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file","e8c"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices","ae9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check","ff2"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/sdk/android",component:p("/zh-Hans/docs/next/developer-guide/sdk/android","6e9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/sdk/ios",component:p("/zh-Hans/docs/next/developer-guide/sdk/ios","27f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/self-hosted/",component:p("/zh-Hans/docs/next/self-hosted/","5e5"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/next/self-hosted/configuration/environment-variables","9da"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs","043"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication","357"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/next/self-hosted/deployment/architecture","751"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/docker",component:p("/zh-Hans/docs/next/self-hosted/deployment/docker","a4f"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step","d7b"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/fly",component:p("/zh-Hans/docs/next/self-hosted/deployment/fly","17c"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/next/self-hosted/deployment/kubernetes","11d"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/next/self-hosted/deployment/nomad","f41"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/railway",component:p("/zh-Hans/docs/next/self-hosted/deployment/railway","ca6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/render",component:p("/zh-Hans/docs/next/self-hosted/deployment/render","4ce"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/next/self-hosted/deployment/requirements","f08"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/next/self-hosted/deployment/source-code","ded"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/next/self-hosted/reverse-proxies","49a"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/storage",component:p("/zh-Hans/docs/next/self-hosted/storage","0ff"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/user-guide/",component:p("/zh-Hans/docs/next/user-guide/","1fb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/next/user-guide/administrator/apple-team","383"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/backup",component:p("/zh-Hans/docs/next/user-guide/administrator/backup","4ae"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs","b4c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics","847"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/logging","b1a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info","056"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/permissions",component:p("/zh-Hans/docs/next/user-guide/administrator/permissions","bfc"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/settings",component:p("/zh-Hans/docs/next/user-guide/administrator/settings","a7e"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/",component:p("/zh-Hans/docs/next/user-guide/apps/","7fe"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/create",component:p("/zh-Hans/docs/next/user-guide/apps/create","faa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/detail",component:p("/zh-Hans/docs/next/user-guide/apps/detail","78f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/upload",component:p("/zh-Hans/docs/next/user-guide/apps/upload","d44"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/best_practices",component:p("/zh-Hans/docs/next/user-guide/best_practices","49f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/changelog",component:p("/zh-Hans/docs/next/user-guide/changelog","f9a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/credits",component:p("/zh-Hans/docs/next/user-guide/credits","054"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/dashboard",component:p("/zh-Hans/docs/next/user-guide/dashboard","581"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/",component:p("/zh-Hans/docs/next/user-guide/debug-files/","d57"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/review",component:p("/zh-Hans/docs/next/user-guide/debug-files/review","6df"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/upload",component:p("/zh-Hans/docs/next/user-guide/debug-files/upload","99a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/qa",component:p("/zh-Hans/docs/next/user-guide/qa","f7a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/next/user-guide/toolkits/fetch-udid","204"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/next/user-guide/toolkits/teardown","a6c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks",component:p("/zh-Hans/docs/next/user-guide/webhooks","66b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/next/user-guide/webhooks/dingtalk","784"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/discord",component:p("/zh-Hans/docs/next/user-guide/webhooks/discord","946"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/next/user-guide/webhooks/feishu","42f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/slack",component:p("/zh-Hans/docs/next/user-guide/webhooks/slack","7cb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/next/user-guide/webhooks/wecom","644"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/docs",component:p("/zh-Hans/docs","a28"),routes:[{path:"/zh-Hans/docs/category/administrator",component:p("/zh-Hans/docs/category/administrator","097"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/apps",component:p("/zh-Hans/docs/category/apps","8cd"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/cloud-provider-guides",component:p("/zh-Hans/docs/category/cloud-provider-guides","fbc"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/configuration",component:p("/zh-Hans/docs/category/configuration","346"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/debug-files",component:p("/zh-Hans/docs/category/debug-files","ea0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/deployment",component:p("/zh-Hans/docs/category/deployment","1b8"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/local-development",component:p("/zh-Hans/docs/category/local-development","34b"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/category/monitoring",component:p("/zh-Hans/docs/category/monitoring","adb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/sdks",component:p("/zh-Hans/docs/category/sdks","38f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/category/toolkits",component:p("/zh-Hans/docs/category/toolkits","a3c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/contributing-guide/",component:p("/zh-Hans/docs/contributing-guide/","73c"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/contributing-guide/local-development/devcontainer","862"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/contributing-guide/local-development/source-code","ad0"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/developer-guide/",component:p("/zh-Hans/docs/developer-guide/","274"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api",component:p("/zh-Hans/docs/developer-guide/api","722"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api/apps",component:p("/zh-Hans/docs/developer-guide/api/apps","40f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api/debug_files",component:p("/zh-Hans/docs/developer-guide/api/debug_files","869"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane",component:p("/zh-Hans/docs/developer-guide/fastlane","73d"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot","3fc"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file","4df"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices","d4f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_version_check","ac5"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/sdk/android",component:p("/zh-Hans/docs/developer-guide/sdk/android","cf3"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/sdk/ios",component:p("/zh-Hans/docs/developer-guide/sdk/ios","e8f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/self-hosted/",component:p("/zh-Hans/docs/self-hosted/","78e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/self-hosted/configuration/environment-variables","d54"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/self-hosted/configuration/schedule-jobs","bb1"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/self-hosted/configuration/third-party-authentication","0c6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/self-hosted/deployment/architecture","91f"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/docker",component:p("/zh-Hans/docs/self-hosted/deployment/docker","189"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/self-hosted/deployment/docker/step-by-step","57b"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/fly",component:p("/zh-Hans/docs/self-hosted/deployment/fly","fc2"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/self-hosted/deployment/kubernetes","6b6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/self-hosted/deployment/nomad","719"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/railway",component:p("/zh-Hans/docs/self-hosted/deployment/railway","9ef"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/render",component:p("/zh-Hans/docs/self-hosted/deployment/render","934"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/self-hosted/deployment/requirements","5d9"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/self-hosted/deployment/source-code","415"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/self-hosted/reverse-proxies","a9e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/storage",component:p("/zh-Hans/docs/self-hosted/storage","969"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/user-guide/",component:p("/zh-Hans/docs/user-guide/","859"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/user-guide/administrator/apple-team","38b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/backup",component:p("/zh-Hans/docs/user-guide/administrator/backup","84e"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs","497"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics","4bd"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/logging","f50"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/system-info","bd8"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/permissions",component:p("/zh-Hans/docs/user-guide/administrator/permissions","ac0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/project-settings",component:p("/zh-Hans/docs/user-guide/administrator/project-settings","aec"),exact:!0},{path:"/zh-Hans/docs/user-guide/administrator/settings",component:p("/zh-Hans/docs/user-guide/administrator/settings","408"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/",component:p("/zh-Hans/docs/user-guide/apps/","243"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/create",component:p("/zh-Hans/docs/user-guide/apps/create","27d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/detail",component:p("/zh-Hans/docs/user-guide/apps/detail","ce1"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/upload",component:p("/zh-Hans/docs/user-guide/apps/upload","0e8"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/best_practices",component:p("/zh-Hans/docs/user-guide/best_practices","7a2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/changelog",component:p("/zh-Hans/docs/user-guide/changelog","6e5"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/credits",component:p("/zh-Hans/docs/user-guide/credits","6de"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/dashboard",component:p("/zh-Hans/docs/user-guide/dashboard","5aa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/",component:p("/zh-Hans/docs/user-guide/debug-files/","8d4"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/review",component:p("/zh-Hans/docs/user-guide/debug-files/review","24d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/upload",component:p("/zh-Hans/docs/user-guide/debug-files/upload","503"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/qa",component:p("/zh-Hans/docs/user-guide/qa","8b7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/user-guide/toolkits/fetch-udid","847"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/user-guide/toolkits/teardown","8ee"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks",component:p("/zh-Hans/docs/user-guide/webhooks","936"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/user-guide/webhooks/dingtalk","e82"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/discord",component:p("/zh-Hans/docs/user-guide/webhooks/discord","f58"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/user-guide/webhooks/feishu","5bb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/slack",component:p("/zh-Hans/docs/user-guide/webhooks/slack","4b3"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/user-guide/webhooks/wecom","82b"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/",component:p("/zh-Hans/","df2"),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),s=n(405),i=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),h=n(5742),g=n(2263),m=n(4996),b=n(6668),v=n(1944),y=n(4711),x=n(9727),w=n(3320),k=n(8780),z=n(197);function _(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(h.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(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),o=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,c.TH)();return e+(0,k.applyTrailingSlash)((0,m.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:o;return r.createElement(h.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function H(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(h.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:x.h})),n&&r.createElement(v.d,{image:n}),r.createElement(E,null),r.createElement(_,null),r.createElement(z.Z,{tag:w.HX,locale:e}),r.createElement(h.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const S=new Map;function C(e){if(S.has(e.pathname))return{...e,pathname:S.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return S.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return S.set(e.pathname,t),{...e,pathname:t}}var T=n(8934),L=n(8940);function A(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 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:s}=t;if(s){const e=decodeURIComponent(s.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:o}),A("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=i.Z.canUseDOM?A("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=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=O,R="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",M="__docusaurus-base-url-issue-banner-suggestion-container",G="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return`\nwindow['${G}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${G}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${R}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${D}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${M}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${M}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function B(){const{siteConfig:{baseUrl:e}}=(0,g.Z)();return(0,r.useLayoutEffect)((()=>{window[G]=!1}),[]),r.createElement(r.Fragment,null,!i.Z.canUseDOM&&r.createElement(h.Z,null,r.createElement("script",null,F(e))),r.createElement("div",{id:R}))}function j(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(B,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:a}}=(0,g.Z)(),s=(0,m.Z)(e),{htmlLang:i,direction:l}=a[o];return r.createElement(h.Z,null,r.createElement("html",{lang:i,dir:l}),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:s}))}var U=n(4763),Z=n(2389);function V(){const e=(0,Z.Z)();return r.createElement(h.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function q(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(U.Z,null,r.createElement(L.M,null,r.createElement(T.t,null,r.createElement(p,null,r.createElement($,null),r.createElement(H,null),r.createElement(j,null),r.createElement(I,{location:C(t)},e)),r.createElement(V,null))))}var W=n(6887);const Y=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 K=n(9670);const X=new Set,Q=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Q.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.f)(u.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,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Q.has(e))(e)&&(Q.add(e),P(e))},te=Object.freeze(ee);if(i.Z.canUseDOM){window.docusaurus=te;const e=o.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(s.B6,null,r.createElement(a.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/zh-Hans/docs","versions":[{"name":"current","label":"\u5f00\u53d1\u7248\u672c \ud83d\udea7","isLast":false,"path":"/zh-Hans/docs/next","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/next/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/next/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/next/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/next/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/next/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/next/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/next/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/next/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/next/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/next/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/next/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/next/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/next/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/next/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/next/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/next/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/next/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/next/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/next/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/next/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/next/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/next/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/next/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/next/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/next/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/zh-Hans/docs/next/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/next/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/zh-Hans/docs/next/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/zh-Hans/docs/next/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/zh-Hans/docs/next/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/next/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/next/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/next/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/next/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/zh-Hans/docs/next/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/zh-Hans/docs/next/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/next/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/next/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/next/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/next/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/next/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/next/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/next/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/next/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/next/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/next/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/next/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/next/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/next/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/next/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/next/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/next/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/next/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/next/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/next/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/next/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/next/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/next/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/next/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/next/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}},{"name":"5.0.0","label":"5.0.0","isLast":true,"path":"/zh-Hans/docs","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/zh-Hans/docs/user-guide/administrator/project-settings"},{"id":"user-guide/administrator/settings","path":"/zh-Hans/docs/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/zh-Hans/docs/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/zh-Hans/docs/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/zh-Hans/docs/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/zh-Hans/docs/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/zh-Hans/docs/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}},{"name":"4.x","label":"4.x","isLast":false,"path":"/zh-Hans/docs/4.x","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/4.x/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/4.x/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/4.x/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/4.x/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/4.x/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/4.x/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/4.x/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/4.x/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/4.x/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/4.x/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/4.x/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/4.x/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/4.x/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/4.x/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/4.x/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/4.x/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/4.x/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/4.x/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/4.x/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/4.x/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/4.x/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/4.x/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/zh-Hans/docs/4.x/user-guide/administrator/project-settings"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/4.x/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/4.x/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/4.x/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/4.x/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/4.x/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/4.x/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/4.x/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/4.x/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/4.x/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/4.x/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/4.x/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/4.x/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/4.x/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/4.x/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/4.x/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/4.x/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/4.x/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/4.x/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/4.x/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/4.x/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/4.x/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/4.x/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/4.x/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/4.x/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/4.x/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/4.x/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/4.x/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/4.x/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}}],"breadcrumbs":true}}}'),s=JSON.parse('{"defaultLocale":"en","locales":["en","zh-Hans"],"path":"i18n","currentLocale":"zh-Hans","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var i=n(7529);const l=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-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"}}}'),u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:s,codeTranslations:i},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(412),a=n(5742),s=n(8780),i=n(7961);function l(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(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,s.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,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),s=n(8780),i=n(2263),l=n(3919),u=n(412);const c=o.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,i.Z)(),{withBaseUrl:w}=(0,d.C)(),k=(0,o.useContext)(c),z=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>z.current));const _=p||f;const E=(0,l.Z)(_),H=_?.replace("pathname://","");let S=void 0!==H?(C=H,b&&(e=>e.startsWith("/"))(C)?w(C):C):void 0;var C;S&&E&&(S=(0,s.applyTrailingSlash)(S,{trailingSlash:y,baseUrl:x}));const T=(0,o.useRef)(!1),L=n?a.OL:a.rU,A=u.Z.canUseIntersectionObserver,N=(0,o.useRef)(),P=()=>{T.current||null==S||(window.docusaurus.preload(S),T.current=!0)};(0,o.useEffect)((()=>(!A&&E&&null!=S&&window.docusaurus.prefetch(S),()=>{A&&N.current&&N.current.disconnect()})),[N,S,A,E]);const O=S?.startsWith("#")??!1,I=!S||!E||O;return I||m||k.collectLink(S),I?o.createElement("a",(0,r.Z)({ref:z,href:S},_&&!E&&{target:"_blank",rel:"noopener noreferrer"},v)):o.createElement(L,(0,r.Z)({},v,{onMouseEnter:P,onTouchStart:P,innerRef:e=>{z.current=e,A&&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!=S&&window.docusaurus.prefetch(S))}))})),N.current.observe(e))},to:S},n&&{isActive:g,activeClassName:h}))}const f=o.forwardRef(p)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>i});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 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 a[t??n]??n??t}function i(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function l(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 i=s({message:t,id:n});return r.createElement(r.Fragment,null,o(i,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:()=>s,Z:()=>i});var r=n(7294),o=n(2263),a=n(3919);function s(){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:s=!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 i=n.startsWith(t)?n:t+n.replace(/^\//,"");return s?e+i:i}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=s();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,s]=n;const i=o?`${o}.${a}`:a;r(s)?e(s,i):t[i]=s}))}(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),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:a,value:n})),[a,n]);return r.createElement(o.Provider,{value:s},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>c,Jo:()=>m,zh:()=>d,yW:()=>h,gB:()=>f});var r=n(6550),o=n(2263),a=n(9935);function s(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 i=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=i(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(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={},c=()=>s("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=s(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 p(e){void 0===e&&(e={});const t=c(),{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 f(e){return d(e).versions}function h(e){const t=d(e);return i(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},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(1472)(`./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"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var r=n(7294),o=n(6010),a=n(4763),s=n(1944),i=n(7462),l=n(6550),u=n(5999),c=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,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,u.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 g(e){const t=e.children??h,{containerRef:n,onClick:o}=f();return r.createElement("div",{ref:n,role:"region","aria-label":h},r.createElement("a",(0,i.Z)({},e,{href:`#${d}`,onClick:o}),t))}var m=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var x=n(6668),w=n(9689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:s,...l}=e;return r.createElement("svg",(0,i.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const z={closeButton:"closeButton_CVFx"};function _(e){return r.createElement("button",(0,i.Z)({type:"button","aria-label":(0,u.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",z.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const E={content:"content_knG7"};function H(e){const{announcementBar:t}=(0,x.L)(),{content:n}=t;return r.createElement("div",(0,i.Z)({},e,{className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const S={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,x.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:o,textColor:a,isCloseable:s}=e;return r.createElement("div",{className:S.announcementBar,style:{backgroundColor:o,color:a},role:"banner"},s&&r.createElement("div",{className:S.announcementBarPlaceholder}),r.createElement(H,{className:S.announcementBarContent}),s&&r.createElement(_,{onClick:n,className:S.announcementBarClose}))}var T=n(3163),L=n(2466);var A=n(902),N=n(3102);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,T.e)(),t=(0,N.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,s=(0,A.D9)(a);return(0,r.useEffect)((()=>{a&&!s&&o(!0)}),[a,s]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return r.createElement(P.Provider,{value:n},t)}function I(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(P);if(!e)throw new A.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:I(a)})),[o,a,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:s}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":s})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var M=n(2949),G=n(2389);function F(e){return r.createElement("svg",(0,i.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 B(e){return r.createElement("svg",(0,i.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 j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:a,onChange:s}=e;const i=(0,G.Z)(),l=(0,u.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,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.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)(j.toggle,t)},r.createElement("button",{className:(0,o.Z)("clean-btn",j.toggleButton,!i&&j.toggleButtonDisabled,n),type:"button",onClick:()=>s("dark"===a?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(F,{className:(0,o.Z)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(B,{className:(0,o.Z)(j.toggleIcon,j.darkToggleIcon)})))}const U=r.memo($),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.L)().navbar.style,o=(0,x.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:s}=(0,M.I)();return o?null:r.createElement(U,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:s})}var q=n(1327);function W(){return r.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,T.e)();return r.createElement("button",{type:"button","aria-label":(0,u.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 K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:s,html:l,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const p=(0,Q.Z)(o),f=(0,Q.Z)(t),h=(0,Q.Z)(a,{forcePrependBaseUrl:!0}),g=s&&a&&!(0,J.Z)(a),m=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,s,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return a?r.createElement(X.Z,(0,i.Z)({href:c?h:a},d,m)):r.createElement(X.Z,(0,i.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},d,m))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const s=r.createElement(ne,(0,i.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},a));return n?r.createElement("li",null,s):s}function oe(e){let{className:t,isDropdownItem:n,...a}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,i.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,i.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(6043),ie=n(8596),le=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:s,...l}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.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)}}),[u]),r.createElement("div",{ref:u,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,i.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.Z)("navbar__link",a)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(_e,(0,i.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:a,onClick:s,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,se.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,i.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),f()}}),u.children??u.label),r.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(_e,(0,i.Z)({mobile:!0,isDropdownItem:!0,onClick:s,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const o=t?de:ce;return r.createElement(o,n)}var fe=n(4711);function he(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,i.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 ge="iconLanguage_nlXk";var me=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,be.searchBox)},t)}var ye=n(143),xe=n(3438);var we=n(373);const ke=e=>e.docs.find((t=>t.id===e.mainDocId));const ze={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,...a}=e;const{i18n:{currentLocale:s,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:h}=(0,l.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===s?t?"menu__link--active":"dropdown__link--active":""}})),...o],m=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[s].label;return r.createElement(pe,(0,i.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(he,{className:ge}),m),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(me.Z,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:s=!1}=e;const i=s?"li":"div";return r.createElement(i,{className:(0,o.Z)({navbar__item:!a&&!s,"menu__list-item":a},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:s}=(0,ye.Iw)(o),l=(0,xe.vY)(t,o);return null===l?null:r.createElement(ae,(0,i.Z)({exact:!0},a,{isActive:()=>s?.path===l.path||!!s?.sidebar&&s.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:s}=(0,ye.Iw)(o),l=(0,xe.oz)(t,o).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,i.Z)({exact:!0},a,{isActive:()=>s?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const s=(0,xe.lO)(o)[0],l=t??s.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(s).path;return r.createElement(ae,(0,i.Z)({},a,{label:l,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:s,...c}=e;const{search:d,hash:p}=(0,l.TH)(),f=(0,ye.Iw)(n),h=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,we.J)(n),m=[...a,...h.map((e=>{const t=f.alternateDocVersions[e.name]??ke(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...s],b=(0,xe.lO)(n)[0],v=t&&m.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&m.length>1?void 0:ke(b).path;return m.length<=1?r.createElement(ae,(0,i.Z)({},c,{mobile:t,label:v,to:y,isActive:o?()=>!1:void 0})):r.createElement(pe,(0,i.Z)({},c,{mobile:t,label:v,to:y,items:m,isActive:o?()=>!1:void 0}))}};function _e(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=ze[o];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(a,n)}function Ee(){const e=(0,T.e)(),t=(0,x.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(_e,(0,i.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function He(e){return r.createElement("button",(0,i.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.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 Se(){const e=0===(0,x.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(He,{onClick:()=>t.hide()}),t.content)}function Ce(){const e=(0,T.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(D,{header:r.createElement(K,null),primaryMenu:r.createElement(Ee,null),secondaryMenu:r.createElement(Se,null)}):null}const Te={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return r.createElement("div",(0,i.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Ae(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.L)(),s=(0,T.e)(),{navbarRef:i,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),s=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((t,r)=>{let{scrollY:s}=t;if(!e)return;if(s<a.current)return void n(!0);if(o.current)return void(o.current=!1);const i=r?.scrollY,l=document.documentElement.scrollHeight-a.current,u=window.innerHeight;i&&s>=i?n(!1):s+u<l&&n(!0)})),(0,c.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:s,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:i,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Te.navbarHideable,!l&&Te.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":s.shown})},t,r.createElement(Le,{onClick:s.toggle}),r.createElement(Ce,null))}var Ne=n(8780);const Pe={errorBoundaryError:"errorBoundaryError_a6uf"};function Oe(e){return r.createElement("button",(0,i.Z)({type:"button"},e),r.createElement(u.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 Ie(e){let{error:t}=e;const n=(0,Ne.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Pe.errorBoundaryError},n)}class Re extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const De="right";function Me(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,i.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 Ge(){const{toggle:e,shown:t}=(0,T.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.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(Me,null))}const Fe={colorModeToggle:"colorModeToggle_DEke"};function Be(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Re,{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(_e,e)))))}function je(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 $e(){const e=(0,T.e)(),t=(0,x.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??De)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement(je,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ge,null),r.createElement(W,null),r.createElement(Be,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Be,{items:o}),r.createElement(V,{className:Fe.colorModeToggle}),!a&&r.createElement(ve,null,r.createElement(me.Z,null)))})}function Ue(){return r.createElement(Ae,null,r.createElement($e,null))}function Ze(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:s,...l}=t,u=(0,Q.Z)(n),c=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,i.Z)({className:"footer__link-item"},o?{href:s?c:o}:{to:u},l),a,o&&!(0,J.Z)(o)&&r.createElement(te.Z,null))}function Ve(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(Ze,{item:t}))}function qe(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(Ve,{key:t,item:e})))))}function We(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(qe,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function Xe(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(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(We,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:a,copyright:s}=e;return r.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(a||s)&&r.createElement("div",{className:"footer__bottom text--center"},a&&r.createElement("div",{className:"margin-bottom--sm"},a),s)))}function at(){const{footer:e}=(0,x.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(ot,{style:a,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:o&&r.createElement(nt,{logo:o}),copyright:t&&r.createElement(rt,{copyright:t})})}const st=r.memo(at),it=(0,A.Qc)([M.S,w.pl,L.OC,we.L5,s.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(T.M,null,r.createElement(O,null,t)))}]);function lt(e){let{children:t}=e;return r.createElement(it,null,t)}function ut(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.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(Oe,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Ie,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:i,title:l,description:u}=e;return(0,b.t)(),r.createElement(lt,null,r.createElement(s.d,{title:l,description:u}),r.createElement(y,null),r.createElement(C,null),r.createElement(Ue,null),r.createElement("div",{id:d,className:(0,o.Z)(m.k.wrapper.main,ct.mainWrapper,i)},r.createElement(a.Z,{fallback:e=>r.createElement(ut,e)},t)),!n&&r.createElement(st,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),o=n(7294),a=n(9960),s=n(4996),i=n(2263),l=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,s.Z)(t.src),dark:(0,s.Z)(t.srcDark||t.src)},i=o.createElement(u.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},i):i}function d(e){const{siteConfig:{title:t}}=(0,i.Z)(),{navbar:{title:n,logo:u}}=(0,l.L)(),{imageClassName:d,titleClassName:p,...f}=e,h=(0,s.Z)(u?.href||"/"),g=n?"":t,m=u?.alt??g;return o.createElement(a.Z,(0,r.Z)({to:h},f,u?.target&&{target:u.target}),u&&o.createElement(c,{logo:u,alt:m,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 s=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}),s&&r.createElement("meta",{name:"docsearch:language",content:s}),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:()=>u});var r=n(7462),o=n(7294),a=n(6010),s=n(2389),i=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,s.Z)(),{colorMode:n}=(0,i.I)(),{sources:u,className:c,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:u[e],alt:d,className:(0,a.Z)(l.themedImage,l[`themedImage--${e}`],c)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>m});var r=n(7462),o=n(7294),a=n(412),s=n(1442);const i="ease-in-out";function l(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 u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;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,s.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??i}`,height:`${t}px`}}function l(){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?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!a.Z.canUseDOM)return e?u:c}function h(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:s,className:i,disableSSRStyle:l}=e;const u=(0,o.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),o.createElement(t,{ref:u,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),s?.(n))},className:i},r)}function g(e){let{collapsed:t,...n}=e;const[a,s]=(0,o.useState)(!t),[i,l]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||s(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&l(t)}),[a,t]),a?o.createElement(h,(0,r.Z)({},n,{collapsed:i})):null}function m(e){let{lazy:t,...n}=e;const r=t?g:h;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>f});var r=n(7294),o=n(2389),a=n(12),s=n(902),i=n(6668);const l=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),c=()=>"true"===l.get(),d=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,i.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const s=(0,r.useCallback)((()=>{d(!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&&d(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:s})),[e,n,s])}();return r.createElement(p.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>m,S:()=>g});var r=n(7294),o=n(412),a=n(902),s=n(12),i=n(6668);const l=r.createContext(void 0),u="theme",c=(0,s.WA)(u),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),h=e=>{c.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),[o,a]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(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?d.dark:d.light:e),c.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!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);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:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===d.dark},setLightTheme(){s(d.light)},setDarkTheme(){s(d.dark)}})),[o,s])}();return r.createElement(l.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(l);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:()=>m});var r=n(7294),o=n(143),a=n(9935),s=n(6668),i=n(3438),l=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,o._r)(),t=(0,s.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,i]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{i(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),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(f.Provider,{value:n},t)}function m(e){let{children:t}=e;return i.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,s]=b(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find((e=>e.name===i))??null,savePreferredVersionName:(0,r.useCallback)((t=>{s.savePreferredVersion(e,t)}),[s,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>i});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),s=r.createContext(a);function i(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(s.Provider,{value:a},t)}function l(){const e=(0,r.useContext)(s);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>i,q:()=>s});var r=n(7294),o=n(902);const a=r.createContext(null);function s(e){let{children:t,version:n}=e;return r.createElement(a.Provider,{value:n},t)}function i(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");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),s=n(1980),i=n(6668),l=n(902);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,i.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,u]=(0,r.useState)(!1);(0,s.Rb)((()=>{if(l)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>i,Zo:()=>l,n2:()=>s});var r=n(7294),o=n(902);const a=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function i(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const s=(0,r.useContext)(a);if(!s)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,i]=s,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{i({component:t,props:l})}),[i,t,l]),(0,r.useEffect)((()=>()=>i({component:null,props:null})),[i]),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)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},s=996;function i(){return o.Z.canUseDOM?window.innerWidth>s?a.desktop:a.mobile:a.ssr}const l=!1;function u(){const[e,t]=(0,r.useState)((()=>l?"ssr":i()));return(0,r.useEffect)((()=>{function e(){t(i())}const n=l?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})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>E,Wl:()=>h,_F:()=>v,cE:()=>p,hI:()=>_,jA:()=>g,lO:()=>w,oz:()=>k,s1:()=>x,vY:()=>z,xz:()=>f});var r=n(7294),o=n(6550),a=n(8790),s=n(143),i=n(373),l=n(4477),u=n(1116),c=n(7392),d=n(8596);const p=!!s._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function h(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=h(t);if(e)return e}}}function g(){const{pathname:e}=(0,o.TH)(),t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||b(e.items,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.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,u.V)(),{pathname:t}=(0,o.TH)(),n=(0,s.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,s.Iw)(e),{preferredVersion:n}=(0,i.J)(e),o=(0,s.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([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 z(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- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),s=t.routes,i=s.find((e=>(0,o.LX)(r.pathname,e)));if(!i)return null;const l=i.sidebar,u=l?n.docsSidebars[l]:void 0;return{docElement:(0,a.H)(s),sidebarName:l,sidebarItems:u}}function E(e){return e.filter((e=>"category"!==e.type||!!h(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(7294),o=n(6550),a=n(1688),s=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,s.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(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)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>c,VC:()=>f});var r=n(7294),o=n(6010),a=n(5742),s=n(226);function i(){const e=r.useContext(s._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:o,image:s,children:i}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=s?d(s,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),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}),i)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const s=r.useContext(d),i=(0,o.Z)(s,t);return r.createElement(d.Provider,{value:i},r.createElement(a.Z,null,r.createElement("html",{className:i})),n)}function f(e){let{children:t}=e;const n=i(),a=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const s=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,o.Z)(a,s)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>l,i6:()=>i,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 s(e){const t=(0,r.useRef)();return o((()=>{t.current=e})),t.current}class i 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 l(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 r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>s,Ns:()=>i});var r=n(7294),o=n(723),a=n(2263);function s(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){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:()=>f,OC:()=>l,RF:()=>d,o5:()=>p});var r=n(7294),o=n(412),a=n(2389),s=n(902);const i=r.createContext(void 0);function l(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(i.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(i);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const c=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(c()),a=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();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=u(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function f(){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:()=>r,os:()=>o});n(2263);const r="default";function o(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>c});var r=n(7294),o=n(1688);const a="localStorage";function s(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const u={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(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=i(t?.persistence);return null===n?u:{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),s({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),s({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),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?u:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,o.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(2263),o=n(6550),a=n(8780);function s(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:s,currentLocale:i}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),u=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=i===s?e:e.replace(`/${i}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===s?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>s});var r=n(7294),o=n(6550),a=n(902);function s(e){const t=(0,o.TH)(),n=(0,a.D9)(t),s=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&s({location:t,previousLocation:n})}),[s,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}},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:(s=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(s):function(e){return e.endsWith("/")?e.slice(0,-1):e}(s));var s;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:()=>x,q_:()=>H,ob:()=>f,PP:()=>C,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 s=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],s=t&&t.split("/")||[],i=e&&o(e),l=t&&o(t),u=i||l;if(e&&o(e)?s=r:r.length&&(s.pop(),s=s.concat(r)),!s.length)return"/";if(s.length){var c=s[s.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,p=s.length;p>=0;p--){var f=s[p];"."===f?a(s,p):".."===f?(a(s,p),d++):d&&(a(s,p),d--)}if(!u)for(;d--;d)s.unshift("..");!u||""===s[0]||s[0]&&o(s[0])||s.unshift("");var h=s.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var i=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function 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(i){throw i instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=s(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){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 g=!("undefined"==typeof window||!window.document||!window.document.createElement);function m(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={}),g||(0,i.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")),s=e,u=s.forceRefresh,x=void 0!==u&&u,w=s.getUserConfirmation,k=void 0===w?m:w,z=s.keyLength,_=void 0===z?6:z,E=e.basename?d(l(e.basename)):"";function H(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return E&&(a=c(a,E)),f(a,r,n)}function S(){return Math.random().toString(36).substr(2,_)}var C=h();function T(e){(0,r.Z)(B,e),B.length=n.length,C.notifyListeners(B.location,B.action)}function L(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(H(e.state))}function A(){P(H(y()))}var N=!1;function P(e){if(N)N=!1,T();else{C.confirmTransitionTo(e,"POP",k,(function(t){t?T({action:"POP",location:e}):function(e){var t=B.location,n=I.indexOf(t.key);-1===n&&(n=0);var r=I.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(N=!0,D(o))}(e)}))}}var O=H(y()),I=[O.key];function R(e){return E+p(e)}function D(e){n.go(e)}var M=0;function G(e){1===(M+=e)&&1===e?(window.addEventListener(b,L),a&&window.addEventListener(v,A)):0===M&&(window.removeEventListener(b,L),a&&window.removeEventListener(v,A))}var F=!1;var B={length:n.length,action:"POP",location:O,createHref:R,push:function(e,t){var r="PUSH",a=f(e,t,S(),B.location);C.confirmTransitionTo(a,r,k,(function(e){if(e){var t=R(a),s=a.key,i=a.state;if(o)if(n.pushState({key:s,state:i},null,t),x)window.location.href=t;else{var l=I.indexOf(B.location.key),u=I.slice(0,l+1);u.push(a.key),I=u,T({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,S(),B.location);C.confirmTransitionTo(a,r,k,(function(e){if(e){var t=R(a),s=a.key,i=a.state;if(o)if(n.replaceState({key:s,state:i},null,t),x)window.location.replace(t);else{var l=I.indexOf(B.location.key);-1!==l&&(I[l]=a.key),T({action:r,location:a})}else window.location.replace(t)}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return F||(G(1),F=!0),function(){return F&&(F=!1,G(-1)),t()}},listen:function(e){var t=C.appendListener(e);return G(1),function(){G(-1),t()}}};return B}var w="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+u(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:u,decodePath:l},slash:{encodePath:l,decodePath:l}};function z(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(z(window.location.href)+"#"+e)}function H(e){void 0===e&&(e={}),g||(0,i.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?m:o,s=n.hashType,u=void 0===s?"slash":s,b=e.basename?d(l(e.basename)):"",v=k[u],y=v.encodePath,x=v.decodePath;function H(){var e=x(_());return b&&(e=c(e,b)),f(e)}var S=h();function C(e){(0,r.Z)(F,e),F.length=t.length,S.notifyListeners(F.location,F.action)}var T=!1,L=null;function A(){var e,t,n=_(),r=y(n);if(n!==r)E(r);else{var o=H(),s=F.location;if(!T&&(t=o,(e=s).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(L===p(o))return;L=null,function(e){if(T)T=!1,C();else{var t="POP";S.confirmTransitionTo(e,t,a,(function(n){n?C({action:t,location:e}):function(e){var t=F.location,n=I.lastIndexOf(p(t));-1===n&&(n=0);var r=I.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(T=!0,R(o))}(e)}))}}(o)}}var N=_(),P=y(N);N!==P&&E(P);var O=H(),I=[p(O)];function R(e){t.go(e)}var D=0;function M(e){1===(D+=e)&&1===e?window.addEventListener(w,A):0===D&&window.removeEventListener(w,A)}var G=!1;var F={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=z(window.location.href)),n+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,F.location);S.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);if(_()!==o){L=t,function(e){window.location.hash=e}(o);var a=I.lastIndexOf(p(F.location)),s=I.slice(0,a+1);s.push(t),I=s,C({action:n,location:r})}else C()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,F.location);S.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);_()!==o&&(L=t,E(o));var a=I.indexOf(p(F.location));-1!==a&&(I[a]=t),C({action:n,location:r})}}))},go:R,goBack:function(){R(-1)},goForward:function(){R(1)},block:function(e){void 0===e&&(e=!1);var t=S.setPrompt(e);return G||(M(1),G=!0),function(){return G&&(G=!1,M(-1)),t()}},listen:function(e){var t=S.appendListener(e);return M(1),function(){M(-1),t()}}};return F}function S(e,t,n){return Math.min(Math.max(e,t),n)}function C(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,s=t.initialIndex,i=void 0===s?0:s,l=t.keyLength,u=void 0===l?6:l,c=h();function d(e){(0,r.Z)(x,e),x.length=x.entries.length,c.notifyListeners(x.location,x.action)}function g(){return Math.random().toString(36).substr(2,u)}var m=S(i,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?g():e.key||g())})),v=p;function y(e){var t=S(x.index+e,0,x.entries.length-1),r=x.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var x={length:b.length,action:"POP",location:b[m],index:m,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,g(),x.location);c.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,g(),x.location);c.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),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return x}},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},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function l(e){return r.isMemo(e)?s:i[e.$$typeof]||o}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[r.Memo]=s;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var s=c(n);d&&(s=s.concat(d(n)));for(var i=l(t),g=l(n),m=0;m<s.length;++m){var b=s[m];if(!(a[b]||r&&r[b]||g&&g[b]||i&&i[b])){var v=p(n,b);try{u(t,b,v)}catch(y){}}}}return t}},1143:e=>{"use strict";e.exports=function(e,t,n,r,o,a,s,i){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 u=[n,r,o,a,s,i],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},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 s(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),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,i((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,s(e,c,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,s=t.querySelector(r.barSelector),i=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return l(s,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&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 i=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 u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(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,s,i=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l<arguments.length;l++){for(var u in a=Object(arguments[l]))n.call(a,u)&&(i[u]=a[u]);if(t){s=t(a);for(var c=0;c<s.length;c++)r.call(a,s[c])&&(i[s[c]]=a[s[c]])}}return i}},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 s in o={},n[a]=o,t)t.hasOwnProperty(s)&&(o[s]=e(t[s],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],s={};for(var i in a)if(a.hasOwnProperty(i)){if(i==t)for(var l in n)n.hasOwnProperty(l)&&(s[l]=n[l]);n.hasOwnProperty(i)||(s[i]=a[i])}var u=o[e];return o[e]=s,r.languages.DFS(r.languages,(function(t,n){n===u&&t!=e&&(this[t]=s)})),s},DFS:function e(t,n,o,a){a=a||{};var s=r.util.objId;for(var i in t)if(t.hasOwnProperty(i)){n.call(t,i,t[i],o||i);var l=t[i],u=r.util.type(l);"Object"!==u||a[s(l)]?"Array"!==u||a[s(l)]||(a[s(l)]=!0,e(l,n,i,a)):(a[s(l)]=!0,e(l,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 i;return l(o,o.head,e),s(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 s(e,t,n,i,c,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var h=0;h<f.length;++h){if(d&&d.cause==p+","+h)return;var g=f[h],m=g.inside,b=!!g.lookbehind,v=!!g.greedy,y=g.alias;if(v&&!g.pattern.global){var x=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,x+"g")}for(var w=g.pattern||g,k=i.next,z=c;k!==t.tail&&!(d&&z>=d.reach);z+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,H=1;if(v){if(!(E=a(w,z,e,b))||E.index>=e.length)break;var S=E.index,C=E.index+E[0].length,T=z;for(T+=k.value.length;S>=T;)T+=(k=k.next).value.length;if(z=T-=k.value.length,k.value instanceof o)continue;for(var L=k;L!==t.tail&&(T<C||"string"==typeof L.value);L=L.next)H++,T+=L.value.length;H--,_=e.slice(z,T),E.index-=z}else if(!(E=a(w,0,_,b)))continue;S=E.index;var A=E[0],N=_.slice(0,S),P=_.slice(S+A.length),O=z+_.length;d&&O>d.reach&&(d.reach=O);var I=k.prev;if(N&&(I=l(t,I,N),z+=N.length),u(t,I,H),k=l(t,I,new o(p,m?r.tokenize(A,m):A,y,A)),P&&l(t,k,P),H>1){var R={cause:p+","+h,reach:O};s(e,t,n,k.prev,z,R),d&&R.reach>d.reach&&(d.reach=R.reach)}}}}}}function i(){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 u(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},s=t.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(a.classes,s):a.classes.push(s)),r.hooks.run("wrap",a);var i="";for(var l in a.attributes)i+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+i+">"+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,s=0;s<o.length;s++)a[o[s]]=e.languages.bash[o[s]];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 s(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:s(/\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:s(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:s(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:s(a),lookbehind:!0,greedy:!0},number:{pattern:s(/[+-]?(?: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],s=o.content[3];if(a&&s&&"code-language"===a.type&&"code-block"===s.type&&"string"==typeof a.content){var i=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),l="language-"+(i=(/[a-z][\w-]*/i.exec(i)||[""])[0].toLowerCase());s.alias?"string"==typeof s.alias?s.alias=[s.alias,l]:s.alias.push(l):s.alias=[l]}}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],u=/language-(.+)/.exec(a);if(u){n=u[1];break}}var c,d=e.languages[n];if(d)t.content=e.highlight((c=t.content,c.replace(s,"").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)),l(n);var r=i[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 s=RegExp(e.languages.markup.tag.pattern.source,"gi"),i={amp:"&",lt:"<",gt:">",quot:'"'},l=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"])&&"("===c(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var s=c(0);"variable"===s.type&&(f(s,"variable-input"),o.push(s.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===c(0).content&&(n++,f(c(0),"property-mutation"),o.length>0)){var i=p(/^\{$/,/^\}$/);if(-1===i)continue;for(var l=n;l<i;l++){var u=t[l];"variable"===u.type&&o.indexOf(u.content)>=0&&f(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function p(e,r){for(var o=1,a=n;a<t.length;a++){var s=t[a],i=s.content;if("punctuation"===s.type&&"string"==typeof i)if(e.test(i))o++;else if(r.test(i)&&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 s(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 i(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(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 u(t){var n={};n["interpolation-punctuation"]=o;var a=e.tokenize(t,n);if(3===a.length){var s=[1,1];s.push.apply(s,l(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,s)}return new e.Token("interpolation",a,r.alias,t)}function c(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),s=0,c={},d=l(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=i(s++,r)););return c[n]=o,n})).join(""),n,r),p=Object.keys(c);return s=0,function e(t){for(var n=0;n<t.length;n++){if(s>=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var o=p[s],a="string"==typeof r?r:r.content,i=a.indexOf(o);if(-1!==i){++s;var l=a.substring(0,i),d=u(c[o]),f=a.substring(i+o.length),h=[];if(l&&h.push(l),h.push(d),f){var g=[f];e(g),h.push.apply(h,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(h)),n+=h.length-1):r.content=h}}else{var m=r.content;Array.isArray(m)?e(m):e([m])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[s("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),s("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),s("svg",/\bsvg/.source),s("markdown",/\b(?:markdown|md)/.source),s("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),s("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 s=a.content;if(Array.isArray(s))if("template-string"===a.type){var i=s[1];if(3===s.length&&"string"!=typeof i&&"embedded-code"===i.type){var l=p(i),u=i.alias,d=Array.isArray(u)?u[0]:u,f=e.languages[d];if(!f)continue;s[1]=c(l,f,d)}}else t(s);else"string"!=typeof s&&t([s])}}}(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 s=a.inside||{};a.inside=s,s["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 s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""},i=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===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}):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 l=s(o);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(l+=s(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=s(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}o.content&&"string"!=typeof o.content&&i(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(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 s=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,i=s.length;-1!==n.code.indexOf(o=t(r,i));)++i;return s[i]=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 s(i){for(var l=0;l<i.length&&!(o>=a.length);l++){var u=i[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=a[o],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),h=p.indexOf(f);if(h>-1){++o;var g=p.substring(0,h),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),v=[];g&&v.push.apply(v,s([g])),v.push(m),b&&v.push.apply(v,s([b])),"string"==typeof u?i.splice.apply(i,[l,1].concat(v)):u.content=v}}else u.content&&s(u.content)}return i}(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},485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},4677:()=>{Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},3436:()=>{!function(e){var t=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:t}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:t}},punctuation:/[{};]/}}(Prism)},9385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},874:()=>{Prism.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:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},1472:(e,t,n)=>{var r={"./prism-groovy":485,"./prism-hcl":4677,"./prism-java":2503,"./prism-kotlin":2334,"./prism-nginx":3436,"./prism-ruby":9385,"./prism-swift":874,"./prism-toml":9930};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=1472},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,s){if(s!==r){var i=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 i.name="Invariant Violation",i}}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 s(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(s(227));var i=new Set,l={};function u(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)i.add(t[e])}var 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,h={},g={};function m(e,t,n,r,o,a,s){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=s}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function x(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(g,e)||!f.call(h,e)&&(p.test(e)?g[e]=!0:(h[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 m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,z=60106,_=60107,E=60108,H=60114,S=60109,C=60110,T=60112,L=60113,A=60120,N=60115,P=60116,O=60121,I=60128,R=60129,D=60130,M=60131;if("function"==typeof Symbol&&Symbol.for){var G=Symbol.for;k=G("react.element"),z=G("react.portal"),_=G("react.fragment"),E=G("react.strict_mode"),H=G("react.profiler"),S=G("react.provider"),C=G("react.context"),T=G("react.forward_ref"),L=G("react.suspense"),A=G("react.suspense_list"),N=G("react.memo"),P=G("react.lazy"),O=G("react.block"),G("react.scope"),I=G("react.opaque.id"),R=G("react.debug_trace_mode"),D=G("react.offscreen"),M=G("react.legacy_hidden")}var F,B="function"==typeof Symbol&&Symbol.iterator;function j(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=B&&e[B]||e["@@iterator"])?e:null}function $(e){if(void 0===F)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);F=t&&t[1]||""}return"\n"+F+e}var U=!1;function Z(e,t){if(!e||U)return"";U=!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(l){var r=l}Reflect.construct(e,[],t)}else{try{t.call()}catch(l){r=l}e.call(t.prototype)}else{try{throw Error()}catch(l){r=l}e()}}catch(l){if(l&&r&&"string"==typeof l.stack){for(var o=l.stack.split("\n"),a=r.stack.split("\n"),s=o.length-1,i=a.length-1;1<=s&&0<=i&&o[s]!==a[i];)i--;for(;1<=s&&0<=i;s--,i--)if(o[s]!==a[i]){if(1!==s||1!==i)do{if(s--,0>--i||o[s]!==a[i])return"\n"+o[s].replace(" at new "," at ")}while(1<=s&&0<=i);break}}}finally{U=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?$(e):""}function V(e){switch(e.tag){case 5:return $(e.type);case 16:return $("Lazy");case 13:return $("Suspense");case 19:return $("SuspenseList");case 0:case 2:case 15:return e=Z(e.type,!1);case 11:return e=Z(e.type.render,!1);case 22:return e=Z(e.type._render,!1);case 1:return e=Z(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case _:return"Fragment";case z:return"Portal";case H:return"Profiler";case E:return"StrictMode";case L:return"Suspense";case A:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case C:return(e.displayName||"Context")+".Consumer";case S:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case N:return q(e.type);case O:return q(e._render);case P:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var 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 X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return 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)&&x(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&&Q(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 se(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 ie(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(s(91));return o({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function le(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(s(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(s(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function ue(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={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 he,ge,me=(ge=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((he=he||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=he.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ge(e,t)}))}:ge);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var 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 xe(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 we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=xe(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 ze(e,t){if(t){if(ke[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(s(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(s(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(s(62))}}function _e(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 Ee(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var He=null,Se=null,Ce=null;function Te(e){if(e=no(e)){if("function"!=typeof He)throw Error(s(280));var t=e.stateNode;t&&(t=oo(t),He(e.stateNode,e.type,t))}}function Le(e){Se?Ce?Ce.push(e):Ce=[e]:Se=e}function Ae(){if(Se){var e=Se,t=Ce;if(Ce=Se=null,Te(e),t)for(e=0;e<t.length;e++)Te(t[e])}}function Ne(e,t){return e(t)}function Pe(e,t,n,r,o){return e(t,n,r,o)}function Oe(){}var Ie=Ne,Re=!1,De=!1;function Me(){null===Se&&null===Ce||(Oe(),Ae())}function Ge(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(s(231,t,typeof n));return n}var Fe=!1;if(d)try{var Be={};Object.defineProperty(Be,"passive",{get:function(){Fe=!0}}),window.addEventListener("test",Be,Be),window.removeEventListener("test",Be,Be)}catch(ge){Fe=!1}function je(e,t,n,r,o,a,s,i,l){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(c){this.onError(c)}}var $e=!1,Ue=null,Ze=!1,Ve=null,qe={onError:function(e){$e=!0,Ue=e}};function We(e,t,n,r,o,a,s,i,l){$e=!1,Ue=null,je.apply(qe,arguments)}function Ye(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 Ke(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(s(188))}function Qe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(e)))throw Error(s(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 Xe(o),e;if(a===r)return Xe(o),t;a=a.sibling}throw Error(s(188))}if(n.return!==r.return)n=o,r=a;else{for(var i=!1,l=o.child;l;){if(l===n){i=!0,n=o,r=a;break}if(l===r){i=!0,r=o,n=a;break}l=l.sibling}if(!i){for(l=a.child;l;){if(l===n){i=!0,n=a,r=o;break}if(l===r){i=!0,r=a,n=o;break}l=l.sibling}if(!i)throw Error(s(189))}}if(n.alternate!==r)throw Error(s(190))}if(3!==n.tag)throw Error(s(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=[],st=null,it=null,lt=null,ut=new Map,ct=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 ht(e,t){switch(e){case"focusin":case"focusout":st=null;break;case"dragenter":case"dragleave":it=null;break;case"mouseover":case"mouseout":lt=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function gt(e,t,n,r,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 mt(e){var t=to(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ke(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=Qt(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=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&at.shift()}null!==st&&bt(st)&&(st=null),null!==it&&bt(it)&&(it=null),null!==lt&&bt(lt)&&(lt=null),ut.forEach(vt),ct.forEach(vt)}function xt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,yt)))}function wt(e){function t(t){return xt(t,e)}if(0<at.length){xt(at[0],e);for(var n=1;n<at.length;n++){var r=at[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==st&&xt(st,e),null!==it&&xt(it,e),null!==lt&&xt(lt,e),ut.forEach(t),ct.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)mt(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 zt={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},_t={},Et={};function Ht(e){if(_t[e])return _t[e];if(!zt[e])return e;var t,n=zt[e];for(t in n)if(n.hasOwnProperty(t)&&t in Et)return _t[e]=n[t];return e}d&&(Et=document.createElement("div").style,"AnimationEvent"in window||(delete zt.animationend.animation,delete zt.animationiteration.animation,delete zt.animationstart.animation),"TransitionEvent"in window||delete zt.transitionend.transition);var St=Ht("animationend"),Ct=Ht("animationiteration"),Tt=Ht("animationstart"),Lt=Ht("transitionend"),At=new Map,Nt=new Map,Pt=["abort","abort",St,"animationEnd",Ct,"animationIteration",Tt,"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",Lt,"transitionEnd","waiting","waiting"];function Ot(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),At.set(r,o),u(o,[r])}}(0,a.unstable_now)();var It=8;function Rt(e){if(0!=(1&e))return It=15,1;if(0!=(2&e))return It=14,2;if(0!=(4&e))return It=13,4;var t=24&e;return 0!==t?(It=12,t):0!=(32&e)?(It=11,32):0!==(t=192&e)?(It=10,t):0!=(256&e)?(It=9,256):0!==(t=3584&e)?(It=8,t):0!=(4096&e)?(It=7,4096):0!==(t=4186112&e)?(It=6,t):0!==(t=62914560&e)?(It=5,t):67108864&e?(It=4,67108864):0!=(134217728&e)?(It=3,134217728):0!==(t=805306368&e)?(It=2,t):0!=(1073741824&e)?(It=1,1073741824):(It=8,e)}function Dt(e,t){var n=e.pendingLanes;if(0===n)return It=0;var r=0,o=0,a=e.expiredLanes,s=e.suspendedLanes,i=e.pingedLanes;if(0!==a)r=a,o=It=15;else if(0!==(a=134217727&n)){var l=a&~s;0!==l?(r=Rt(l),o=It):0!==(i&=a)&&(r=Rt(i),o=It)}else 0!==(a=n&~s)?(r=Rt(a),o=It):0!==i&&(r=Rt(i),o=It);if(0===r)return 0;if(r=n&((0>(r=31-$t(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&s)){if(Rt(t),o<=It)return t;It=o}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-$t(t)),r|=e[n],t&=~o;return r}function Mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function Gt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Ft(24&~t))?Gt(10,t):e;case 10:return 0===(e=Ft(192&~t))?Gt(8,t):e;case 8:return 0===(e=Ft(3584&~t))&&(0===(e=Ft(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Ft(805306368&~t))&&(t=268435456),t}throw Error(s(358,e))}function Ft(e){return e&-e}function Bt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function jt(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-$t(t)]=n}var $t=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ut(e)/Zt|0)|0},Ut=Math.log,Zt=Math.LN2;var Vt=a.unstable_UserBlockingPriority,qt=a.unstable_runWithPriority,Wt=!0;function Yt(e,t,n,r){Re||Oe();var o=Xt,a=Re;Re=!0;try{Pe(o,e,t,n,r)}finally{(Re=a)||Me()}}function Kt(e,t,n,r){qt(Vt,Xt.bind(null,e,t,n,r))}function Xt(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=Qt(e,t,n,r);if(null===a)o&&ht(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 st=gt(st,e,t,n,r,o),!0;case"dragenter":return it=gt(it,e,t,n,r,o),!0;case"mouseover":return lt=gt(lt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return ut.set(a,gt(ut.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,ct.set(a,gt(ct.get(a)||null,e,t,n,r,o)),!0}return!1}(a,e,t,n,r))return;ht(e,r)}Or(e,t,r,null,n)}}}function Qt(e,t,n,r){var o=Ee(r);if(null!==(o=to(o))){var a=Ye(o);if(null===a)o=null;else{var s=a.tag;if(13===s){if(null!==(o=Ke(a)))return o;o=null}else if(3===s){if(a.stateNode.hydrate)return 3===a.tag?a.stateNode.containerInfo:null;o=null}else a!==o&&(o=null)}}return Or(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 s=r-e;for(t=1;t<=s&&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 sn(e){function t(t,n,r,o,a){for(var s in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(s)&&(t=e[s],this[s]=t?t(o):o[s]);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 ln,un,cn,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(dn),fn=o({},dn,{view:0,detail:0}),hn=sn(fn),gn=o({},fn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Sn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==cn&&(cn&&"mousemove"===e.type?(ln=e.screenX-cn.screenX,un=e.screenY-cn.screenY):un=ln=0,cn=e),ln)},movementY:function(e){return"movementY"in e?e.movementY:un}}),mn=sn(gn),bn=sn(o({},gn,{dataTransfer:0})),vn=sn(o({},fn,{relatedTarget:0})),yn=sn(o({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),xn=o({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=sn(xn),kn=sn(o({},dn,{data:0})),zn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},_n={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"},En={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Hn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=En[e])&&!!t[e]}function Sn(){return Hn}var Cn=o({},fn,{key:function(e){if(e.key){var t=zn[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?_n[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Sn,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}}),Tn=sn(Cn),Ln=sn(o({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),An=sn(o({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Sn})),Nn=sn(o({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Pn=o({},gn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),On=sn(Pn),In=[9,13,27,32],Rn=d&&"CompositionEvent"in window,Dn=null;d&&"documentMode"in document&&(Dn=document.documentMode);var Mn=d&&"TextEvent"in window&&!Dn,Gn=d&&(!Rn||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),Bn=!1;function jn(e,t){switch(e){case"keyup":return-1!==In.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 Zn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Zn[e.type]:"textarea"===t}function qn(e,t,n,r){Le(r),0<(t=Rr(t,"onChange")).length&&(n=new pn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,Yn=null;function Kn(e){Cr(e,0)}function Xn(e){if(X(ro(e)))return e}function Qn(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),Yn=Wn=null)}function or(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,Ee(e)),e=Kn,Re)e(t);else{Re=!0;try{Ne(e,t)}finally{Re=!1,Me()}}}}function ar(e,t,n){"focusin"===e?(rr(),Yn=n,(Wn=t).attachEvent("onpropertychange",or)):"focusout"===e&&rr()}function sr(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function ir(e,t){if("click"===e)return Xn(t)}function lr(e,t){if("input"===e||"change"===e)return Xn(t)}var ur="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},cr=Object.prototype.hasOwnProperty;function dr(e,t){if(ur(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!ur(e[n[r]],t[n[r]]))return!1;return!0}function 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 hr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?hr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function gr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function mr(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,xr=null,wr=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wr||null==vr||vr!==Q(r)||("selectionStart"in(r=vr)&&mr(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},xr&&dr(xr,r)||(xr=r,0<(r=Rr(yr,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}Ot("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),Ot("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),Ot(Pt,2);for(var zr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),_r=0;_r<zr.length;_r++)Nt.set(zr[_r],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),u("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),u("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),u("onBeforeInput",["compositionend","keypress","textInput","paste"]),u("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Er="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Hr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Er));function Sr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,i,l,u){if(We.apply(this,arguments),$e){if(!$e)throw Error(s(198));var c=Ue;$e=!1,Ue=null,Ze||(Ze=!0,Ve=c)}}(r,t,void 0,e),e.currentTarget=null}function Cr(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 s=r.length-1;0<=s;s--){var i=r[s],l=i.instance,u=i.currentTarget;if(i=i.listener,l!==a&&o.isPropagationStopped())break e;Sr(o,i,u),a=l}else for(s=0;s<r.length;s++){if(l=(i=r[s]).instance,u=i.currentTarget,i=i.listener,l!==a&&o.isPropagationStopped())break e;Sr(o,i,u),a=l}}}if(Ze)throw e=Ve,Ze=!1,Ve=null,e}function Tr(e,t){var n=ao(t),r=e+"__bubble";n.has(r)||(Pr(t,e,2,!1),n.add(r))}var Lr="_reactListening"+Math.random().toString(36).slice(2);function Ar(e){e[Lr]||(e[Lr]=!0,i.forEach((function(t){Hr.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&&Hr.has(e)){if("scroll"!==e)return;o|=2,a=r}var s=ao(a),i=e+"__"+(t?"capture":"bubble");s.has(i)||(t&&(o|=4),Pr(a,e,o,t),s.add(i))}function Pr(e,t,n,r){var o=Nt.get(t);switch(void 0===o?2:o){case 0:o=Yt;break;case 1:o=Kt;break;default:o=Xt}n=o.bind(null,t,n,e),o=void 0,!Fe||"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 Or(e,t,n,r,o){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var s=r.tag;if(3===s||4===s){var i=r.stateNode.containerInfo;if(i===o||8===i.nodeType&&i.parentNode===o)break;if(4===s)for(s=r.return;null!==s;){var l=s.tag;if((3===l||4===l)&&((l=s.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;s=s.return}for(;null!==i;){if(null===(s=to(i)))return;if(5===(l=s.tag)||6===l){r=a=s;continue e}i=i.parentNode}}r=r.return}!function(e,t,n){if(De)return e(t,n);De=!0;try{return Ie(e,t,n)}finally{De=!1,Me()}}((function(){var r=a,o=Ee(n),s=[];e:{var i=At.get(e);if(void 0!==i){var l=pn,u=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":l=Tn;break;case"focusin":u="focus",l=vn;break;case"focusout":u="blur",l=vn;break;case"beforeblur":case"afterblur":l=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":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=An;break;case St:case Ct:case Tt:l=yn;break;case Lt:l=Nn;break;case"scroll":l=hn;break;case"wheel":l=On;break;case"copy":case"cut":case"paste":l=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=Ln}var c=0!=(4&t),d=!c&&"scroll"===e,p=c?null!==i?i+"Capture":null:i;c=[];for(var f,h=r;null!==h;){var g=(f=h).stateNode;if(5===f.tag&&null!==g&&(f=g,null!==p&&(null!=(g=Ge(h,p))&&c.push(Ir(h,g,f)))),d)break;h=h.return}0<c.length&&(i=new l(i,u,null,n,o),s.push({event:i,listeners:c}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(i="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(u=n.relatedTarget||n.fromElement)||!to(u)&&!u[Jr])&&(l||i)&&(i=o.window===o?o:(i=o.ownerDocument)?i.defaultView||i.parentWindow:window,l?(l=r,null!==(u=(u=n.relatedTarget||n.toElement)?to(u):null)&&(u!==(d=Ye(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(l=null,u=r),l!==u)){if(c=mn,g="onMouseLeave",p="onMouseEnter",h="mouse","pointerout"!==e&&"pointerover"!==e||(c=Ln,g="onPointerLeave",p="onPointerEnter",h="pointer"),d=null==l?i:ro(l),f=null==u?i:ro(u),(i=new c(g,h+"leave",l,n,o)).target=d,i.relatedTarget=f,g=null,to(o)===r&&((c=new c(p,h+"enter",u,n,o)).target=f,c.relatedTarget=d,g=c),d=g,l&&u)e:{for(p=u,h=0,f=c=l;f;f=Dr(f))h++;for(f=0,g=p;g;g=Dr(g))f++;for(;0<h-f;)c=Dr(c),h--;for(;0<f-h;)p=Dr(p),f--;for(;h--;){if(c===p||null!==p&&c===p.alternate)break e;c=Dr(c),p=Dr(p)}c=null}else c=null;null!==l&&Mr(s,i,l,c,!1),null!==u&&null!==d&&Mr(s,d,u,c,!0)}if("select"===(l=(i=r?ro(r):window).nodeName&&i.nodeName.toLowerCase())||"input"===l&&"file"===i.type)var m=Qn;else if(Vn(i))if(Jn)m=lr;else{m=sr;var b=ar}else(l=i.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===i.type||"radio"===i.type)&&(m=ir);switch(m&&(m=m(e,r))?qn(s,m,n,o):(b&&b(e,i,r),"focusout"===e&&(b=i._wrapperState)&&b.controlled&&"number"===i.type&&oe(i,"number",i.value)),b=r?ro(r):window,e){case"focusin":(Vn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,xr=null);break;case"focusout":xr=yr=vr=null;break;case"mousedown":wr=!0;break;case"contextmenu":case"mouseup":case"dragend":wr=!1,kr(s,n,o);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(s,n,o)}var v;if(Rn)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?jn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Gn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=nn()):(en="value"in(Jt=o)?Jt.value:Jt.textContent,Un=!0)),0<(b=Rr(r,y)).length&&(y=new kn(y,e,null,n,o),s.push({event:y,listeners:b}),v?y.data=v:null!==(v=$n(n))&&(y.data=v))),(v=Mn?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(Bn=!0,Fn);case"textInput":return(e=t.data)===Fn&&Bn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!Rn&&jn(e,t)?(e=nn(),tn=en=Jt=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 Gn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Rr(r,"onBeforeInput")).length&&(o=new kn("onBeforeInput","beforeinput",null,n,o),s.push({event:o,listeners:r}),o.data=v))}Cr(s,t)}))}function Ir(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Rr(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=Ge(e,n))&&r.unshift(Ir(e,a,o)),null!=(a=Ge(e,t))&&r.push(Ir(e,a,o))),e=e.return}return r}function Dr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Mr(e,t,n,r,o){for(var a=t._reactName,s=[];null!==n&&n!==r;){var i=n,l=i.alternate,u=i.stateNode;if(null!==l&&l===r)break;5===i.tag&&null!==u&&(i=u,o?null!=(l=Ge(n,a))&&s.unshift(Ir(n,l,i)):o||null!=(l=Ge(n,a))&&s.push(Ir(n,l,i))),n=n.return}0!==s.length&&e.push({event:t,listeners:s})}function Gr(){}var Fr=null,Br=null;function jr(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function $r(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 Ur="function"==typeof setTimeout?setTimeout:void 0,Zr="function"==typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function 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 Yr=0;var Kr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Kr,Qr="__reactProps$"+Kr,Jr="__reactContainer$"+Kr,eo="__reactEvents$"+Kr;function to(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wr(e);null!==e;){if(n=e[Xr])return n;e=Wr(e)}return t}n=(e=n).parentNode}return null}function no(e){return!(e=e[Xr]||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(s(33))}function oo(e){return e[Qr]||null}function ao(e){var t=e[eo];return void 0===t&&(t=e[eo]=new Set),t}var so=[],io=-1;function lo(e){return{current:e}}function uo(e){0>io||(e.current=so[io],so[io]=null,io--)}function co(e,t){io++,so[io]=e.current,e.current=t}var po={},fo=lo(po),ho=lo(!1),go=po;function mo(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(){uo(ho),uo(fo)}function yo(e,t,n){if(fo.current!==po)throw Error(s(168));co(fo,t),co(ho,n)}function xo(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(s(108,q(t)||"Unknown",a));return o({},n,r)}function wo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||po,go=fo.current,co(fo,e),co(ho,ho.current),!0}function ko(e,t,n){var r=e.stateNode;if(!r)throw Error(s(169));n?(e=xo(e,t,go),r.__reactInternalMemoizedMergedChildContext=e,uo(ho),uo(fo),co(fo,e)):uo(ho),co(ho,n)}var zo=null,_o=null,Eo=a.unstable_runWithPriority,Ho=a.unstable_scheduleCallback,So=a.unstable_cancelCallback,Co=a.unstable_shouldYield,To=a.unstable_requestPaint,Lo=a.unstable_now,Ao=a.unstable_getCurrentPriorityLevel,No=a.unstable_ImmediatePriority,Po=a.unstable_UserBlockingPriority,Oo=a.unstable_NormalPriority,Io=a.unstable_LowPriority,Ro=a.unstable_IdlePriority,Do={},Mo=void 0!==To?To:function(){},Go=null,Fo=null,Bo=!1,jo=Lo(),$o=1e4>jo?Lo:function(){return Lo()-jo};function Uo(){switch(Ao()){case No:return 99;case Po:return 98;case Oo:return 97;case Io:return 96;case Ro:return 95;default:throw Error(s(332))}}function Zo(e){switch(e){case 99:return No;case 98:return Po;case 97:return Oo;case 96:return Io;case 95:return Ro;default:throw Error(s(332))}}function Vo(e,t){return e=Zo(e),Eo(e,t)}function qo(e,t,n){return e=Zo(e),Ho(e,t,n)}function Wo(){if(null!==Fo){var e=Fo;Fo=null,So(e)}Yo()}function Yo(){if(!Bo&&null!==Go){Bo=!0;var e=0;try{var t=Go;Vo(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Go=null}catch(n){throw null!==Go&&(Go=Go.slice(e+1)),Ho(No,Wo),n}finally{Bo=!1}}}var Ko=w.ReactCurrentBatchConfig;function Xo(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 Qo=lo(null),Jo=null,ea=null,ta=null;function na(){ta=ea=Jo=null}function ra(e){var t=Qo.current;uo(Qo),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)&&(Rs=!0),e.firstContext=null)}function sa(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(s(308));ea=t,Jo.dependencies={lanes:0,firstContext:t,responders:null}}else ea=ea.next=t;return e._currentValue}var ia=!1;function la(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function ua(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 ca(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 s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=s:a=a.next=s,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;ia=!1;var s=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var u=l,c=u.next;u.next=null,null===i?s=c:i.next=c,i=u;var d=e.alternate;if(null!==d){var p=(d=d.updateQueue).lastBaseUpdate;p!==i&&(null===p?d.firstBaseUpdate=c:p.next=c,d.lastBaseUpdate=u)}}if(null!==s){for(p=a.baseState,i=0,d=c=u=null;;){l=s.lane;var f=s.eventTime;if((r&l)===l){null!==d&&(d=d.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var h=e,g=s;switch(l=t,f=n,g.tag){case 1:if("function"==typeof(h=g.payload)){p=h.call(f,p,l);break e}p=h;break e;case 3:h.flags=-4097&h.flags|64;case 0:if(null==(l="function"==typeof(h=g.payload)?h.call(f,p,l):h))break e;p=o({},p,l);break e;case 2:ia=!0}}null!==s.callback&&(e.flags|=32,null===(l=a.effects)?a.effects=[s]:l.push(s))}else f={eventTime:f,lane:l,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===d?(c=d=f,u=p):d=d.next=f,i|=l;if(null===(s=s.next)){if(null===(l=a.shared.pending))break;s=l.next,l.next=null,a.lastBaseUpdate=l,a.shared.pending=null}}null===d&&(u=p),a.baseState=u,a.firstBaseUpdate=c,a.lastBaseUpdate=d,Bi|=i,e.lanes=i,e.memoizedState=p}}function ha(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(s(191,o));o.call(r)}}}var ga=(new r.Component).refs;function ma(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)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.payload=t,null!=n&&(a.callback=n),da(e,a),hl(e,o,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=pl(),o=fl(e),a=ca(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),da(e,a),hl(e,o,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=pl(),r=fl(e),o=ca(n,r);o.tag=2,null!=t&&(o.callback=t),da(e,o),hl(e,r,n)}};function va(e,t,n,r,o,a,s){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,s):!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=sa(a):(o=bo(t)?go:fo.current,a=(r=null!=(r=t.contextTypes))?mo(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 xa(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 wa(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=ga,la(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=sa(a):(a=bo(t)?go:fo.current,o.context=mo(e,a)),fa(e,n,o,r),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(ma(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 za(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(s(309));var r=n.stateNode}if(!r)throw Error(s(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===ga&&(t=r.refs={}),null===e?delete t[o]:t[o]=e},t._stringRef=o,t)}if("string"!=typeof e)throw Error(s(284));if(!n._owner)throw Error(s(290,e))}return e}function _a(e,t){if("textarea"!==e.type)throw Error(s(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function Ea(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=Vl(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 i(t){return e&&null===t.alternate&&(t.flags=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Kl(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function u(e,t,n,r){return null!==t&&t.elementType===n.type?((r=o(t,n.props)).ref=za(e,t,n),r.return=e,r):((r=ql(n.type,n.key,n.props,null,e.mode,r)).ref=za(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xl(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=Wl(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=Kl(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=ql(t.type,t.key,t.props,null,e.mode,n)).ref=za(e,null,t),n.return=e,n;case z:return(t=Xl(t,e.mode,n)).return=e,t}if(ka(t)||j(t))return(t=Wl(t,e.mode,n,null)).return=e,t;_a(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:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?n.type===_?d(e,t,n.props.children,r,o):u(e,t,n,r):null;case z:return n.key===o?c(e,t,n,r):null}if(ka(n)||j(n))return null!==o?null:d(e,t,n,r,null);_a(e,n)}return null}function h(e,t,n,r,o){if("string"==typeof r||"number"==typeof r)return l(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===_?d(t,e,r.props.children,o,r.key):u(t,e,r,o);case z:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o)}if(ka(r)||j(r))return d(t,e=e.get(n)||null,r,o,null);_a(t,r)}return null}function g(o,s,i,l){for(var u=null,c=null,d=s,g=s=0,m=null;null!==d&&g<i.length;g++){d.index>g?(m=d,d=null):m=d.sibling;var b=f(o,d,i[g],l);if(null===b){null===d&&(d=m);break}e&&d&&null===b.alternate&&t(o,d),s=a(b,s,g),null===c?u=b:c.sibling=b,c=b,d=m}if(g===i.length)return n(o,d),u;if(null===d){for(;g<i.length;g++)null!==(d=p(o,i[g],l))&&(s=a(d,s,g),null===c?u=d:c.sibling=d,c=d);return u}for(d=r(o,d);g<i.length;g++)null!==(m=h(d,o,g,i[g],l))&&(e&&null!==m.alternate&&d.delete(null===m.key?g:m.key),s=a(m,s,g),null===c?u=m:c.sibling=m,c=m);return e&&d.forEach((function(e){return t(o,e)})),u}function m(o,i,l,u){var c=j(l);if("function"!=typeof c)throw Error(s(150));if(null==(l=c.call(l)))throw Error(s(151));for(var d=c=null,g=i,m=i=0,b=null,v=l.next();null!==g&&!v.done;m++,v=l.next()){g.index>m?(b=g,g=null):b=g.sibling;var y=f(o,g,v.value,u);if(null===y){null===g&&(g=b);break}e&&g&&null===y.alternate&&t(o,g),i=a(y,i,m),null===d?c=y:d.sibling=y,d=y,g=b}if(v.done)return n(o,g),c;if(null===g){for(;!v.done;m++,v=l.next())null!==(v=p(o,v.value,u))&&(i=a(v,i,m),null===d?c=v:d.sibling=v,d=v);return c}for(g=r(o,g);!v.done;m++,v=l.next())null!==(v=h(g,o,m,v.value,u))&&(e&&null!==v.alternate&&g.delete(null===v.key?m:v.key),i=a(v,i,m),null===d?c=v:d.sibling=v,d=v);return e&&g.forEach((function(e){return t(o,e)})),c}return function(e,r,a,l){var u="object"==typeof a&&null!==a&&a.type===_&&null===a.key;u&&(a=a.props.children);var c="object"==typeof a&&null!==a;if(c)switch(a.$$typeof){case k:e:{for(c=a.key,u=r;null!==u;){if(u.key===c){if(7===u.tag){if(a.type===_){n(e,u.sibling),(r=o(u,a.props.children)).return=e,e=r;break e}}else if(u.elementType===a.type){n(e,u.sibling),(r=o(u,a.props)).ref=za(e,u,a),r.return=e,e=r;break e}n(e,u);break}t(e,u),u=u.sibling}a.type===_?((r=Wl(a.props.children,e.mode,l,a.key)).return=e,e=r):((l=ql(a.type,a.key,a.props,null,e.mode,l)).ref=za(e,r,a),l.return=e,e=l)}return i(e);case z:e:{for(u=a.key;null!==r;){if(r.key===u){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=Xl(a,e.mode,l)).return=e,e=r}return i(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=Kl(a,e.mode,l)).return=e,e=r),i(e);if(ka(a))return g(e,r,a,l);if(j(a))return m(e,r,a,l);if(c&&_a(e,a),void 0===a&&!u)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(s(152,q(e.type)||"Component"))}return n(e,r)}}var Ha=Ea(!0),Sa=Ea(!1),Ca={},Ta=lo(Ca),La=lo(Ca),Aa=lo(Ca);function Na(e){if(e===Ca)throw Error(s(174));return e}function Pa(e,t){switch(co(Aa,t),co(La,e),co(Ta,Ca),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)}uo(Ta),co(Ta,t)}function Oa(){uo(Ta),uo(La),uo(Aa)}function Ia(e){Na(Aa.current);var t=Na(Ta.current),n=fe(t,e.type);t!==n&&(co(La,e),co(Ta,n))}function Ra(e){La.current===e&&(uo(Ta),uo(La))}var Da=lo(0);function Ma(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 Ga=null,Fa=null,Ba=!1;function ja(e,t){var n=Ul(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 $a(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 Ua(e){if(Ba){var t=Fa;if(t){var n=t;if(!$a(e,t)){if(!(t=qr(n.nextSibling))||!$a(e,t))return e.flags=-1025&e.flags|2,Ba=!1,void(Ga=e);ja(Ga,n)}Ga=e,Fa=qr(t.firstChild)}else e.flags=-1025&e.flags|2,Ba=!1,Ga=e}}function Za(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Ga=e}function Va(e){if(e!==Ga)return!1;if(!Ba)return Za(e),Ba=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!$r(t,e.memoizedProps))for(t=Fa;t;)ja(e,t),t=qr(t.nextSibling);if(Za(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(s(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Fa=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Fa=null}}else Fa=Ga?qr(e.stateNode.nextSibling):null;return!0}function qa(){Fa=Ga=null,Ba=!1}var Wa=[];function Ya(){for(var e=0;e<Wa.length;e++)Wa[e]._workInProgressVersionPrimary=null;Wa.length=0}var Ka=w.ReactCurrentDispatcher,Xa=w.ReactCurrentBatchConfig,Qa=0,Ja=null,es=null,ts=null,ns=!1,rs=!1;function os(){throw Error(s(321))}function as(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ur(e[n],t[n]))return!1;return!0}function ss(e,t,n,r,o,a){if(Qa=a,Ja=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Ka.current=null===e||null===e.memoizedState?Ns:Ps,e=n(r,o),rs){a=0;do{if(rs=!1,!(25>a))throw Error(s(301));a+=1,ts=es=null,t.updateQueue=null,Ka.current=Os,e=n(r,o)}while(rs)}if(Ka.current=As,t=null!==es&&null!==es.next,Qa=0,ts=es=Ja=null,ns=!1,t)throw Error(s(300));return e}function is(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ts?Ja.memoizedState=ts=e:ts=ts.next=e,ts}function ls(){if(null===es){var e=Ja.alternate;e=null!==e?e.memoizedState:null}else e=es.next;var t=null===ts?Ja.memoizedState:ts.next;if(null!==t)ts=t,es=e;else{if(null===e)throw Error(s(310));e={memoizedState:(es=e).memoizedState,baseState:es.baseState,baseQueue:es.baseQueue,queue:es.queue,next:null},null===ts?Ja.memoizedState=ts=e:ts=ts.next=e}return ts}function us(e,t){return"function"==typeof t?t(e):t}function cs(e){var t=ls(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var r=es,o=r.baseQueue,a=n.pending;if(null!==a){if(null!==o){var i=o.next;o.next=a.next,a.next=i}r.baseQueue=o=a,n.pending=null}if(null!==o){o=o.next,r=r.baseState;var l=i=a=null,u=o;do{var c=u.lane;if((Qa&c)===c)null!==l&&(l=l.next={lane:0,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null}),r=u.eagerReducer===e?u.eagerState:e(r,u.action);else{var d={lane:c,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null};null===l?(i=l=d,a=r):l=l.next=d,Ja.lanes|=c,Bi|=c}u=u.next}while(null!==u&&u!==o);null===l?a=r:l.next=i,ur(r,t.memoizedState)||(Rs=!0),t.memoizedState=r,t.baseState=a,t.baseQueue=l,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function ds(e){var t=ls(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var i=o=o.next;do{a=e(a,i.action),i=i.next}while(i!==o);ur(a,t.memoizedState)||(Rs=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function ps(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=(Qa&e)===e)&&(t._workInProgressVersionPrimary=r,Wa.push(t))),e)return n(t._source);throw Wa.push(t),Error(s(350))}function fs(e,t,n,r){var o=Pi;if(null===o)throw Error(s(349));var a=t._getVersion,i=a(t._source),l=Ka.current,u=l.useState((function(){return ps(o,t,n)})),c=u[1],d=u[0];u=ts;var p=e.memoizedState,f=p.refs,h=f.getSnapshot,g=p.source;p=p.subscribe;var m=Ja;return e.memoizedState={refs:f,source:t,subscribe:r},l.useEffect((function(){f.getSnapshot=n,f.setSnapshot=c;var e=a(t._source);if(!ur(i,e)){e=n(t._source),ur(d,e)||(c(e),e=fl(m),o.mutableReadLanes|=e&o.pendingLanes),e=o.mutableReadLanes,o.entangledLanes|=e;for(var r=o.entanglements,s=e;0<s;){var l=31-$t(s),u=1<<l;r[l]|=e,s&=~u}}}),[n,t,r]),l.useEffect((function(){return r(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var r=fl(m);o.mutableReadLanes|=r&o.pendingLanes}catch(a){n((function(){throw a}))}}))}),[t,r]),ur(h,n)&&ur(g,t)&&ur(p,r)||((e={pending:null,dispatch:null,lastRenderedReducer:us,lastRenderedState:d}).dispatch=c=Ls.bind(null,Ja,e),u.queue=e,u.baseQueue=null,d=ps(o,t,n),u.memoizedState=u.baseState=d),d}function hs(e,t,n){return fs(ls(),e,t,n)}function gs(e){var t=is();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:us,lastRenderedState:e}).dispatch=Ls.bind(null,Ja,e),[t.memoizedState,e]}function ms(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 bs(e){return e={current:e},is().memoizedState=e}function vs(){return ls().memoizedState}function ys(e,t,n,r){var o=is();Ja.flags|=e,o.memoizedState=ms(1|t,n,void 0,void 0===r?null:r)}function xs(e,t,n,r){var o=ls();r=void 0===r?null:r;var a=void 0;if(null!==es){var s=es.memoizedState;if(a=s.destroy,null!==r&&as(r,s.deps))return void ms(t,n,a,r)}Ja.flags|=e,o.memoizedState=ms(1|t,n,a,r)}function ws(e,t){return ys(516,4,e,t)}function ks(e,t){return xs(516,4,e,t)}function zs(e,t){return xs(4,2,e,t)}function _s(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 Es(e,t,n){return n=null!=n?n.concat([e]):null,xs(4,2,_s.bind(null,t,e),n)}function Hs(){}function Ss(e,t){var n=ls();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&as(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Cs(e,t){var n=ls();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&as(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ts(e,t){var n=Uo();Vo(98>n?98:n,(function(){e(!0)})),Vo(97<n?97:n,(function(){var n=Xa.transition;Xa.transition=1;try{e(!1),t()}finally{Xa.transition=n}}))}function Ls(e,t,n){var r=pl(),o=fl(e),a={lane:o,action:n,eagerReducer:null,eagerState:null,next:null},s=t.pending;if(null===s?a.next=a:(a.next=s.next,s.next=a),t.pending=a,s=e.alternate,e===Ja||null!==s&&s===Ja)rs=ns=!0;else{if(0===e.lanes&&(null===s||0===s.lanes)&&null!==(s=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=s(i,n);if(a.eagerReducer=s,a.eagerState=l,ur(l,i))return}catch(u){}hl(e,o,r)}}var As={readContext:sa,useCallback:os,useContext:os,useEffect:os,useImperativeHandle:os,useLayoutEffect:os,useMemo:os,useReducer:os,useRef:os,useState:os,useDebugValue:os,useDeferredValue:os,useTransition:os,useMutableSource:os,useOpaqueIdentifier:os,unstable_isNewReconciler:!1},Ns={readContext:sa,useCallback:function(e,t){return is().memoizedState=[e,void 0===t?null:t],e},useContext:sa,useEffect:ws,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ys(4,2,_s.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ys(4,2,e,t)},useMemo:function(e,t){var n=is();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=is();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=Ls.bind(null,Ja,e),[r.memoizedState,e]},useRef:bs,useState:gs,useDebugValue:Hs,useDeferredValue:function(e){var t=gs(e),n=t[0],r=t[1];return ws((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=gs(!1),t=e[0];return bs(e=Ts.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=is();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fs(r,e,t,n)},useOpaqueIdentifier:function(){if(Ba){var e=!1,t=function(e){return{$$typeof:I,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Yr++).toString(36))),Error(s(355))})),n=gs(t)[1];return 0==(2&Ja.mode)&&(Ja.flags|=516,ms(5,(function(){n("r:"+(Yr++).toString(36))}),void 0,null)),t}return gs(t="r:"+(Yr++).toString(36)),t},unstable_isNewReconciler:!1},Ps={readContext:sa,useCallback:Ss,useContext:sa,useEffect:ks,useImperativeHandle:Es,useLayoutEffect:zs,useMemo:Cs,useReducer:cs,useRef:vs,useState:function(){return cs(us)},useDebugValue:Hs,useDeferredValue:function(e){var t=cs(us),n=t[0],r=t[1];return ks((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=cs(us)[0];return[vs().current,e]},useMutableSource:hs,useOpaqueIdentifier:function(){return cs(us)[0]},unstable_isNewReconciler:!1},Os={readContext:sa,useCallback:Ss,useContext:sa,useEffect:ks,useImperativeHandle:Es,useLayoutEffect:zs,useMemo:Cs,useReducer:ds,useRef:vs,useState:function(){return ds(us)},useDebugValue:Hs,useDeferredValue:function(e){var t=ds(us),n=t[0],r=t[1];return ks((function(){var t=Xa.transition;Xa.transition=1;try{r(e)}finally{Xa.transition=t}}),[e]),n},useTransition:function(){var e=ds(us)[0];return[vs().current,e]},useMutableSource:hs,useOpaqueIdentifier:function(){return ds(us)[0]},unstable_isNewReconciler:!1},Is=w.ReactCurrentOwner,Rs=!1;function Ds(e,t,n,r){t.child=null===e?Sa(t,null,n,r):Ha(t,e.child,n,r)}function Ms(e,t,n,r,o){n=n.render;var a=t.ref;return aa(t,o),r=ss(e,t,n,r,a,o),null===e||Rs?(t.flags|=1,Ds(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,ai(e,t,o))}function Gs(e,t,n,r,o,a){if(null===e){var s=n.type;return"function"!=typeof s||Zl(s)||void 0!==s.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=ql(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=s,Fs(e,t,s,r,o,a))}return s=e.child,0==(o&a)&&(o=s.memoizedProps,(n=null!==(n=n.compare)?n:dr)(o,r)&&e.ref===t.ref)?ai(e,t,a):(t.flags|=1,(e=Vl(s,r)).ref=t.ref,e.return=t,t.child=e)}function Fs(e,t,n,r,o,a){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Rs=!1,0==(a&o))return t.lanes=e.lanes,ai(e,t,a);0!=(16384&e.flags)&&(Rs=!0)}return $s(e,t,n,r,a)}function Bs(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},kl(t,n);else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},kl(t,e),null;t.memoizedState={baseLanes:0},kl(t,null!==a?a.baseLanes:n)}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,kl(t,r);return Ds(e,t,o,n),t.child}function js(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function $s(e,t,n,r,o){var a=bo(n)?go:fo.current;return a=mo(t,a),aa(t,o),n=ss(e,t,n,r,a,o),null===e||Rs?(t.flags|=1,Ds(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~o,ai(e,t,o))}function Us(e,t,n,r,o){if(bo(n)){var a=!0;wo(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),wa(t,n,r,o),r=!0;else if(null===e){var s=t.stateNode,i=t.memoizedProps;s.props=i;var l=s.context,u=n.contextType;"object"==typeof u&&null!==u?u=sa(u):u=mo(t,u=bo(n)?go:fo.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof s.getSnapshotBeforeUpdate;d||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(i!==r||l!==u)&&xa(t,s,r,u),ia=!1;var p=t.memoizedState;s.state=p,fa(t,r,s,o),l=t.memoizedState,i!==r||p!==l||ho.current||ia?("function"==typeof c&&(ma(t,n,c,r),l=t.memoizedState),(i=ia||va(t,n,i,r,p,l,u))?(d||"function"!=typeof s.UNSAFE_componentWillMount&&"function"!=typeof s.componentWillMount||("function"==typeof s.componentWillMount&&s.componentWillMount(),"function"==typeof s.UNSAFE_componentWillMount&&s.UNSAFE_componentWillMount()),"function"==typeof s.componentDidMount&&(t.flags|=4)):("function"==typeof s.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=l),s.props=r,s.state=l,s.context=u,r=i):("function"==typeof s.componentDidMount&&(t.flags|=4),r=!1)}else{s=t.stateNode,ua(e,t),i=t.memoizedProps,u=t.type===t.elementType?i:Xo(t.type,i),s.props=u,d=t.pendingProps,p=s.context,"object"==typeof(l=n.contextType)&&null!==l?l=sa(l):l=mo(t,l=bo(n)?go:fo.current);var f=n.getDerivedStateFromProps;(c="function"==typeof f||"function"==typeof s.getSnapshotBeforeUpdate)||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(i!==d||p!==l)&&xa(t,s,r,l),ia=!1,p=t.memoizedState,s.state=p,fa(t,r,s,o);var h=t.memoizedState;i!==d||p!==h||ho.current||ia?("function"==typeof f&&(ma(t,n,f,r),h=t.memoizedState),(u=ia||va(t,n,u,r,p,h,l))?(c||"function"!=typeof s.UNSAFE_componentWillUpdate&&"function"!=typeof s.componentWillUpdate||("function"==typeof s.componentWillUpdate&&s.componentWillUpdate(r,h,l),"function"==typeof s.UNSAFE_componentWillUpdate&&s.UNSAFE_componentWillUpdate(r,h,l)),"function"==typeof s.componentDidUpdate&&(t.flags|=4),"function"==typeof s.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof s.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=h),s.props=r,s.state=h,s.context=l,r=u):("function"!=typeof s.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),r=!1)}return Zs(e,t,n,r,a,o)}function Zs(e,t,n,r,o,a){js(e,t);var s=0!=(64&t.flags);if(!r&&!s)return o&&ko(t,n,!1),ai(e,t,a);r=t.stateNode,Is.current=t;var i=s&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&s?(t.child=Ha(t,e.child,null,a),t.child=Ha(t,null,i,a)):Ds(e,t,i,a),t.memoizedState=r.state,o&&ko(t,n,!0),t.child}function Vs(e){var t=e.stateNode;t.pendingContext?yo(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yo(0,t.context,!1),Pa(e,t.containerInfo)}var qs,Ws,Ys,Ks,Xs={dehydrated:null,retryLane:0};function Qs(e,t,n){var r,o=t.pendingProps,a=Da.current,s=!1;return(r=0!=(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!=(2&a)),r?(s=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===o.fallback||!0===o.unstable_avoidThisFallback||(a|=1),co(Da,1&a),null===e?(void 0!==o.fallback&&Ua(t),e=o.children,a=o.fallback,s?(e=Js(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xs,e):"number"==typeof o.unstable_expectedLoadTime?(e=Js(t,e,a,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xs,t.lanes=33554432,e):((n=Yl({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,s?(o=ti(e,t,o.children,o.fallback,n),s=t.child,a=e.child.memoizedState,s.memoizedState=null===a?{baseLanes:n}:{baseLanes:a.baseLanes|n},s.childLanes=e.childLanes&~n,t.memoizedState=Xs,o):(n=ei(e,t,o.children,n),t.memoizedState=null,n))}function Js(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=Yl(t,o,0,null),n=Wl(n,o,r,null),a.return=e,n.return=e,a.sibling=n,e.child=a,n}function ei(e,t,n,r){var o=e.child;return e=o.sibling,n=Vl(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 ti(e,t,n,r,o){var a=t.mode,s=e.child;e=s.sibling;var i={mode:"hidden",children:n};return 0==(2&a)&&t.child!==s?((n=t.child).childLanes=0,n.pendingProps=i,null!==(s=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=s,s.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Vl(s,i),null!==e?r=Vl(e,r):(r=Wl(r,a,o,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function ni(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),oa(e.return,t)}function ri(e,t,n,r,o,a){var s=e.memoizedState;null===s?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o,lastEffect:a}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=r,s.tail=n,s.tailMode=o,s.lastEffect=a)}function oi(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Ds(e,t,r.children,n),0!=(2&(r=Da.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&&ni(e,n);else if(19===e.tag)ni(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(co(Da,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===Ma(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),ri(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===Ma(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}ri(t,!0,n,null,a,t.lastEffect);break;case"together":ri(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function ai(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Bi|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(s(153));if(null!==t.child){for(n=Vl(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Vl(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function si(e,t){if(!Ba)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 ii(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 Oa(),uo(ho),uo(fo),Ya(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Va(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Ws(t),null;case 5:Ra(t);var a=Na(Aa.current);if(n=t.type,null!==e&&null!=t.stateNode)Ys(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(s(166));return null}if(e=Na(Ta.current),Va(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[Xr]=t,r[Qr]=i,n){case"dialog":Tr("cancel",r),Tr("close",r);break;case"iframe":case"object":case"embed":Tr("load",r);break;case"video":case"audio":for(e=0;e<Er.length;e++)Tr(Er[e],r);break;case"source":Tr("error",r);break;case"img":case"image":case"link":Tr("error",r),Tr("load",r);break;case"details":Tr("toggle",r);break;case"input":ee(r,i),Tr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},Tr("invalid",r);break;case"textarea":le(r,i),Tr("invalid",r)}for(var u in ze(n,i),e=null,i)i.hasOwnProperty(u)&&(a=i[u],"children"===u?"string"==typeof a?r.textContent!==a&&(e=["children",a]):"number"==typeof a&&r.textContent!==""+a&&(e=["children",""+a]):l.hasOwnProperty(u)&&null!=a&&"onScroll"===u&&Tr("scroll",r));switch(n){case"input":K(r),re(r,i,!0);break;case"textarea":K(r),ce(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Gr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(u=9===a.nodeType?a:a.ownerDocument,e===de.html&&(e=pe(n)),e===de.html?"script"===n?((e=u.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),"select"===n&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Xr]=t,e[Qr]=r,qs(e,t,!1,!1),t.stateNode=e,u=_e(n,r),n){case"dialog":Tr("cancel",e),Tr("close",e),a=r;break;case"iframe":case"object":case"embed":Tr("load",e),a=r;break;case"video":case"audio":for(a=0;a<Er.length;a++)Tr(Er[a],e);a=r;break;case"source":Tr("error",e),a=r;break;case"img":case"image":case"link":Tr("error",e),Tr("load",e),a=r;break;case"details":Tr("toggle",e),a=r;break;case"input":ee(e,r),a=J(e,r),Tr("invalid",e);break;case"option":a=ae(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=o({},r,{value:void 0}),Tr("invalid",e);break;case"textarea":le(e,r),a=ie(e,r),Tr("invalid",e);break;default:a=r}ze(n,a);var c=a;for(i in c)if(c.hasOwnProperty(i)){var d=c[i];"style"===i?we(e,d):"dangerouslySetInnerHTML"===i?null!=(d=d?d.__html:void 0)&&me(e,d):"children"===i?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(l.hasOwnProperty(i)?null!=d&&"onScroll"===i&&Tr("scroll",e):null!=d&&x(e,i,d,u))}switch(n){case"input":K(e),re(e,r,!1);break;case"textarea":K(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?se(e,!!r.multiple,i,!1):null!=r.defaultValue&&se(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=Gr)}jr(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Ks(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(s(166));n=Na(Aa.current),Na(Ta.current),Va(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return uo(Da),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Va(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Da.current)?0===Mi&&(Mi=3):(0!==Mi&&3!==Mi||(Mi=4),null===Pi||0==(134217727&Bi)&&0==(134217727&ji)||vl(Pi,Ii))),(r||n)&&(t.flags|=4),null);case 4:return Oa(),Ws(t),null===e&&Ar(t.stateNode.containerInfo),null;case 10:return ra(t),null;case 19:if(uo(Da),null===(r=t.memoizedState))return null;if(i=0!=(64&t.flags),null===(u=r.rendering))if(i)si(r,!1);else{if(0!==Mi||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(u=Ma(e))){for(t.flags|=64,si(r,!1),null!==(i=u.updateQueue)&&(t.updateQueue=i,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=2,i.nextEffect=null,i.firstEffect=null,i.lastEffect=null,null===(u=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=u.childLanes,i.lanes=u.lanes,i.child=u.child,i.memoizedProps=u.memoizedProps,i.memoizedState=u.memoizedState,i.updateQueue=u.updateQueue,i.type=u.type,e=u.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return co(Da,1&Da.current|2),t.child}e=e.sibling}null!==r.tail&&$o()>Vi&&(t.flags|=64,i=!0,si(r,!1),t.lanes=33554432)}else{if(!i)if(null!==(e=Ma(u))){if(t.flags|=64,i=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),si(r,!0),null===r.tail&&"hidden"===r.tailMode&&!u.alternate&&!Ba)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*$o()-r.renderingStartTime>Vi&&1073741824!==n&&(t.flags|=64,i=!0,si(r,!1),t.lanes=33554432);r.isBackwards?(u.sibling=t.child,t.child=u):(null!==(n=r.last)?n.sibling=u:t.child=u,r.last=u)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=$o(),n.sibling=null,t=Da.current,co(Da,i?1&t|2:1&t),n):null;case 23:case 24:return zl(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(s(156,t.tag))}function li(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(Oa(),uo(ho),uo(fo),Ya(),0!=(64&(t=e.flags)))throw Error(s(285));return e.flags=-4097&t|64,e;case 5:return Ra(e),null;case 13:return uo(Da),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return uo(Da),null;case 4:return Oa(),null;case 10:return ra(e),null;case 23:case 24:return zl(),null;default:return null}}function ui(e,t){try{var n="",r=t;do{n+=V(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 ci(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qs=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}},Ws=function(){},Ys=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Na(Ta.current);var s,i=null;switch(n){case"input":a=J(e,a),r=J(e,r),i=[];break;case"option":a=ae(e,a),r=ae(e,r),i=[];break;case"select":a=o({},a,{value:void 0}),r=o({},r,{value:void 0}),i=[];break;case"textarea":a=ie(e,a),r=ie(e,r),i=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Gr)}for(d in ze(n,r),n=null,a)if(!r.hasOwnProperty(d)&&a.hasOwnProperty(d)&&null!=a[d])if("style"===d){var u=a[d];for(s in u)u.hasOwnProperty(s)&&(n||(n={}),n[s]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(l.hasOwnProperty(d)?i||(i=[]):(i=i||[]).push(d,null));for(d in r){var c=r[d];if(u=null!=a?a[d]:void 0,r.hasOwnProperty(d)&&c!==u&&(null!=c||null!=u))if("style"===d)if(u){for(s in u)!u.hasOwnProperty(s)||c&&c.hasOwnProperty(s)||(n||(n={}),n[s]="");for(s in c)c.hasOwnProperty(s)&&u[s]!==c[s]&&(n||(n={}),n[s]=c[s])}else n||(i||(i=[]),i.push(d,n)),n=c;else"dangerouslySetInnerHTML"===d?(c=c?c.__html:void 0,u=u?u.__html:void 0,null!=c&&u!==c&&(i=i||[]).push(d,c)):"children"===d?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(d,""+c):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(l.hasOwnProperty(d)?(null!=c&&"onScroll"===d&&Tr("scroll",e),i||u===c||(i=[])):"object"==typeof c&&null!==c&&c.$$typeof===I?c.toString():(i=i||[]).push(d,c))}n&&(i=i||[]).push("style",n);var d=i;(t.updateQueue=d)&&(t.flags|=4)}},Ks=function(e,t,n,r){n!==r&&(t.flags|=4)};var di="function"==typeof WeakMap?WeakMap:Map;function pi(e,t,n){(n=ca(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ki||(Ki=!0,Xi=r),ci(0,t)},n}function fi(e,t,n){(n=ca(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return ci(0,t),r(o)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Qi?Qi=new Set([this]):Qi.add(this),ci(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var hi="function"==typeof WeakSet?WeakSet:Set;function gi(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){Fl(e,n)}else t.current=null}function mi(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:Xo(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(s(163))}function bi(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)&&(Dl(n,e),Rl(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:Xo(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&ha(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}ha(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&jr(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&wt(n)))))}throw Error(s(163))}function vi(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=xe("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 yi(e,t){if(_o&&"function"==typeof _o.onCommitFiberUnmount)try{_o.onCommitFiberUnmount(zo,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))Dl(t,n);else{r=t;try{o()}catch(a){Fl(r,a)}}n=n.next}while(n!==e)}break;case 1:if(gi(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(a){Fl(t,a)}break;case 5:gi(t);break;case 4:Ei(e,t)}}function xi(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 wi(e){return 5===e.tag||3===e.tag||4===e.tag}function ki(e){e:{for(var t=e.return;null!==t;){if(wi(t))break e;t=t.return}throw Error(s(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(s(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||wi(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?zi(e,n,t):_i(e,n,t)}function zi(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=Gr));else if(4!==r&&null!==(e=e.child))for(zi(e,t,n),e=e.sibling;null!==e;)zi(e,t,n),e=e.sibling}function _i(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(_i(e,t,n),e=e.sibling;null!==e;)_i(e,t,n),e=e.sibling}function Ei(e,t){for(var n,r,o=t,a=!1;;){if(!a){a=o.return;e:for(;;){if(null===a)throw Error(s(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 i=e,l=o,u=l;;)if(yi(i,u),null!==u.child&&4!==u.tag)u.child.return=u,u=u.child;else{if(u===l)break e;for(;null===u.sibling;){if(null===u.return||u.return===l)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}r?(i=n,l=o.stateNode,8===i.nodeType?i.parentNode.removeChild(l):i.removeChild(l)):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(yi(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 Hi(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[Qr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),_e(e,o),t=_e(e,r),o=0;o<a.length;o+=2){var i=a[o],l=a[o+1];"style"===i?we(n,l):"dangerouslySetInnerHTML"===i?me(n,l):"children"===i?be(n,l):x(n,i,l,t)}switch(e){case"input":ne(n,r);break;case"textarea":ue(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(a=r.value)?se(n,!!r.multiple,a,!1):e!==!!r.multiple&&(null!=r.defaultValue?se(n,!!r.multiple,r.defaultValue,!0):se(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(s(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Zi=$o(),vi(t.child,!0)),void Si(t);case 19:return void Si(t);case 23:case 24:return void vi(t,null!==t.memoizedState)}throw Error(s(163))}function Si(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new hi),t.forEach((function(t){var r=jl.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Ci(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ti=Math.ceil,Li=w.ReactCurrentDispatcher,Ai=w.ReactCurrentOwner,Ni=0,Pi=null,Oi=null,Ii=0,Ri=0,Di=lo(0),Mi=0,Gi=null,Fi=0,Bi=0,ji=0,$i=0,Ui=null,Zi=0,Vi=1/0;function qi(){Vi=$o()+500}var Wi,Yi=null,Ki=!1,Xi=null,Qi=null,Ji=!1,el=null,tl=90,nl=[],rl=[],ol=null,al=0,sl=null,il=-1,ll=0,ul=0,cl=null,dl=!1;function pl(){return 0!=(48&Ni)?$o():-1!==il?il:il=$o()}function fl(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Uo()?1:2;if(0===ll&&(ll=Fi),0!==Ko.transition){0!==ul&&(ul=null!==Ui?Ui.pendingLanes:0),e=ll;var t=4186112&~ul;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Uo(),0!=(4&Ni)&&98===e?e=Gt(12,ll):e=Gt(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),ll),e}function hl(e,t,n){if(50<al)throw al=0,sl=null,Error(s(185));if(null===(e=gl(e,t)))return null;jt(e,t,n),e===Pi&&(ji|=t,4===Mi&&vl(e,Ii));var r=Uo();1===t?0!=(8&Ni)&&0==(48&Ni)?yl(e):(ml(e,n),0===Ni&&(qi(),Wo())):(0==(4&Ni)||98!==r&&99!==r||(null===ol?ol=new Set([e]):ol.add(e)),ml(e,n)),Ui=e}function gl(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 ml(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,o=e.pingedLanes,a=e.expirationTimes,i=e.pendingLanes;0<i;){var l=31-$t(i),u=1<<l,c=a[l];if(-1===c){if(0==(u&r)||0!=(u&o)){c=t,Rt(u);var d=It;a[l]=10<=d?c+250:6<=d?c+5e3:-1}}else c<=t&&(e.expiredLanes|=u);i&=~u}if(r=Dt(e,e===Pi?Ii:0),t=It,0===r)null!==n&&(n!==Do&&So(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Do&&So(n)}15===t?(n=yl.bind(null,e),null===Go?(Go=[n],Fo=Ho(No,Yo)):Go.push(n),n=Do):14===t?n=qo(99,yl.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(s(358,e))}}(t),n=qo(n,bl.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bl(e){if(il=-1,ul=ll=0,0!=(48&Ni))throw Error(s(327));var t=e.callbackNode;if(Il()&&e.callbackNode!==t)return null;var n=Dt(e,e===Pi?Ii:0);if(0===n)return null;var r=n,o=Ni;Ni|=16;var a=Hl();for(Pi===e&&Ii===r||(qi(),_l(e,r));;)try{Tl();break}catch(l){El(e,l)}if(na(),Li.current=a,Ni=o,null!==Oi?r=0:(Pi=null,Ii=0,r=Mi),0!=(Fi&ji))_l(e,0);else if(0!==r){if(2===r&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=Mt(e))&&(r=Sl(e,n))),1===r)throw t=Gi,_l(e,0),vl(e,n),ml(e,$o()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(s(345));case 2:case 5:Nl(e);break;case 3:if(vl(e,n),(62914560&n)===n&&10<(r=Zi+500-$o())){if(0!==Dt(e,0))break;if(((o=e.suspendedLanes)&n)!==n){pl(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=Ur(Nl.bind(null,e),r);break}Nl(e);break;case 4:if(vl(e,n),(4186112&n)===n)break;for(r=e.eventTimes,o=-1;0<n;){var i=31-$t(n);a=1<<i,(i=r[i])>o&&(o=i),n&=~a}if(n=o,10<(n=(120>(n=$o()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ti(n/1960))-n)){e.timeoutHandle=Ur(Nl.bind(null,e),n);break}Nl(e);break;default:throw Error(s(329))}}return ml(e,$o()),e.callbackNode===t?bl.bind(null,e):null}function vl(e,t){for(t&=~$i,t&=~ji,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-$t(t),r=1<<n;e[n]=-1,t&=~r}}function yl(e){if(0!=(48&Ni))throw Error(s(327));if(Il(),e===Pi&&0!=(e.expiredLanes&Ii)){var t=Ii,n=Sl(e,t);0!=(Fi&ji)&&(n=Sl(e,t=Dt(e,t)))}else n=Sl(e,t=Dt(e,0));if(0!==e.tag&&2===n&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=Mt(e))&&(n=Sl(e,t))),1===n)throw n=Gi,_l(e,0),vl(e,t),ml(e,$o()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Nl(e),ml(e,$o()),null}function xl(e,t){var n=Ni;Ni|=1;try{return e(t)}finally{0===(Ni=n)&&(qi(),Wo())}}function wl(e,t){var n=Ni;Ni&=-2,Ni|=8;try{return e(t)}finally{0===(Ni=n)&&(qi(),Wo())}}function kl(e,t){co(Di,Ri),Ri|=t,Fi|=t}function zl(){Ri=Di.current,uo(Di)}function _l(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Zr(n)),null!==Oi)for(n=Oi.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&vo();break;case 3:Oa(),uo(ho),uo(fo),Ya();break;case 5:Ra(r);break;case 4:Oa();break;case 13:case 19:uo(Da);break;case 10:ra(r);break;case 23:case 24:zl()}n=n.return}Pi=e,Oi=Vl(e.current,null),Ii=Ri=Fi=t,Mi=0,Gi=null,$i=ji=Bi=0}function El(e,t){for(;;){var n=Oi;try{if(na(),Ka.current=As,ns){for(var r=Ja.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ns=!1}if(Qa=0,ts=es=Ja=null,rs=!1,Ai.current=null,null===n||null===n.return){Mi=1,Gi=t,Oi=null;break}e:{var a=e,s=n.return,i=n,l=t;if(t=Ii,i.flags|=2048,i.firstEffect=i.lastEffect=null,null!==l&&"object"==typeof l&&"function"==typeof l.then){var u=l;if(0==(2&i.mode)){var c=i.alternate;c?(i.updateQueue=c.updateQueue,i.memoizedState=c.memoizedState,i.lanes=c.lanes):(i.updateQueue=null,i.memoizedState=null)}var d=0!=(1&Da.current),p=s;do{var f;if(f=13===p.tag){var h=p.memoizedState;if(null!==h)f=null!==h.dehydrated;else{var g=p.memoizedProps;f=void 0!==g.fallback&&(!0!==g.unstable_avoidThisFallback||!d)}}if(f){var m=p.updateQueue;if(null===m){var b=new Set;b.add(u),p.updateQueue=b}else m.add(u);if(0==(2&p.mode)){if(p.flags|=64,i.flags|=16384,i.flags&=-2981,1===i.tag)if(null===i.alternate)i.tag=17;else{var v=ca(-1,1);v.tag=2,da(i,v)}i.lanes|=1;break e}l=void 0,i=t;var y=a.pingCache;if(null===y?(y=a.pingCache=new di,l=new Set,y.set(u,l)):void 0===(l=y.get(u))&&(l=new Set,y.set(u,l)),!l.has(i)){l.add(i);var x=Bl.bind(null,a,u,i);u.then(x,x)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);l=Error((q(i.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!==Mi&&(Mi=2),l=ui(l,i),p=s;do{switch(p.tag){case 3:a=l,p.flags|=4096,t&=-t,p.lanes|=t,pa(p,pi(0,a,t));break e;case 1:a=l;var w=p.type,k=p.stateNode;if(0==(64&p.flags)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Qi||!Qi.has(k)))){p.flags|=4096,t&=-t,p.lanes|=t,pa(p,fi(p,a,t));break e}}p=p.return}while(null!==p)}Al(n)}catch(z){t=z,Oi===n&&null!==n&&(Oi=n=n.return);continue}break}}function Hl(){var e=Li.current;return Li.current=As,null===e?As:e}function Sl(e,t){var n=Ni;Ni|=16;var r=Hl();for(Pi===e&&Ii===t||_l(e,t);;)try{Cl();break}catch(o){El(e,o)}if(na(),Ni=n,Li.current=r,null!==Oi)throw Error(s(261));return Pi=null,Ii=0,Mi}function Cl(){for(;null!==Oi;)Ll(Oi)}function Tl(){for(;null!==Oi&&!Co();)Ll(Oi)}function Ll(e){var t=Wi(e.alternate,e,Ri);e.memoizedProps=e.pendingProps,null===t?Al(e):Oi=t,Ai.current=null}function Al(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ii(n,t,Ri)))return void(Oi=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ri)||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=li(t)))return n.flags&=2047,void(Oi=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Oi=t);Oi=t=e}while(null!==t);0===Mi&&(Mi=5)}function Nl(e){var t=Uo();return Vo(99,Pl.bind(null,e,t)),null}function Pl(e,t){do{Il()}while(null!==el);if(0!=(48&Ni))throw Error(s(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(s(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 i=e.eventTimes,l=e.expirationTimes;0<a;){var u=31-$t(a),c=1<<u;o[u]=0,i[u]=-1,l[u]=-1,a&=~c}if(null!==ol&&0==(24&r)&&ol.has(e)&&ol.delete(e),e===Pi&&(Oi=Pi=null,Ii=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(o=Ni,Ni|=32,Ai.current=null,Fr=Wt,mr(i=gr())){if("selectionStart"in i)l={start:i.selectionStart,end:i.selectionEnd};else e:if(l=(l=i.ownerDocument)&&l.defaultView||window,(c=l.getSelection&&l.getSelection())&&0!==c.rangeCount){l=c.anchorNode,a=c.anchorOffset,u=c.focusNode,c=c.focusOffset;try{l.nodeType,u.nodeType}catch(H){l=null;break e}var d=0,p=-1,f=-1,h=0,g=0,m=i,b=null;t:for(;;){for(var v;m!==l||0!==a&&3!==m.nodeType||(p=d+a),m!==u||0!==c&&3!==m.nodeType||(f=d+c),3===m.nodeType&&(d+=m.nodeValue.length),null!==(v=m.firstChild);)b=m,m=v;for(;;){if(m===i)break t;if(b===l&&++h===a&&(p=d),b===u&&++g===c&&(f=d),null!==(v=m.nextSibling))break;b=(m=b).parentNode}m=v}l=-1===p||-1===f?null:{start:p,end:f}}else l=null;l=l||{start:0,end:0}}else l=null;Br={focusedElem:i,selectionRange:l},Wt=!1,cl=null,dl=!1,Yi=r;do{try{Ol()}catch(H){if(null===Yi)throw Error(s(330));Fl(Yi,H),Yi=Yi.nextEffect}}while(null!==Yi);cl=null,Yi=r;do{try{for(i=e;null!==Yi;){var y=Yi.flags;if(16&y&&be(Yi.stateNode,""),128&y){var x=Yi.alternate;if(null!==x){var w=x.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:ki(Yi),Yi.flags&=-3;break;case 6:ki(Yi),Yi.flags&=-3,Hi(Yi.alternate,Yi);break;case 1024:Yi.flags&=-1025;break;case 1028:Yi.flags&=-1025,Hi(Yi.alternate,Yi);break;case 4:Hi(Yi.alternate,Yi);break;case 8:Ei(i,l=Yi);var k=l.alternate;xi(l),null!==k&&xi(k)}Yi=Yi.nextEffect}}catch(H){if(null===Yi)throw Error(s(330));Fl(Yi,H),Yi=Yi.nextEffect}}while(null!==Yi);if(w=Br,x=gr(),y=w.focusedElem,i=w.selectionRange,x!==y&&y&&y.ownerDocument&&hr(y.ownerDocument.documentElement,y)){null!==i&&mr(y)&&(x=i.start,void 0===(w=i.end)&&(w=x),"selectionStart"in y?(y.selectionStart=x,y.selectionEnd=Math.min(w,y.value.length)):(w=(x=y.ownerDocument||document)&&x.defaultView||window).getSelection&&(w=w.getSelection(),l=y.textContent.length,k=Math.min(i.start,l),i=void 0===i.end?k:Math.min(i.end,l),!w.extend&&k>i&&(l=i,i=k,k=l),l=fr(y,k),a=fr(y,i),l&&a&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==a.node||w.focusOffset!==a.offset)&&((x=x.createRange()).setStart(l.node,l.offset),w.removeAllRanges(),k>i?(w.addRange(x),w.extend(a.node,a.offset)):(x.setEnd(a.node,a.offset),w.addRange(x))))),x=[];for(w=y;w=w.parentNode;)1===w.nodeType&&x.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<x.length;y++)(w=x[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Wt=!!Fr,Br=Fr=null,e.current=n,Yi=r;do{try{for(y=e;null!==Yi;){var z=Yi.flags;if(36&z&&bi(y,Yi.alternate,Yi),128&z){x=void 0;var _=Yi.ref;if(null!==_){var E=Yi.stateNode;Yi.tag,x=E,"function"==typeof _?_(x):_.current=x}}Yi=Yi.nextEffect}}catch(H){if(null===Yi)throw Error(s(330));Fl(Yi,H),Yi=Yi.nextEffect}}while(null!==Yi);Yi=null,Mo(),Ni=o}else e.current=n;if(Ji)Ji=!1,el=e,tl=t;else for(Yi=r;null!==Yi;)t=Yi.nextEffect,Yi.nextEffect=null,8&Yi.flags&&((z=Yi).sibling=null,z.stateNode=null),Yi=t;if(0===(r=e.pendingLanes)&&(Qi=null),1===r?e===sl?al++:(al=0,sl=e):al=0,n=n.stateNode,_o&&"function"==typeof _o.onCommitFiberRoot)try{_o.onCommitFiberRoot(zo,n,void 0,64==(64&n.current.flags))}catch(H){}if(ml(e,$o()),Ki)throw Ki=!1,e=Xi,Xi=null,e;return 0!=(8&Ni)||Wo(),null}function Ol(){for(;null!==Yi;){var e=Yi.alternate;dl||null===cl||(0!=(8&Yi.flags)?Je(Yi,cl)&&(dl=!0):13===Yi.tag&&Ci(e,Yi)&&Je(Yi,cl)&&(dl=!0));var t=Yi.flags;0!=(256&t)&&mi(e,Yi),0==(512&t)||Ji||(Ji=!0,qo(97,(function(){return Il(),null}))),Yi=Yi.nextEffect}}function Il(){if(90!==tl){var e=97<tl?97:tl;return tl=90,Vo(e,Ml)}return!1}function Rl(e,t){nl.push(t,e),Ji||(Ji=!0,qo(97,(function(){return Il(),null})))}function Dl(e,t){rl.push(t,e),Ji||(Ji=!0,qo(97,(function(){return Il(),null})))}function Ml(){if(null===el)return!1;var e=el;if(el=null,0!=(48&Ni))throw Error(s(331));var t=Ni;Ni|=32;var n=rl;rl=[];for(var r=0;r<n.length;r+=2){var o=n[r],a=n[r+1],i=o.destroy;if(o.destroy=void 0,"function"==typeof i)try{i()}catch(u){if(null===a)throw Error(s(330));Fl(a,u)}}for(n=nl,nl=[],r=0;r<n.length;r+=2){o=n[r],a=n[r+1];try{var l=o.create;o.destroy=l()}catch(u){if(null===a)throw Error(s(330));Fl(a,u)}}for(l=e.current.firstEffect;null!==l;)e=l.nextEffect,l.nextEffect=null,8&l.flags&&(l.sibling=null,l.stateNode=null),l=e;return Ni=t,Wo(),!0}function Gl(e,t,n){da(e,t=pi(0,t=ui(n,t),1)),t=pl(),null!==(e=gl(e,1))&&(jt(e,1,t),ml(e,t))}function Fl(e,t){if(3===e.tag)Gl(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Gl(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Qi||!Qi.has(r))){var o=fi(n,e=ui(t,e),1);if(da(n,o),o=pl(),null!==(n=gl(n,1)))jt(n,1,o),ml(n,o);else if("function"==typeof r.componentDidCatch&&(null===Qi||!Qi.has(r)))try{r.componentDidCatch(t,e)}catch(a){}break}}n=n.return}}function Bl(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=pl(),e.pingedLanes|=e.suspendedLanes&n,Pi===e&&(Ii&n)===n&&(4===Mi||3===Mi&&(62914560&Ii)===Ii&&500>$o()-Zi?_l(e,0):$i|=n),ml(e,t)}function jl(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===Uo()?1:2:(0===ll&&(ll=Fi),0===(t=Ft(62914560&~ll))&&(t=4194304))),n=pl(),null!==(e=gl(e,t))&&(jt(e,t,n),ml(e,n))}function $l(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 Ul(e,t,n,r){return new $l(e,t,n,r)}function Zl(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vl(e,t){var n=e.alternate;return null===n?((n=Ul(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 ql(e,t,n,r,o,a){var i=2;if(r=e,"function"==typeof e)Zl(e)&&(i=1);else if("string"==typeof e)i=5;else e:switch(e){case _:return Wl(n.children,o,a,t);case R:i=8,o|=16;break;case E:i=8,o|=1;break;case H:return(e=Ul(12,n,t,8|o)).elementType=H,e.type=H,e.lanes=a,e;case L:return(e=Ul(13,n,t,o)).type=L,e.elementType=L,e.lanes=a,e;case A:return(e=Ul(19,n,t,o)).elementType=A,e.lanes=a,e;case D:return Yl(n,o,a,t);case M:return(e=Ul(24,n,t,o)).elementType=M,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case S:i=10;break e;case C:i=9;break e;case T:i=11;break e;case N:i=14;break e;case P:i=16,r=null;break e;case O:i=22;break e}throw Error(s(130,null==e?e:typeof e,""))}return(t=Ul(i,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Wl(e,t,n,r){return(e=Ul(7,e,r,t)).lanes=n,e}function Yl(e,t,n,r){return(e=Ul(23,e,r,t)).elementType=D,e.lanes=n,e}function Kl(e,t,n){return(e=Ul(6,e,null,t)).lanes=n,e}function Xl(e,t,n){return(t=Ul(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ql(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=Bt(0),this.expirationTimes=Bt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bt(0),this.mutableSourceEagerHydrationData=null}function Jl(e,t,n,r){var o=t.current,a=pl(),i=fl(o);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(s(170));var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(bo(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}l=l.return}while(null!==l);throw Error(s(171))}if(1===n.tag){var u=n.type;if(bo(u)){n=xo(n,u,l);break e}}n=l}else n=po;return null===t.context?t.context=n:t.pendingContext=n,(t=ca(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),da(o,t),hl(o,i,a),i}function eu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nu(e,t){tu(e,t),(e=e.alternate)&&tu(e,t)}function ru(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Ql(e,t,null!=n&&!0===n.hydrate),t=Ul(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,la(t),e[Jr]=n.current,Ar(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 ou(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function au(e,t,n,r,o){var a=n._reactRootContainer;if(a){var s=a._internalRoot;if("function"==typeof o){var i=o;o=function(){var e=eu(s);i.call(e)}}Jl(t,s,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 ru(e,0,t?{hydrate:!0}:void 0)}(n,r),s=a._internalRoot,"function"==typeof o){var l=o;o=function(){var e=eu(s);l.call(e)}}wl((function(){Jl(t,s,e,o)}))}return eu(s)}function su(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ou(t))throw Error(s(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:z,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Wi=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||ho.current)Rs=!0;else{if(0==(n&r)){switch(Rs=!1,t.tag){case 3:Vs(t),qa();break;case 5:Ia(t);break;case 1:bo(t.type)&&wo(t);break;case 4:Pa(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var o=t.type._context;co(Qo,o._currentValue),o._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Qs(e,t,n):(co(Da,1&Da.current),null!==(t=ai(e,t,n))?t.sibling:null);co(Da,1&Da.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return oi(e,t,n);t.flags|=64}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),co(Da,Da.current),r)break;return null;case 23:case 24:return t.lanes=0,Bs(e,t,n)}return ai(e,t,n)}Rs=0!=(16384&e.flags)}else Rs=!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=mo(t,fo.current),aa(t,n),o=ss(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;wo(t)}else a=!1;t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,la(t);var i=r.getDerivedStateFromProps;"function"==typeof i&&ma(t,r,i,e),o.updater=ba,t.stateNode=o,o._reactInternals=t,wa(t,r,e,n),t=Zs(null,t,r,!0,a,n)}else t.tag=0,Ds(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 Zl(e)?1:0;if(null!=e){if((e=e.$$typeof)===T)return 11;if(e===N)return 14}return 2}(o),e=Xo(o,e),a){case 0:t=$s(null,t,o,e,n);break e;case 1:t=Us(null,t,o,e,n);break e;case 11:t=Ms(null,t,o,e,n);break e;case 14:t=Gs(null,t,o,Xo(o.type,e),r,n);break e}throw Error(s(306,o,""))}return t;case 0:return r=t.type,o=t.pendingProps,$s(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 1:return r=t.type,o=t.pendingProps,Us(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 3:if(Vs(t),r=t.updateQueue,null===e||null===r)throw Error(s(282));if(r=t.pendingProps,o=null!==(o=t.memoizedState)?o.element:null,ua(e,t),fa(t,r,null,n),(r=t.memoizedState.element)===o)qa(),t=ai(e,t,n);else{if((a=(o=t.stateNode).hydrate)&&(Fa=qr(t.stateNode.containerInfo.firstChild),Ga=t,a=Ba=!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=Sa(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Ds(e,t,r,n),qa();t=t.child}return t;case 5:return Ia(t),null===e&&Ua(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,i=o.children,$r(r,o)?i=null:null!==a&&$r(r,a)&&(t.flags|=16),js(e,t),Ds(e,t,i,n),t.child;case 6:return null===e&&Ua(t),null;case 13:return Qs(e,t,n);case 4:return Pa(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ha(t,null,r,n):Ds(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Ms(e,t,r,o=t.elementType===r?o:Xo(r,o),n);case 7:return Ds(e,t,t.pendingProps,n),t.child;case 8:case 12:return Ds(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,o=t.pendingProps,i=t.memoizedProps,a=o.value;var l=t.type._context;if(co(Qo,l._currentValue),l._currentValue=a,null!==i)if(l=i.value,0===(a=ur(l,a)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,a):1073741823))){if(i.children===o.children&&!ho.current){t=ai(e,t,n);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){var u=l.dependencies;if(null!==u){i=l.child;for(var c=u.firstContext;null!==c;){if(c.context===r&&0!=(c.observedBits&a)){1===l.tag&&((c=ca(-1,n&-n)).tag=2,da(l,c)),l.lanes|=n,null!==(c=l.alternate)&&(c.lanes|=n),oa(l.return,n),u.lanes|=n;break}c=c.next}}else i=10===l.tag&&l.type===t.type?null:l.child;if(null!==i)i.return=l;else for(i=l;null!==i;){if(i===t){i=null;break}if(null!==(l=i.sibling)){l.return=i.return,i=l;break}i=i.return}l=i}Ds(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=sa(o,a.unstable_observedBits)),t.flags|=1,Ds(e,t,r,n),t.child;case 14:return a=Xo(o=t.type,t.pendingProps),Gs(e,t,o,a=Xo(o.type,a),r,n);case 15:return Fs(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:Xo(r,o),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,bo(r)?(e=!0,wo(t)):e=!1,aa(t,n),ya(t,r,o),wa(t,r,o,n),Zs(null,t,r,!0,e,n);case 19:return oi(e,t,n);case 23:case 24:return Bs(e,t,n)}throw Error(s(156,t.tag))},ru.prototype.render=function(e){Jl(e,this._internalRoot,null,null)},ru.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jl(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(hl(e,4,pl()),nu(e,4))},tt=function(e){13===e.tag&&(hl(e,67108864,pl()),nu(e,67108864))},nt=function(e){if(13===e.tag){var t=pl(),n=fl(e);hl(e,n,t),nu(e,n)}},rt=function(e,t){return t()},He=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(s(90));X(r),ne(r,o)}}}break;case"textarea":ue(e,n);break;case"select":null!=(t=n.value)&&se(e,!!n.multiple,t,!1)}},Ne=xl,Pe=function(e,t,n,r,o){var a=Ni;Ni|=4;try{return Vo(98,e.bind(null,t,n,r,o))}finally{0===(Ni=a)&&(qi(),Wo())}},Oe=function(){0==(49&Ni)&&(function(){if(null!==ol){var e=ol;ol=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,ml(e,$o())}))}Wo()}(),Il())},Ie=function(e,t){var n=Ni;Ni|=2;try{return e(t)}finally{0===(Ni=n)&&(qi(),Wo())}};var iu={Events:[no,ro,oo,Le,Ae,Il,{current:!1}]},lu={findFiberByHostInstance:to,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},uu={bundleType:lu.bundleType,version:lu.version,rendererPackageName:lu.rendererPackageName,rendererConfig:lu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Qe(e))?null:e.stateNode},findFiberByHostInstance:lu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cu=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cu.isDisabled&&cu.supportsFiber)try{zo=cu.inject(uu),_o=cu}catch(ge){}}t.hydrate=function(e,t,n){if(!ou(t))throw Error(s(200));return au(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,s){if(e===s)return!0;if(e&&s&&"object"==typeof e&&"object"==typeof s){if(e.constructor!==s.constructor)return!1;var i,l,u,c;if(Array.isArray(e)){if((i=e.length)!=s.length)return!1;for(l=i;0!=l--;)if(!a(e[l],s[l]))return!1;return!0}if(n&&e instanceof Map&&s instanceof Map){if(e.size!==s.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!s.has(l.value[0]))return!1;for(c=e.entries();!(l=c.next()).done;)if(!a(l.value[1],s.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&s instanceof Set){if(e.size!==s.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!s.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(s)){if((i=e.length)!=s.length)return!1;for(l=i;0!=l--;)if(e[l]!==s[l])return!1;return!0}if(e.constructor===RegExp)return e.source===s.source&&e.flags===s.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof s.valueOf)return e.valueOf()===s.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof s.toString)return e.toString()===s.toString();if((i=(u=Object.keys(e)).length)!==Object.keys(s).length)return!1;for(l=i;0!=l--;)if(!Object.prototype.hasOwnProperty.call(s,u[l]))return!1;if(t&&e instanceof Element)return!1;for(l=i;0!=l--;)if(("_owner"!==u[l]&&"__v"!==u[l]&&"__o"!==u[l]||!e.$$typeof)&&!a(e[u[l]],s[u[l]]))return!1;return!0}return e!=e&&s!=s}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:()=>Z,ql:()=>J});var r=n(7294),o=n(5697),a=n.n(o),s=n(9590),i=n.n(s),l=n(1143),u=n.n(l),c=n(6774),d=n.n(c);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,h(e,t)}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function g(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 m={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(m).map((function(e){return m[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}),{}),z=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=z(e,m.TITLE),n=z(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=z(e,"defaultTitle");return t||r||void 0},E=function(e){return z(e,"onChangeClientState")||function(){}},H=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)}),{})},S=function(e,t){return t.filter((function(e){return void 0!==e[m.BASE]})).map((function(e){return e[m.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}),[])},C=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),s=0;s<a.length;s+=1){var i=a[s],l=i.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(i)||"innerHTML"!==i&&"cssText"!==i&&"itemprop"!==i||(n=i)}if(!n||!e[n])return!1;var u=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][u]&&(o[n][u]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),s=0;s<a.length;s+=1){var i=a[s],l=p({},r[i],o[i]);r[i]=l}return e}),[]).reverse()},T=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},L=function(e){return Array.isArray(e)?e.join(""):e},A=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=[m.NOSCRIPT,m.SCRIPT,m.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,"'")},I=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}),"")},R=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},D=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)}))},M=function(e,t,n){switch(e){case m.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=R(n,o),[r.createElement(m.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=I(n),a=L(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 R(t)},toString:function(){return I(t)}};default:return{toComponent:function(){return D(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||"",s=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(s?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},G=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,s=e.styleTags,i=e.title,l=void 0===i?"":i,u=e.titleAttributes,c=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var h=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=A(e.metaTags,y),a=A(t,b),s=A(n,v);return{priorityMethods:{toComponent:function(){return[].concat(D(m.META,o.priority),D(m.LINK,a.priority),D(m.SCRIPT,s.priority))},toString:function(){return M(m.META,o.priority,r)+" "+M(m.LINK,a.priority,r)+" "+M(m.SCRIPT,s.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:s.default}}(e);f=h.priorityMethods,c=h.linkTags,d=h.metaTags,p=h.scriptTags}return{priority:f,base:M(m.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",o,r),link:M(m.LINK,c,r),meta:M(m.META,d,r),noscript:M(m.NOSCRIPT,a,r),script:M(m.SCRIPT,p,r),style:M(m.STYLE,s,r),title:M(m.TITLE,{title:l,titleAttributes:u},r)}},F=[],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?F:n.instances},add:function(e){(n.canUseDOM?F:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?F:n.instances).indexOf(e);(n.canUseDOM?F:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=G({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},j=r.createContext({}),$=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),U="undefined"!=typeof document,Z=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new B(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(j.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);Z.canUseDOM=U,Z.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},Z.defaultProps={context:{}},Z.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(m.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),s=[];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):s.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),s.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:s}},q=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),s=Object.keys(t),i=0;i<s.length;i+=1){var l=s[i],u=t[l]||"";n.getAttribute(l)!==u&&n.setAttribute(l,u),-1===o.indexOf(l)&&o.push(l);var c=a.indexOf(l);-1!==c&&a.splice(c,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")!==s.join(",")&&n.setAttribute("data-rh",s.join(","))}},W=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,s=e.noscriptTags,i=e.onChangeClientState,l=e.scriptTags,u=e.styleTags,c=e.title,d=e.titleAttributes;q(m.BODY,e.bodyAttributes),q(m.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=L(e)),q(m.TITLE,t)}(c,d);var p={baseTag:V(m.BASE,n),linkTags:V(m.LINK,o),metaTags:V(m.META,a),noscriptTags:V(m.NOSCRIPT,s),scriptTags:V(m.SCRIPT,l),styleTags:V(m.STYLE,u)},f={},h={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(h[e]=p[e].oldTags)})),t&&t(),i(e,f,h)},Y=null,K=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:S(["href"],e),bodyAttributes:H("bodyAttributes",e),defer:z(e,"defer"),encode:z(e,"encodeSpecialCharacters"),htmlAttributes:H("htmlAttributes",e),linkTags:C(m.LINK,["rel","href"],e),metaTags:C(m.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:C(m.NOSCRIPT,["innerHTML"],e),onChangeClientState:E(e),scriptTags:C(m.SCRIPT,["src","innerHTML"],e),styleTags:C(m.STYLE,["cssText"],e),title:_(e),titleAttributes:H("titleAttributes",e),prioritizeSeoTags:T(e,"prioritizeSeoTags")});Z.canUseDOM?(t=a,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){W(t,(function(){Y=null}))})):(W(t),Y=null)):G&&(o=G(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);K.propTypes={context:$.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Q=["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!i()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case m.SCRIPT:case m.NOSCRIPT:return{innerHTML:t};case m.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,s=e.nestedChildren;switch(r.type){case m.TITLE:return p({},o,((t={})[r.type]=s,t.titleAttributes=p({},a),t));case m.BODY:return p({},o,{bodyAttributes:p({},a)});case m.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 u()(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."),u()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,s=g(r,X),i=Object.keys(s).reduce((function(e,t){return e[k[t]||t]=s[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case m.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case m.LINK:case m.META:case m.NOSCRIPT:case m.SCRIPT:case m.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:i,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,Q),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof B||(a=new B(a.context,a.instances)),a?r.createElement(K,p({},o,{context:a.value,helmetData:void 0})):r.createElement(j.Consumer,null,(function(e){return r.createElement(K,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,s=n?Symbol.for("react.strict_mode"):60108,i=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,h=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,m=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 c:case d:case a:case i:case s:case f:return e;default:switch(e=e&&e.$$typeof){case u:case p:case m:case g:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=m,t.Memo=g,t.Portal=o,t.Profiler=i,t.StrictMode=s,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===u},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)===m},t.isMemo=function(e){return w(e)===g},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===i},t.isStrictMode=function(e){return w(e)===s},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===i||e===s||e===f||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===g||e.$$typeof===l||e.$$typeof===u||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},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 s(){return s=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},s.apply(this,arguments)}var i=n(7294),l=n(5697),u=[],c=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function 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 i.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function h(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var h=s({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),g=null;function m(){return g||(g=e(h.loader)),g.promise}return u.push(m),"function"==typeof h.webpack&&c.push((function(){if((0,h.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return m()})),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}),g=e(h.loader),r._loadModule()})),m(),r.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.loaded},r}r(n,t),n.preload=function(){return m()};var s=n.prototype;return s.UNSAFE_componentWillMount=function(){this._loadModule()},s.componentDidMount=function(){this._mounted=!0},s._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(h.modules)&&h.modules.forEach((function(t){e.context.loadable.report(t)})),g.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof h.delay&&(0===h.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),h.delay)),"number"==typeof h.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),h.timeout));var n=function(){t({error:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},s.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},s._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},s.render=function(){return this.state.loading||this.state.error?i.createElement(h.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?h.render(this.state.loaded,this.props):null},n}(i.Component),a(d,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),p}function g(e){return h(d,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return h(p,e)};var m=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 i.Children.only(this.props.children)},t}(i.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(m,"propTypes",{report:l.func.isRequired}),a(m,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),g.Capture=m,g.preloadAll=function(){return new Promise((function(e,t){b(u).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=g},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>i,f:()=>s});var r=n(6550),o=n(7462),a=n(7294);function s(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&&s(e.routes,t,n)),o})),n}function i(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:()=>c,rU:()=>m});var r=n(6550),o=n(5068),a=n(7294),s=n(9318),i=n(7462),l=n(3366),u=n(8776),c=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,s.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,s.ob)(e,null,null,t):e},f=function(e){return e},h=a.forwardRef;void 0===h&&(h=f);var g=h((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,s=(0,l.Z)(e,["innerRef","navigate","onClick"]),u=s.target,c=(0,i.Z)({},s,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||u&&"_self"!==u||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=f!==h&&t||n,a.createElement("a",c)}));var m=h((function(e,t){var n=e.component,o=void 0===n?g:n,c=e.replace,m=e.to,b=e.innerRef,v=(0,l.Z)(e,["component","replace","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,u.Z)(!1);var n=e.history,r=p(d(m,e.location),e.location),l=r?n.createHref(r):"",g=(0,i.Z)({},v,{href:l,navigate:function(){var t=d(m,e.location),r=(0,s.Ep)(e.location)===(0,s.Ep)(p(t));(c||r?n.replace:n.push)(t)}});return f!==h?g.ref=t||b:g.innerRef=b,a.createElement(o,g)}))})),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,s=e.activeClassName,c=void 0===s?"active":s,f=e.activeStyle,h=e.className,g=e.exact,y=e.isActive,x=e.location,w=e.sensitive,k=e.strict,z=e.style,_=e.to,E=e.innerRef,H=(0,l.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,u.Z)(!1);var n=x||e.location,s=p(d(_,n),n),l=s.pathname,S=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),C=S?(0,r.LX)(n.pathname,{path:S,exact:g,sensitive:w,strict:k}):null,T=!!(y?y(C,n):C),L="function"==typeof h?h(T):h,A="function"==typeof z?z(T):z;T&&(L=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(" ")}(L,c),A=(0,i.Z)({},A,f));var N=(0,i.Z)({"aria-current":T&&o||null,className:L,style:A,to:s},H);return b!==v?N.ref=t||E:N.innerRef=E,a.createElement(m,N)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>_,F0:()=>y,LX:()=>z,TH:()=>P,k6:()=>N,rs:()=>L,s6:()=>v});var r=n(5068),o=n(7294),a=n(5697),s=n.n(a),i=n(9318),l=n(8776),u=n(7462),c=n(9658),d=n.n(c),p=(n(9864),n(3366)),f=(n(8679),1073741823),h="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var g=o.createContext||function(e,t){var n,a,i="__create-react-context-"+function(){var e="__global_unique_id__";return h[e]=(h[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];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={})[i]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(s=o)?0!==a||1/a==1/s:a!=a&&s!=s)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,s},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[i]=s().object.isRequired,n);var u=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[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},o.getValue=function(){return this.context[i]?this.context[i].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 u.contextTypes=((a={})[i]=s().object,a),{Provider:l,Consumer:u}},m=function(e){var t=g();return t.displayName=e,t},b=m("Router-History"),v=m("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 x={},w=1e4,k=0;function z(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,s=n.strict,i=void 0!==s&&s,l=n.sensitive,u=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:i,sensitive:u}),o=r.regexp,s=r.keys,l=o.exec(e);if(!l)return null;var c=l[0],p=l.slice(1),f=e===c;return a&&!f?null:{path:n,url:"/"===n&&""===c?"/":c,isExact:f,params:s.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.Z)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,l.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?z(n.pathname,e.props):t.match,a=(0,u.Z)({},t,{location:n,match:r}),s=e.props,i=s.children,c=s.component,d=s.render;return Array.isArray(i)&&function(e){return 0===o.Children.count(e)}(i)&&(i=null),o.createElement(v.Provider,{value:a},a.match?i?"function"==typeof i?i(a):i:c?o.createElement(c,a):d?d(a):null:"function"==typeof i?i(a):null)}))},t}(o.Component);function E(e){return"/"===e.charAt(0)?e:"/"+e}function H(e,t){if(!e)return t;var n=E(e);return 0!==t.pathname.indexOf(n)?t:(0,u.Z)({},t,{pathname:t.pathname.substr(n.length)})}function S(e){return"string"==typeof e?e:(0,i.Ep)(e)}function C(e){return function(){(0,l.Z)(!1)}}function T(){}o.Component;var L=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,l.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 s=e.props.path||e.props.from;r=s?z(a.pathname,(0,u.Z)({},e.props,{path:s})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var A=o.useContext;function N(){return A(b)}function P(){return A(v).location}},9658:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return i(a(e,t),t)},e.exports.tokensToFunction=i,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,s=0,i="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(i+=e.slice(s,f),s=f+d.length,p)i+=p[1];else{var h=e[s],g=n[2],m=n[3],b=n[4],v=n[5],y=n[6],x=n[7];i&&(r.push(i),i="");var w=null!=g&&null!=h&&h!==g,k="+"===y||"*"===y,z="?"===y||"*"===y,_=n[2]||c,E=b||v;r.push({name:m||a++,prefix:g||"",delimiter:_,optional:z,repeat:k,partial:w,asterisk:!!x,pattern:E?u(E):x?".*":"[^"+l(_)+"]+?"})}}return s<e.length&&(i+=e.substr(s)),i&&r.push(i),r}function s(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function i(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="",i=t||{},l=(o||{}).pretty?s:encodeURIComponent,u=0;u<e.length;u++){var c=e[u];if("string"!=typeof c){var d,p=i[c.name];if(null==p){if(c.optional){c.partial&&(a+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(p)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=l(p[f]),!n[u].test(d))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===f?c.prefix:c.delimiter)+d}}else{if(d=c.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(p),!n[u].test(d))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+d+'"');a+=c.prefix+d}}else a+=c}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,s="",i=0;i<e.length;i++){var u=e[i];if("string"==typeof u)s+=l(u);else{var p=l(u.prefix),f="(?:"+u.pattern+")";t.push(u),u.repeat&&(f+="(?:"+p+f+")*"),s+=f=u.optional?u.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var h=l(n.delimiter||"/"),g=s.slice(-h.length)===h;return o||(s=(g?s.slice(0,-h.length):s)+"(?:"+h+"(?=$))?"),s+=a?"$":o&&g?"":"(?="+h+"|$)",c(new RegExp("^"+s,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 c(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 c(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},2408:(e,t,n)=>{"use strict";var r=n(7418),o=60103,a=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var s=60109,i=60110,l=60112;t.Suspense=60113;var u=60115,c=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"),s=d("react.provider"),i=d("react.context"),l=d("react.forward_ref"),t.Suspense=d("react.suspense"),u=d("react.memo"),c=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 h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function m(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}m.prototype.isReactComponent={},m.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")},m.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=m.prototype;var y=v.prototype=new b;y.constructor=v,r(y,m.prototype),y.isPureReactComponent=!0;var x={current:null},w=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function z(e,t,n){var r,a={},s=null,i=null;if(null!=t)for(r in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)w.call(t,r)&&!k.hasOwnProperty(r)&&(a[r]=t[r]);var l=arguments.length-2;if(1===l)a.children=n;else if(1<l){for(var u=Array(l),c=0;c<l;c++)u[c]=arguments[c+2];a.children=u}if(e&&e.defaultProps)for(r in l=e.defaultProps)void 0===a[r]&&(a[r]=l[r]);return{$$typeof:o,type:e,key:s,ref:i,props:a,_owner:x.current}}function _(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var E=/\/+/g;function H(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 S(e,t,n,r,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var l=!1;if(null===e)l=!0;else switch(i){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case o:case a:l=!0}}if(l)return s=s(l=e),e=""===r?"."+H(l,0):r,Array.isArray(s)?(n="",null!=e&&(n=e.replace(E,"$&/")+"/"),S(s,t,n,"",(function(e){return e}))):null!=s&&(_(s)&&(s=function(e,t){return{$$typeof:o,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,n+(!s.key||l&&l.key===s.key?"":(""+s.key).replace(E,"$&/")+"/")+e)),t.push(s)),1;if(l=0,r=""===r?".":r+":",Array.isArray(e))for(var u=0;u<e.length;u++){var c=r+H(i=e[u],u);l+=S(i,t,n,c,s)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(i=e.next()).done;)l+=S(i=i.value,t,n,c=r+H(i,u++),s);else if("object"===i)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return l}function C(e,t,n){if(null==e)return e;var r=[],o=0;return S(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function T(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 L={current:null};function A(){var e=L.current;if(null===e)throw Error(f(321));return e}var N={ReactCurrentDispatcher:L,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:x,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:C,forEach:function(e,t,n){C(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return C(e,(function(){t++})),t},toArray:function(e){return C(e,(function(e){return e}))||[]},only:function(e){if(!_(e))throw Error(f(143));return e}},t.Component=m,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),s=e.key,i=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,l=x.current),void 0!==t.key&&(s=""+t.key),e.type&&e.type.defaultProps)var u=e.type.defaultProps;for(c in t)w.call(t,c)&&!k.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==u?u[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=n;else if(1<c){u=Array(c);for(var d=0;d<c;d++)u[d]=arguments[d+2];a.children=u}return{$$typeof:o,type:e.type,key:s,ref:i,props:a,_owner:l}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:i,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=z,t.createFactory=function(e){var t=z.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=_,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:T}},t.memo=function(e,t){return{$$typeof:u,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return A().useCallback(e,t)},t.useContext=function(e,t){return A().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return A().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return A().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return A().useLayoutEffect(e,t)},t.useMemo=function(e,t){return A().useMemo(e,t)},t.useReducer=function(e,t,n){return A().useReducer(e,t,n)},t.useRef=function(e){return A().useRef(e)},t.useState=function(e){return A().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 s=performance;t.unstable_now=function(){return s.now()}}else{var i=Date,l=i.now();t.unstable_now=function(){return i.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var u=null,c=null,d=function(){if(null!==u)try{var e=t.unstable_now();u(!0,e),u=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==u?setTimeout(n,0,e):(u=e,setTimeout(d,0))},r=function(e,t){c=setTimeout(e,t)},o=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var h=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 h&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,m=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 x=new MessageChannel,w=x.port2;x.port1.onmessage=function(){if(null!==m){var e=t.unstable_now();y=e+v;try{m(!0,e)?w.postMessage(null):(g=!1,m=null)}catch(n){throw w.postMessage(null),n}}else g=!1},n=function(e){m=e,g||(g=!0,w.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<E(o,t)))break e;e[r]=t,e[n]=o,n=r}}function z(e){return void 0===(e=e[0])?null:e}function _(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,s=e[a],i=a+1,l=e[i];if(void 0!==s&&0>E(s,n))void 0!==l&&0>E(l,s)?(e[r]=l,e[i]=n,r=i):(e[r]=s,e[a]=n,r=a);else{if(!(void 0!==l&&0>E(l,n)))break e;e[r]=l,e[i]=n,r=i}}}return t}return null}function E(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var H=[],S=[],C=1,T=null,L=3,A=!1,N=!1,P=!1;function O(e){for(var t=z(S);null!==t;){if(null===t.callback)_(S);else{if(!(t.startTime<=e))break;_(S),t.sortIndex=t.expirationTime,k(H,t)}t=z(S)}}function I(e){if(P=!1,O(e),!N)if(null!==z(H))N=!0,n(R);else{var t=z(S);null!==t&&r(I,t.startTime-e)}}function R(e,n){N=!1,P&&(P=!1,o()),A=!0;var a=L;try{for(O(n),T=z(H);null!==T&&(!(T.expirationTime>n)||e&&!t.unstable_shouldYield());){var s=T.callback;if("function"==typeof s){T.callback=null,L=T.priorityLevel;var i=s(T.expirationTime<=n);n=t.unstable_now(),"function"==typeof i?T.callback=i:T===z(H)&&_(H),O(n)}else _(H);T=z(H)}if(null!==T)var l=!0;else{var u=z(S);null!==u&&r(I,u.startTime-n),l=!1}return l}finally{T=null,L=a,A=!1}}var D=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||A||(N=!0,n(R))},t.unstable_getCurrentPriorityLevel=function(){return L},t.unstable_getFirstCallbackNode=function(){return z(H)},t.unstable_next=function(e){switch(L){case 1:case 2:case 3:var t=3;break;default:t=L}var n=L;L=t;try{return e()}finally{L=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=D,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=L;L=e;try{return t()}finally{L=n}},t.unstable_scheduleCallback=function(e,a,s){var i=t.unstable_now();switch("object"==typeof s&&null!==s?s="number"==typeof(s=s.delay)&&0<s?i+s:i:s=i,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:C++,callback:a,priorityLevel:e,startTime:s,expirationTime:l=s+l,sortIndex:-1},s>i?(e.sortIndex=s,k(S,e),null===z(H)&&e===z(S)&&(P?o():P=!0,r(I,s-i))):(e.sortIndex=l,k(H,e),N||A||(N=!0,n(R))),e},t.unstable_wrapCallback=function(e){var t=L;return function(){var n=L;L=t;try{return e.apply(this,arguments)}finally{L=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),s=Object.keys(t);if(a.length!==s.length)return!1;for(var i=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var u=a[l];if(!i(u))return!1;var c=e[u],d=t[u];if(!1===(o=n?n.call(r,c,d,u):void 0)||void 0===o&&c!==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,s=r.useEffect,i=r.useLayoutEffect,l=r.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var c="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,c=r[1];return i((function(){o.value=n,o.getSnapshot=t,u(o)&&c({inst:o})}),[e,n,t]),s((function(){return u(o)&&c({inst:o}),e((function(){u(o)&&c({inst:o})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:c},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:"Zealot",tagline:"Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.",url:"https://zealot.ews.im",baseUrl:"/zh-Hans/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/zealot.png",i18n:{defaultLocale:"en",locales:["en","zh-Hans"],path:"i18n",localeConfigs:{}},organizationName:"tryzealot",projectName:"docs",presets:[["classic",{docs:{sidebarPath:"/home/runner/work/docs/docs/sidebars.js",editUrl:"https://github.com/tryzealot/docs/tree/main/",lastVersion:"5.0.0",versions:{current:{label:"Next \ud83d\udea7"}}},theme:{customCss:"/home/runner/work/docs/docs/src/css/custom.css"},sitemap:{changefreq:"weekly",priority:.5,ignorePatterns:["/tags/**"],filename:"sitemap.xml"}}]],themeConfig:{navbar:{title:"Zealot",logo:{alt:"Zealot Logo",src:"img/zealot.png",srcDark:"img/zealot-dark.png"},items:[{type:"doc",docId:"self-hosted/index",label:"\u81ea\u5efa\u670d\u52a1\u6307\u5357",position:"left"},{type:"doc",docId:"developer-guide/index",position:"left",label:"\u5f00\u53d1\u8005\u8d44\u6e90"},{type:"doc",docId:"user-guide/index",position:"left",label:"\u7528\u6237\u624b\u518c"},{type:"doc",docId:"contributing-guide/index",position:"left",label:"\u8d21\u732e\u8005\u6307\u5357"},{type:"doc",docId:"user-guide/changelog",position:"left",label:"\u53d8\u66f4\u65e5\u5fd7"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsAfter:[{type:"html",value:'<hr class="dropdown-separator">'},{href:"https://tryzealot.github.io/docs-legacy",label:"Legacy docs"}],dropdownItemsBefore:[]},{type:"localeDropdown",position:"right",dropdownItemsBefore:[],dropdownItemsAfter:[]}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Community",items:[{label:"Github Discussions",href:"https://github.com/tryzealot/zealot/discussions"},{label:"Telegram",href:"https://t.me/+csa3Y2KOx44wMGRl"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/tryzealot/zealot"}]}],copyright:"Copyright \xa9 2023 icyleaf. Built with Docusaurus."},prism:{additionalLanguages:["kotlin","java","swift","groovy","ruby","nginx","toml","hcl"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}},{className:"code-block-error-line",line:"This will error"}],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:{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"}}]}},colorMode:{defaultMode:"light",disableSwitch:!1,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=JSON.parse('{"theme.AnnouncementBar.closeButtonAriaLabel":"\u5173\u95ed","theme.BackToTopButton.buttonAriaLabel":"\u56de\u5230\u9876\u90e8","theme.CodeBlock.copied":"\u590d\u5236\u6210\u529f","theme.CodeBlock.copy":"\u590d\u5236","theme.CodeBlock.copyButtonAriaLabel":"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f","theme.CodeBlock.wordWrapToggle":"\u5207\u6362\u81ea\u52a8\u6362\u884c","theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel":"\u6253\u5f00/\u6536\u8d77\u4fa7\u8fb9\u680f\u83dc\u5355\u300c{label}\u300d","theme.ErrorPageContent.title":"\u9875\u9762\u5df2\u5d29\u6e83\u3002","theme.ErrorPageContent.tryAgain":"\u91cd\u8bd5","theme.NavBar.navAriaLabel":"\u4e3b\u5bfc\u822a","theme.NotFound.p1":"\u6211\u4eec\u627e\u4e0d\u5230\u60a8\u8981\u627e\u7684\u9875\u9762\u3002","theme.NotFound.p2":"\u8bf7\u8054\u7cfb\u539f\u59cb\u94fe\u63a5\u6765\u6e90\u7f51\u7ad9\u7684\u6240\u6709\u8005\uff0c\u5e76\u544a\u77e5\u4ed6\u4eec\u94fe\u63a5\u5df2\u635f\u574f\u3002","theme.NotFound.title":"\u627e\u4e0d\u5230\u9875\u9762","theme.TOCCollapsible.toggleButtonLabel":"\u672c\u9875\u603b\u89c8","theme.admonition.caution":"\u8b66\u544a","theme.admonition.danger":"\u5371\u9669","theme.admonition.info":"\u4fe1\u606f","theme.admonition.note":"\u5907\u6ce8","theme.admonition.tip":"\u63d0\u793a","theme.blog.archive.description":"\u5386\u53f2\u535a\u6587","theme.blog.archive.title":"\u5386\u53f2\u535a\u6587","theme.blog.paginator.navAriaLabel":"\u535a\u6587\u5217\u8868\u5206\u9875\u5bfc\u822a","theme.blog.paginator.newerEntries":"\u8f83\u65b0\u7684\u535a\u6587","theme.blog.paginator.olderEntries":"\u8f83\u65e7\u7684\u535a\u6587","theme.blog.post.paginator.navAriaLabel":"\u535a\u6587\u5206\u9875\u5bfc\u822a","theme.blog.post.paginator.newerPost":"\u8f83\u65b0\u4e00\u7bc7","theme.blog.post.paginator.olderPost":"\u8f83\u65e7\u4e00\u7bc7","theme.blog.post.plurals":"{count} \u7bc7\u535a\u6587","theme.blog.post.readMore":"\u9605\u8bfb\u66f4\u591a","theme.blog.post.readMoreLabel":"\u9605\u8bfb {title} \u7684\u5168\u6587","theme.blog.post.readingTime.plurals":"\u9605\u8bfb\u9700 {readingTime} \u5206\u949f","theme.blog.sidebar.navAriaLabel":"\u6700\u8fd1\u535a\u6587\u5bfc\u822a","theme.blog.tagTitle":"{nPosts} \u542b\u6709\u6807\u7b7e\u300c{tagName}\u300d","theme.colorToggle.ariaLabel":"\u5207\u6362\u6d45\u8272/\u6697\u9ed1\u6a21\u5f0f\uff08\u5f53\u524d\u4e3a{mode}\uff09","theme.colorToggle.ariaLabel.mode.dark":"\u6697\u9ed1\u6a21\u5f0f","theme.colorToggle.ariaLabel.mode.light":"\u6d45\u8272\u6a21\u5f0f","theme.common.editThisPage":"\u7f16\u8f91\u6b64\u9875","theme.common.headingLinkTitle":"\u6807\u9898\u7684\u76f4\u63a5\u94fe\u63a5","theme.common.skipToMainContent":"\u8df3\u5230\u4e3b\u8981\u5185\u5bb9","theme.docs.DocCard.categoryDescription":"{count} \u4e2a\u9879\u76ee","theme.docs.breadcrumbs.home":"\u4e3b\u9875\u9762","theme.docs.breadcrumbs.navAriaLabel":"\u9875\u9762\u8def\u5f84","theme.docs.paginator.navAriaLabel":"\u6587\u6863\u5206\u9875\u5bfc\u822a","theme.docs.paginator.next":"\u4e0b\u4e00\u9875","theme.docs.paginator.previous":"\u4e0a\u4e00\u9875","theme.docs.sidebar.closeSidebarButtonAriaLabel":"Close navigation bar","theme.docs.sidebar.collapseButtonAriaLabel":"\u6536\u8d77\u4fa7\u8fb9\u680f","theme.docs.sidebar.collapseButtonTitle":"\u6536\u8d77\u4fa7\u8fb9\u680f","theme.docs.sidebar.expandButtonAriaLabel":"\u5c55\u5f00\u4fa7\u8fb9\u680f","theme.docs.sidebar.expandButtonTitle":"\u5c55\u5f00\u4fa7\u8fb9\u680f","theme.docs.sidebar.navAriaLabel":"\u6587\u6863\u4fa7\u8fb9\u680f","theme.docs.sidebar.toggleSidebarButtonAriaLabel":"Toggle navigation bar","theme.docs.tagDocListPageTitle":"{nDocsTagged}\u300c{tagName}\u300d","theme.docs.tagDocListPageTitle.nDocsTagged":"{count} \u7bc7\u6587\u6863\u5e26\u6709\u6807\u7b7e","theme.docs.versionBadge.label":"\u7248\u672c\uff1a{versionLabel}","theme.docs.versions.latestVersionLinkLabel":"\u6700\u65b0\u7248\u672c","theme.docs.versions.latestVersionSuggestionLabel":"\u6700\u65b0\u7684\u6587\u6863\u8bf7\u53c2\u9605 {latestVersionLink} ({versionLabel})\u3002","theme.docs.versions.unmaintainedVersionLabel":"\u6b64\u4e3a {siteTitle} {versionLabel} \u7248\u7684\u6587\u6863\uff0c\u73b0\u5df2\u4e0d\u518d\u79ef\u6781\u7ef4\u62a4\u3002","theme.docs.versions.unreleasedVersionLabel":"\u6b64\u4e3a {siteTitle} {versionLabel} \u7248\u5c1a\u672a\u53d1\u884c\u7684\u6587\u6863\u3002","theme.lastUpdated.atDate":"\u4e8e {date} ","theme.lastUpdated.byUser":"\u7531 {user} ","theme.lastUpdated.lastUpdatedAtBy":"\u6700\u540e{byUser}{atDate}\u66f4\u65b0","theme.navbar.mobileLanguageDropdown.label":"\u9009\u62e9\u8bed\u8a00","theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel":"\u2190 \u56de\u5230\u4e3b\u83dc\u5355","theme.navbar.mobileVersionsDropdown.label":"\u9009\u62e9\u7248\u672c","theme.tags.tagsListLabel":"\u6807\u7b7e\uff1a","theme.tags.tagsPageLink":"\u67e5\u770b\u6240\u6709\u6807\u7b7e","theme.tags.tagsPageTitle":"\u6807\u7b7e","Easy to Use":"\u8f7b\u677e\u4f7f\u7528","Focus on What Matters":"\u4e13\u6ce8\u4e8e\u91cd\u8981\u7684\u4e8b\u60c5","Open Source 100%":"100% \u5f00\u6e90\u9879\u76ee","Zealot was designed from the ground up to be easily installed and running quickly.":"Zealot \u63d0\u4f9b\u7b80\u5355\u4fbf\u6377\u7684\u90e8\u7f72\u65b9\u5f0f\u5b9e\u73b0\u4e00\u952e\u5b89\u88c5\u548c\u8fd0\u884c\u3002","Zealot lets you focus on your app, and we\'ll do the chores. Go ahead and upload your apps.":"Zealot \u4f7f\u5f97\u5f00\u53d1\u8005\u53ef\u4ee5\u5173\u6ce8\u4e8e\u5e94\u7528\u5f00\u53d1\u672c\u8eab\uff0c\u6211\u4eec\u6765\u5904\u7406\u6301\u7eed\u4ea4\u4ed8\u548c\u6d4b\u8bd5\u7684\u5de5\u4f5c\uff0c\u7acb\u5373\u4e0a\u4f20\u5e94\u7528\u5427\u3002","Zealot is an open source project, Everyone could easy self hosted on own servers.":"Zealot \u662f\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u6bcf\u4e2a\u4eba\u90fd\u53ef\u4ee5\u79c1\u6709\u5316\u90e8\u7f72\u5728\u81ea\u5df1\u7684\u670d\u52a1\u5668\u3002","Getting started":"\u5feb\u901f\u4e0a\u624b","homepage.header.title":"Zealot","homepage.header.subtitle":"\u5f00\u6e90\u81ea\u90e8\u7f72\u6301\u7eed\u96c6\u6210\u4e00\u5207\u8ddf\u5e94\u7528\u6709\u5173\u4e8b\u60c5\uff0c\u63a5\u5165\u4efb\u610f CI \u7cfb\u7edf\u4e00\u5207\u81ea\u52a8\u5316\u5904\u7406\uff0c\u4f01\u4e1a\u591a\u5e74\u5b9e\u6218\u7ecf\u9a8c\uff0c\u72ec\u7acb\u90e8\u7f72\u63d0\u4f9b\u4f01\u4e1a\u6253\u5305\u5206\u53d1\u6d41\u7a0b\u3001\u4e0a\u4f20\u5e94\u7528\u5168\u5957\u6d41\u7a0b\u65b9\u6848","Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.":"\u79c1\u6709\u5316\u90e8\u7f72 Android\u3001iOS\u3001macOS\u3001Windows \u548c Linux \u5e94\u7528\u6258\u7ba1\u670d\u52a1"}')},6887:e=>{"use strict";e.exports=JSON.parse('{"/zh-Hans/markdown-page-75e":{"__comp":"1f391b9e","__context":{"plugin":"a7434565"},"content":"393be207"},"/zh-Hans/docs/4.x-da2":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"cae0f04b"},"/zh-Hans/docs/4.x/category/administrator-d7f":{"__comp":"14eb3368","categoryGeneratedIndex":"7a31e8eb"},"/zh-Hans/docs/4.x/category/apps-2ef":{"__comp":"14eb3368","categoryGeneratedIndex":"47c1865a"},"/zh-Hans/docs/4.x/category/cloud-provider-guides-3e0":{"__comp":"14eb3368","categoryGeneratedIndex":"7e84284a"},"/zh-Hans/docs/4.x/category/configuration-139":{"__comp":"14eb3368","categoryGeneratedIndex":"7f084e8e"},"/zh-Hans/docs/4.x/category/debug-files-bfa":{"__comp":"14eb3368","categoryGeneratedIndex":"2de1c1b9"},"/zh-Hans/docs/4.x/category/deployment-518":{"__comp":"14eb3368","categoryGeneratedIndex":"492fa892"},"/zh-Hans/docs/4.x/category/local-development-c2c":{"__comp":"14eb3368","categoryGeneratedIndex":"a9736a03"},"/zh-Hans/docs/4.x/category/monitoring-066":{"__comp":"14eb3368","categoryGeneratedIndex":"5b48482c"},"/zh-Hans/docs/4.x/category/sdks-cd7":{"__comp":"14eb3368","categoryGeneratedIndex":"6a6b352a"},"/zh-Hans/docs/4.x/category/toolkits-9b1":{"__comp":"14eb3368","categoryGeneratedIndex":"b0b6b74b"},"/zh-Hans/docs/4.x/contributing-guide/-0bd":{"__comp":"17896441","content":"77ad6583"},"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer-7b7":{"__comp":"17896441","content":"9d0b921d"},"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code-314":{"__comp":"17896441","content":"0c22aff4"},"/zh-Hans/docs/4.x/developer-guide/-396":{"__comp":"17896441","content":"731441ba"},"/zh-Hans/docs/4.x/developer-guide/api-d53":{"__comp":"17896441","content":"6988bd10"},"/zh-Hans/docs/4.x/developer-guide/api/apps-b1c":{"__comp":"17896441","content":"71cdea68"},"/zh-Hans/docs/4.x/developer-guide/api/debug_files-ae9":{"__comp":"17896441","content":"9387e8f1"},"/zh-Hans/docs/4.x/developer-guide/fastlane-baa":{"__comp":"17896441","content":"3b925495"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot-684":{"__comp":"17896441","content":"6de0a3bc"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file-8bd":{"__comp":"17896441","content":"08927acb"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices-1c5":{"__comp":"17896441","content":"dc9db4d6"},"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check-55a":{"__comp":"17896441","content":"77ba73fa"},"/zh-Hans/docs/4.x/developer-guide/sdk/android-57e":{"__comp":"17896441","content":"b43ef384"},"/zh-Hans/docs/4.x/developer-guide/sdk/ios-e20":{"__comp":"17896441","content":"c704004d"},"/zh-Hans/docs/4.x/self-hosted/-518":{"__comp":"17896441","content":"b6e49d05"},"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables-3c6":{"__comp":"17896441","content":"78d3bc26"},"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs-a07":{"__comp":"17896441","content":"6c1f465d"},"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication-586":{"__comp":"17896441","content":"6025cfa3"},"/zh-Hans/docs/4.x/self-hosted/deployment/architecture-ea9":{"__comp":"17896441","content":"eb842df6"},"/zh-Hans/docs/4.x/self-hosted/deployment/docker-143":{"__comp":"17896441","content":"4aeacf08"},"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step-4fe":{"__comp":"17896441","content":"5fe54c51"},"/zh-Hans/docs/4.x/self-hosted/deployment/fly-b4e":{"__comp":"17896441","content":"b168d81c"},"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes-779":{"__comp":"17896441","content":"3731d319"},"/zh-Hans/docs/4.x/self-hosted/deployment/nomad-902":{"__comp":"17896441","content":"1ec5d4b5"},"/zh-Hans/docs/4.x/self-hosted/deployment/railway-548":{"__comp":"17896441","content":"e471e2c1"},"/zh-Hans/docs/4.x/self-hosted/deployment/render-db8":{"__comp":"17896441","content":"33ad4946"},"/zh-Hans/docs/4.x/self-hosted/deployment/requirements-4df":{"__comp":"17896441","content":"42055627"},"/zh-Hans/docs/4.x/self-hosted/deployment/source-code-4c4":{"__comp":"17896441","content":"f3e148a8"},"/zh-Hans/docs/4.x/self-hosted/reverse-proxies-9ee":{"__comp":"17896441","content":"b572cb1f"},"/zh-Hans/docs/4.x/self-hosted/storage-380":{"__comp":"17896441","content":"10743099"},"/zh-Hans/docs/4.x/user-guide/-f14":{"__comp":"17896441","content":"3e64385b"},"/zh-Hans/docs/4.x/user-guide/administrator/apple-team-2b0":{"__comp":"17896441","content":"66a79633"},"/zh-Hans/docs/4.x/user-guide/administrator/backup-f68":{"__comp":"17896441","content":"5171b55b"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs-a4d":{"__comp":"17896441","content":"c869843a"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics-462":{"__comp":"17896441","content":"5e69b000"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging-3aa":{"__comp":"17896441","content":"c5a4c00b"},"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info-8f2":{"__comp":"17896441","content":"8c7fed4d"},"/zh-Hans/docs/4.x/user-guide/administrator/permissions-cbb":{"__comp":"17896441","content":"c38ecdbc"},"/zh-Hans/docs/4.x/user-guide/administrator/project-settings-bbb":{"__comp":"17896441","content":"7e2cd3a9"},"/zh-Hans/docs/4.x/user-guide/apps/create-574":{"__comp":"17896441","content":"405e4d0a"},"/zh-Hans/docs/4.x/user-guide/best_practices-9f7":{"__comp":"17896441","content":"575c49fd"},"/zh-Hans/docs/4.x/user-guide/changelog-af2":{"__comp":"17896441","content":"89a1149b"},"/zh-Hans/docs/4.x/user-guide/credits-672":{"__comp":"17896441","content":"67d72155"},"/zh-Hans/docs/4.x/user-guide/dashboard-2c7":{"__comp":"17896441","content":"1ab7b698"},"/zh-Hans/docs/4.x/user-guide/debug-files/upload-f8f":{"__comp":"17896441","content":"8dbd9405"},"/zh-Hans/docs/4.x/user-guide/qa-a9f":{"__comp":"17896441","content":"0409ce86"},"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid-31b":{"__comp":"17896441","content":"6fa94343"},"/zh-Hans/docs/4.x/user-guide/toolkits/teardown-915":{"__comp":"17896441","content":"05c34111"},"/zh-Hans/docs/4.x/user-guide/webhooks-d21":{"__comp":"17896441","content":"1d59b05a"},"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk-078":{"__comp":"17896441","content":"68604c4e"},"/zh-Hans/docs/4.x/user-guide/webhooks/discord-0f6":{"__comp":"17896441","content":"493ecea9"},"/zh-Hans/docs/4.x/user-guide/webhooks/feishu-c9c":{"__comp":"17896441","content":"6821510c"},"/zh-Hans/docs/4.x/user-guide/webhooks/slack-4ac":{"__comp":"17896441","content":"00f34551"},"/zh-Hans/docs/4.x/user-guide/webhooks/wecom-f3a":{"__comp":"17896441","content":"63d75c88"},"/zh-Hans/docs/next-e3e":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"935f2afb"},"/zh-Hans/docs/next/category/administrator-72c":{"__comp":"14eb3368","categoryGeneratedIndex":"4aefe824"},"/zh-Hans/docs/next/category/apps-260":{"__comp":"14eb3368","categoryGeneratedIndex":"f057e2be"},"/zh-Hans/docs/next/category/cloud-provider-guides-ddb":{"__comp":"14eb3368","categoryGeneratedIndex":"f3ecbbb7"},"/zh-Hans/docs/next/category/configuration-e3d":{"__comp":"14eb3368","categoryGeneratedIndex":"e649ac20"},"/zh-Hans/docs/next/category/debug-files-1e7":{"__comp":"14eb3368","categoryGeneratedIndex":"0376ac8d"},"/zh-Hans/docs/next/category/deployment-730":{"__comp":"14eb3368","categoryGeneratedIndex":"ab09b93d"},"/zh-Hans/docs/next/category/local-development-3a2":{"__comp":"14eb3368","categoryGeneratedIndex":"53ae73f2"},"/zh-Hans/docs/next/category/monitoring-5fb":{"__comp":"14eb3368","categoryGeneratedIndex":"c1af49ed"},"/zh-Hans/docs/next/category/sdks-dd4":{"__comp":"14eb3368","categoryGeneratedIndex":"68518edc"},"/zh-Hans/docs/next/category/toolkits-dcc":{"__comp":"14eb3368","categoryGeneratedIndex":"c7c3383a"},"/zh-Hans/docs/next/contributing-guide/-24b":{"__comp":"17896441","content":"4960790f"},"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer-033":{"__comp":"17896441","content":"cc8d1b20"},"/zh-Hans/docs/next/contributing-guide/local-development/source-code-d9f":{"__comp":"17896441","content":"c941fb92"},"/zh-Hans/docs/next/developer-guide/-81a":{"__comp":"17896441","content":"61b3b8ce"},"/zh-Hans/docs/next/developer-guide/api-d7a":{"__comp":"17896441","content":"546445a3"},"/zh-Hans/docs/next/developer-guide/api/apps-8f3":{"__comp":"17896441","content":"c6fb1e3c"},"/zh-Hans/docs/next/developer-guide/api/debug_files-0f2":{"__comp":"17896441","content":"ef9024f9"},"/zh-Hans/docs/next/developer-guide/fastlane-637":{"__comp":"17896441","content":"92f17503"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot-8f6":{"__comp":"17896441","content":"ae0b00ed"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file-e8c":{"__comp":"17896441","content":"b155671d"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices-ae9":{"__comp":"17896441","content":"07e94b94"},"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check-ff2":{"__comp":"17896441","content":"4daa79cc"},"/zh-Hans/docs/next/developer-guide/sdk/android-6e9":{"__comp":"17896441","content":"000e92dd"},"/zh-Hans/docs/next/developer-guide/sdk/ios-27f":{"__comp":"17896441","content":"380655f7"},"/zh-Hans/docs/next/self-hosted/-5e5":{"__comp":"17896441","content":"498392b4"},"/zh-Hans/docs/next/self-hosted/configuration/environment-variables-9da":{"__comp":"17896441","content":"30738da4"},"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs-043":{"__comp":"17896441","content":"4b6154ab"},"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication-357":{"__comp":"17896441","content":"ffe0e092"},"/zh-Hans/docs/next/self-hosted/deployment/architecture-751":{"__comp":"17896441","content":"f3b6e326"},"/zh-Hans/docs/next/self-hosted/deployment/docker-a4f":{"__comp":"17896441","content":"533b3bff"},"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step-d7b":{"__comp":"17896441","content":"756ae957"},"/zh-Hans/docs/next/self-hosted/deployment/fly-17c":{"__comp":"17896441","content":"93e83d03"},"/zh-Hans/docs/next/self-hosted/deployment/kubernetes-11d":{"__comp":"17896441","content":"0b2dde68"},"/zh-Hans/docs/next/self-hosted/deployment/nomad-f41":{"__comp":"17896441","content":"94a70f3c"},"/zh-Hans/docs/next/self-hosted/deployment/railway-ca6":{"__comp":"17896441","content":"4a0f0e0c"},"/zh-Hans/docs/next/self-hosted/deployment/render-4ce":{"__comp":"17896441","content":"23b09800"},"/zh-Hans/docs/next/self-hosted/deployment/requirements-f08":{"__comp":"17896441","content":"40622858"},"/zh-Hans/docs/next/self-hosted/deployment/source-code-ded":{"__comp":"17896441","content":"b8ca8336"},"/zh-Hans/docs/next/self-hosted/reverse-proxies-49a":{"__comp":"17896441","content":"4bc9e19e"},"/zh-Hans/docs/next/self-hosted/storage-0ff":{"__comp":"17896441","content":"e84771ae"},"/zh-Hans/docs/next/user-guide/-1fb":{"__comp":"17896441","content":"36ff01e5"},"/zh-Hans/docs/next/user-guide/administrator/apple-team-383":{"__comp":"17896441","content":"381e4cde"},"/zh-Hans/docs/next/user-guide/administrator/backup-4ae":{"__comp":"17896441","content":"b667b6c3"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs-b4c":{"__comp":"17896441","content":"422bbee2"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics-847":{"__comp":"17896441","content":"d7c763e8"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging-b1a":{"__comp":"17896441","content":"5f6e077b"},"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info-056":{"__comp":"17896441","content":"2ba4a649"},"/zh-Hans/docs/next/user-guide/administrator/permissions-bfc":{"__comp":"17896441","content":"b0d48a44"},"/zh-Hans/docs/next/user-guide/administrator/settings-a7e":{"__comp":"17896441","content":"927828a2"},"/zh-Hans/docs/next/user-guide/apps/-7fe":{"__comp":"17896441","content":"097ad104"},"/zh-Hans/docs/next/user-guide/apps/create-faa":{"__comp":"17896441","content":"0f991629"},"/zh-Hans/docs/next/user-guide/apps/detail-78f":{"__comp":"17896441","content":"ac20dd04"},"/zh-Hans/docs/next/user-guide/apps/upload-d44":{"__comp":"17896441","content":"580231d5"},"/zh-Hans/docs/next/user-guide/best_practices-49f":{"__comp":"17896441","content":"65f8d4cd"},"/zh-Hans/docs/next/user-guide/changelog-f9a":{"__comp":"17896441","content":"ad5e89b7"},"/zh-Hans/docs/next/user-guide/credits-054":{"__comp":"17896441","content":"9aa09611"},"/zh-Hans/docs/next/user-guide/dashboard-581":{"__comp":"17896441","content":"ec4538ed"},"/zh-Hans/docs/next/user-guide/debug-files/-d57":{"__comp":"17896441","content":"a21619df"},"/zh-Hans/docs/next/user-guide/debug-files/review-6df":{"__comp":"17896441","content":"e177b72e"},"/zh-Hans/docs/next/user-guide/debug-files/upload-99a":{"__comp":"17896441","content":"c6bdf690"},"/zh-Hans/docs/next/user-guide/qa-f7a":{"__comp":"17896441","content":"808d5cf9"},"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid-204":{"__comp":"17896441","content":"d0f9f7b0"},"/zh-Hans/docs/next/user-guide/toolkits/teardown-a6c":{"__comp":"17896441","content":"78f6b461"},"/zh-Hans/docs/next/user-guide/webhooks-66b":{"__comp":"17896441","content":"1ab1b8b6"},"/zh-Hans/docs/next/user-guide/webhooks/dingtalk-784":{"__comp":"17896441","content":"aa45ed72"},"/zh-Hans/docs/next/user-guide/webhooks/discord-946":{"__comp":"17896441","content":"bbb0fa6e"},"/zh-Hans/docs/next/user-guide/webhooks/feishu-42f":{"__comp":"17896441","content":"0da09c0c"},"/zh-Hans/docs/next/user-guide/webhooks/slack-7cb":{"__comp":"17896441","content":"8c755c24"},"/zh-Hans/docs/next/user-guide/webhooks/wecom-644":{"__comp":"17896441","content":"980d6c79"},"/zh-Hans/docs-a28":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"c9b278a8"},"/zh-Hans/docs/category/administrator-097":{"__comp":"14eb3368","categoryGeneratedIndex":"bc4a1c03"},"/zh-Hans/docs/category/apps-8cd":{"__comp":"14eb3368","categoryGeneratedIndex":"e676557f"},"/zh-Hans/docs/category/cloud-provider-guides-fbc":{"__comp":"14eb3368","categoryGeneratedIndex":"320c81fa"},"/zh-Hans/docs/category/configuration-346":{"__comp":"14eb3368","categoryGeneratedIndex":"f25fc619"},"/zh-Hans/docs/category/debug-files-ea0":{"__comp":"14eb3368","categoryGeneratedIndex":"9d7c6944"},"/zh-Hans/docs/category/deployment-1b8":{"__comp":"14eb3368","categoryGeneratedIndex":"f500fe2a"},"/zh-Hans/docs/category/local-development-34b":{"__comp":"14eb3368","categoryGeneratedIndex":"9d0a861d"},"/zh-Hans/docs/category/monitoring-adb":{"__comp":"14eb3368","categoryGeneratedIndex":"f576f290"},"/zh-Hans/docs/category/sdks-38f":{"__comp":"14eb3368","categoryGeneratedIndex":"709f7e27"},"/zh-Hans/docs/category/toolkits-a3c":{"__comp":"14eb3368","categoryGeneratedIndex":"70a2637b"},"/zh-Hans/docs/contributing-guide/-73c":{"__comp":"17896441","content":"06a7ce3e"},"/zh-Hans/docs/contributing-guide/local-development/devcontainer-862":{"__comp":"17896441","content":"56786dcf"},"/zh-Hans/docs/contributing-guide/local-development/source-code-ad0":{"__comp":"17896441","content":"cbffe0ba"},"/zh-Hans/docs/developer-guide/-274":{"__comp":"17896441","content":"7b50d085"},"/zh-Hans/docs/developer-guide/api-722":{"__comp":"17896441","content":"797c3697"},"/zh-Hans/docs/developer-guide/api/apps-40f":{"__comp":"17896441","content":"a73dab33"},"/zh-Hans/docs/developer-guide/api/debug_files-869":{"__comp":"17896441","content":"3384f4b5"},"/zh-Hans/docs/developer-guide/fastlane-73d":{"__comp":"17896441","content":"c3412635"},"/zh-Hans/docs/developer-guide/fastlane/zealot-3fc":{"__comp":"17896441","content":"0b5c90e4"},"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file-4df":{"__comp":"17896441","content":"8e4c1cdf"},"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices-d4f":{"__comp":"17896441","content":"6aeebc73"},"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check-ac5":{"__comp":"17896441","content":"dd90aca1"},"/zh-Hans/docs/developer-guide/sdk/android-cf3":{"__comp":"17896441","content":"3d079836"},"/zh-Hans/docs/developer-guide/sdk/ios-e8f":{"__comp":"17896441","content":"b38b46a9"},"/zh-Hans/docs/self-hosted/-78e":{"__comp":"17896441","content":"0ef4ad01"},"/zh-Hans/docs/self-hosted/configuration/environment-variables-d54":{"__comp":"17896441","content":"500b40a2"},"/zh-Hans/docs/self-hosted/configuration/schedule-jobs-bb1":{"__comp":"17896441","content":"88e109fd"},"/zh-Hans/docs/self-hosted/configuration/third-party-authentication-0c6":{"__comp":"17896441","content":"faaf8c96"},"/zh-Hans/docs/self-hosted/deployment/architecture-91f":{"__comp":"17896441","content":"de6e37e2"},"/zh-Hans/docs/self-hosted/deployment/docker-189":{"__comp":"17896441","content":"1c821441"},"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step-57b":{"__comp":"17896441","content":"cd05e63c"},"/zh-Hans/docs/self-hosted/deployment/fly-fc2":{"__comp":"17896441","content":"b51b060c"},"/zh-Hans/docs/self-hosted/deployment/kubernetes-6b6":{"__comp":"17896441","content":"fe394c5b"},"/zh-Hans/docs/self-hosted/deployment/nomad-719":{"__comp":"17896441","content":"abf33808"},"/zh-Hans/docs/self-hosted/deployment/railway-9ef":{"__comp":"17896441","content":"93332d63"},"/zh-Hans/docs/self-hosted/deployment/render-934":{"__comp":"17896441","content":"cf72ee6a"},"/zh-Hans/docs/self-hosted/deployment/requirements-5d9":{"__comp":"17896441","content":"20570c26"},"/zh-Hans/docs/self-hosted/deployment/source-code-415":{"__comp":"17896441","content":"c3697579"},"/zh-Hans/docs/self-hosted/reverse-proxies-a9e":{"__comp":"17896441","content":"5914602b"},"/zh-Hans/docs/self-hosted/storage-969":{"__comp":"17896441","content":"04af2ec6"},"/zh-Hans/docs/user-guide/-859":{"__comp":"17896441","content":"a06cc266"},"/zh-Hans/docs/user-guide/administrator/apple-team-38b":{"__comp":"17896441","content":"089c33a0"},"/zh-Hans/docs/user-guide/administrator/backup-84e":{"__comp":"17896441","content":"210ec931"},"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs-497":{"__comp":"17896441","content":"2ff16664"},"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics-4bd":{"__comp":"17896441","content":"4b5eb73a"},"/zh-Hans/docs/user-guide/administrator/monitoring/logging-f50":{"__comp":"17896441","content":"c89e1d41"},"/zh-Hans/docs/user-guide/administrator/monitoring/system-info-bd8":{"__comp":"17896441","content":"26cfe7d9"},"/zh-Hans/docs/user-guide/administrator/permissions-ac0":{"__comp":"17896441","content":"9c76208a"},"/zh-Hans/docs/user-guide/administrator/project-settings-aec":{"__comp":"17896441","content":"d02aa106"},"/zh-Hans/docs/user-guide/administrator/settings-408":{"__comp":"17896441","content":"2a1b2070"},"/zh-Hans/docs/user-guide/apps/-243":{"__comp":"17896441","content":"fa6a7c71"},"/zh-Hans/docs/user-guide/apps/create-27d":{"__comp":"17896441","content":"e74b89a8"},"/zh-Hans/docs/user-guide/apps/detail-ce1":{"__comp":"17896441","content":"10ab72a2"},"/zh-Hans/docs/user-guide/apps/upload-0e8":{"__comp":"17896441","content":"2da1a83d"},"/zh-Hans/docs/user-guide/best_practices-7a2":{"__comp":"17896441","content":"eb89accb"},"/zh-Hans/docs/user-guide/changelog-6e5":{"__comp":"17896441","content":"9eed9fa1"},"/zh-Hans/docs/user-guide/credits-6de":{"__comp":"17896441","content":"e25c1561"},"/zh-Hans/docs/user-guide/dashboard-5aa":{"__comp":"17896441","content":"9a46955c"},"/zh-Hans/docs/user-guide/debug-files/-8d4":{"__comp":"17896441","content":"3d648c75"},"/zh-Hans/docs/user-guide/debug-files/review-24d":{"__comp":"17896441","content":"28463b1d"},"/zh-Hans/docs/user-guide/debug-files/upload-503":{"__comp":"17896441","content":"986b83c2"},"/zh-Hans/docs/user-guide/qa-8b7":{"__comp":"17896441","content":"23e1330d"},"/zh-Hans/docs/user-guide/toolkits/fetch-udid-847":{"__comp":"17896441","content":"46458cf8"},"/zh-Hans/docs/user-guide/toolkits/teardown-8ee":{"__comp":"17896441","content":"20cbbbee"},"/zh-Hans/docs/user-guide/webhooks-936":{"__comp":"17896441","content":"d75d92bc"},"/zh-Hans/docs/user-guide/webhooks/dingtalk-e82":{"__comp":"17896441","content":"2ac37e2a"},"/zh-Hans/docs/user-guide/webhooks/discord-f58":{"__comp":"17896441","content":"3f7af0f1"},"/zh-Hans/docs/user-guide/webhooks/feishu-5bb":{"__comp":"17896441","content":"0659cada"},"/zh-Hans/docs/user-guide/webhooks/slack-4b3":{"__comp":"17896441","content":"b2ef10a5"},"/zh-Hans/docs/user-guide/webhooks/wecom-82b":{"__comp":"17896441","content":"b0190f04"},"/zh-Hans/-df2":{"__comp":"c4f5d8e4","__context":{"plugin":"a7434565"},"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/zh-Hans/assets/js/runtime~main.23c2f18f.js b/zh-Hans/assets/js/runtime~main.96852407.js similarity index 73% rename from zh-Hans/assets/js/runtime~main.23c2f18f.js rename to zh-Hans/assets/js/runtime~main.96852407.js index 064a7980e..952a00d0b 100644 --- a/zh-Hans/assets/js/runtime~main.23c2f18f.js +++ b/zh-Hans/assets/js/runtime~main.96852407.js @@ -1 +1 @@ -(()=>{"use strict";var e,c,a,b,d,f={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var a=t[e]={exports:{}};return f[e].call(a.exports,a,a.exports,r),a.exports}r.m=f,e=[],r.O=(c,a,b,d)=>{if(!a){var f=1/0;for(i=0;i<e.length;i++){a=e[i][0],b=e[i][1],d=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&d||f>=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d<f&&(f=d));if(t){e.splice(i--,1);var n=b();void 0!==n&&(c=n)}}return c}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,b,d]},r.n=e=>{var c=e&&e.__esModule?()=>e.default:()=>e;return r.d(c,{a:c}),c},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var f={};c=c||[null,a({}),a([]),a(a)];for(var t=2&b&&e;"object"==typeof t&&!~c.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((c=>f[c]=()=>e[c]));return f.default=()=>e,r.d(d,f),d},r.d=(e,c)=>{for(var a in c)r.o(c,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:c[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((c,a)=>(r.f[a](e,c),c)),[])),r.u=e=>"assets/js/"+({39:"7a31e8eb",53:"935f2afb",80:"c1af49ed",105:"2de1c1b9",131:"ae0b00ed",144:"00f34551",184:"b0d48a44",270:"93e83d03",324:"cf72ee6a",536:"8dbd9405",594:"cbffe0ba",631:"c3697579",639:"20570c26",652:"6a6b352a",713:"aa45ed72",721:"cc8d1b20",726:"097ad104",847:"e177b72e",859:"6025cfa3",861:"f3ecbbb7",959:"07e94b94",1013:"06a7ce3e",1042:"5fe54c51",1075:"5171b55b",1125:"fa6a7c71",1147:"bc4a1c03",1224:"b6e49d05",1233:"405e4d0a",1290:"f576f290",1297:"d7c763e8",1300:"5f6e077b",1717:"f3b6e326",1821:"575c49fd",1839:"ab09b93d",1854:"0659cada",1931:"d0f9f7b0",2141:"2a1b2070",2170:"c869843a",2171:"0376ac8d",2208:"c5a4c00b",2238:"e471e2c1",2239:"9d0b921d",2247:"210ec931",2254:"0f991629",2300:"9a46955c",2347:"78d3bc26",2353:"f25fc619",2390:"eb89accb",2406:"b2ef10a5",2515:"36ff01e5",2559:"c89e1d41",2570:"bbb0fa6e",2571:"10743099",2608:"b0b6b74b",2705:"c6bdf690",2745:"3b925495",2922:"3d079836",2986:"4a0f0e0c",2994:"faaf8c96",3020:"a21619df",3032:"23e1330d",3082:"e676557f",3085:"1f391b9e",3091:"26cfe7d9",3137:"3731d319",3144:"68518edc",3165:"6aeebc73",3194:"0c22aff4",3240:"a9736a03",3262:"05c34111",3313:"0ef4ad01",3369:"6de0a3bc",3434:"67d72155",3705:"abf33808",3775:"e25c1561",3868:"9d0a861d",3946:"ad5e89b7",3975:"88e109fd",4061:"6988bd10",4069:"8e4c1cdf",4085:"77ba73fa",4114:"ac20dd04",4123:"000e92dd",4127:"b8ca8336",4156:"c704004d",4195:"c4f5d8e4",4219:"04af2ec6",4259:"b667b6c3",4288:"a06cc266",4328:"ec4538ed",4343:"61b3b8ce",4360:"c38ecdbc",4529:"0409ce86",4552:"808d5cf9",4590:"d02aa106",4620:"28463b1d",4641:"46458cf8",4775:"cd05e63c",4938:"f3e148a8",5086:"927828a2",5100:"980d6c79",5185:"4960790f",5215:"33ad4946",5238:"2ac37e2a",5256:"e74b89a8",5342:"4bc9e19e",5343:"c7c3383a",5405:"20cbbbee",5468:"e84771ae",5476:"2ba4a649",5497:"b0190f04",5632:"65f8d4cd",5709:"cae0f04b",5732:"6821510c",5745:"580231d5",5855:"eb842df6",5924:"b155671d",5929:"c3412635",6031:"9aa09611",6043:"b43ef384",6082:"422bbee2",6164:"f057e2be",6170:"709f7e27",6184:"4aeacf08",6222:"de6e37e2",6229:"fe394c5b",6276:"4aefe824",6346:"9eed9fa1",6432:"731441ba",6442:"68604c4e",6447:"1ab1b8b6",6463:"320c81fa",6500:"493ecea9",6519:"63d75c88",6543:"8c755c24",6620:"9387e8f1",6735:"500b40a2",6751:"756ae957",6766:"6c1f465d",6788:"56786dcf",6801:"7f084e8e",6833:"42055627",6981:"b572cb1f",6988:"77ad6583",7030:"4daa79cc",7053:"797c3697",7121:"66a79633",7166:"0b2dde68",7169:"2da1a83d",7181:"1d59b05a",7190:"546445a3",7207:"8c7fed4d",7284:"b168d81c",7298:"492fa892",7299:"7b50d085",7347:"08927acb",7355:"5b48482c",7414:"393be207",7452:"ef9024f9",7493:"089c33a0",7531:"78f6b461",7551:"c941fb92",7575:"f500fe2a",7645:"a7434565",7659:"986b83c2",7679:"dd90aca1",7700:"7e84284a",7704:"92f17503",7754:"93332d63",7755:"47c1865a",7759:"1ab7b698",7772:"3384f4b5",7781:"a73dab33",7817:"23b09800",7918:"17896441",7925:"9c76208a",7950:"3d648c75",8007:"70a2637b",8037:"4b5eb73a",8170:"30738da4",8189:"9d7c6944",8202:"1ec5d4b5",8206:"10ab72a2",8228:"4b6154ab",8307:"3e64385b",8390:"0da09c0c",8447:"b51b060c",8450:"d75d92bc",8552:"71cdea68",8650:"e649ac20",8740:"381e4cde",8782:"b38b46a9",8794:"dc9db4d6",8797:"5914602b",8810:"ffe0e092",8832:"6fa94343",8876:"c6fb1e3c",9164:"498392b4",9181:"c9b278a8",9213:"380655f7",9316:"3f7af0f1",9327:"2ff16664",9334:"247783bb",9347:"7e2cd3a9",9390:"53ae73f2",9411:"40622858",9506:"1c821441",9514:"1be78505",9555:"0b5c90e4",9557:"5e69b000",9697:"89a1149b",9817:"14eb3368",9882:"533b3bff",9902:"94a70f3c"}[e]||e)+"."+{39:"e317e887",53:"17df8ec4",80:"2e5f2978",105:"e16d6bce",131:"ac560ab6",144:"dd00da09",184:"dd548038",270:"80d1a67d",324:"aa57a03a",536:"c2f54e6e",594:"a159fa65",631:"c73234eb",639:"c057422a",652:"74181fc1",713:"fe0a6923",721:"2c4c0211",726:"d5eed7c4",847:"90ea20c7",859:"318673d0",861:"68d890e1",959:"f5b86a0a",1013:"eebaf313",1042:"00bb025d",1075:"d4afc109",1125:"3e6312af",1147:"aeea4337",1224:"26c824c7",1233:"866d252d",1290:"f794fc88",1297:"255bb749",1300:"73bb2351",1717:"9084ce02",1821:"26cddc95",1839:"e0a2c17f",1854:"6d3d65f1",1931:"f3da805d",2141:"545a2b6a",2170:"6597928c",2171:"c58a7b5c",2208:"33147048",2238:"6d3b5298",2239:"c7b4dc33",2247:"0d6bf754",2254:"c64a180a",2300:"50568c8f",2347:"25a21ca3",2353:"33369f9f",2390:"d5895f13",2406:"bb7c8f85",2515:"c74b7f69",2559:"2f10de5e",2570:"ef51c9e9",2571:"ca663263",2608:"71148d5c",2705:"53da6006",2745:"0e024d03",2922:"0d33a2e8",2986:"4a6ac4e8",2994:"b3d4b832",3020:"15ef0aad",3032:"5b8ddfb0",3082:"33f75a2c",3085:"3825bb4d",3091:"c67ffa99",3137:"91bf23be",3144:"237417f1",3165:"20fea439",3194:"4d62cf02",3240:"b1d855cf",3262:"ee6b6f6d",3313:"a7fb8f86",3369:"bd877831",3434:"14a70944",3705:"05c27bed",3775:"c0ff416b",3868:"86eac8ef",3946:"c9b452c8",3975:"0623decd",4061:"982d477f",4069:"321da4ce",4085:"ae86c2ff",4114:"bdb1d880",4123:"ce6b281f",4127:"6b35e9d9",4156:"e3a8d780",4195:"ce8f06be",4219:"96f53e5f",4259:"623917b9",4288:"4727cb78",4328:"e3642bb5",4343:"ef1835be",4360:"87b87228",4529:"864bbeeb",4552:"d0540836",4590:"d32d0252",4620:"f72b3276",4641:"49c6b2ed",4775:"bd0c6adf",4938:"fe52a823",4972:"163ed418",5086:"31ae7837",5100:"ba20a8bc",5185:"8725cac8",5215:"ec6afc3a",5238:"e9043143",5256:"2552b90c",5342:"c07c0a48",5343:"8411ef59",5405:"b4254786",5468:"ab0c79ae",5476:"cb96e1e9",5497:"eb03a6db",5632:"619f370c",5709:"e3f517ce",5732:"2845e02d",5745:"efa6856c",5855:"7a93ab0d",5924:"119511e2",5929:"7ee07099",6031:"db5e5d2e",6043:"d041b537",6082:"b249bcf5",6164:"ca5c8a23",6170:"f498d3f3",6184:"b38521a5",6222:"37aca0ed",6229:"dd8a21b5",6276:"7de1ce24",6346:"cc0b37a4",6432:"61176b64",6442:"0650aed8",6447:"614755a5",6463:"3920bfa1",6500:"a90b439e",6519:"eafc5450",6543:"7f0d2e50",6620:"062b8138",6735:"2e4e6bb4",6751:"50ee394e",6766:"de8e38bd",6788:"2f58ac1b",6801:"6f1c07bf",6833:"a3a3259d",6981:"d79c0217",6988:"a77dd39c",7030:"11284d31",7053:"b4379a38",7121:"1c27a3dd",7166:"3b26059f",7169:"f035932d",7181:"251122ce",7190:"a89c3137",7207:"1dec9a0f",7284:"7f6f7da3",7298:"ac26f4c1",7299:"e9d515c7",7347:"114e3e1d",7355:"1695557b",7414:"d9eb2bd1",7452:"391389fb",7493:"dc191d5c",7531:"31d6b080",7551:"591d8b92",7575:"57347fcc",7645:"837e7198",7659:"d535e6b7",7679:"ed298570",7700:"4393798f",7704:"91c88607",7754:"8803c46f",7755:"fd76f94d",7759:"4f653951",7772:"81486390",7781:"346dced6",7817:"2514ea8c",7918:"6c096025",7925:"a46e7f26",7950:"6e8b8d39",8007:"8d43c6e9",8037:"9ac8288c",8170:"72bcf579",8189:"8f121392",8202:"d6a72c6f",8206:"d55fe4ce",8228:"eee29c97",8307:"b86f02a4",8390:"24ed407a",8447:"034382e9",8450:"e940a6ef",8552:"34b42946",8650:"34999ac4",8740:"271de015",8782:"55543957",8794:"c5224475",8797:"81f6ff86",8810:"0ffe5445",8832:"254b79ce",8876:"17ecb02c",9164:"43a9c46e",9181:"9fc967a1",9213:"d62bcfc6",9316:"63b5ae77",9327:"e65701de",9334:"7d6e64fc",9347:"9e151803",9390:"3662cee4",9411:"25179760",9455:"59bcb4de",9506:"2bb804f4",9514:"7062d58b",9555:"df7e94fe",9557:"15c85ad5",9697:"a294e810",9817:"bf9cc31c",9882:"2f9305e0",9902:"abf8d925"}[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,c)=>Object.prototype.hasOwnProperty.call(e,c),b={},d="zealot-new-docs:",r.l=(e,c,a,f)=>{if(b[e])b[e].push(c);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")==d+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",d+a),t.src=e),b[e]=[c];var l=(c,a)=>{t.onerror=t.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(a))),c)return c(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="/zh-Hans/",r.gca=function(e){return e={10743099:"2571",17896441:"7918",40622858:"9411",42055627:"6833","7a31e8eb":"39","935f2afb":"53",c1af49ed:"80","2de1c1b9":"105",ae0b00ed:"131","00f34551":"144",b0d48a44:"184","93e83d03":"270",cf72ee6a:"324","8dbd9405":"536",cbffe0ba:"594",c3697579:"631","20570c26":"639","6a6b352a":"652",aa45ed72:"713",cc8d1b20:"721","097ad104":"726",e177b72e:"847","6025cfa3":"859",f3ecbbb7:"861","07e94b94":"959","06a7ce3e":"1013","5fe54c51":"1042","5171b55b":"1075",fa6a7c71:"1125",bc4a1c03:"1147",b6e49d05:"1224","405e4d0a":"1233",f576f290:"1290",d7c763e8:"1297","5f6e077b":"1300",f3b6e326:"1717","575c49fd":"1821",ab09b93d:"1839","0659cada":"1854",d0f9f7b0:"1931","2a1b2070":"2141",c869843a:"2170","0376ac8d":"2171",c5a4c00b:"2208",e471e2c1:"2238","9d0b921d":"2239","210ec931":"2247","0f991629":"2254","9a46955c":"2300","78d3bc26":"2347",f25fc619:"2353",eb89accb:"2390",b2ef10a5:"2406","36ff01e5":"2515",c89e1d41:"2559",bbb0fa6e:"2570",b0b6b74b:"2608",c6bdf690:"2705","3b925495":"2745","3d079836":"2922","4a0f0e0c":"2986",faaf8c96:"2994",a21619df:"3020","23e1330d":"3032",e676557f:"3082","1f391b9e":"3085","26cfe7d9":"3091","3731d319":"3137","68518edc":"3144","6aeebc73":"3165","0c22aff4":"3194",a9736a03:"3240","05c34111":"3262","0ef4ad01":"3313","6de0a3bc":"3369","67d72155":"3434",abf33808:"3705",e25c1561:"3775","9d0a861d":"3868",ad5e89b7:"3946","88e109fd":"3975","6988bd10":"4061","8e4c1cdf":"4069","77ba73fa":"4085",ac20dd04:"4114","000e92dd":"4123",b8ca8336:"4127",c704004d:"4156",c4f5d8e4:"4195","04af2ec6":"4219",b667b6c3:"4259",a06cc266:"4288",ec4538ed:"4328","61b3b8ce":"4343",c38ecdbc:"4360","0409ce86":"4529","808d5cf9":"4552",d02aa106:"4590","28463b1d":"4620","46458cf8":"4641",cd05e63c:"4775",f3e148a8:"4938","927828a2":"5086","980d6c79":"5100","4960790f":"5185","33ad4946":"5215","2ac37e2a":"5238",e74b89a8:"5256","4bc9e19e":"5342",c7c3383a:"5343","20cbbbee":"5405",e84771ae:"5468","2ba4a649":"5476",b0190f04:"5497","65f8d4cd":"5632",cae0f04b:"5709","6821510c":"5732","580231d5":"5745",eb842df6:"5855",b155671d:"5924",c3412635:"5929","9aa09611":"6031",b43ef384:"6043","422bbee2":"6082",f057e2be:"6164","709f7e27":"6170","4aeacf08":"6184",de6e37e2:"6222",fe394c5b:"6229","4aefe824":"6276","9eed9fa1":"6346","731441ba":"6432","68604c4e":"6442","1ab1b8b6":"6447","320c81fa":"6463","493ecea9":"6500","63d75c88":"6519","8c755c24":"6543","9387e8f1":"6620","500b40a2":"6735","756ae957":"6751","6c1f465d":"6766","56786dcf":"6788","7f084e8e":"6801",b572cb1f:"6981","77ad6583":"6988","4daa79cc":"7030","797c3697":"7053","66a79633":"7121","0b2dde68":"7166","2da1a83d":"7169","1d59b05a":"7181","546445a3":"7190","8c7fed4d":"7207",b168d81c:"7284","492fa892":"7298","7b50d085":"7299","08927acb":"7347","5b48482c":"7355","393be207":"7414",ef9024f9:"7452","089c33a0":"7493","78f6b461":"7531",c941fb92:"7551",f500fe2a:"7575",a7434565:"7645","986b83c2":"7659",dd90aca1:"7679","7e84284a":"7700","92f17503":"7704","93332d63":"7754","47c1865a":"7755","1ab7b698":"7759","3384f4b5":"7772",a73dab33:"7781","23b09800":"7817","9c76208a":"7925","3d648c75":"7950","70a2637b":"8007","4b5eb73a":"8037","30738da4":"8170","9d7c6944":"8189","1ec5d4b5":"8202","10ab72a2":"8206","4b6154ab":"8228","3e64385b":"8307","0da09c0c":"8390",b51b060c:"8447",d75d92bc:"8450","71cdea68":"8552",e649ac20:"8650","381e4cde":"8740",b38b46a9:"8782",dc9db4d6:"8794","5914602b":"8797",ffe0e092:"8810","6fa94343":"8832",c6fb1e3c:"8876","498392b4":"9164",c9b278a8:"9181","380655f7":"9213","3f7af0f1":"9316","2ff16664":"9327","247783bb":"9334","7e2cd3a9":"9347","53ae73f2":"9390","1c821441":"9506","1be78505":"9514","0b5c90e4":"9555","5e69b000":"9557","89a1149b":"9697","14eb3368":"9817","533b3bff":"9882","94a70f3c":"9902"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(c,a)=>{var b=r.o(e,c)?e[c]:void 0;if(0!==b)if(b)a.push(b[2]);else if(/^(1303|532)$/.test(c))e[c]=0;else{var d=new Promise(((a,d)=>b=e[c]=[a,d]));a.push(b[2]=d);var f=r.p+r.u(c),t=new Error;r.l(f,(a=>{if(r.o(e,c)&&(0!==(b=e[c])&&(e[c]=void 0),b)){var d=a&&("load"===a.type?"missing":a.type),f=a&&a.target&&a.target.src;t.message="Loading chunk "+c+" failed.\n("+d+": "+f+")",t.name="ChunkLoadError",t.type=d,t.request=f,b[1](t)}}),"chunk-"+c,c)}},r.O.j=c=>0===e[c];var c=(c,a)=>{var b,d,f=a[0],t=a[1],o=a[2],n=0;if(f.some((c=>0!==e[c]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(c&&c(a);n<f.length;n++)d=f[n],r.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return r.O(i)},a=self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[];a.forEach(c.bind(null,0)),a.push=c.bind(null,a.push.bind(a))})()})(); \ No newline at end of file +(()=>{"use strict";var e,a,c,b,f,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,b,f)=>{if(!c){var d=1/0;for(i=0;i<e.length;i++){c=e[i][0],b=e[i][1],f=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&f||d>=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f<d&&(d=f));if(t){e.splice(i--,1);var n=b();void 0!==n&&(a=n)}}return a}f=f||0;for(var i=e.length;i>0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,b,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(f,d),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({39:"7a31e8eb",53:"935f2afb",80:"c1af49ed",105:"2de1c1b9",131:"ae0b00ed",144:"00f34551",184:"b0d48a44",270:"93e83d03",324:"cf72ee6a",536:"8dbd9405",594:"cbffe0ba",631:"c3697579",639:"20570c26",652:"6a6b352a",713:"aa45ed72",721:"cc8d1b20",726:"097ad104",847:"e177b72e",859:"6025cfa3",861:"f3ecbbb7",959:"07e94b94",1013:"06a7ce3e",1042:"5fe54c51",1075:"5171b55b",1125:"fa6a7c71",1147:"bc4a1c03",1224:"b6e49d05",1233:"405e4d0a",1290:"f576f290",1297:"d7c763e8",1300:"5f6e077b",1717:"f3b6e326",1821:"575c49fd",1839:"ab09b93d",1854:"0659cada",1931:"d0f9f7b0",2141:"2a1b2070",2170:"c869843a",2171:"0376ac8d",2208:"c5a4c00b",2238:"e471e2c1",2239:"9d0b921d",2247:"210ec931",2254:"0f991629",2300:"9a46955c",2347:"78d3bc26",2353:"f25fc619",2390:"eb89accb",2406:"b2ef10a5",2515:"36ff01e5",2559:"c89e1d41",2570:"bbb0fa6e",2571:"10743099",2608:"b0b6b74b",2705:"c6bdf690",2745:"3b925495",2922:"3d079836",2986:"4a0f0e0c",2994:"faaf8c96",3020:"a21619df",3032:"23e1330d",3082:"e676557f",3085:"1f391b9e",3091:"26cfe7d9",3137:"3731d319",3144:"68518edc",3165:"6aeebc73",3194:"0c22aff4",3240:"a9736a03",3262:"05c34111",3313:"0ef4ad01",3369:"6de0a3bc",3434:"67d72155",3705:"abf33808",3775:"e25c1561",3868:"9d0a861d",3946:"ad5e89b7",3975:"88e109fd",4061:"6988bd10",4069:"8e4c1cdf",4085:"77ba73fa",4114:"ac20dd04",4123:"000e92dd",4127:"b8ca8336",4156:"c704004d",4195:"c4f5d8e4",4219:"04af2ec6",4259:"b667b6c3",4288:"a06cc266",4328:"ec4538ed",4343:"61b3b8ce",4360:"c38ecdbc",4529:"0409ce86",4552:"808d5cf9",4590:"d02aa106",4620:"28463b1d",4641:"46458cf8",4775:"cd05e63c",4938:"f3e148a8",5086:"927828a2",5100:"980d6c79",5185:"4960790f",5215:"33ad4946",5238:"2ac37e2a",5256:"e74b89a8",5342:"4bc9e19e",5343:"c7c3383a",5405:"20cbbbee",5468:"e84771ae",5476:"2ba4a649",5497:"b0190f04",5632:"65f8d4cd",5709:"cae0f04b",5732:"6821510c",5745:"580231d5",5855:"eb842df6",5924:"b155671d",5929:"c3412635",6031:"9aa09611",6043:"b43ef384",6082:"422bbee2",6164:"f057e2be",6170:"709f7e27",6184:"4aeacf08",6222:"de6e37e2",6229:"fe394c5b",6276:"4aefe824",6346:"9eed9fa1",6432:"731441ba",6442:"68604c4e",6447:"1ab1b8b6",6463:"320c81fa",6500:"493ecea9",6519:"63d75c88",6543:"8c755c24",6620:"9387e8f1",6735:"500b40a2",6751:"756ae957",6766:"6c1f465d",6788:"56786dcf",6801:"7f084e8e",6833:"42055627",6981:"b572cb1f",6988:"77ad6583",7030:"4daa79cc",7053:"797c3697",7121:"66a79633",7166:"0b2dde68",7169:"2da1a83d",7181:"1d59b05a",7190:"546445a3",7207:"8c7fed4d",7284:"b168d81c",7298:"492fa892",7299:"7b50d085",7347:"08927acb",7355:"5b48482c",7414:"393be207",7452:"ef9024f9",7493:"089c33a0",7531:"78f6b461",7551:"c941fb92",7575:"f500fe2a",7645:"a7434565",7659:"986b83c2",7679:"dd90aca1",7700:"7e84284a",7704:"92f17503",7754:"93332d63",7755:"47c1865a",7759:"1ab7b698",7772:"3384f4b5",7781:"a73dab33",7817:"23b09800",7918:"17896441",7925:"9c76208a",7950:"3d648c75",8007:"70a2637b",8037:"4b5eb73a",8170:"30738da4",8189:"9d7c6944",8202:"1ec5d4b5",8206:"10ab72a2",8228:"4b6154ab",8307:"3e64385b",8390:"0da09c0c",8447:"b51b060c",8450:"d75d92bc",8552:"71cdea68",8650:"e649ac20",8740:"381e4cde",8782:"b38b46a9",8794:"dc9db4d6",8797:"5914602b",8810:"ffe0e092",8832:"6fa94343",8876:"c6fb1e3c",9164:"498392b4",9181:"c9b278a8",9213:"380655f7",9316:"3f7af0f1",9327:"2ff16664",9334:"247783bb",9347:"7e2cd3a9",9390:"53ae73f2",9411:"40622858",9506:"1c821441",9514:"1be78505",9555:"0b5c90e4",9557:"5e69b000",9697:"89a1149b",9817:"14eb3368",9882:"533b3bff",9902:"94a70f3c"}[e]||e)+"."+{39:"e317e887",53:"17df8ec4",80:"2e5f2978",105:"e16d6bce",131:"ac560ab6",144:"dd00da09",184:"dd548038",270:"80d1a67d",324:"aa57a03a",536:"c2f54e6e",594:"3d7e9944",631:"c73234eb",639:"c057422a",652:"74181fc1",713:"fe0a6923",721:"e3ceee0f",726:"d5eed7c4",847:"90ea20c7",859:"318673d0",861:"68d890e1",959:"f5b86a0a",1013:"eebaf313",1042:"00bb025d",1075:"d4afc109",1125:"3e6312af",1147:"aeea4337",1224:"26c824c7",1233:"866d252d",1290:"f794fc88",1297:"255bb749",1300:"73bb2351",1717:"9084ce02",1821:"26cddc95",1839:"e0a2c17f",1854:"6d3d65f1",1931:"f3da805d",2141:"545a2b6a",2170:"6597928c",2171:"c58a7b5c",2208:"33147048",2238:"6d3b5298",2239:"e137651b",2247:"0d6bf754",2254:"c64a180a",2300:"50568c8f",2347:"25a21ca3",2353:"33369f9f",2390:"d5895f13",2406:"bb7c8f85",2515:"c74b7f69",2559:"2f10de5e",2570:"ef51c9e9",2571:"ca663263",2608:"71148d5c",2705:"53da6006",2745:"0e024d03",2922:"c01ac5b8",2986:"4a6ac4e8",2994:"b3d4b832",3020:"15ef0aad",3032:"5b8ddfb0",3082:"33f75a2c",3085:"9181abc6",3091:"c67ffa99",3137:"91bf23be",3144:"237417f1",3165:"20fea439",3194:"e457901f",3240:"b1d855cf",3262:"ee6b6f6d",3313:"a7fb8f86",3369:"bd877831",3434:"14a70944",3705:"05c27bed",3775:"c0ff416b",3868:"86eac8ef",3946:"c9b452c8",3975:"0623decd",4061:"982d477f",4069:"321da4ce",4085:"ae86c2ff",4114:"bdb1d880",4123:"e15bb030",4127:"6b35e9d9",4156:"2a51d453",4195:"83acb6e2",4219:"96f53e5f",4259:"623917b9",4288:"4727cb78",4328:"e3642bb5",4343:"ef1835be",4360:"87b87228",4529:"864bbeeb",4552:"d0540836",4590:"d32d0252",4620:"a870fa84",4641:"49c6b2ed",4775:"bd0c6adf",4938:"fe52a823",4972:"163ed418",5086:"31ae7837",5100:"ba20a8bc",5185:"8725cac8",5215:"ec6afc3a",5238:"e9043143",5256:"2552b90c",5342:"e5b16ca4",5343:"8411ef59",5405:"b4254786",5468:"ab0c79ae",5476:"cb96e1e9",5497:"eb03a6db",5632:"619f370c",5709:"e3f517ce",5732:"2845e02d",5745:"efa6856c",5855:"7a93ab0d",5924:"119511e2",5929:"7ee07099",6031:"db5e5d2e",6043:"a46875fd",6082:"b249bcf5",6164:"ca5c8a23",6170:"f498d3f3",6184:"b38521a5",6222:"37aca0ed",6229:"dd8a21b5",6276:"7de1ce24",6346:"cc0b37a4",6432:"61176b64",6442:"0650aed8",6447:"614755a5",6463:"3920bfa1",6500:"a90b439e",6519:"eafc5450",6543:"7f0d2e50",6620:"062b8138",6735:"2e4e6bb4",6751:"50ee394e",6766:"de8e38bd",6788:"ce1d840f",6801:"6f1c07bf",6833:"a3a3259d",6981:"45ba144c",6988:"a77dd39c",7030:"11284d31",7053:"b4379a38",7121:"1c27a3dd",7166:"3b26059f",7169:"f035932d",7181:"251122ce",7190:"a89c3137",7207:"1dec9a0f",7284:"7f6f7da3",7298:"ac26f4c1",7299:"e9d515c7",7347:"114e3e1d",7355:"1695557b",7414:"d9eb2bd1",7452:"391389fb",7493:"dc191d5c",7531:"31d6b080",7551:"52305bd6",7575:"57347fcc",7645:"837e7198",7659:"d535e6b7",7679:"ed298570",7700:"4393798f",7704:"91c88607",7754:"8803c46f",7755:"fd76f94d",7759:"4f653951",7772:"81486390",7781:"346dced6",7817:"2514ea8c",7918:"d30cc80e",7925:"a46e7f26",7950:"6e8b8d39",8007:"8d43c6e9",8037:"9ac8288c",8170:"72bcf579",8189:"8f121392",8202:"d6a72c6f",8206:"d55fe4ce",8228:"eee29c97",8307:"b86f02a4",8390:"24ed407a",8447:"034382e9",8450:"e940a6ef",8552:"34b42946",8650:"34999ac4",8740:"271de015",8782:"a1fa7312",8794:"c5224475",8797:"17a5ffe7",8810:"0ffe5445",8832:"254b79ce",8876:"17ecb02c",9164:"43a9c46e",9181:"9fc967a1",9213:"c4872d66",9316:"63b5ae77",9327:"e65701de",9334:"7d6e64fc",9347:"9e151803",9390:"3662cee4",9411:"25179760",9455:"649e6775",9506:"2bb804f4",9514:"1dba3c15",9555:"df7e94fe",9557:"15c85ad5",9697:"a294e810",9817:"94edc1dc",9882:"2f9305e0",9902:"abf8d925"}[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),b={},f="zealot-new-docs:",r.l=(e,a,c,d)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==c)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")==f+c){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",f+c),t.src=e),b[e]=[a];var l=(a,c)=>{t.onerror=t.onload=null,clearTimeout(s);var f=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},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="/zh-Hans/",r.gca=function(e){return e={10743099:"2571",17896441:"7918",40622858:"9411",42055627:"6833","7a31e8eb":"39","935f2afb":"53",c1af49ed:"80","2de1c1b9":"105",ae0b00ed:"131","00f34551":"144",b0d48a44:"184","93e83d03":"270",cf72ee6a:"324","8dbd9405":"536",cbffe0ba:"594",c3697579:"631","20570c26":"639","6a6b352a":"652",aa45ed72:"713",cc8d1b20:"721","097ad104":"726",e177b72e:"847","6025cfa3":"859",f3ecbbb7:"861","07e94b94":"959","06a7ce3e":"1013","5fe54c51":"1042","5171b55b":"1075",fa6a7c71:"1125",bc4a1c03:"1147",b6e49d05:"1224","405e4d0a":"1233",f576f290:"1290",d7c763e8:"1297","5f6e077b":"1300",f3b6e326:"1717","575c49fd":"1821",ab09b93d:"1839","0659cada":"1854",d0f9f7b0:"1931","2a1b2070":"2141",c869843a:"2170","0376ac8d":"2171",c5a4c00b:"2208",e471e2c1:"2238","9d0b921d":"2239","210ec931":"2247","0f991629":"2254","9a46955c":"2300","78d3bc26":"2347",f25fc619:"2353",eb89accb:"2390",b2ef10a5:"2406","36ff01e5":"2515",c89e1d41:"2559",bbb0fa6e:"2570",b0b6b74b:"2608",c6bdf690:"2705","3b925495":"2745","3d079836":"2922","4a0f0e0c":"2986",faaf8c96:"2994",a21619df:"3020","23e1330d":"3032",e676557f:"3082","1f391b9e":"3085","26cfe7d9":"3091","3731d319":"3137","68518edc":"3144","6aeebc73":"3165","0c22aff4":"3194",a9736a03:"3240","05c34111":"3262","0ef4ad01":"3313","6de0a3bc":"3369","67d72155":"3434",abf33808:"3705",e25c1561:"3775","9d0a861d":"3868",ad5e89b7:"3946","88e109fd":"3975","6988bd10":"4061","8e4c1cdf":"4069","77ba73fa":"4085",ac20dd04:"4114","000e92dd":"4123",b8ca8336:"4127",c704004d:"4156",c4f5d8e4:"4195","04af2ec6":"4219",b667b6c3:"4259",a06cc266:"4288",ec4538ed:"4328","61b3b8ce":"4343",c38ecdbc:"4360","0409ce86":"4529","808d5cf9":"4552",d02aa106:"4590","28463b1d":"4620","46458cf8":"4641",cd05e63c:"4775",f3e148a8:"4938","927828a2":"5086","980d6c79":"5100","4960790f":"5185","33ad4946":"5215","2ac37e2a":"5238",e74b89a8:"5256","4bc9e19e":"5342",c7c3383a:"5343","20cbbbee":"5405",e84771ae:"5468","2ba4a649":"5476",b0190f04:"5497","65f8d4cd":"5632",cae0f04b:"5709","6821510c":"5732","580231d5":"5745",eb842df6:"5855",b155671d:"5924",c3412635:"5929","9aa09611":"6031",b43ef384:"6043","422bbee2":"6082",f057e2be:"6164","709f7e27":"6170","4aeacf08":"6184",de6e37e2:"6222",fe394c5b:"6229","4aefe824":"6276","9eed9fa1":"6346","731441ba":"6432","68604c4e":"6442","1ab1b8b6":"6447","320c81fa":"6463","493ecea9":"6500","63d75c88":"6519","8c755c24":"6543","9387e8f1":"6620","500b40a2":"6735","756ae957":"6751","6c1f465d":"6766","56786dcf":"6788","7f084e8e":"6801",b572cb1f:"6981","77ad6583":"6988","4daa79cc":"7030","797c3697":"7053","66a79633":"7121","0b2dde68":"7166","2da1a83d":"7169","1d59b05a":"7181","546445a3":"7190","8c7fed4d":"7207",b168d81c:"7284","492fa892":"7298","7b50d085":"7299","08927acb":"7347","5b48482c":"7355","393be207":"7414",ef9024f9:"7452","089c33a0":"7493","78f6b461":"7531",c941fb92:"7551",f500fe2a:"7575",a7434565:"7645","986b83c2":"7659",dd90aca1:"7679","7e84284a":"7700","92f17503":"7704","93332d63":"7754","47c1865a":"7755","1ab7b698":"7759","3384f4b5":"7772",a73dab33:"7781","23b09800":"7817","9c76208a":"7925","3d648c75":"7950","70a2637b":"8007","4b5eb73a":"8037","30738da4":"8170","9d7c6944":"8189","1ec5d4b5":"8202","10ab72a2":"8206","4b6154ab":"8228","3e64385b":"8307","0da09c0c":"8390",b51b060c:"8447",d75d92bc:"8450","71cdea68":"8552",e649ac20:"8650","381e4cde":"8740",b38b46a9:"8782",dc9db4d6:"8794","5914602b":"8797",ffe0e092:"8810","6fa94343":"8832",c6fb1e3c:"8876","498392b4":"9164",c9b278a8:"9181","380655f7":"9213","3f7af0f1":"9316","2ff16664":"9327","247783bb":"9334","7e2cd3a9":"9347","53ae73f2":"9390","1c821441":"9506","1be78505":"9514","0b5c90e4":"9555","5e69b000":"9557","89a1149b":"9697","14eb3368":"9817","533b3bff":"9882","94a70f3c":"9902"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)c.push(b[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>b=e[a]=[c,f]));c.push(b[2]=f);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var f=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+d+")",t.name="ChunkLoadError",t.type=f,t.request=d,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var b,f,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(c);n<d.length;n++)f=d[n],r.o(e,f)&&e[f]&&e[f][0](),e[f]=0;return r.O(i)},c=self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[];c.forEach(a.bind(null,0)),c.push=a.bind(null,c.push.bind(c))})()})(); \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/administrator/index.html b/zh-Hans/docs/4.x/category/administrator/index.html index dfe168852..4d0a69a97 100644 --- a/zh-Hans/docs/4.x/category/administrator/index.html +++ b/zh-Hans/docs/4.x/category/administrator/index.html @@ -4,13 +4,13 @@ <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v2.4.3"> <title data-rh="true">管理面板 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/apps/index.html b/zh-Hans/docs/4.x/category/apps/index.html index c711bba48..bd787ff7d 100644 --- a/zh-Hans/docs/4.x/category/apps/index.html +++ b/zh-Hans/docs/4.x/category/apps/index.html @@ -4,13 +4,13 @@ 应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/cloud-provider-guides/index.html b/zh-Hans/docs/4.x/category/cloud-provider-guides/index.html index dabf49bd3..0ae463067 100644 --- a/zh-Hans/docs/4.x/category/cloud-provider-guides/index.html +++ b/zh-Hans/docs/4.x/category/cloud-provider-guides/index.html @@ -4,13 +4,13 @@ 云服务商 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/configuration/index.html b/zh-Hans/docs/4.x/category/configuration/index.html index d2fe24297..87a520122 100644 --- a/zh-Hans/docs/4.x/category/configuration/index.html +++ b/zh-Hans/docs/4.x/category/configuration/index.html @@ -4,13 +4,13 @@ 配置 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/debug-files/index.html b/zh-Hans/docs/4.x/category/debug-files/index.html index 7fa7a410a..b4723887c 100644 --- a/zh-Hans/docs/4.x/category/debug-files/index.html +++ b/zh-Hans/docs/4.x/category/debug-files/index.html @@ -4,13 +4,13 @@ 调试文件 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/deployment/index.html b/zh-Hans/docs/4.x/category/deployment/index.html index 8a0eacad2..24ad534aa 100644 --- a/zh-Hans/docs/4.x/category/deployment/index.html +++ b/zh-Hans/docs/4.x/category/deployment/index.html @@ -4,13 +4,13 @@ 部署 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/local-development/index.html b/zh-Hans/docs/4.x/category/local-development/index.html index 42934a5d5..eb1a12e94 100644 --- a/zh-Hans/docs/4.x/category/local-development/index.html +++ b/zh-Hans/docs/4.x/category/local-development/index.html @@ -4,13 +4,13 @@ 本地开发 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/monitoring/index.html b/zh-Hans/docs/4.x/category/monitoring/index.html index a7ccd164f..e0c0aeedc 100644 --- a/zh-Hans/docs/4.x/category/monitoring/index.html +++ b/zh-Hans/docs/4.x/category/monitoring/index.html @@ -4,13 +4,13 @@ 监控 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/sdks/index.html b/zh-Hans/docs/4.x/category/sdks/index.html index 3b36fd301..e9c61b27d 100644 --- a/zh-Hans/docs/4.x/category/sdks/index.html +++ b/zh-Hans/docs/4.x/category/sdks/index.html @@ -4,13 +4,13 @@ 移动 SDK | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/category/toolkits/index.html b/zh-Hans/docs/4.x/category/toolkits/index.html index feb73d052..821d1f269 100644 --- a/zh-Hans/docs/4.x/category/toolkits/index.html +++ b/zh-Hans/docs/4.x/category/toolkits/index.html @@ -4,13 +4,13 @@ 工具箱 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/contributing-guide/index.html b/zh-Hans/docs/4.x/contributing-guide/index.html index bfaf3f8f4..ad678edc7 100644 --- a/zh-Hans/docs/4.x/contributing-guide/index.html +++ b/zh-Hans/docs/4.x/contributing-guide/index.html @@ -4,14 +4,14 @@ 贡献者指南 | Zealot - - + +
版本:4.x

贡献者指南

本指南将会帮助你更好的上手 Zealot!感谢您对本项目感兴趣。在提交你的贡献之前请仔细认真阅读如下指南:

准备工作

贡献代码前请在 Issues 确认是否存在,没有发现的话欢迎动动小手创建新 Issue,创建之后你会收到一个自动回复请勿担心我会在看到后尽快整理并回应。 如果解决方案非常的复杂,建议极可能完整描述背景、解决目的和方案以方便核心开发者审核。

准备本地开发环境

我们将会从如下指南帮助准备和部署本地 Zealot 开发环境:

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer/index.html b/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer/index.html index b5e58bb35..6c90baa41 100644 --- a/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer/index.html +++ b/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer/index.html @@ -4,13 +4,13 @@ Visual Studio Code Dev Container 开发部署指南 | Zealot - - + +
版本:4.x

Visual Studio Code Dev Container 开发部署指南

Dev Container (Developing inside a Container) 是 Visual Studio Code 使用 Docker 作为开发环境能够实现在本地无需配置开发环境在容器开发有近乎本地体验的解决方案。

VSCode devcontainer

系统依赖

在开发之前,你需要安装最新版本的 Git,Virsual Studio Code,Docker 和 docker-compose。

安装 Git

因操作系统不同,建议按照官方安装教程操作。

安装 Docker & docker-compose

安装 Visual Studio Code

Visual Studio Code 是一个跨平台运行的免费的代码编辑器,根据操作系统选择你的安装方式:

  1. 下载 Visual Studio Code macOS 版。
  2. 打开浏览器下载界面找到已下载的应用文件或压缩文件。
  3. 如果是压缩文件先进行解压缩操作,如果使用 Safari 下载通常会帮你自动解压缩。
  4. 拖拽 Visual Studio Code.app 到系统应用文件夹。
  5. 双击 VS Code 应用即可打开应用。

安装 Remote container 扩展

按照官方教程安装 Remote Container extension

VSCode extension

获取 Zealot Codespace

Zealot Codespace 同样存放在 Zealot 项目 .devcontailer 目录,你需要先克隆项目源代码。

git clone https://github.com/tryzealot/zealot.git

Codespace 包含了一系列文件:

文件名说明
devcontainer.jsonVSCode devcontainer 配置文件
Dockerfile.base镜像核心,变更会自动推送到不同 registry 仓库
Dockerfile间接镜像,主要是节省编译时间
docker-compose.yml项目服务依赖
create-db-user.sql用于初始化 Postgres 默认用户及权限

在容器内打开项目

打开 Visual Studio Code 应用后在 Command Palette 输入 Dev Containers: Open Folder in Container... 回车选择刚克隆下来的 Zealot 项目目录。

VSCode Command Palette

首次执行会拉取 Zealot Codespace 镜像并开始构建,过程会持续一段时间期间可点击 Starting Dev Container (show log) 查看构建实时日志。

VSCode Command Palette

构建完成并启动完毕会加载项目文件和 zsh 终端,通过日志可以看到如下信息:

[7293 ms] Start: Run in container: cat /proc/344/environ
[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.
[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e
[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established
[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close
[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.
[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close

在宿主机也能看到 Docker 启动了 docker-compose 在运行:

Docker-Compose containers

启动项目

如果没有打开 VSCode 内置终端可以通过快捷键 Ctrl + ` 打开,新打开一个终端运行 bin/dev 可运行 Zealot 依赖的所有服务。

VSCode Zealot in Container

浏览器访问服务

在运行 bin/dev 一会后你会在右下角窗口看到 Open in Browser 窗口点击可打开 Zealot 网页服务。同样也可以通过终端区域顶部 Ports 选项查看可转发端口的服务,点击浏览器图标会把容器的端口转发并绑定到本地随机断开后上面访问。

VSCode forwarded ports

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/contributing-guide/local-development/source-code/index.html b/zh-Hans/docs/4.x/contributing-guide/local-development/source-code/index.html index d357cfe98..6f4cca130 100644 --- a/zh-Hans/docs/4.x/contributing-guide/local-development/source-code/index.html +++ b/zh-Hans/docs/4.x/contributing-guide/local-development/source-code/index.html @@ -4,13 +4,13 @@ 源码部署 Zealot 指南 | Zealot - - + +
版本:4.x

源码部署 Zealot 指南

如下整理了不同操作系统的本地部署开发教程。

准备部署环境

macOS

安装 homebrew

首先需要安装 Xcode Command tools:

$ xcode-select --install

如果提示安装失败,需要从 https://developer.apple.com/downloads 下载安装。

之后安装 macOS 的包管理工具 Homebrew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装依赖

之后开始安装环境依赖

$ brew install redis postgresql webp imagemagick node git

M1 用户需要设置依赖编译路径到 SHELL 的配置文件中:

export CPATH=/opt/homebrew/include/
export LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ brew services start postgresql
$ brew services start redis

Postgresql 还需要创建默认用户名:

$ createuser --superuser zealot

# 如果担心权限过高可以只开启创建数据库权限
$ createuser --createdb zealot

yarn

$ npm install -g yarn

运行起来后使用浏览器访问 http://localhost:3000

疑难杂症

M1 芯片 MacOS 问题
aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o

使用 bundle install 会遇到如上问题这个是因为 homebrew 安装 webp 依赖之后编译路径无法被找到,上面有解决办法。

Debian (Ubuntu)

安装环境依赖

$ apt update
$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev

安装依赖

$ apt install -y redis postgresql-client node

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ systemctl postgres start
$ systemctl redis start

Postgresql 还需要创建默认用户名:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

node

$ npm install -g yarn

Alpine Linux

安装环境依赖

$ apk --update --no-cache add build-base libxml2 libxslt git \
libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \
tzdata

如果是在 arm 架构安装还需要额外安装 gcompat glib 兼容层,否则会报 "Error loading shared library" 异常错误。

安装依赖

$ apk --update --no-cache redis postgresql node

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ rc-service postgres start
$ rc-service redis start

Postgresql 还需要创建默认用户名:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# 如果担心数据库用户权限,可仅开启创建数据库权限
$ createuser --createdb zealot

yarn

$ npm install -g yarn

安装 Ruby

可以通过 asdf、rvm 任意一种方式安装。

一个支持主流开发语言版本切换的工具,请按照官方安装教程好之后安装 ruby:

# 开启 Ruby 3.2.0 YJIT 新特性需要安装 rust 1.58+
# 可选安装:
asdf plugin add rust
asdf install rust latest
asdf global rust latest
export RUBY_CONFIGURE_OPTS=--enable-yjit

# 必须安装
asdf plugin add ruby
asdf install ruby 3.2.0
asdf global ruby 3.2.0

克隆源代码

git clone https://github.com/tryzealot/zealot.git

初始化

以下步骤均需要在 zealot 根目录执行。

bundler

安装 Ruby gems 第三方类库

$ [sudo] gem install bundler
$ bundle install

yarn

安装前端第三方类库

$ yarn install

初始化数据库

确保连接数据库信息没有问题,后将会创建数据库表并创建表结构

$ rails db:create
$ rails db:migrate

配置数据库连接参数可通过环境变量或更改 config/database.yml 文件。

初始化预制数据

初始化管理员账号和应用样例

$ rails db:seed

运行 Zealot 服务

$ bin/dev

打开浏览器访问 http://localhost:3000

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/api/apps/index.html b/zh-Hans/docs/4.x/developer-guide/api/apps/index.html index 0c99fe3bf..82cba88f8 100644 --- a/zh-Hans/docs/4.x/developer-guide/api/apps/index.html +++ b/zh-Hans/docs/4.x/developer-guide/api/apps/index.html @@ -4,13 +4,13 @@ 应用接口 | Zealot - - + +
版本:4.x

应用接口

上传应用

上传应用,仅支持 iOS, Android 和 macOS 类型。

POST /api/apps/upload

参数

信息
名称类型是否必须描述
fileFiletrue应用本地路径的内容
channel_keyStringfalse应用具体渠道的 Key,没有传此参数会字段创建对于的应用、类型和渠道
nameStringfalse应用名称,为空时取 App 的信息
release_typeStringfalse应用类型,比如 debug, beta, adhoc, release, enterprise 等
sourceStringfalse上传渠道名称,默认是 api
changelogStringfalse变更日志,接受纯文本或 JSON 格式化的数据
branchStringfalse上传应用时的git branch名称
git_commitStringfalse上传应用时的 git commit hash
ci_urlStringfalseCI 项目构建地址
custom_fieldsStringfalse这是一个用 JSON 字符串定义的自定义字段,
可配置名称,值以及 fontawesome 图标用于在页面详情展示

For changelog attribute which it accepts both plain text and JSON formatted contents:

plain text:

message 1\nmessage 2

JSON:

[
{
"message": "message 1",
"author": "admin",
"email": "admin@zealot.com",
"date": "2021-11-11 11:11:11"
},
{
"message": "message 1",
"author": "developer",
"email": "developer@zealot.com",
"date": "2021-11-11 11:11:11"
}
]

对于 custom_fields 的用法,它是一个使用 JSON 格式的以键值对为单位的数组,比如需要自定义国家 country=China 并配置图标为 fontawesome 的 flag

curl -X POST \
'https://YOUR_ZEALOT_URL/api/apps/upload' \
--form 'token="token"' \
--form 'channel_key="channel_key"' \
+ --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \
--form 'file=@/path/to/your/app'

返回样例

{
"id": 50,
"version": 7,
"app_name": "Test Android",
"bundle_id": "com.test.app",
"release_version": "1.0",
"build_version": "1",
"source": "SOURCE",
"branch": "master",
"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",
"ci_url": "",
"size": 1565486,
"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",
"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",
"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",
"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",
"changelog": [
{
"message": "Changelog message 1"
},
{
"message": "Changelog message 2"
}
],
"text_changelog": "- Changelog message 1\n- Changelog message 2",
"custom_fields": [],
"created_at": "2021-09-01T11:43:33.977+08:00",
"app": {
"id": 1,
"name": "App name"
},
"scheme": {
"id": 8,
"name": "Test"
},
"channel": {
"slug": "1XmpC",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
}

应用列表

获取创建的应用列表,支持分页

GET /api/apps

参数

名称类型是否必须描述
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

[
{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 1,
"name": "测试版",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
},
{
"id": 2,
"name": "内测版",
"channels": [
{
"slug": "l19Tl",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "8selv",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}
]

应用详情

查看应用的明细:应用类型、渠道等信息

GET /api/apps/:id

参数

名称类型是否必须描述
idStringtrue应用 ID

返回样例

{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 5,
"name": "测试版",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}

应用版本列表

获取应用已上传的版本列表,按照上传时间倒序排列

GET /api/apps/versions

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

{
"app_name": "Zealot iOS 测试版",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "测试版"
},
"releases": [
{
"version": 2,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10292024",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
{
"version": 1,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
]
}

应用最新版本

获取指定应用的最新版本信息

GET /api/apps/latest

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
release_versionStringtrue应用的发布版本
build_versionStringtrue应用的构建版本

返回样例

{
"app_name": "Zealot iOS 测试版",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "测试版"
},
"releases": {
"version": 1,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}
}

检查当前版本是否存在

使用 bundle_id、release_version、build_verion 或 bundle_id、git_commit 组合检查当前版本是否存在

GET /api/apps/version_exist

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
bundle_idStringtrue应用的包名,iOS 取 bundle_id,Android 取 package_name
release_versionStringfalse应用的发布版本
build_versionStringfalse应用的构建版本
git_commitStringfalse上传应用时的 git commit hash

返回样例

  • 版本存在返回 200 状态码并返回版本的信息
  • 版本不存在返回 404 状态码和错误信息

版本存在的返回信息

{
"version": 1,
"app_name": "好好住 iOS 测试版",
"bundle_id": "com.haohaozhu.hhz",
"release_version": "4.1.1",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}

版本不存在的返回信息:

{
"error": "应用版本不存在"
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/api/debug_files/index.html b/zh-Hans/docs/4.x/developer-guide/api/debug_files/index.html index 40388c6f2..5e9e2c469 100644 --- a/zh-Hans/docs/4.x/developer-guide/api/debug_files/index.html +++ b/zh-Hans/docs/4.x/developer-guide/api/debug_files/index.html @@ -4,13 +4,13 @@ 调试文件接口 | Zealot - - + +
版本:4.x

调试文件接口

上传调试文件

上传 iOS 和 Android 的调试文件:

  • iOS: 使用 Zip 压缩后的 dSYM 文件
  • Android: 使用 Zip 压缩后包含 mapping.txt、R.txt 和 AndroidManifest.xml 的文件
POST /api/debug_files/upload

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
fileFiletrueZip 压缩文件后的调试文件
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringtrue内部版本号,iOS 类型可忽略该参数

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

下载调试文件

下载 iOS 和 Android 的调试文件

POST /api/debug_files/download

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringfalse内部版本号,iOS 类型可忽略该参数
orderStringfalse获取最新的方式,可选值有:
version = 最新版本 和 upload_date = 最新上传时间
仅限接受 release_version 值为 latest 有效

返回样例

  • 版本存在返回 200 状态码并返回 302 重定向到下载地址
  • 版本不存在返回 404 状态码和错误信息

调试文件列表

获取创建的应用列表,支持分页

GET /api/debug_files

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

[
{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}
]

调试文件详情

查看调试文件的明细,包含上传调试文件的具体解析。

GET /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

更新调试文件

更新调试文件

PUT /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID
fileFiletrueZip 压缩文件后的调试文件
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringtrue内部版本号,iOS 类型可忽略该参数

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

删除调试文件

删除指定调试文件

DELETE /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID

返回样例

{
"mesage": "OK"
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/api/index.html b/zh-Hans/docs/4.x/developer-guide/api/index.html index 6709bf389..6d69ec490 100644 --- a/zh-Hans/docs/4.x/developer-guide/api/index.html +++ b/zh-Hans/docs/4.x/developer-guide/api/index.html @@ -4,13 +4,13 @@ APIs | Zealot - - + +
版本:4.x

APIs

Zealot 提供提供 REST APIs 接口服务可用于自定义的查看 App 信息或者上传、下载 App。

接口认证

接口请求目前仅支持 User Token 的 query 认证,在登录用户的详情页面最下面 API - 密钥 找到。

example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN

接口版本

当前是 v1 版本,接口无需显性传递版本参数,另外 GraphGL 接口也在逐步开发中后续会考虑两个版本同时存在。

接口列表

目前可用的 API 接口基本满足打包和下载流程的范围:

应用接口

定义地址
上传应用/api/apps/upload
应用列表/api/apps
应用详情/api/apps/:id
应用版本列表/api/apps/versions
应用最新版本/api/apps/latest
检查当前版本/api/apps/version_exist

全部接口 api/apps

调试文件接口

定义地址
上传调试文件/api/debug_files/upload
下载调试文件/api/debug_files/download
调试文件列表/api/debug_files
调试文件详情/api/debug_files/:id
检查调试文件是否存在/api/debug_files/version_exist
更新调试文件/api/debug_files/:id
删除调试文件/api/debug_files/:id

全部接口api/debug_files

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/fastlane/index.html b/zh-Hans/docs/4.x/developer-guide/fastlane/index.html index 93092ef79..d161817b3 100644 --- a/zh-Hans/docs/4.x/developer-guide/fastlane/index.html +++ b/zh-Hans/docs/4.x/developer-guide/fastlane/index.html @@ -4,14 +4,14 @@ Fastlane 插件 | Zealot - - + +
版本:4.x

Fastlane 插件

信息

第一次听说 fastlane,那你得多 out 了?!快看看开发者准备的 Fastlane 系列教程补补课吧。

添加 Zealot 插件

fastlane-plugin-zealot 是专门为 Zealot 提供 的上传 iOS、Andorid 应用和调试文件的 fastlane 插件。

通过下面方法添加到 fastlane 体系中:

$ fastlane add_plugin zealot

插件包含多个 action:

  • zealot: 上传 iOS 或 Android 应用
  • zealot_debug_file: 上传调试文件(iOS 是 dSYM,Android 是 Proguard)
  • zealot_version_check: 检查当前版本是否已存在
  • zealot_sync_devices: 同步 Apple 开发者账号的设备列表信息到 Zealot 用于关联 AdHoc 证书应用的设备名称
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot/index.html b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot/index.html index 5e70ab0e0..be6fcd047 100644 --- a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot/index.html +++ b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot | Zealot - - + +
版本:4.x

Fastlane action: zealot

上传 iOS 或 Android 应用,传入如下参数插件会在成功打包后自动获取 app 的路径并进行上传:

zealot(
endpoint: 'https://zealot.com',
token: '...',
channel_key: '...',
)

参数

+-----------------+---------------------------------+------------------------+----------+
| zealot Options |
+-----------------+---------------------------------+------------------------+----------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+----------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| file | The path of app file. Optional | ZEALOT_FILE | |
| | if you use the `gym`, `ipa`, | | |
| | `xcodebuild` or `gradle` | | |
| | action. | | |
| name | The name of app to display on | ZEALOT_NAME | |
| | zealot | | |
| changelog | The changelog of app | ZEALOT_CHANGELOG | |
| slug | The slug of app | ZEALOT_SLUG | |
| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |
| branch | The name of git branch | ZEALOT_BRANCH | |
| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |
| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |
| | fields | | |
| password | The password of app to download | ZEALOT_PASSWORD | |
| source | The name of upload source | ZEALOT_SOURCE | fastlane |
| ci_url | The name of upload source | ZEALOT_CI_CURL | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |
| | keep secret | | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure | | |
+-----------------+---------------------------------+------------------------+----------+
* = default value is dependent on the user's system

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+

环境变量

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+
Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html index 2a1d45b9a..88eaea4c1 100644 --- a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html +++ b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_debug_file | Zealot - - + +
版本:4.x

Fastlane action: zealot_debug_file

上传 iOS 的 dSYM 或 Android 的 Proguard 调试文件到 Zealot

  # 上传 iOS dSYM 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :ios,
xcode_scheme: 'AppName',
verify_ssl: false
)

# 上传 Android Proguard 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :android,
android_build_type: 'release',
android_flavor: 'store',
release_version: '1.1.0',
build_version: '1',
overwrite: true
)

# 上传指定 zip file 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
zip_file: 'path/to/your/zip_file',
release_version: '1.1.0',
build_version: '1',
verify_ssl: false
)

参数

+--------------------+-----------------------------------+---------------------------+---------+
| zealot_debug_file Options |
+--------------------+-----------------------------------+---------------------------+---------+
| Key | Description | Env Var | Default |
+--------------------+-----------------------------------+---------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |
| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |
| | to direct upload | | |
| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |
| | value are | | |
| | ios,mac,macos,osx,android | | |
| path | The path of debug file | ZEALOT_PATH | |
| | (iOS/macOS is archive path for | | |
| | Xcode, Android is path for app | | |
| | project) | | |
| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |
| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |
| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |
| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |
| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |
| | dSYM file | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| | (Android needs) | | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| | (Android needs) | | |
| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |
| | if it existed | | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+--------------------+-----------------------------------+---------------------------+---------+
* = default value is dependent on the user's system

+-----------------------+-----------------------------------------+
| zealot_debug_file Output Variables |
+-----------------------+-----------------------------------------+
| Key | Description |
+-----------------------+-----------------------------------------+
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+-----------------------------------------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html index eba41b658..71e52c258 100644 --- a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html +++ b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_sync_devices | Zealot - - + +
版本:4.x

Fastlane action: zealot_sync_devices

信息

🔔 Zealot 4.5.0 版本已经支持使用 Apple API Key

苹果开发者管理并可自动同步测试设备展示,查看详情

同步并关联苹果开发者中心(Apple Developer Portal)的测试设备名称到 Zealot 服务。

# 使用 Apple API Key 授权
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
api_key_path: '/path/to/your/api_key_json_file',
team_id: '...'
)

# 使用密码授权(需要二步认证)
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
username: 'user@example.com',
team_id: '...'
)

参数

+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| zealot_sync_devices Options |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| Key | Description | Env Var(s) | Default |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |
| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -json-file) | | |
| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -hash-option) | | |
| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |
| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |
| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |
| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html index 5d12313cf..8ebdc8a70 100644 --- a/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html +++ b/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_version_check | Zealot - - + +
版本:4.x

Fastlane action: zealot_version_check

检查当前版本是否已经上传,减少重复打包和上传。

zealot_version_check(
endpoint: 'https://zealot.com',
token: '...',
bundle_id: 'com.example.app.name',
release_version: '1.0.0',
build_version: '1'
)

参数

+-----------------+---------------------------------+------------------------+---------+
| zealot_version_check Options |
+-----------------+---------------------------------+------------------------+---------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |
| | app | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+-----------------+---------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/index.html b/zh-Hans/docs/4.x/developer-guide/index.html index 07a761dbe..87549eb3c 100644 --- a/zh-Hans/docs/4.x/developer-guide/index.html +++ b/zh-Hans/docs/4.x/developer-guide/index.html @@ -4,13 +4,13 @@ 开发者资源 | Zealot - - + +
版本:4.x

开发者资源

Zealot 为开发者提供了丰富的组件,包括 iOS 和 Android 使用的 SDK,用于持久化构建自动化脚本 fastlane 插件等。

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/sdk/android/index.html b/zh-Hans/docs/4.x/developer-guide/sdk/android/index.html index 2c46510b3..35fb93c13 100644 --- a/zh-Hans/docs/4.x/developer-guide/sdk/android/index.html +++ b/zh-Hans/docs/4.x/developer-guide/sdk/android/index.html @@ -4,13 +4,13 @@ Zealot Android SDK | Zealot - - + +
版本:4.x

Zealot Android SDK

Android 组件提供为 Zealot 检查新版本和安装的服务,支持 Kotlin 和 Java。

安装

JitPack

使用 jitpack 安装,先需要添加 maven 仓库:

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

之后在主 app 项目的 build.gradle 添加 zealot:

dependencies {
implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'
}

用户权限

使用 Zealot SDK 需要开启网络权限

<uses-permission android:name="android.permission.INTERNET" />

初始化

在你的 Application 文件的 onCreate 方法添加启动代码:

// 单个渠道
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("...")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()

// 多个渠道,比如测试版本,内测版本
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("xxxxxxx", "beta")
.setCHannelKey("yyyyyyy", "test")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/developer-guide/sdk/ios/index.html b/zh-Hans/docs/4.x/developer-guide/sdk/ios/index.html index e74e648e0..1da918855 100644 --- a/zh-Hans/docs/4.x/developer-guide/sdk/ios/index.html +++ b/zh-Hans/docs/4.x/developer-guide/sdk/ios/index.html @@ -4,13 +4,13 @@ Zealot iOS SDK | Zealot - - + +
版本:4.x

Zealot iOS SDK

iOS 组件提供为 Zealot 检查新版本和安装的服务,支持 Swift 和 Objective-C。

安装

Cocoapods

使用 Cocoapods 安装 Zealot 需要把它加到 Podfile:

pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'

保存后开始安装:

pod install

初始化

  1. 在 AppDelegate 文件引入 Zealot 框架头:
import Zealot
  1. 接着在上面文件的 application:didFinishLaunchingWithOptions: 方法追加启动代码:
// 单个渠道
let zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")
zealot.checkVersion()

// 多个渠道,比如测试版本,内测版本
let zealot = Zealot(endpoint: "http://zealot.com",
channelKeys: [
"beta": "xxxxxxx",
"test": "yyyyyyy"],
default_enviroment: "beta")

// 最后触发监测方法
zealot.checkVersion()
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables/index.html b/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables/index.html index 8f14a1cf8..f8678212e 100644 --- a/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables/index.html +++ b/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables/index.html @@ -4,13 +4,13 @@ 环境变量 | Zealot - - + +
版本:4.x

环境变量

.env 文件

Zealot 可通过如下环境变量或使用项目根目录的 .env 文件配置系统参数,通过上述方式更改后需要重启服务才可生效。

HTTPS 证书

因苹果的硬性要求线上部署和下载服务强制 HTTPS,因此再部署的时候下载应用会强制走 HTTPS 协议。

如果部署是单台机器的独立服务,建议开启 Let's Encrypt 免费 SSL 证书,只需要设置

ZEALOT_CERT_EMAIL=zealot@example.com

和下面自签名证书文件名二选一,不能同时设置

如果部署的机器只能使用自签名证书,则需要配置,但需要注意的是 iOS 的下载需要在 iOS 设备授权自签名的证书后才允许下载安装。(不推荐)

ZEALOT_CERT=zealot.test.pem
ZEALOT_CERT_KEY=zealot.test-key.pem

和 Let's Encrypt 注册电子邮箱名二选一,不能同时设置

配置域名 (URL)

必须配置否则下载应用和一些静态资源会无法正确访问到

# 域名配置,无需配置 http:// 或 https://
ZEALOT_DOMAIN=zealot.com

配置数据库和缓存

假如你有可以复用的 postgresql 和 redis 服务也可以自定义配置使用,而无需使用 docker-compose 默认配置的服务。

Postgresql

ZEALOT_POSTGRES_HOST=127.0.0.1
ZEALOT_POSTGRES_PORT=5432
ZEALOT_POSTGRES_USERNAME=postgres
ZEALOT_POSTGRES_PASSWORD=ze@l0t
ZEALOT_POSTGRES_DB_NAME=zealot

Redis

兼容大多数云服务部署采用的 URL 连接方式

REDIS_URL=redis://user:pass@127.0.0.1:6379/0

# 基于 SSL 的 Redis
REDIS_URL=rediss://user:pass@127.0.0.1:6379/0

配置网站默认语言

语言包
zh-CN简体中文 (默认)
en英文
DEFAULT_LOCALE=en

配置网站默认外观

外观
light浅色 (默认)
dark深色(黑暗模式)
auto随系统自动
ZEALOT_APPEARANCE=dark

配置管理员账户和密码

默认不配置如下也会生成下面的账户和密码作为管理员权限的账户,建议配置后重新修改密码。

ZEALOT_ADMIN_EMAIL=admin@zealot.com
ZEALOT_ADMIN_PASSWORD=ze@l0t

开启用户注册

关闭注册之后,管理员可以通过管理面板的用户管理手动添加用户。

# 开启注册
ZEALOT_REGISTER_ENABLED=true

# 关闭注册
ZEALOT_REGISTER_ENABLED=false

开启游客模式

开启游客模式后允许应用的查看、下载和安装,建议公司内部对权限依赖不高的状况使用,具体权限对比可以看这里查看详情

# 开启游客模式
ZEALOT_GUEST_MODE=true

# 关闭游客模式
ZEALOT_GUEST_MODE=false

邮件服务

目前仅支持 smtp 的方式配置邮件通知服务,邮件通知主要影响用户注册、发送激活邮件、更改密码服务,如果不开启也不影响使用,账户激活的链接也会在用户管理那边找到。

# 发送邮件配置
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=you@gmail.com
SMTP_PASSWORD=yourpassword
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

# 邮件默认收发人配置
ACTION_MAILER_DEFAULT_FROM=you@gmail.com
ACTION_MAILER_DEFAULT_TO=you@gmail.com
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs/index.html b/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs/index.html index bd75d8df5..fbdb1a884 100644 --- a/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs/index.html +++ b/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs/index.html @@ -4,14 +4,14 @@ 定时任务 | Zealot - - + +
版本:4.x

定时任务

清理老版本

按照项目维护者长期的使用观察一个可靠的清理老版本的逻辑是时刻关注当前主版本的所有上传版本, 之前上传的历史版本只需要保留最后一个上传构建版本基本上就满足绝大数情况,举个例子:

额外补充:当前逻辑相对省事但缺乏灵活度,其实有想过支持多种处理逻辑,具体参见 https://github.com/tryzealot/zealot/issues/376

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 9
- 8
...
- 1.0
- 5
- 4
- 3
...

任务执行时会清理掉 1.0.1 版本包含 9 以下和 1.0 版本包含 4 以下所有版本,最终保留的版本文件是:

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 1.0
- 5

如果磁盘空间有限,可以通过设置环境变量 ZEALOT_KEEP_UPLOADS=false 来开启定时任务的清理。

信息

ZEALOT_KEEP_UPLOADS 模式是 true 开启状态 。

备份

当你通过管理员面板创建任何的备份计划都会加入到定时任务队列中。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication/index.html b/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication/index.html index 724bcbf91..e623718a6 100644 --- a/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication/index.html +++ b/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication/index.html @@ -4,13 +4,13 @@ 第三方登录 | Zealot - - + +
版本:4.x

第三方登录

目前已接入的第三方登录:

服务标识符
飞书feishu
Gitlabgitlab
Googlegoogle_oauth2
LDAPldap

如果以上服务需要设置回调地址的话请统一设置为:

http://zealot.com/users/auth/:provider/callback

其中 :provider 是上面支持第三方服务的标识符,例如开启了飞书那就把 :provider 替换成 feishu

飞书

  1. 去注册一个飞书账号并下载手机 App
  2. 注册飞书开发平台并创建企业自建应用获得 app_id, app_secret
  3. 填写 callback url 为 http://zealot.com/users/auth/feishu/callback (域名根据实际情况修改)
  4. 添加用户字段信息授权:email 地址 (可选)
  5. 至少勾选一个应用方式并创建新版本后发布
FEISHU_ENABLED=true
FEISHU_APP_ID=
FEISHU_APP_SECRET=

Gitlab

  1. 注册 Gitlab 官方账户或自部署 Gitlab 服务
  2. 在用户设置(Preferences) -> 应用(Applications) 创建一个新应用
  3. 回调地址(Redirect URI) 配置为 http://zealot.com/users/auth/gitlab/callback (域名根据实际情况修改)
  4. 添加用户字段信息授权(scope):read_user,默认 zealot 仅用此授权,如果你的授权范围是 api 也没问题
GITLAB_ENABLED=true
GITLAB_SITE=https://gitlab.com/api/v4
GITLAB_SCOPE=read_user
GITLAB_APP_ID=
GITLAB_SECRET=

Google

  1. 注册 Google 账号
  2. 开通 Google Cloud Platform 服务
  3. 选择或创建 Project 并前往 Credentials
  4. 创建 OAuth Client ID 选择 Web Application 后添加回调地址(Authorized redirect URI) 配置为 http://zealot.com/users/auth/google_oauth2/callback (域名根据实际情况修改)
  5. 创建成功后获得 Client ID 和 Client Secret
GOOGLE_OAUTH_ENABLED=true
GOOGLE_CLIENT_ID=
GOOGLE_SECRET=

LDAP

  1. 自部署或使用现有的 LDAP 服务
  2. 自配置或查找如下参数的值
LDAP_ENABLED=true
LDAP_HOST=10.0.0.1
LDAP_PORT=389
LDAP_METHOD=plain
LDAP_BIND_DN="cn=Manager,dc=example,dc=com"
LDAP_PASSWORD=password
LDAP_BASE="ou=People,dc=example,dc=com"
LDAP_UID=uid
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/architecture/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/architecture/index.html index 0a9bbbb3b..bcc17fc6c 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/architecture/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/architecture/index.html @@ -4,13 +4,13 @@ Zealot 服务架构 | Zealot - - + +
版本:4.x

Zealot 服务架构

运行 Zealot 依赖如下服务才能保证正常运行

ArchitectureArchitecture
  • 使用 amd86/arm64/armv7 运行的主流 Linux 系统
  • Ruby on Rails 提供核心网页和 API 服务
  • Sidekiq 提供后台的异步任务管理服务
  • PostgreSQL 数据库服务
  • Redis 缓存服务
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/docker/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/docker/index.html index 6f55b7fe9..427b4a175 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/docker/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/docker/index.html @@ -4,8 +4,8 @@ Docker 部署 Zealot 指南 | Zealot - - + +
@@ -15,7 +15,7 @@ 首先需要克隆官方 Zealot 部署工具,进入 zealot-docker 目录后需要打开 example.env 文件配置必要的参数后可直接执行 ./deploy.sh 脚本:

提示

默认会生成管理员账号:admin@zealot.com 和密码 ze@l0t 和一些演示应用。

$ git clone https://github.com/tryzealot/zealot-docker.git
$ cd zealot-docker
$ ./deploy

一键部署生成脚本默认内置了下面三种模板配置 SSL 证书:

配置 SSL 证书

Let's Encrypt

信息

免费且自动续签 SSL 证书,新手使用的最佳选择

第一步:执行部署脚本:

$ ./deploy

第二步:检查和配置 .env 文件,主要是 ZEALOT_DOMAINZEALOT_CERT_EMAIL 是否填写正确, 其他部分可根据实际情况做对应的配置调整

第三步:运行 Zealot 服务:

$ docker-compose up -d

反向代理托管 SSL 证书

配置说明迁移值反向代理指南,里面包含了更多的服务配置。

自签名 SSL 证书

警告

在条件满足其他情况下绝对不推荐此方案,iOS 设备对使用自签名证书的任何 Web 服务必须在其设备上手动安装自签名证书后才能正常安装应用

如果域名是非注册域名则需要绑 host 才可以访问,通常是修改系统的 /etc/hosts 文件。

$ sudo vim /etc/hosts

127.0.0.1 zealot.test
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html index fe886ff19..cf62ddac1 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html @@ -4,13 +4,13 @@ Docker 手把手部署文档 | Zealot - - + +
版本:4.x

Docker 手把手部署文档

这是一篇手把手来指导使用 Docker 部署文档,同时也是解释Docker 部署 Zealot 指南的分解

版本列表

  • 稳定版本 - 4.7.1/latest - ghcr.io/tryzealot/zealot:latest
  • 测试版本 - develop - ghcr.io/tryzealot/zealot:nightly - 基于 develop 分支每次提交构建的版本

镜像仓库

Docker hub 取消了免费组织计划,不再同步更新推送。

Github Container Registry: https://github.com/tryzealot/zealot/pkgs/container/zealot (推荐)

步骤解析

安装 Docker

按照官方教程安装

安装 Docker-Compose

按照官方教程安装

生成 .env 配置文件

从预先 config.env 配置文件复制一份部署使用的配置文件

配置域名

二次校验如果没有配置会再提醒

配置证书

部署脚本提供三种方式,就算使用最后一种生成的也是 https 的协议头

  • 使用 Let's Encrypt 证书
  • 使用自签名证书
  • 纯 Zealot 服务(需反代网关或负载均衡生成 SSL 证书)

生成 docker-compose.yml

配置文件会生成至少四个服务(service),使用上面前两个证书方式会额外增加一个服务:

  • zealot-zealot: 核心 Web 和 API 服务
  • zealot-worker: 核心异步任务服务
  • zealot-postgres: 数据库服务
  • zealot-redis: 缓存服务
  • zealot-web: 提供(服务和证书)反代的网关服务,非必需

创建持久化存储的 docker volumes

存储持久化数据

  • zealot-data: 静态资源,JS、CSS、图片以及上传的应用、应用图标和调试文件
  • zealot-postgres: 数据库数据
  • zealot-redis: 缓存数据

拉取(更新)镜像

第一次使用会自动从 Docker hub 下载镜像,后续是更新操作,通常只会更新 zealot 镜像。其他几个依赖服务镜像都是固定版本号

docker-compose pull

设置数据库数据

第一次使用会初始化数据库、加载范例应用数据和设置管理员账号,后续这是因 zealot 更新需要的操作

docker-compose run --rm zealot run_upgrade

运行 docker-compose

为了安全期间和用户的自定义操作需要手动执行来运行服务:

docker-compose up -d

高级配置

自定义 volume 路径

自定义路径有两种方法: (假设自定义的路径是 /data/zealot)

1. 创建 volume 自定义路径

docker volume create --name zealot-data \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/zealot-data

docker volume create --name zealot-redis \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/redis

docker volume create --name zealot-postgres \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/postgres

2. 修改 docker-compose 的 volumes 部分

打开 docker-compose.yml 拉到最底部找到 volumes: 开头的部分,修改为如下内容:

volumes:
zealot-data:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/data
zealot-redis:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/redis

zealot-postgres:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/postgres
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/fly/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/fly/index.html index c9fc6341d..74ce181aa 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/fly/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/fly/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Fly 指南 | Zealot - - + +
版本:4.x

部署 Zealot 到 Fly 指南

Zealot 支持 fly.io 官方的应用配置格式(fly.toml)。

部署步骤

  • 预先安装 flyctl 命令行工具。
  • 复制下面配置文件 保存为 fly.toml 文件放在项目根目录,根据创建的 fly app 项目修改 app 的值。
  • 运行 flyctl deploy 开始构建和部署工作。
  • 运行 fly scale vm shared-cpu-1x --memory 512 来达到 Zealot 可允许的内存环境,默认免费的 256M 内存实际只有 205M,Zealot 运行起来闲置状态会 190M 到会提示 OOM 内存溢出。

配置文件

app = "[app-name:changeme]"
kill_signal = "SIGINT"
kill_timeout = 120
processes = []

[build]
image = "ghcr.io/tryzealot/zealot:nightly"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 80
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

[[statics]]
guest_path = "/app/public"
url_prefix = "/"
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes/index.html index d1a822a63..258bc405f 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes/index.html @@ -4,13 +4,13 @@ Kubernetes 部署 Zealot 指南 | Zealot - - + +
版本:4.x

Kubernetes 部署 Zealot 指南

Zealot 原生支持使用 Kubernetes 部署,不过一直还没有梳理 .yaml 配置文件用于安装。

部署清单

  • 生成 Secret/Configmap 存储环境变量。
  • 生成 PersistentVolumeClaim 用于 public/uploads, public/bakcup 的持久化存储。
  • 生成 Deployment 来管理 zealot Pod。
  • 生成 Ingress 配置 Zealot 路由访问。

详细步骤

10-zealot-namespace.yml

创建 Zealot 命名空间。

10-zealot-namespace.yml
api Version: v1
kind: Namespace
metadata:
name: zealot

20-zealot-secrets.yml

配置 Zealot 涉及隐私数据的环境变量,值是需要经过 base64 加密。

20-zealot-secrets.yml
apiVersion: v1
kind: Secret
metadata:
namespace: zealot
name: zealot-secrets
data:
ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=
ZEALOT_ADMIN_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=
ZEALOT_POSTGRES_PORT: NTQzMg==
ZEALOT_POSTGRES_USERNAME: emVhbG90
ZEALOT_POSTGRES_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_DB_NAME: emVhbG90
REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=

# echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64
SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==

21-zealot-configmap.yml

配置 Zealot 正常数据的环境变量

21-zealot-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: zealot
name: zealot-config
data:
ZEALOT_DOMAIN: zealot.icyleaf.dev
DEFAULT_LOCALE: en
ZEALOT_REGISTER_ENABLED: "true"

30-zealot-storage.yml

为上传文件(应用包和调试文件)以及备份文件创建持久化存储卷。你可能需要根据实际情况修改存储大小。

30-zealot-storage.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-uploads
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-backup
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

40-zealot-deployment.yml

创建 Zealot 部署,根据实际情况修改 replicas 扩容值和 image 镜像 tag。

40-zealot-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zealot
namespace: zealot
spec:
restartPolicy: Always
replicas: 1
selector:
matchLabels:
app: zealot
template:
metadata:
labels:
app: zealot
spec:
containers:
- name: zealot
image: ghcr.io/tryzealot/zealot:nightly
# imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
envFrom:
- configMapRef:
name: zealot-env
- secretRef:
name: zealot-secrets
volumeMounts:
- mountPath: /app/public/uploads
name: uploads
- mountPath: /app/public/backup
name: backup
volumes:
- name: uploads
persistentVolumeClaim:
claimName: zealot-uploads
- name: backup
persistentVolumeClaim:
claimName: zealot-backup

50-zealot-service.yml

创建 zealot 服务。

50-zealot-service.yml
apiVersion: v1
kind: Service
metadata:
name: zealot
namespace: zealot
labels:
app: zealot
spec:
selector:
app: zealot
ports:
- port: 80
targetPort: http
name: http
protocol: TCP

60-zealot-ingress.yml

为 Zealot 服务设置 ingress。

50-zealot-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zealot
namespace: zealot
annotations:
#cert-manager.io/cluster-issuer: letsencrypt-prod
#kubernetes.io/ingress.class: nginx
spec:
rules:
- host: zealot.icyleaf.dev
http:
paths:
- web:
service:
name: zealot
port:
number: 80
path: /
pathType: Prefix
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/nomad/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/nomad/index.html index ca2115d67..99201630c 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/nomad/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/nomad/index.html @@ -4,15 +4,15 @@ Nomad 部署 Zealot 指南 | Zealot - - + +
版本:4.x

Nomad 部署 Zealot 指南

Zealot 原生支持使用 Nomad 部署。这得益于 Nomad 有很不错的插件机制,官方默认支持 Docker 插件。 在配置上接近于 docker compose 的配置,只不过它的配置语言是 HCL 而不是 YAML。

基本部署

使用 Nomad 部署

先按照官方教程依次安装好 nomad,这个二进制文件是包含了客户端和服务端。 不了解的建议跟着官方教程演练一遍。

下面文件将会创建 postgres、redis 和 zealot 三个服务,对于已有的外部数据库和缓存服务,可以删除掉对应的 port, servicetask 后编辑 zealot task 里面的模板变量。

zealot.nomad
job "zealot" {
type = "service"
datacenters = "dc1" // 根据实际情况修改

update {
max_parallel = 1
min_healthy_time = "30s"
auto_revert = true
}

group "zealot" {
network {
port "zealot" {
to = 80
}

port "postgres" {
to = 5678
}

port "redis" {
to = 6379
}
}

service {
name = "zealot"
port = "zealot"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.http.routers.zealot.entrypoints=web, websecure",
// "traefik.http.routers.zealot.rule=Host(`zealot.example.com`)",
// ]
}

service {
name = "postgres"
port = "postgres"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.tcp.routers.postgres.rule=HostSNI(`*`)",
// "traefik.tcp.routers.postgres.entrypoints=postgres",
// ]
}

service {
name = "redis"
port = "redis"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.tcp.routers.redis.rule=HostSNI(`*`)",
// "traefik.tcp.routers.redis.entrypoints=redis",
// ]
}

task "zealot" {
driver = "docker"

config {
image = "ghcr.io/tryzealot/zealot:latest"
ports = ["zealot"]

// 根据实际情况修改,或采用 CSI 协议的外部存储
volumes = [
"/tmp/zealot/uploads:/app/public/uploads",
"/tmp/zealot/backups:/app/public/backups",
]

// 添加服务到 homepage dashboard 面板
// labels = {
// "homepage.group" = "Dev"
// "homepage.name" = "Zealot"
// "homepage.icon" = "mdi-progress-download"
// "homepage.href" = "https://zealot.example.com"
// "homepage.description" = "Beta App Distribution"
// }
}

// Zealot example config
// https://github.com/tryzealot/zealot-docker/blob/master/config.env
template {
destination = "local/config.env"
change_mode = "restart"
env = true
data = <<-EOF
ZEALOT_APPEARANCE = dark
ZEALOT_DOMAIN = zealot.example.com

ZEALOT_GUEST_MODE = false
ZEALOT_REGISTER_ENABLED = true
EOF
}

template {
destination = "secrets/secret.env"
change_mode = "restart"
env = true
data = <<-EOF
# admin account
ZEALOT_ADMIN_EMAIL = admin@zealot.com
ZEALOT_ADMIN_PASSWORD = ze@l0t

# datbase
ZEALOT_POSTGRES_HOST = {{ env "NOMAD_IP_postgres" }}
ZEALOT_POSTGRES_PORT = {{ env "NOMAD_PORT_postgres" }}
ZEALOT_POSTGRES_USERNAME = "zealot"
ZEALOT_POSTGRES_PASSWORD = "zealot"
ZEALOT_POSTGRES_DB_NAME = "zealot"

# cache
REDIS_URL = redis://{{ env "NOMAD_ARRR_redis" }}/0

# secret token
SECRET_TOKEN = $${ sha256(uuidv5("url", "zealot.ews.im")) }
EOF
}

resources {
cpu = 500
memory = 500
memory_max = 1000
}
}

task "postgres" {
driver = "docker"

lifecycle {
hook = "prestart"
sidecar = true
}

config {
image = "postgres:14-alpine"
ports = ["postgres"]
volumes = [
"secrets/init-role.sql:/init-role.sql",
"secrets/init-db.sql:/init-db.sql"
]
}

env {
POSTGRES_INITDB_ARGS = "--data-checksums"
POSTGRES_USER = "zealot"
POSTGRES_PASSWORD = "zealot"
POSTGRES_DB = "zealot"
}

resources{
cpu = 512
memory = 200
memory_max = 512
}
}

task "redis" {
driver = "docker"

lifecycle {
hook = "prestart"
sidecar = true
}

config {
image = "redis:5-alpine"
ports = ["redis"]
}

resources {
cpu = 200
memory = 200
}
}
}
}

确认无误后执行 nomad job run zealot.nomad

使用 Terraform 部署

Terraform 和 Nomad 是同家公司的产品。

先按照官方教程依次安装好 terraformnomad 插件后,复用上面的 zealot.nomad 文件再额外加一个 main.tf 文件即可。

resource "nomad_job" "jobs" {
jobspec = file("${path.module}/zealot.nomad")
}

执行 terraform plan 确认无误后在通过 terraform apply 应用。

外部文件存储

Nomad 支持多集群管理,很多情况下服务部署的存储不可能直接挂载到对应的文件系统中,更多的是放在一个共享文件存储协议上面,比如 SMB、NFS、S3 等等。

CSI 协议

Nomad 支持 CSI 协议,理论上实现 CSI 接口的服务都可以满足。

截止 Nomad 1.5 版本为止,Nomad 可以使用 CSI 卷,但它不能自身控制创建、销毁或管理。卷必须在外部创建,然后向 Nomad 注册后才能使用。

插件支持协议兼容情况terraform nomad 资源
kubernetes-csi-driver-smbsmb未测试未测试
kubernetes-csi-driver-nfsnfs支持nomad_volume
kubernetes-csi-driver-iscsiiscsi未测试未测试
democraticcsi/democratic-csismb/nfs/iscsi支持nomad_external_volume
rocketduck/csi-plugin-nfsnfs支持nomad_external_volume
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/railway/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/railway/index.html index 12db64460..8226ad9c3 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/railway/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/railway/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Railway 指南 | Zealot - - + +
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/render/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/render/index.html index 1adc7e192..eb1fb7b27 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/render/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/render/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Render 指南 | Zealot - - + +
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/requirements/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/requirements/index.html index 0c6477c8b..772c75b4a 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/requirements/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/requirements/index.html @@ -4,14 +4,14 @@ Zealot 自部署依赖 | Zealot - - + +
版本:4.x

Zealot 自部署依赖

如果想要顺利并发挥 Zealot 最佳状态运行,本页面提供了安装所需的各自软硬环境的依赖安装信息。

操作系统

Zealot 可以安装在绝大多数 Linux 操作系统,但目前并没有测试和统计具体有哪些。

硬件依赖

系统架构

支持使用 amd86/arm64/armv7 运行的主流 Linux 系统,比如 Debian,Ubuntu、CentOS、Arch Linux、Armbian 等。

CPU

CPU 数量取决于 Zealot 使用的资源和任务量,工作量受(包括但不仅限于)以下因素影响:有多少应用和调试文件被上传和解析;有多少应用被下载;有多少网络钩子被触发;苹果开发者同步测试设备的频率以及备份计划作业的数量和频率。

下面是最小硬件条件推荐的 CPU 硬件规格,请不要低于这个标准否则服务运行会收到一定的影响造成服务无法正常工作:

  • 1 核必须的最小核心数。

内存

内存大小取决于 Zealot 使用的资源和任务量,工作量受(包括但不仅限于)以下因素影响:有多少应用和调试文件被上传和解析;有多少应用被下载;有多少网络钩子被触发;苹果开发者同步测试设备的频率以及备份计划作业的数量和频率。

下面是最小硬件条件推荐的内存大小规格,请不要低于这个标准否则服务运行会收到一定的影响造成服务无法正常工作:

  • 512MB必须的最少的内存大小。

存储

存储容量的大小取决于有多少应用和调试文件版本上传,当然也包含生成的备份文件。

软件依赖

Ruby 版本

  • Ruby 3.0+

必须使用标准的 MRI 实现的 Ruby 版本。Zealot 内部依赖的 Gems 需要原生扩展。

Node.js 版本

Zealot 使用 esbuildsass 编译前端资源。

推荐使用 Node 14.x 以上版本。

可以在终端应用通过运行 node -v 命令查看 node 的版本。如果运行的版本低于 v8.0 你需要更新到推荐的版本。你可在官方网站查看更多安装或升级教程。

数据库

数据库仅支持 PostgreSQL 且目前没有计划支持更多其他数据库。

PostgreSQL 依赖

PostgreSQL 预留至少 5-10 GB 空间,更多的空间意味着可以存储更多的数据。

我们强烈推荐使用且保持 PostgreSQL 永远是最新的稳定版本作为开发和测试使用。

Redis

Zealot 后台异步任务和定时任务依赖于 Redis 做数据的存储和统计使用,存储空间依赖很小,50MB 足矣。

Redis 最低支持版本 6.2+,推荐 7.x 版本

Sidekiq

Sidekiq 是 Zealot 后台异步任务和定时任务使用的服务,它支持多线程操作且运行时依托于 Rails (也就是 Zealot 使用的框架)。 它可能会随着时间的推移而增长内存的占用,如果 Zealot 运行的时间很长造成的服务不稳定请适当调整内存的大小,建议是 1GB+。

已支持 Web 浏览器

提示

Zealot 运行部分页面依赖于 Javascript,请不要设置浏览器禁止它。

Zealot 支持如下 Web 浏览器:

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/deployment/source-code/index.html b/zh-Hans/docs/4.x/self-hosted/deployment/source-code/index.html index 418d8099f..23c5cc9f4 100644 --- a/zh-Hans/docs/4.x/self-hosted/deployment/source-code/index.html +++ b/zh-Hans/docs/4.x/self-hosted/deployment/source-code/index.html @@ -4,13 +4,13 @@ 源码部署 Zealot 指南 (遗弃) | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/index.html b/zh-Hans/docs/4.x/self-hosted/index.html index 2ae5ad8fc..e98bb8fd7 100644 --- a/zh-Hans/docs/4.x/self-hosted/index.html +++ b/zh-Hans/docs/4.x/self-hosted/index.html @@ -4,13 +4,13 @@ 自建服务指南 | Zealot - - + +
版本:4.x

自建服务指南

本指南将会帮助你安装和部署 Zealot 到产品环境。

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/reverse-proxies/index.html b/zh-Hans/docs/4.x/self-hosted/reverse-proxies/index.html index 5d059a347..297e1ac1a 100644 --- a/zh-Hans/docs/4.x/self-hosted/reverse-proxies/index.html +++ b/zh-Hans/docs/4.x/self-hosted/reverse-proxies/index.html @@ -4,13 +4,13 @@ 反向代理 | Zealot - - + +
版本:4.x

反向代理

方便 SSL 证书的统一管理和分发、服务的扩容及接入现成的网关服务,文档提供几种给网关配置反向代理服务的配置。

ArchitectureArchitecture

准备工作

配置反向代理需要准备好如下数据:

名称范例值备注
域名zealot.icyleaf.dev
反向代理 IP 地址172.16.56.1
Zealot IP 地址172.16.56.100反向代理服务可访问
同一台服务可改为 127.0.0.1
Zealot 外部映射端口号8901反向代理服务可访问
Zealot 内部端口号80无需修改
Let's Encrypt 邮箱your-email@example.com

Traefik

Traefik 是一款开源的反向代理与负载均衡工具,它自身提供多种 Providers 可以实现接入反向代理并配置 SSL 的方式。

配置解释

无论使用那种 Provider 核心的配置项是相同的,构成反向代理服务配置主要有三部分组成:发现端口号、路由规则(包含访问端口号、域名绑定和SSL)

Traefik 服务

entryPoints:
web:
address: ":80"

websecure:
address: ":443"

certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web

Docker

首先需要开启 Docker provider 后在修改 zealot 的 Docker Compose 配置:

docker-compose.yml
version: '3'
services:
zealot:
<<: *defaults
labels:
- "traefik.enable=true"
- "traefik.http.services.zealot.loadbalancer.server.port=80"
- "traefik.http.routers.zealot.service=zealot"
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"
- "traefik.http.routers.zealot.tls=true"
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt"
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
# 由 Treafik 接管无需在对外暴露端口号
# ports:
# - "8901:80"
network:
# 根据 traefik 服务的 network 按需调整
- traefik-services

networks:
# 根据 traefik 服务的 network 按需调整
traefik-services:
external: true

Docker 部署的局限于 Traefik 和 Zealot 服务通常在同一个机器的同一个 OS 系统中,跨机器就没法实现通讯,对于跨机器就需要参考下面两种配置方案:

Consul

首先需要开启 Consul providerConsul Catalog provider,我们只需要利用它的 Key-Value 存储:

consul kv put traefik/http/services/zealot/loadbalancer/server/port 5
consul kv put traefik/http/routers/zealot/service zealot
consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'
consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt
consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev
consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev

Nomad

首先需要开启 Nomad provider 且 Nomad 版本要大于等于 1.3 才可以哟:

zealot.nomad
job "zealot" {
datacenters = ["dc1"]
type = "service"

group "zealot" {
count = 1

network {
port "http"{
static = 80
}
}

service {
name = "zealot-http"
provider = "nomad"
port = "http"
}

task "server" {
driver = "docker"
config {
image = "ghcr.io/tryzealot/zealot:nightly"
ports = ["http"]
args = [
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",
- "traefik.http.routers.zealot.tls=true",
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt",
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
]
}
}
}
}

Caddy 2 配置

Caddyfile
:443

log

# 使用 Let's Encrypt 服务
tls your-email@example.com

reverse_proxy 172.16.56.100:8901

配置只需配置 tlsproxy 后面 IP 地址和端口部分即可。

Nginx

如下是通用配置,如果不可用欢迎提问题

conf.d/zealot.conf
upstream zealot {
zone upstreams 64K;
server 172.16.56.100:8901;
keepalive 32;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name zealot.icyleaf.dev;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2; # 可选:http2 可能需要安装额外扩展,不需要可移除
listen [::]:443 ssl http2; # 可选:http2 可能需要安装额外扩展,不需要可移除
server_name zealot.icyleaf.dev;

ssl_certificate /etc/certs/zealot-cert.pem;
ssl_certificate_key /etc/certs/zealot.pem;

# Optional
# ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
# ssl_session_timeout 5m;
# ssl_session_cache shared:SSL:1m;
# ssl_prefer_server_ciphers on;

location / {
proxy_pass http://zealot;
proxy_redirect off;

proxy_pass_header Authorization;
proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Ssl on; # 可选
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

client_max_body_size 0;
proxy_read_timeout 36000s;
}
}

Nginx 还需要在 http 中配置最大上传文件上传大小,普通应用建议是在 200MB 左右,如果是游戏可根据实际文件大小再多出 50% 打出富余。

nginx.conf
http {
[...]

client_max_body_size 200M;
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/self-hosted/storage/index.html b/zh-Hans/docs/4.x/self-hosted/storage/index.html index 849c4ac75..e6e119560 100644 --- a/zh-Hans/docs/4.x/self-hosted/storage/index.html +++ b/zh-Hans/docs/4.x/self-hosted/storage/index.html @@ -4,13 +4,13 @@ 数据存储 | Zealot - - + +
版本:4.x

数据存储

这里罗列了 Zealot 服务所需的所有数据存储,在还没有提供更好的备份管理工具之前,方便有能力的用户能够手动备份和恢复数据使用。

Postgres

用于存储和管理一切和 Zealot 有关数据,这个就不用多说了。

Redis

目前只有 sidekiq 异步任务服务在使用它做一些任务状态、统计数据的存储。

文件存储

Zealot 服务除了依赖 postgresql、redis 之外还有一部分的磁盘存储是上传的应用、调试文件且仅提供存储在文件系统之中,目录位于 public/uploads

  • apps 上传应用的目录
  • debugs_files 上传调试文件的目录

备份存储

Zealot 服务目前支持通过管理员面板管理和生成备份数据,备份数据可配置范围包括数据库和上传应用,目录位于 public/backup

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/apple-team/index.html b/zh-Hans/docs/4.x/user-guide/administrator/apple-team/index.html index 2cc03e486..2ffe1067d 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/apple-team/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/apple-team/index.html @@ -4,13 +4,13 @@ 苹果开发者 | Zealot - - + +
版本:4.x

苹果开发者

iOS Ad-Hoc 签发的应用分发最大的困难是需要给大量不懂这些概念的人传递什么是 UDID、学习如何获取、获取后再提供给开发者,再通过重新签发证书、打包、上传才能安装。

Zealot 可以自动获取 Ad-Hoc 应用的 UDID,面对一串串的 UDID 没人能够看懂这都是谁的设备,明明这些设备在注册的时候都已经备注或自动获取了设备名,但它有不能够自动同步过来。

为了解决以上两个重大难题,Zealot 分别尝试了几种方案来解决这个困难,早期使用 fastlane 插件 zealot_sync_device 调用时会同步测试设备的名称和机型,直到苹果开发者推出 AppStoreConnect API 后完全可以托管到 Zealot 来自动化处理,通过常规流程大大简化注册流程的同时,也能过让测试应用能够显示可识别且友好的测试设备名称。

注册流程注册流程

虽然提供的设备 UDID 功能确认哪些应用可以安装,假如设备没有注册到任何一个应用这个时候提供一个测试设备注册的功能岂不是大大提升团队的效率?这也就是苹果开发者的作用。

苹果开发者详情预览苹果开发者详情预览

最初功能介绍:https://github.com/tryzealot/zealot/issues/723 后续在做更全面的不全

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/backup/index.html b/zh-Hans/docs/4.x/user-guide/administrator/backup/index.html index b15d9012e..f956c961c 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/backup/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/backup/index.html @@ -4,13 +4,13 @@ 备份计划 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html index 5dd794554..3b4b3e878 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html @@ -4,13 +4,13 @@ 后台任务 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html index 0c34d2e3d..18466101d 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html @@ -4,13 +4,13 @@ 数据库分析 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging/index.html b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging/index.html index e2cad7055..7c75b9ffc 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging/index.html @@ -4,13 +4,13 @@ 系统日志 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info/index.html b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info/index.html index 18f258964..90bdd47fa 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info/index.html @@ -4,13 +4,13 @@ 系统信息 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/permissions/index.html b/zh-Hans/docs/4.x/user-guide/administrator/permissions/index.html index 58c8c004b..5b7e7cded 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/permissions/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/permissions/index.html @@ -4,13 +4,13 @@ 用户权限 | Zealot - - + +
版本:4.x

用户权限

Zealot 提供四种用户权限:

  • 游客
  • 普通用户
  • 开发者
  • 管理员

权限明细

功能游客[开/关]普通用户开发者管理员
控制面板
浏览所有的数据
✓/✕
应用
浏览应用列表
✓/✕
应用
浏览应用类型和渠道详情
✓/✕
应用
浏览应用版本详情
✓/✓
支持密码访问
应用
浏览应用内的网络钩子
✓/✕
应用
上传/安装/下载应用
应用
创建/编辑/删除应用
应用
创建/编辑/删除应用的类型或渠道
应用
删除指定的应用版本和上传的应用文件
应用
测试应用的网络钩子
应用
启用或禁用网络钩子
应用
删除应用
调试文件
浏览调试文件列表
✓/✕
调试文件
浏览上传调试文件的解析详情
调试文件
下载调试文件
调试文件
上传/删除调试文件
应用解包
浏览应用解包列表
✓/✕
应用解包
浏览应用解包的详情数据
✓/✕
应用解包
删除应用解包
管理面板
浏览和管理用户
管理面板
浏览和管理全部的网络钩子
管理面板
浏览和管理系统设置
管理面板
浏览系统环境的数据
管理面板
浏览和管理后台任务
管理面板
浏览页面访问统计
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/administrator/project-settings/index.html b/zh-Hans/docs/4.x/user-guide/administrator/project-settings/index.html index 1612c842a..1996699f4 100644 --- a/zh-Hans/docs/4.x/user-guide/administrator/project-settings/index.html +++ b/zh-Hans/docs/4.x/user-guide/administrator/project-settings/index.html @@ -4,13 +4,13 @@ 系统设置 | Zealot - - + +
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/apps/create/index.html b/zh-Hans/docs/4.x/user-guide/apps/create/index.html index 687e4ec39..d0b37324e 100644 --- a/zh-Hans/docs/4.x/user-guide/apps/create/index.html +++ b/zh-Hans/docs/4.x/user-guide/apps/create/index.html @@ -4,13 +4,13 @@ 创建应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/best_practices/index.html b/zh-Hans/docs/4.x/user-guide/best_practices/index.html index 2132d6c32..bda7bef25 100644 --- a/zh-Hans/docs/4.x/user-guide/best_practices/index.html +++ b/zh-Hans/docs/4.x/user-guide/best_practices/index.html @@ -4,13 +4,13 @@ 最佳实践 | Zealot - - + +
版本:4.x

最佳实践

iOS 和 Android 应用

集成 Zealot SDK

集成 Zealot SDK 可以让非客户端研发自动触发新版本检查、查看变更日志和安装功能。

安装 fastlane

通过官方文档安装 fastlane.

配置 Fastfile

# 构建 iOS 的 ipa 文件并上传 zealot 服务器
lane :upload_app do
# 打包,比如 iOS 的 gym 或 Android 的 gradle
gym

# 上传应用到 Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# 上传 iOS 的 dSYM
zealot_debug_file(
scheme: 'AppName'
)
end

# 构建 android 的 apk 文件并生成 progguard 包后上传 zealot 服务器
lane :upload_debug_file do
# 打包,比如 iOS 的 gym 或 Android 的 gradle
gradle

# 自动化搜索 Android Proguard(混淆)并打包 Zip 文件
debug_file

# 上传应用到 Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# 上传 Android 的 Proguard
zealot_debug_file(
build_type: 'release',
flavor: 'googleplay'
)
end

CI 打包构建服务

自行选择使用 Jenkins、Gitlab CI 等任何可构建 iOS 或 Android 的构建服务完成项目构建的配置。这部分不同的 CI 服务配置都有所不同,暂时无法展开,大家可根据自己熟悉情况或借助运维部门的协助搭建。

Zealot 服务

除了管理每次上传的应用和调试文件,在每次接收到上传的应用会触发已配置的网络钩子用来给第三方服务发送通知有新版本收到,同时对于集成 Zealot SDK 的手机客户端每次第一次打开 App 都会收到新版本的安装提醒。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/changelog/index.html b/zh-Hans/docs/4.x/user-guide/changelog/index.html index 76815d2bf..490fbc8a0 100644 --- a/zh-Hans/docs/4.x/user-guide/changelog/index.html +++ b/zh-Hans/docs/4.x/user-guide/changelog/index.html @@ -4,13 +4,13 @@ 变更日志 | Zealot - - + +
版本:4.x

变更日志

未发布

提示

如下罗列的变更是还未发布的列表,代码变更历史:未发布

暂无

5.0

请从右上角版本列表选择对应的版本。

4.7.1 (2023-03-10)

支持最新 Android aapt2 构建工具生成的 aab 应用解析,详细代码变更记录

修复

  • Web 升级最新 appt2 模型避免 aab 解析异常
  • Web 解析异常的重复处理

新增

  • Web Android 应用解包详情页增加应用类型
  • Web 应用渠道编辑后调整原先的页面

4.7.0 (2023-03-03)

变更

  • Docker 重大变更 Redis 最低版本依赖从原来的 5.x 升级至 6.2+,建议使用 7.x 主版本,升级时请手动修改。详细代码变更记录

新增

  • Web 应用类型新增 “新上传版本提示窗” 控制开关 #1058 感谢 softwind0214
  • Web 应用列表页面图标可点击跳转应用详情页
  • Web 环境信息新增依赖服务的版本号显示
  • Web 版本号增加对 nightly 构建的版本的显示

修复

  • Web Ruby 版本降级至 3.0 暂时解决高版本带来的 iOS 应用解析崩溃,具体情况看 #1070
  • Web 应用/类型/渠道展示顺序固定为按照创建时间正序排列
  • Web 修复用户注销时没有弹出二次确认提示
  • Web 修复应用版本在主历史版本无法删除
  • Web 改善多个页面的样式问题
  • Web 产品环境不再展示 Javascript 调试器日志输出

4.6.0 (2023-01-17)

运行环境升级至 Ruby 3.2 并支持 arm64 平台。详细代码变更记录

修复

  • Web 捕获创建应用渠道名称为空问题 #968 感谢 congpeijun
  • Web 备份文件在磁盘不存在的逻辑完善 #995

新增

  • Docker 支持 arm64/v8 及 armv7 镜像 #970
  • Web 采用新 50x 错误页面

变更

  • Web 开发环境 Ruby 升级至 3.2 版本,devcontainer 及容器默认开启 YJIT 特性 #1011
  • API 更新调试文件返回数据结构并修改状态码从 204 改为 200

4.5.3 (2022-11-22)

详细代码变更记录

修复

新增

  • Docker 新增环境变量来关闭 WebSocket (ActionCable) 的请求保护 (实验性质) #950

4.5.2 (2022-11-01)

详细代码变更记录

修复

  • Web 修复注册测试设备异常 #935 感谢 ycy0430
  • Web 适配二维码支持黑暗模式
  • Web 修正 en 英文语言包

新增

  • WebHook 变量结构体新增 usernameemail 字段 #934 感谢 rkonfj
  • Docker 支持 SIDEKIQ_CONCURRENCY 环境变量设置后台任务的并发量,默认 5

变更

  • Docker 减少安全隐患,Web 服务包含 puma 和 puma_control_server 监听更换成 127.0.0.1
  • Web 优化 iOS 设备 UDID 描述文件的文案
  • Web 更新页面底部的文案,感谢 Rails 和 AdminLTE 开源项目!

4.5.1 (2022-09-14)

详细代码变更记录

修复

  • Web 修复应用解包解析报错

4.5.0 (2022-08-19)

详细代码变更记录

支持 👨🏻‍🔧 苹果开发者托管测试设备顺手把 🌑 黑暗模式搞来了!

新增

  • Web 支持黑暗模式 #816
  • Web 新增苹果开发者管理用于注册测试设备 #817
  • Web 新增数据备份管理 #835
  • Web 管理面板完成依赖服务的监控 #586
  • API 涉及 release 字典的地方新增三个字段 platform, device_typecustom_fields

变更

  • Web 不兼容变更 Google 统计强制升级 v4 版本,之前设置的需要重新配置才可以生效 #815
  • CLI 不兼容变更 数据备份和还原功能因结构发生变更不再提供,请使用管理员面板的数据备份功能
  • Web 针对获取设备 UDID 及 iOS 版本安装和下载变更根据设备展示对应的功能界面,不再全部展示
  • Web 移除管理员面板的页面统计功能 #814
  • Web 前端技术栈从 webpacker 迁移至 esbuild + sass, Turbolinks 迁移至 Stimulus 带来更好的前端交互体验 #829
  • Web 鉴于编辑应用的类型和渠道逻辑较复杂,变更只能修改应用名

修复

  • Web 处理应用类型下没有存在渠道的选择错误 #795 感谢 tasselsd
  • API 修复 Android 地址返回错误 #813 感谢 denymz
  • Web/API 修正 aab 解析部分参数为空引发的异常 tryzealot/fastlane-plugin-zealot#9 感谢 tasselsd
  • Web 修复第一次初始化项目生成演示数据异常 #821
  • API 修复检查应用最新版本数据异常 #856 感谢 denymz
  • Web 修复应用渠道详情因关联网络钩子数据异常报错
  • Web 修正英文语言包很多拼写错误

4.4.1 (2022-06-20)

详细代码变更记录

修复

4.4.0 (2022-06-09)

详细代码变更记录

变更

  • Web 对于未登录且未开启游客模式的用户权限新增查看应用版本详情之外还提供按照版本、分支、打包类型方式的筛选显示列表
  • Web 运行时环境升级至 Ruby 3.0,服务框架升级至 Rails 7.0
  • Web 兼容 macOS M1 芯片组

新增

  • Web 便于分享简化和统一部分应用链接 #666
  • Web 补全一些遗漏的权限检查页面

修复

  • Job 修复 iOS 文件解析 URL Schemes 异常
  • Web 修复服务日志没有输出到终端控制台
  • Web 增加处理上传调试文件在解析时它被删除掉或其他原因没有找到本地文件的异常捕获
  • Web 适配超宽屏幕的 UI
  • Web 修复第三方登录依赖库的安全隐患
  • API 修复上传 Android 再不传 channel_key 异常 #779 感谢 likfe

4.3.1 (2021-12-22)

详细代码变更记录

新增

  • Web 设置项更新后可恢复原始默认值
  • Web 应用解包支持 Android 对 app links (区分 deep links 和 url schemes) 的解析显示
  • Web 设置页面强化设置开启、关闭状态的视觉效果

修复

  • Web 修复演示模式异步任务方法错误
  • Web 修复创建和编辑应用无法勾选选中的应用类型和渠道
  • Web 修复在环境页面无法
  • Web 修复解析 aab 没有 intent filters 无法解析
  • Web 增加取消勾选任何类型和渠道更新应用的报错
  • Web 修复加载策略造成第三方登录全部不可用

4.3.0 (2021-12-08)

支持 aab 格式解析、多语言支持!详细代码变更记录

变更

  • Web 使用默认提示的结构体作为网络钩子的数据结构,不再是一个奇怪的结构
  • Web 设置页面不再提供第三方登录授权的参数变更(依赖服务重启)
  • API 上传应用接口和版本详情返回主体新增 text_changelog 650f1ffd
  • API 上传应用接口返回主体 changelog_list 改名 changelog 719f0b1e
  • Web 变更日志输出的内容不再是一个数组内容,而是改为兼容 markdown list 格式的文本内容 719f0b1e
  • Web 一些隐私的配置 key 或 token 仅在管理员权限下明文显示;其他权限不可见;演示只读且会做部分加密处理 #644
  • Web 构建日期和哈希值无法获取不显示

新增

  • Web 支持 Android App Bundle (aab) 文件格式和 webp 图标的解析
  • Web 支持语言国际化,可选语言包:简体中文,英文 (支持页面配置)
  • Web 支持配置更多的系统设置项 #643
  • Web 管理面板支持网络钩子的编辑功能
  • Web 重写并优化应用列表的样式布局
  • Web 优化基础的邮件模板
  • Web 调整登录窗口的样式和错误逻辑
  • Web 管理面板的环境变量页面新增文件权限检查 #608
  • Web 管理面板的新增错误异步任务的详情展示,最大错误数量为 5000
  • Web 使用更好的日志输出格式 #646

修复

  • Web 修复设置页面默认情况下 boolean 值类型的参数勾选状态错误
  • Web 修复在钉钉 App 点击安装或下载出现异常问题(改为微信逻辑处理)
  • Web 修复在环境页面无法显示构建日期(构建 docker 镜像时的时间戳)
  • Web 修复异步通知域名作用域无法生效
  • Web 修复获取 gems 异常
  • Web 修复 iOS 证书过期时间判断异常
  • Web 修复使用虚拟机开发挂载磁盘空间无法获取
  • Web 修复演示模式下的一些已知错误

4.2.2 (2021-10-15)

详细代码变更记录

修复

  • API 解决因批量替换造成的参数不匹配没有正确输出错误信息 #615 感谢 gin7758258
  • Web 解决了针对部分 apk Android 文件解析异常问题 #587

4.2.1 (2021-09-14)

详细代码变更记录

变更

  • Web 应用的图标不再按照预设尺寸裁切并移除图片处理依赖减少将近 200MB 镜像体积
  • Docker 反代服务 Caddy 不再输出日志到 STDOUT 而是直接到文件

修复

  • Web 修复上传应用后图标没有正常处理和显示
  • Web 兼容上传 dSYM 不同的 zip 解压缩逻辑
  • Web 修复安装 iOS 无法显示应用图标
  • Web 安全隐患:禁止编辑设置只读的系统设置
  • Web 修复 macOS 下载文件后缀不正确
  • Web 修复个别情况下不显示弹出无法安装的窗口

4.2.0 (2021-09-01)

详细代码变更记录

变更

  • Web 清理老版本逻辑默认改为关闭,如需开启请设置环境变量 ZEALOT_KEEP_UPLOADS=false #570
  • Web 文件解析改名为应用解包 #529
  • Web 下线应用解包中对已上传应用的解包支持(现在上传的应用都会自动触发额外的应用解包)
  • API 上传应用的自定义字段图标支持 fontawesome css 的值,比如 flag 的值是 fas fa-flag
  • Docker 镜像由 caddy 作为反代提供服务并对 volume 持久化做了变更,涉及迁移,具体看 #540

新功能

  • Web 支持 macOS 应用的上传、解析和下载 #562
  • Web 新增手机设备在渠道详情页对应用类型和渠道快速筛选项 #510 感谢 huacnlee
  • Web 管理员面板可配置应用的类型模板和默认注册用户的权限 #562 #568
  • Web 环境变量涉及隐私的做部分加密处理
  • Web 内存和磁盘使用率增加图形展示
  • Docker 新增支持 Github Container Registry 镜像同步更新
  • Docker 新增支持环境变量配置 postgres 端口号

修复

  • Web 修复在 iPad 和 M1 芯片的 macOS 无法显示 iOS 安装按钮 #519 感谢 ohdarling
  • Web 修复注册但未验证邮件的同时使用第三方登录失败 #517 感谢 huacnlee
  • Web 修复使用网页上传没有触发应用解包
  • Web 修复 tubrolink 开启下左侧导航样式错位
  • Web Android 上传应用也显示解包链接
  • Web 优化解包文件列表判断为空的显示提示
  • Web 修复 LDAP 参数获取错误 #541 感谢 Martwu
  • Web 优化捕获页面上传应用错误改为可读的错误信息
  • Web 修复创建应用类型出错判断异常
  • Web 补充在应用删除全部渠道后点击详情报错的一个异常情况的判断
  • Web 修复上传应用因解析过程变量释放错误
  • Web 修复应用设置密码保护校验时报错 #564 感谢 EasierLu
  • Web 修复管理员面板编辑用户资料报错 #564 感谢 EasierLu
  • Web 修复应用详情页面 "安装" 按钮会在错误的系统和设备上异常显示(正常只有 iOS 应用在 iOS 及 macOS 设备才会显示)
  • Web 优化应用解包对于开发者证书因包含特殊字符集(目前已知的是中文编码)解析失败及 UI 样式的重新布局
  • Web 修复无法编辑当前用户
  • Web 改正调试文件的标题重复
  • Docker 修复镜像初始化 logrotate 错误
  • Docker 修复使用 Caddy 部署需要确认 #551 感谢 ReverseScale

4.1.0 (2021-07-17)

详细代码变更记录

变更

  • Web 因 iPad 的 User-Agent 和 Desktop 一样更改获取设备 UDID 的显示逻辑
  • Docker 设置 Gihub Container Registry (gcr.io) 作为默认 Docker 镜像源

新功能

  • Web 支持飞书、Gitlab 第三方一键登录认证
  • Web 优化找不到应用版本详情页面并可以手动跳转到最新版本
  • Web 系统配置新增部分配置项的查看和部分不通过重启的参数修改
  • Web 管理面板新增页面统计报表

修复

  • Web 修复网络钩子无法获取 title 变量的值
  • Web 修复解析应用过程中异常报错
  • Web 修复创建应用过程中会有异常报错
  • Web 修复系统配置保存时为空造成无法编辑
  • Job 处理移除老版本的逻辑造成删除的版本逻辑和文档逻辑是反的

4.0.0 (2020-12-31)

详细代码变更记录

修复

  • Web 修正文件解析 iOS 证书对失效时间判断异常造成的页面错误显示
  • Web 忽略默认开发版本号检查新版本

4.0.0.rc2 (2020-12-25)

详细代码变更记录

新功能

  • Web 新的文件解析会保存到列表,上传的应用也会同步一份文件解析(异步任务) #346
  • Web 控制面板新增文件解析数据统计
  • Web 控制面板针对管理员新增网络钩子、后台任务和磁盘使用的数据统计
  • Web 版本详情提示文件缺失增加有权限者快速删除功能

变更

  • API 调试文件版本检查接口改名并新增按照文件指纹和 dSYM uuid 检查是否存在 #349

修复

  • Web 修复禁用 LDAP 登录认证报错( IP 白名单设置错误)
  • Web 修正 Android 微信打开版本详情提示的文案

4.0.0.rc1 (2020-10-29)

详细代码变更记录

变更

  • Docker 重大变更 合并 rails 和 worker 到同一镜像部署需要同步更新 zealot-docker 库 #235
  • Docker Ruby 升级 2.7 部署
  • Web font-awesome 从 4.7.0 升级至 5.13.0,可能会有遗漏的 Icon 显示不正常
  • Web 调整邀请邮件的文案
  • Web 应用和调试文件下载路径统一到 /download 路径
  • Web 在线解析应用需要登录权限
  • Web 优化已经删除的或不存在的版本详情地址会自动跳转最新版本
  • Web 应用安装和下载逻辑做了调整(主要 iPadOS UserAgent 和 Desktop 一样无法判断)

新功能

  • Web 涉及下载文件不存在会提示无法下载
  • Web 在线解析支持 .mobileprovision 格式文件以及解析 .ipa 新增开启功能等
  • Web 部分系统设置可以使用管理员面板在线修改 #245
  • Web 新增游客模式 #243
  • Web 支持显示 iOS AdHoc 版本测试设备的名称 #211
  • Web 支持解析已上传版本安装包的内容 #210
  • Web 支持获取 iOS 设备 UDID 功能 #203
  • Web 支持定期数据初始化且有功能限制的演示模式 #198
  • Web 上传 App 后在版本详情显示原本应用的名称
  • Web 可通过版本、Git 分支、打包类型筛选过滤应用列表
  • Web 版本详情最近上传关联 git commit 链接(如果在渠道设置了 git url)
  • Web LDAP 登录融合到现有登录界面,不再使用第三方依赖提供的简陋界面
  • Job 支持通过 rails 命令管理生成恢复数据备份功能(数据库、上传文件数据)#207
  • API 新增检查调试文件是否存在接口 /api/debug_files/version_exist

修复

  • Web 修复上传 App 填写变更日志解析报错
  • Web 解决版本详情中二维码在中等分辨率会超出父视图
  • Web 解决应用渠道一些值为空确没有不显示默认值
  • Web 优化在线解析 iOS 包的内容展示(和永远展示假数据的问题)
  • Web 解决版本详情在使用 fastlane-plugin-ci_changelog 生成的变更日志没有展示提交者信息
  • Web 修复并优化检查新版本逻辑
  • Web 修复删除调试文件确认弹窗信息获取为空
  • Web 优化版本详情设备列表在一些手机的显示方式
  • Web 修复解析应用在不传参数提交的报错
  • Web 优化版本列表在手机查看
  • Web 渠道版本的最近上传动态仅显示底部分页,上部改为版本总数
  • Web 修复管理员编辑用户留空密码提示不能为空
  • Web/API 修复在线下载和安装版本不存在时会采用最新版本
  • Web 修复游客模式登录界面会显示边栏菜单
  • Web 修复上传同一应用同一平台调试文件总是会被覆盖的问题
  • Web 系统设置页面优化对布尔类型、字典类型的显示
  • Job 修复定时任务来清理老版本时因版本判断错误发生的误删版本
  • Docker 修复因为 volume 存储 public 文件夹造成内部静态资源不会更新
  • Docker 容器内的版本和外部不一致

4.0.0.beta4 (2020-05-07)

详细代码变更记录

新功能

  • Docker 支持 Heroku 部署
  • Web 游客模式允许查看 App 详情、列表和上传 App 详情
  • API 上传 App 支持自定义字段 #178
  • Web/API 上传 App 传递了 branch 值开头包含 origin/ 开头会自动清理掉
  • Web 登录、注册、找回密码、重设密码等用户认证界面增加项目简介

修复

  • Web 修正用户密码描述文案
  • Web 修复网络钩子(WebHook)包含 url 字段的地址错误
  • Web/API 修复上传 iOS dSYM 文件上传报错
  • API 修复获取 App 接口 has_password 参数异常
  • API 修复上传 App 记录的 source 来源都是 Web
  • API 修复并支持上传 App 传递字符串类型的 json 格式的 changelog
  • Web 修复系统信息没有正常获取 CPU 和内存信息
  • Web 修复在线解析 Android 应用偶尔报错
  • Web 修复使用微信扫描二维码页面报错

变更

  • API 应用最新版本接口(apps/latest)增加 bundle_id 纬度的验证
  • Web 游客模式可以访问应用版本详情和下载操作
  • Web 应用版本详情对于 iOS AdHoc 右侧的设备列表左移并默认收起状态
  • Web 开发环境移除 GraphQL 控制台功能,推荐使用 graphql-playground
  • Web 页面底部移除 footbar,版本信息可以在系统信息查看

4.0.0.beta3 (2020-01-16)

详细代码变更记录

新功能

  • Web 管理员添加的用户在邮箱未激活会提示并显示确认邮箱的链接
  • Web 默认开启 Sentry 匿名上报机制(可关闭)

修复

  • API 修复上传应用总会创建新渠道
  • Web/API 修复上传 Android 应用无法显示图标

变更

  • Docker 初始化数据从镜像移出到 zealot-docker 操作 #120
  • Docker 精简镜像的体积大小从 1.18G 降到 308M #114
  • Job 使用异步任务代替传统 cron job 来实现定时清理老版本历史包文件(可关闭)
  • Job 对异步任务进行分组和设置优先级
  • API 所有报错信息改成中文显示,因数据库写操作会返回具体错误信息
  • Web 使用 Rubocop Lint 规范化代码

4.0.0.beta2 (2020-01-10)

详细代码变更记录

新功能

  • Web 新增上传到具体应用渠道的全部版本列表同时支持删除操作

修复

  • Web 对于上传应用不是有效 ipa 或 apk 的会给予错误提示而不是报错
  • API 修复获取应用最新版本列表因查询版本号不存在数据库无法返回最新版本列表
  • API 只针对写操作的接口才会要求 token 验证(之前是绝大部分都需要)

4.0.0.beta1

🌈 第一个公测版本发布啦

更早的版本

之前多年一直是公司内部开发和运营并没有开源,曾经承担过很多的功能到现在脱离出来专注提供应用托管和分发的服务。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/credits/index.html b/zh-Hans/docs/4.x/user-guide/credits/index.html index 5bcc18261..b5dc85b82 100644 --- a/zh-Hans/docs/4.x/user-guide/credits/index.html +++ b/zh-Hans/docs/4.x/user-guide/credits/index.html @@ -4,13 +4,13 @@ Credits | Zealot - - + +
版本:4.x

Credits

实在不知道怎么翻译 Credits,就这么招吧。

贡献成员

感谢你们让 Zealot 变得更有用!

项目名

Zealot 来自星际争霸种神族基础兵种。

图标

最初项目历史提交资源图标版权归属暴雪,后期改为自己设计的图标,如果有热心设计师能够帮助设计更好的图标,本人代表本项目表示衷心的感谢。

发布协议

Zealot 是一个基于 MIT 发布协议 (MIT) 发布的开源项目,协议内容请参见协议文件

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/dashboard/index.html b/zh-Hans/docs/4.x/user-guide/dashboard/index.html index 0ffb435bd..6edd9b901 100644 --- a/zh-Hans/docs/4.x/user-guide/dashboard/index.html +++ b/zh-Hans/docs/4.x/user-guide/dashboard/index.html @@ -4,13 +4,13 @@ 控制面板 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/debug-files/upload/index.html b/zh-Hans/docs/4.x/user-guide/debug-files/upload/index.html index 9d325f899..e69ecd8ca 100644 --- a/zh-Hans/docs/4.x/user-guide/debug-files/upload/index.html +++ b/zh-Hans/docs/4.x/user-guide/debug-files/upload/index.html @@ -4,13 +4,13 @@ 上传调试文件 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/index.html b/zh-Hans/docs/4.x/user-guide/index.html index 6949a020e..8d88e7c26 100644 --- a/zh-Hans/docs/4.x/user-guide/index.html +++ b/zh-Hans/docs/4.x/user-guide/index.html @@ -4,8 +4,8 @@ 用户手册 | Zealot - - + +
@@ -14,7 +14,7 @@ Chat on Telegram Maintainability License

开源自部署持续集成一切跟应用有关事情,接入任意 CI 系统一切自动化处理,企业多年实战经验,独立部署提供企业打包分发流程、上传应用全套流程方案 En Taro Adun! 🖖

功能预览功能预览

特性

  • 🌏 多平台应用托管: macOS、iOS、甚至是 APK 和 AAB 格式的 Android 应用上传、安装和下载
  • 🗄 多渠道分类管理: Debug、AdHoc、Enterprise 还是 Android 应用渠道管理统统没问题
  • 📱 测试设备一网打进: 自动同步 iOS 测试设备信息,允许一键注册新设备到苹果开发者
  • 🧑‍💻 丰富开发者套件: 提供 REST API、iOSAndroid SDK 以及 fastlane 自动化构建插件
  • 💥 剖析应用内部的秘密: 解读 iOS、Android 应用或 iOS 描述文件的元信息
  • 🎳 多架构部署: amd86、arm64 和 armv7 任君选择(支持 ARM 的 macOS)
  • 🚨 内置多种事件通知: 数据可自定义 Income WebHook 到任意通知服务
  • 🔑 第三方登录: 飞书、Gitlab、Google 和 LDAP 一键授权
  • 🌑 黑暗模式: 黑夜白昼自由切换

在线演示

注意: 演示服务部署在免费资源存在不稳定情况且数据每日都会重新初始化,不对用户上传的应用承担任何法律风险,后果自负!

发布协议

MIT

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/qa/index.html b/zh-Hans/docs/4.x/user-guide/qa/index.html index ce91d570d..0b37df317 100644 --- a/zh-Hans/docs/4.x/user-guide/qa/index.html +++ b/zh-Hans/docs/4.x/user-guide/qa/index.html @@ -4,15 +4,15 @@ 疑惑解答 | Zealot - - + +
版本:4.x

疑惑解答

下面会列出来一些遇到的问题并汇总提供给大家。

为什么不能使用 HTTP 部署服务

鉴于 iOS 使用下载服务依赖开启 SSL/TLS 证书,建议使用经过授权的证书服务,如果服务不需要提供 iOS、macOS 的安装服务可以考虑使用 HTTPS 部署服务, 这里推荐使用免费 Let's Encrypt 提供 SSL 证书服务。

使用自签名的证书无法安装 iOS 应用

如果使用自签名证书需要每个 iOS 设备在下载安装应用前必须安装自签名证书才行,每个设备都需要进行安装,操作比较复杂在有免费 SSL 证书服务的情况下不到逼不得已不建议使用自签名证书。

使用负载均衡部署服务,下载总会从 https 变成 http

负载均衡在提供服务的时候会在最前端部署 https 服务,内部的分发实际上还是走的 http,解决办法在负载均衡上把转发的协议头从 http 改成 https,这样服务再转发的时候就会继承最前端的协议头(X-Forwarded-Proto)。

是否支持外部 redis、postgresql 链接

支持的,如果有公用的 redis、postgresql 服务器那就可以单独部署 zealot 服务,在 .env 配置或 Docker、K8s 的环境变量手动指定如下配置:

# Redis
REDIS_URL=redis://127.0.0.1:6379/0

# Postgresl
ZEALOT_POSTGRES_HOST=127.0.0.1
ZEALOT_POSTGRES_PORT=5432
ZEALOT_POSTGRES_USERNAME=postgres
ZEALOT_POSTGRES_PASSWORD=ze@l0t
ZEALOT_POSTGRES_DB_NAME=zealot

是否支持 Kubernetes(k8s)部署

服务是支持 K8S 的单机部署但不支持伸缩特性,具体原因是因为应用上传使用的是容器内的本地存储没有支持亚马逊 S3 或阿里云第三方云存储的支持。

是否提供类似 FIR、蒲公英服务的应用的分享页面

服务提供两种页面地址:

1 应用渠道详情页

https://YOUR_ZEALOT_URL/channels/SLUG

其实 YOUR_ZEALOT_URL 是 zealot 服务地址,SLUG 是你对应应用渠道的唯一地址。

2 上传的版本详情页

https://YOUR_ZEALOT_URL/channels/SLUG/releases/ID

其实 YOUR_ZEALOT_URL 是 zealot 服务地址,SLUG 是你对应应用渠道的唯一地址,ID 是上传的版本 ID,为空的时候会自动调整到最新版本,所以可以直接分享

https://YOUR_ZEALOT_URL/channels/SLUG/releases

服务运行一段时间 CPU 或内存资源暴涨不下,如何解决?

根据用户 Cleam反馈部署服务之后,托管的应用很少,上传频率不高,服务器硬件规格也完全达标的情况下还是会引发 CPU 或内存资源暴涨造成服务器卡死, 当前的情况属于还属于个人情况,目前情况未知,但可以通过限制 CPU 和内存来规避这个问题,编辑 docker-compose.yml 文件:

zealot:
<<: *defaults
+ deploy:
+ resources:
+ limits:
+ cpus: 2.0
+ memory: 2G
+ reservations:
+ cpus: 0.5
+ memory: 256M
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid/index.html b/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid/index.html index 1fae5d236..cee5c6ad8 100644 --- a/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid/index.html +++ b/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid/index.html @@ -4,13 +4,13 @@ 获取 iOS 设备 UDID | Zealot - - + +
版本:4.x

获取 iOS 设备 UDID

Zealot 提供的获取 iOS 设备 UDID 除了市面上最最最基础的功能之外,内置了强大扩展功能:

  1. 通过 UDID 罗列可以安装的应用列表
  2. 开启苹果开发者功能允许把未注册测试设备添加到对于的开发者账号

安装描述文件

信息

此功能仅对 iOS 设备有效,如果是电脑打开会提示用手机扫描二维码打开。

无论使用什么用户登录模式(包括游客模式)都可以通过左侧菜单栏的 "获取设备 UDID" 安装描述文件后获取当前 iOS 设备的 UDID。

不要在意安装的描述文件展示"未签名",这个不影响安装,且此描述文件是一次性的获取之后会被系统销毁绝对不会存在安全隐患。

安装描述文件安装描述文件

描述文件安装后会返回浏览器打开一个新的页面展示设备 UDID,这个时候会出现如下两种情况:

未注册设备

未注册设备提供最基本的设备信息,包含 UDID、内部型号和序列化号之外,服务管理员如果添加了苹果开发者还会显示注册测试设备到对于的开发者账号中。

提示

注册到苹果开发者账号仅仅意味着设备更新到苹果开发者账号的 Devices 下面,对于 iOS 开发者还需要手动或脚本自动化把该测试设备添加到对应的 Ad-Hoc 证书,再进行安装并重新打包上传才允许该设备安装。

安装描述文件安装描述文件

已注册设备

已注册的测试设备就会展示可以安装的应用列表。服务管理员如果添加了苹果开发者还会显示注册测试设备到对于的开发者账号中。

安装描述文件安装描述文件
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/toolkits/teardown/index.html b/zh-Hans/docs/4.x/user-guide/toolkits/teardown/index.html index bc9359b16..99facf038 100644 --- a/zh-Hans/docs/4.x/user-guide/toolkits/teardown/index.html +++ b/zh-Hans/docs/4.x/user-guide/toolkits/teardown/index.html @@ -4,13 +4,13 @@ 解析应用分析内部元信息 (Metadata) | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk/index.html b/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk/index.html index 29fce5636..92668a620 100644 --- a/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk/index.html +++ b/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk/index.html @@ -4,14 +4,14 @@ 钉钉 | Zealot - - + +
版本:4.x

钉钉

钉钉的网络钩子结构体通常支持文本和 markdown 两种方式, 由于系统限制尽量使用关键词或 IP 地址白名单机制来接受消息。可通过如下配置实现:

Text 文本格式

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Markdown 格式

title 字段仅在对话列表展示,进入对话框的聊天内容则展示 text 字段

{
"msgtype": "markdown",
"markdown": {
"title": @title,
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/webhooks/discord/index.html b/zh-Hans/docs/4.x/user-guide/webhooks/discord/index.html index e4e6fa705..13cf29520 100644 --- a/zh-Hans/docs/4.x/user-guide/webhooks/discord/index.html +++ b/zh-Hans/docs/4.x/user-guide/webhooks/discord/index.html @@ -4,13 +4,13 @@ Discord | Zealot - - + +
版本:4.x

Discord

Discord 支持 Slack 兼容的网络钩子因此其结构体通常支持文本和 block 富文本两种方式,可通过如下配置实现:

Text 文本格式

{
"text": "#{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}"
}

Block 富文本格式

一个简单的支持 markdown 的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
]
}

稍微好看点有些结构展示的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*平台:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*上传时间:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/webhooks/feishu/index.html b/zh-Hans/docs/4.x/user-guide/webhooks/feishu/index.html index b3de46940..401cc6a96 100644 --- a/zh-Hans/docs/4.x/user-guide/webhooks/feishu/index.html +++ b/zh-Hans/docs/4.x/user-guide/webhooks/feishu/index.html @@ -4,14 +4,14 @@ 飞书 | Zealot - - + +
版本:4.x

飞书

飞书的网络钩子结构体通常支持文本和卡片两种方式, 由于系统限制尽量使用关键词或 IP 地址白名单机制来接受消息。可通过如下配置实现:

Text 文本格式

{
"msg_type": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Interactive 卡片格式

通过这种格式可以实现支持 markdown 的部分语法:

{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"elements": [
{
"tag": "div",
"text": {
"content": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})",
"tag": "lark_md"
}
},
{
"actions": [{
"tag": "button",
"text": {
"content": "点击安装",
"tag": "lark_md"
},
"url": @install_url,
"type": "default",
"value": {}
}],
"tag": "action"
}
]
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/webhooks/index.html b/zh-Hans/docs/4.x/user-guide/webhooks/index.html index 82dab0686..6dee3d406 100644 --- a/zh-Hans/docs/4.x/user-guide/webhooks/index.html +++ b/zh-Hans/docs/4.x/user-guide/webhooks/index.html @@ -4,15 +4,15 @@ 网络钩子(WebHook) | Zealot - - + +
版本:4.x

网络钩子(WebHook)

Zealot 为每个应用渠道都提供一个消息通知的网络钩子,网络钩子完全可自定义结构体可适用于绝大多数的通知服务, 比如企业微信、钉钉、Slack 等等。

默认结构体

默认结构体每个参数都已变量的方式提供它的值,每个变量都以 @ 开头,在创建网络钩子如果留空自定义结构体就会使用默认结构体, 如下全部提供的变量:

{
event: @event,
title: @title,
app_name: @name,
device_type: @device_type,
release_version: @release_version,
build_version: @build_version,
size: @file_size,
changelog: @changelog,
install_url: @install_url,
icon_url: @icon_url,
qrcode_url: @qrcode_url,
uploaded_at: @uploaded_at
}

输出的结果如下:

{
"event": "upload_events",
"title": "Zealot 样例 iOS 内测版上传了 1.0.0 版本",
"app_name": "Zealot 样例 iOS 内测版",
"device_type": "iOS",
"release_version": "1.0.0",
"build_version": "1",
"size": "30 MB",
"install_url": "https://zealot.test/api/apps/download/12354",
"icon_url": "https://zealot.test/api/apps/icon.png",
"qrcode_url": "https://zealot.test/api/apps/354/qrcode",
"uploaded_at": "2019-12-30 11:33:00",
"changelog": "- 新增了 A 功能\n- 修复了 B 问题\n- 发布 1.0.0 版本",
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/webhooks/slack/index.html b/zh-Hans/docs/4.x/user-guide/webhooks/slack/index.html index 1b0f50e94..9d1ec622d 100644 --- a/zh-Hans/docs/4.x/user-guide/webhooks/slack/index.html +++ b/zh-Hans/docs/4.x/user-guide/webhooks/slack/index.html @@ -4,13 +4,13 @@ Slack | Zealot - - + +
版本:4.x

Slack

Slack 的网络钩子使用 Incoming Webhooks 其结构体通常支持文本和 block 富文本两种方式,可通过如下配置实现:

Text 文本格式

{
"text": "#{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}"
}

Block 富文本格式

一个简单的支持 markdown 的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
]
}

稍微好看点有些结构展示的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*平台:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*上传时间:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/4.x/user-guide/webhooks/wecom/index.html b/zh-Hans/docs/4.x/user-guide/webhooks/wecom/index.html index c51ea44ef..859439233 100644 --- a/zh-Hans/docs/4.x/user-guide/webhooks/wecom/index.html +++ b/zh-Hans/docs/4.x/user-guide/webhooks/wecom/index.html @@ -4,13 +4,13 @@ 企业微信 | Zealot - - + +
版本:4.x

企业微信

企业微信的网络钩子结构体通常支持文本和 markdown 两种方式,可通过如下配置实现:

Text 文本格式

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Markdown 格式

{
"msgtype": "markdown",
"markdown": {
"content": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/administrator/index.html b/zh-Hans/docs/category/administrator/index.html index 621676e13..c0dd2aed4 100644 --- a/zh-Hans/docs/category/administrator/index.html +++ b/zh-Hans/docs/category/administrator/index.html @@ -4,13 +4,13 @@ 管理面板 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/apps/index.html b/zh-Hans/docs/category/apps/index.html index 3e4ae320b..fc22c4b22 100644 --- a/zh-Hans/docs/category/apps/index.html +++ b/zh-Hans/docs/category/apps/index.html @@ -4,13 +4,13 @@ 应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/cloud-provider-guides/index.html b/zh-Hans/docs/category/cloud-provider-guides/index.html index f381153c3..b20988f70 100644 --- a/zh-Hans/docs/category/cloud-provider-guides/index.html +++ b/zh-Hans/docs/category/cloud-provider-guides/index.html @@ -4,13 +4,13 @@ 云服务商 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/configuration/index.html b/zh-Hans/docs/category/configuration/index.html index 6a97fcbf8..5d6420c7b 100644 --- a/zh-Hans/docs/category/configuration/index.html +++ b/zh-Hans/docs/category/configuration/index.html @@ -4,13 +4,13 @@ 配置 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/debug-files/index.html b/zh-Hans/docs/category/debug-files/index.html index a8924d848..782067ef8 100644 --- a/zh-Hans/docs/category/debug-files/index.html +++ b/zh-Hans/docs/category/debug-files/index.html @@ -4,13 +4,13 @@ 调试文件 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/deployment/index.html b/zh-Hans/docs/category/deployment/index.html index 9307653bc..f81db3a2a 100644 --- a/zh-Hans/docs/category/deployment/index.html +++ b/zh-Hans/docs/category/deployment/index.html @@ -4,13 +4,13 @@ 部署 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/local-development/index.html b/zh-Hans/docs/category/local-development/index.html index 85a6c3b07..80875e079 100644 --- a/zh-Hans/docs/category/local-development/index.html +++ b/zh-Hans/docs/category/local-development/index.html @@ -4,13 +4,13 @@ 本地开发 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/monitoring/index.html b/zh-Hans/docs/category/monitoring/index.html index b2f7780f3..f94962444 100644 --- a/zh-Hans/docs/category/monitoring/index.html +++ b/zh-Hans/docs/category/monitoring/index.html @@ -4,13 +4,13 @@ 监控 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/sdks/index.html b/zh-Hans/docs/category/sdks/index.html index a18373273..80d4c554b 100644 --- a/zh-Hans/docs/category/sdks/index.html +++ b/zh-Hans/docs/category/sdks/index.html @@ -4,13 +4,13 @@ 移动 SDK | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/category/toolkits/index.html b/zh-Hans/docs/category/toolkits/index.html index e7d6424ac..0bf5fbb44 100644 --- a/zh-Hans/docs/category/toolkits/index.html +++ b/zh-Hans/docs/category/toolkits/index.html @@ -4,13 +4,13 @@ 工具箱 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/contributing-guide/index.html b/zh-Hans/docs/contributing-guide/index.html index 549d8107d..6cf3026de 100644 --- a/zh-Hans/docs/contributing-guide/index.html +++ b/zh-Hans/docs/contributing-guide/index.html @@ -4,14 +4,14 @@ 贡献者指南 | Zealot - - + +
版本:5.0.0

贡献者指南

本指南将会帮助你更好的上手 Zealot!感谢您对本项目感兴趣。在提交你的贡献之前请仔细认真阅读如下指南:

准备工作

贡献代码前请在 Issues 确认是否存在,没有发现的话欢迎动动小手创建新 Issue,创建之后你会收到一个自动回复请勿担心我会在看到后尽快整理并回应。 如果解决方案非常的复杂,建议极可能完整描述背景、解决目的和方案以方便核心开发者审核。

准备本地开发环境

我们将会从如下指南帮助准备和部署本地 Zealot 开发环境:

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/contributing-guide/local-development/devcontainer/index.html b/zh-Hans/docs/contributing-guide/local-development/devcontainer/index.html index c771200d8..37f76cc0a 100644 --- a/zh-Hans/docs/contributing-guide/local-development/devcontainer/index.html +++ b/zh-Hans/docs/contributing-guide/local-development/devcontainer/index.html @@ -4,13 +4,13 @@ Visual Studio Code Dev Container 开发部署指南 | Zealot - - + +
版本:5.0.0

Visual Studio Code Dev Container 开发部署指南

Dev Container (Developing inside a Container) 是 Visual Studio Code 使用 Docker 作为开发环境能够实现在本地无需配置开发环境在容器开发有近乎本地体验的解决方案。

VSCode devcontainer

系统依赖

在开发之前,你需要安装最新版本的 Git,Virsual Studio Code,Docker 和 docker-compose。

安装 Git

因操作系统不同,建议按照官方安装教程操作。

安装 Docker & docker-compose

安装 Visual Studio Code

Visual Studio Code 是一个跨平台运行的免费的代码编辑器,根据操作系统选择你的安装方式:

  1. 下载 Visual Studio Code macOS 版。
  2. 打开浏览器下载界面找到已下载的应用文件或压缩文件。
  3. 如果是压缩文件先进行解压缩操作,如果使用 Safari 下载通常会帮你自动解压缩。
  4. 拖拽 Visual Studio Code.app 到系统应用文件夹。
  5. 双击 VS Code 应用即可打开应用。

安装 Remote container 扩展

按照官方教程安装 Remote Container extension

VSCode extension

获取 Zealot Codespace

Zealot Codespace 同样存放在 Zealot 项目 .devcontailer 目录,你需要先克隆项目源代码。

git clone https://github.com/tryzealot/zealot.git

Codespace 包含了一系列文件:

文件名说明
devcontainer.jsonVSCode devcontainer 配置文件
Dockerfile.base镜像核心,变更会自动推送到不同 registry 仓库
Dockerfile间接镜像,主要是节省编译时间
docker-compose.yml项目服务依赖
create-db-user.sql用于初始化 Postgres 默认用户及权限

在容器内打开项目

打开 Visual Studio Code 应用后在 Command Palette 输入 Dev Containers: Open Folder in Container... 回车选择刚克隆下来的 Zealot 项目目录。

VSCode Command Palette

首次执行会拉取 Zealot Codespace 镜像并开始构建,过程会持续一段时间期间可点击 Starting Dev Container (show log) 查看构建实时日志。

VSCode Command Palette

构建完成并启动完毕会加载项目文件和 zsh 终端,通过日志可以看到如下信息:

[7293 ms] Start: Run in container: cat /proc/344/environ
[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.
[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e
[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established
[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close
[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.
[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close

在宿主机也能看到 Docker 启动了 docker-compose 在运行:

Docker-Compose containers

启动项目

如果没有打开 VSCode 内置终端可以通过快捷键 Ctrl + ` 打开,新打开一个终端运行 bin/dev 可运行 Zealot 依赖的所有服务。

VSCode Zealot in Container

浏览器访问服务

在运行 bin/dev 一会后你会在右下角窗口看到 Open in Browser 窗口点击可打开 Zealot 网页服务。同样也可以通过终端区域顶部 Ports 选项查看可转发端口的服务,点击浏览器图标会把容器的端口转发并绑定到本地随机断开后上面访问。

VSCode forwarded ports

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/contributing-guide/local-development/source-code/index.html b/zh-Hans/docs/contributing-guide/local-development/source-code/index.html index b5ee9a2de..1deab85d4 100644 --- a/zh-Hans/docs/contributing-guide/local-development/source-code/index.html +++ b/zh-Hans/docs/contributing-guide/local-development/source-code/index.html @@ -4,13 +4,13 @@ 源码部署 Zealot 指南 | Zealot - - + +
版本:5.0.0

源码部署 Zealot 指南

如下整理了不同操作系统的本地部署开发教程。

准备部署环境

macOS

安装 homebrew

首先需要安装 Xcode Command tools:

$ xcode-select --install

如果提示安装失败,需要从 https://developer.apple.com/downloads 下载安装。

之后安装 macOS 的包管理工具 Homebrew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装依赖

之后开始安装环境依赖

$ brew install redis postgresql webp imagemagick node git

M1 用户需要设置依赖编译路径到 SHELL 的配置文件中:

export CPATH=/opt/homebrew/include/
export LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ brew services start postgresql
$ brew services start redis

Postgresql 还需要创建默认用户名:

$ createuser --superuser zealot

# 如果担心权限过高可以只开启创建数据库权限
$ createuser --createdb zealot

yarn

$ npm install -g yarn

运行起来后使用浏览器访问 http://localhost:3000

疑难杂症

M1 芯片 MacOS 问题
aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o

使用 bundle install 会遇到如上问题这个是因为 homebrew 安装 webp 依赖之后编译路径无法被找到,上面有解决办法。

Debian (Ubuntu)

安装环境依赖

$ apt update
$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev

安装依赖

$ apt install -y redis postgresql-client node

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ systemctl postgres start
$ systemctl redis start

Postgresql 还需要创建默认用户名:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

node

$ npm install -g yarn

Alpine Linux

安装环境依赖

$ apk --update --no-cache add build-base libxml2 libxslt git \
libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \
tzdata

如果是在 arm 架构安装还需要额外安装 gcompat glib 兼容层,否则会报 "Error loading shared library" 异常错误。

安装依赖

$ apk --update --no-cache redis postgresql node

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ rc-service postgres start
$ rc-service redis start

Postgresql 还需要创建默认用户名:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# 如果担心数据库用户权限,可仅开启创建数据库权限
$ createuser --createdb zealot

yarn

$ npm install -g yarn

安装 Ruby

可以通过 asdf、rvm 任意一种方式安装。

一个支持主流开发语言版本切换的工具,请按照官方安装教程好之后安装 ruby:

# 开启 Ruby 3.2.0 YJIT 新特性需要安装 rust 1.58+
# 可选安装:
asdf plugin add rust
asdf install rust latest
asdf global rust latest
export RUBY_CONFIGURE_OPTS=--enable-yjit

# 必须安装
asdf plugin add ruby
asdf install ruby 3.2.0
asdf global ruby 3.2.0

克隆源代码

git clone https://github.com/tryzealot/zealot.git

初始化

以下步骤均需要在 zealot 根目录执行。

bundler

安装 Ruby gems 第三方类库

$ [sudo] gem install bundler
$ bundle install

yarn

安装前端第三方类库

$ yarn install

初始化数据库

确保连接数据库信息没有问题,后将会创建数据库表并创建表结构

$ rails db:create
$ rails db:migrate

配置数据库连接参数可通过环境变量或更改 config/database.yml 文件。

初始化预制数据

初始化管理员账号和应用样例

$ rails db:seed

运行 Zealot 服务

$ bin/dev

打开浏览器访问 http://localhost:3000

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/api/apps/index.html b/zh-Hans/docs/developer-guide/api/apps/index.html index b16ea2334..d51b3723d 100644 --- a/zh-Hans/docs/developer-guide/api/apps/index.html +++ b/zh-Hans/docs/developer-guide/api/apps/index.html @@ -4,13 +4,13 @@ 应用接口 | Zealot - - + +
版本:5.0.0

应用接口

上传应用

上传应用,仅支持 iOS, Android 和 macOS 类型。

POST /api/apps/upload

参数

信息
名称类型是否必须描述
fileFiletrue应用本地路径的内容
channel_keyStringfalse应用具体渠道的 Key,没有传此参数会字段创建对于的应用、类型和渠道
nameStringfalse应用名称,为空时取 App 的信息
release_typeStringfalse应用类型,比如 debug, beta, adhoc, release, enterprise 等
sourceStringfalse上传渠道名称,默认是 api
changelogStringfalse变更日志,接受纯文本或 JSON 格式化的数据
branchStringfalse上传应用时的git branch名称
git_commitStringfalse上传应用时的 git commit hash
ci_urlStringfalseCI 项目构建地址
custom_fieldsStringfalse这是一个用 JSON 字符串定义的自定义字段,
可配置名称,值以及 fontawesome 图标用于在页面详情展示

For changelog attribute which it accepts both plain text and JSON formatted contents:

plain text:

message 1\nmessage 2

JSON:

[
{
"message": "message 1",
"author": "admin",
"email": "admin@zealot.com",
"date": "2021-11-11 11:11:11"
},
{
"message": "message 1",
"author": "developer",
"email": "developer@zealot.com",
"date": "2021-11-11 11:11:11"
}
]

对于 custom_fields 的用法,它是一个使用 JSON 格式的以键值对为单位的数组,比如需要自定义国家 country=China 并配置图标为 fontawesome 的 flag

curl -X POST \
'https://YOUR_ZEALOT_URL/api/apps/upload' \
--form 'token="token"' \
--form 'channel_key="channel_key"' \
+ --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \
--form 'file=@/path/to/your/app'

返回样例

{
"id": 50,
"version": 7,
"app_name": "Test Android",
"bundle_id": "com.test.app",
"release_version": "1.0",
"build_version": "1",
"source": "SOURCE",
"branch": "master",
"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",
"ci_url": "",
"size": 1565486,
"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",
"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",
"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",
"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",
"changelog": [
{
"message": "Changelog message 1"
},
{
"message": "Changelog message 2"
}
],
"text_changelog": "- Changelog message 1\n- Changelog message 2",
"custom_fields": [],
"created_at": "2021-09-01T11:43:33.977+08:00",
"app": {
"id": 1,
"name": "App name"
},
"scheme": {
"id": 8,
"name": "Test"
},
"channel": {
"slug": "1XmpC",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
}

应用列表

获取创建的应用列表,支持分页

GET /api/apps

参数

名称类型是否必须描述
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

[
{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 1,
"name": "测试版",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
},
{
"id": 2,
"name": "内测版",
"channels": [
{
"slug": "l19Tl",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "8selv",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}
]

应用详情

查看应用的明细:应用类型、渠道等信息

GET /api/apps/:id

参数

名称类型是否必须描述
idStringtrue应用 ID

返回样例

{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 5,
"name": "测试版",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}

应用版本列表

获取应用已上传的版本列表,按照上传时间倒序排列

GET /api/apps/versions

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

{
"app_name": "Zealot iOS 测试版",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "测试版"
},
"releases": [
{
"version": 2,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10292024",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
{
"version": 1,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
]
}

应用最新版本

获取指定应用的最新版本信息

GET /api/apps/latest

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
release_versionStringtrue应用的发布版本
build_versionStringtrue应用的构建版本

返回样例

{
"app_name": "Zealot iOS 测试版",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "测试版"
},
"releases": {
"version": 1,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}
}

检查当前版本是否存在

使用 bundle_id、release_version、build_verion 或 bundle_id、git_commit 组合检查当前版本是否存在

GET /api/apps/version_exist

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
bundle_idStringtrue应用的包名,iOS 取 bundle_id,Android 取 package_name
release_versionStringfalse应用的发布版本
build_versionStringfalse应用的构建版本
git_commitStringfalse上传应用时的 git commit hash

返回样例

  • 版本存在返回 200 状态码并返回版本的信息
  • 版本不存在返回 404 状态码和错误信息

版本存在的返回信息

{
"version": 1,
"app_name": "好好住 iOS 测试版",
"bundle_id": "com.haohaozhu.hhz",
"release_version": "4.1.1",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}

版本不存在的返回信息:

{
"error": "应用版本不存在"
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/api/debug_files/index.html b/zh-Hans/docs/developer-guide/api/debug_files/index.html index b8213927e..8bdd9a9b2 100644 --- a/zh-Hans/docs/developer-guide/api/debug_files/index.html +++ b/zh-Hans/docs/developer-guide/api/debug_files/index.html @@ -4,13 +4,13 @@ 调试文件接口 | Zealot - - + +
版本:5.0.0

调试文件接口

上传调试文件

上传 iOS 和 Android 的调试文件:

  • iOS: 使用 Zip 压缩后的 dSYM 文件
  • Android: 使用 Zip 压缩后包含 mapping.txt、R.txt 和 AndroidManifest.xml 的文件
POST /api/debug_files/upload

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
fileFiletrueZip 压缩文件后的调试文件
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringtrue内部版本号,iOS 类型可忽略该参数

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

下载调试文件

下载 iOS 和 Android 的调试文件

POST /api/debug_files/download

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringfalse内部版本号,iOS 类型可忽略该参数
orderStringfalse获取最新的方式,可选值有:
version = 最新版本 和 upload_date = 最新上传时间
仅限接受 release_version 值为 latest 有效

返回样例

  • 版本存在返回 200 状态码并返回 302 重定向到下载地址
  • 版本不存在返回 404 状态码和错误信息

调试文件列表

获取创建的应用列表,支持分页

GET /api/debug_files

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

[
{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}
]

调试文件详情

查看调试文件的明细,包含上传调试文件的具体解析。

GET /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

更新调试文件

更新调试文件

PUT /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID
fileFiletrueZip 压缩文件后的调试文件
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringtrue内部版本号,iOS 类型可忽略该参数

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

删除调试文件

删除指定调试文件

DELETE /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID

返回样例

{
"mesage": "OK"
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/api/index.html b/zh-Hans/docs/developer-guide/api/index.html index 8d2ff8c91..c185ada4e 100644 --- a/zh-Hans/docs/developer-guide/api/index.html +++ b/zh-Hans/docs/developer-guide/api/index.html @@ -4,13 +4,13 @@ APIs | Zealot - - + +
版本:5.0.0

APIs

Zealot 提供提供 REST APIs 接口服务可用于自定义的查看 App 信息或者上传、下载 App。

接口认证

接口请求目前仅支持 User Token 的 query 认证,在登录用户的详情页面最下面 API - 密钥 找到。

example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN

接口版本

当前是 v1 版本,接口无需显性传递版本参数,另外 GraphGL 接口也在逐步开发中后续会考虑两个版本同时存在。

接口列表

目前可用的 API 接口基本满足打包和下载流程的范围:

应用接口

定义地址
上传应用/api/apps/upload
应用列表/api/apps
应用详情/api/apps/:id
应用版本列表/api/apps/versions
应用最新版本/api/apps/latest
检查当前版本/api/apps/version_exist

全部接口 api/apps

调试文件接口

定义地址
上传调试文件/api/debug_files/upload
下载调试文件/api/debug_files/download
调试文件列表/api/debug_files
调试文件详情/api/debug_files/:id
检查调试文件是否存在/api/debug_files/version_exist
更新调试文件/api/debug_files/:id
删除调试文件/api/debug_files/:id

全部接口api/debug_files

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/fastlane/index.html b/zh-Hans/docs/developer-guide/fastlane/index.html index ee3f519fb..bc2eb69c8 100644 --- a/zh-Hans/docs/developer-guide/fastlane/index.html +++ b/zh-Hans/docs/developer-guide/fastlane/index.html @@ -4,14 +4,14 @@ Fastlane 插件 | Zealot - - + +
版本:5.0.0

Fastlane 插件

信息

第一次听说 fastlane,那你得多 out 了?!快看看开发者准备的 Fastlane 系列教程补补课吧。

添加 Zealot 插件

fastlane-plugin-zealot 是专门为 Zealot 提供 的上传 iOS、Andorid 应用和调试文件的 fastlane 插件。

通过下面方法添加到 fastlane 体系中:

$ fastlane add_plugin zealot

插件包含多个 action:

  • zealot: 上传 iOS 或 Android 应用
  • zealot_debug_file: 上传调试文件(iOS 是 dSYM,Android 是 Proguard)
  • zealot_version_check: 检查当前版本是否已存在
  • zealot_sync_devices: 同步 Apple 开发者账号的设备列表信息到 Zealot 用于关联 AdHoc 证书应用的设备名称
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/fastlane/zealot/index.html b/zh-Hans/docs/developer-guide/fastlane/zealot/index.html index 5b9c98ce9..78050dcdb 100644 --- a/zh-Hans/docs/developer-guide/fastlane/zealot/index.html +++ b/zh-Hans/docs/developer-guide/fastlane/zealot/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot | Zealot - - + +
版本:5.0.0

Fastlane action: zealot

上传 iOS 或 Android 应用,传入如下参数插件会在成功打包后自动获取 app 的路径并进行上传:

zealot(
endpoint: 'https://zealot.com',
token: '...',
channel_key: '...',
)

参数

+-----------------+---------------------------------+------------------------+----------+
| zealot Options |
+-----------------+---------------------------------+------------------------+----------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+----------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| file | The path of app file. Optional | ZEALOT_FILE | |
| | if you use the `gym`, `ipa`, | | |
| | `xcodebuild` or `gradle` | | |
| | action. | | |
| name | The name of app to display on | ZEALOT_NAME | |
| | zealot | | |
| changelog | The changelog of app | ZEALOT_CHANGELOG | |
| slug | The slug of app | ZEALOT_SLUG | |
| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |
| branch | The name of git branch | ZEALOT_BRANCH | |
| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |
| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |
| | fields | | |
| password | The password of app to download | ZEALOT_PASSWORD | |
| source | The name of upload source | ZEALOT_SOURCE | fastlane |
| ci_url | The name of upload source | ZEALOT_CI_CURL | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |
| | keep secret | | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure | | |
+-----------------+---------------------------------+------------------------+----------+
* = default value is dependent on the user's system

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+

环境变量

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+
Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file/index.html b/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file/index.html index ee51218e7..1e0ca858d 100644 --- a/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file/index.html +++ b/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_debug_file | Zealot - - + +
版本:5.0.0

Fastlane action: zealot_debug_file

上传 iOS 的 dSYM 或 Android 的 Proguard 调试文件到 Zealot

  # 上传 iOS dSYM 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :ios,
xcode_scheme: 'AppName',
verify_ssl: false
)

# 上传 Android Proguard 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :android,
android_build_type: 'release',
android_flavor: 'store',
release_version: '1.1.0',
build_version: '1',
overwrite: true
)

# 上传指定 zip file 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
zip_file: 'path/to/your/zip_file',
release_version: '1.1.0',
build_version: '1',
verify_ssl: false
)

参数

+--------------------+-----------------------------------+---------------------------+---------+
| zealot_debug_file Options |
+--------------------+-----------------------------------+---------------------------+---------+
| Key | Description | Env Var | Default |
+--------------------+-----------------------------------+---------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |
| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |
| | to direct upload | | |
| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |
| | value are | | |
| | ios,mac,macos,osx,android | | |
| path | The path of debug file | ZEALOT_PATH | |
| | (iOS/macOS is archive path for | | |
| | Xcode, Android is path for app | | |
| | project) | | |
| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |
| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |
| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |
| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |
| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |
| | dSYM file | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| | (Android needs) | | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| | (Android needs) | | |
| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |
| | if it existed | | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+--------------------+-----------------------------------+---------------------------+---------+
* = default value is dependent on the user's system

+-----------------------+-----------------------------------------+
| zealot_debug_file Output Variables |
+-----------------------+-----------------------------------------+
| Key | Description |
+-----------------------+-----------------------------------------+
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+-----------------------------------------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices/index.html b/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices/index.html index 574b2bf6c..c7af912c9 100644 --- a/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices/index.html +++ b/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_sync_devices | Zealot - - + +
版本:5.0.0

Fastlane action: zealot_sync_devices

信息

🔔 Zealot 4.5.0 版本已经支持使用 Apple API Key

苹果开发者管理并可自动同步测试设备展示,查看详情

同步并关联苹果开发者中心(Apple Developer Portal)的测试设备名称到 Zealot 服务。

# 使用 Apple API Key 授权
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
api_key_path: '/path/to/your/api_key_json_file',
team_id: '...'
)

# 使用密码授权(需要二步认证)
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
username: 'user@example.com',
team_id: '...'
)

参数

+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| zealot_sync_devices Options |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| Key | Description | Env Var(s) | Default |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |
| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -json-file) | | |
| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -hash-option) | | |
| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |
| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |
| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |
| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/fastlane/zealot_version_check/index.html b/zh-Hans/docs/developer-guide/fastlane/zealot_version_check/index.html index d89f33787..f66696b16 100644 --- a/zh-Hans/docs/developer-guide/fastlane/zealot_version_check/index.html +++ b/zh-Hans/docs/developer-guide/fastlane/zealot_version_check/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_version_check | Zealot - - + +
版本:5.0.0

Fastlane action: zealot_version_check

检查当前版本是否已经上传,减少重复打包和上传。

zealot_version_check(
endpoint: 'https://zealot.com',
token: '...',
bundle_id: 'com.example.app.name',
release_version: '1.0.0',
build_version: '1'
)

参数

+-----------------+---------------------------------+------------------------+---------+
| zealot_version_check Options |
+-----------------+---------------------------------+------------------------+---------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |
| | app | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+-----------------+---------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/index.html b/zh-Hans/docs/developer-guide/index.html index 4ef7b50d7..671f9908a 100644 --- a/zh-Hans/docs/developer-guide/index.html +++ b/zh-Hans/docs/developer-guide/index.html @@ -4,13 +4,13 @@ 开发者资源 | Zealot - - + +
版本:5.0.0

开发者资源

Zealot 为开发者提供了丰富的组件,包括 iOS 和 Android 使用的 SDK,用于持久化构建自动化脚本 fastlane 插件等。

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/sdk/android/index.html b/zh-Hans/docs/developer-guide/sdk/android/index.html index 4a84e8668..0b3247ff8 100644 --- a/zh-Hans/docs/developer-guide/sdk/android/index.html +++ b/zh-Hans/docs/developer-guide/sdk/android/index.html @@ -4,13 +4,13 @@ Zealot Android SDK | Zealot - - + +
版本:5.0.0

Zealot Android SDK

Android 组件提供为 Zealot 检查新版本和安装的服务,支持 Kotlin 和 Java。

安装

JitPack

使用 jitpack 安装,先需要添加 maven 仓库:

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

之后在主 app 项目的 build.gradle 添加 zealot:

dependencies {
implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'
}

用户权限

使用 Zealot SDK 需要开启网络权限

<uses-permission android:name="android.permission.INTERNET" />

初始化

在你的 Application 文件的 onCreate 方法添加启动代码:

// 单个渠道
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("...")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()

// 多个渠道,比如测试版本,内测版本
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("xxxxxxx", "beta")
.setCHannelKey("yyyyyyy", "test")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/developer-guide/sdk/ios/index.html b/zh-Hans/docs/developer-guide/sdk/ios/index.html index de4245991..d7275e363 100644 --- a/zh-Hans/docs/developer-guide/sdk/ios/index.html +++ b/zh-Hans/docs/developer-guide/sdk/ios/index.html @@ -4,13 +4,13 @@ Zealot iOS SDK | Zealot - - + +
版本:5.0.0

Zealot iOS SDK

iOS 组件提供为 Zealot 检查新版本和安装的服务,支持 Swift 和 Objective-C。

安装

Cocoapods

使用 Cocoapods 安装 Zealot 需要把它加到 Podfile:

pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'

保存后开始安装:

pod install

初始化

  1. 在 AppDelegate 文件引入 Zealot 框架头:
import Zealot
  1. 接着在上面文件的 application:didFinishLaunchingWithOptions: 方法追加启动代码:
// 单个渠道
let zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")
zealot.checkVersion()

// 多个渠道,比如测试版本,内测版本
let zealot = Zealot(endpoint: "http://zealot.com",
channelKeys: [
"beta": "xxxxxxx",
"test": "yyyyyyy"],
default_enviroment: "beta")

// 最后触发监测方法
zealot.checkVersion()
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/administrator/index.html b/zh-Hans/docs/next/category/administrator/index.html index 4ee0eb7d2..7d8649ff5 100644 --- a/zh-Hans/docs/next/category/administrator/index.html +++ b/zh-Hans/docs/next/category/administrator/index.html @@ -4,13 +4,13 @@ 管理面板 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/apps/index.html b/zh-Hans/docs/next/category/apps/index.html index 0de44618a..1ec8d0ab1 100644 --- a/zh-Hans/docs/next/category/apps/index.html +++ b/zh-Hans/docs/next/category/apps/index.html @@ -4,13 +4,13 @@ 应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/cloud-provider-guides/index.html b/zh-Hans/docs/next/category/cloud-provider-guides/index.html index f0d0ee9aa..c07a4278c 100644 --- a/zh-Hans/docs/next/category/cloud-provider-guides/index.html +++ b/zh-Hans/docs/next/category/cloud-provider-guides/index.html @@ -4,13 +4,13 @@ 云服务商 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/configuration/index.html b/zh-Hans/docs/next/category/configuration/index.html index 68fa930c6..a40dac941 100644 --- a/zh-Hans/docs/next/category/configuration/index.html +++ b/zh-Hans/docs/next/category/configuration/index.html @@ -4,13 +4,13 @@ 配置 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/debug-files/index.html b/zh-Hans/docs/next/category/debug-files/index.html index 5de6fce06..7d3fc618a 100644 --- a/zh-Hans/docs/next/category/debug-files/index.html +++ b/zh-Hans/docs/next/category/debug-files/index.html @@ -4,13 +4,13 @@ 调试文件 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/deployment/index.html b/zh-Hans/docs/next/category/deployment/index.html index 8de5fe28b..c6471e84f 100644 --- a/zh-Hans/docs/next/category/deployment/index.html +++ b/zh-Hans/docs/next/category/deployment/index.html @@ -4,13 +4,13 @@ 部署 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/local-development/index.html b/zh-Hans/docs/next/category/local-development/index.html index 972f85dfe..e7a0177d3 100644 --- a/zh-Hans/docs/next/category/local-development/index.html +++ b/zh-Hans/docs/next/category/local-development/index.html @@ -4,13 +4,13 @@ 本地开发 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/monitoring/index.html b/zh-Hans/docs/next/category/monitoring/index.html index 23d2d425a..37180942b 100644 --- a/zh-Hans/docs/next/category/monitoring/index.html +++ b/zh-Hans/docs/next/category/monitoring/index.html @@ -4,13 +4,13 @@ 监控 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/sdks/index.html b/zh-Hans/docs/next/category/sdks/index.html index 4a416cdae..a07525aa6 100644 --- a/zh-Hans/docs/next/category/sdks/index.html +++ b/zh-Hans/docs/next/category/sdks/index.html @@ -4,13 +4,13 @@ 移动 SDK | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/category/toolkits/index.html b/zh-Hans/docs/next/category/toolkits/index.html index 0352669b9..d8a48a7dd 100644 --- a/zh-Hans/docs/next/category/toolkits/index.html +++ b/zh-Hans/docs/next/category/toolkits/index.html @@ -4,13 +4,13 @@ 工具箱 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/contributing-guide/index.html b/zh-Hans/docs/next/contributing-guide/index.html index 6bda6a1aa..cbcfed7e2 100644 --- a/zh-Hans/docs/next/contributing-guide/index.html +++ b/zh-Hans/docs/next/contributing-guide/index.html @@ -4,14 +4,14 @@ 贡献者指南 | Zealot - - + +
版本:开发版本 🚧

贡献者指南

本指南将会帮助你更好的上手 Zealot!感谢您对本项目感兴趣。在提交你的贡献之前请仔细认真阅读如下指南:

准备工作

贡献代码前请在 Issues 确认是否存在,没有发现的话欢迎动动小手创建新 Issue,创建之后你会收到一个自动回复请勿担心我会在看到后尽快整理并回应。 如果解决方案非常的复杂,建议极可能完整描述背景、解决目的和方案以方便核心开发者审核。

准备本地开发环境

我们将会从如下指南帮助准备和部署本地 Zealot 开发环境:

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/contributing-guide/local-development/devcontainer/index.html b/zh-Hans/docs/next/contributing-guide/local-development/devcontainer/index.html index 7f57afc32..94f56fe93 100644 --- a/zh-Hans/docs/next/contributing-guide/local-development/devcontainer/index.html +++ b/zh-Hans/docs/next/contributing-guide/local-development/devcontainer/index.html @@ -4,13 +4,13 @@ Visual Studio Code Dev Container 开发部署指南 | Zealot - - + +
版本:开发版本 🚧

Visual Studio Code Dev Container 开发部署指南

Dev Container (Developing inside a Container) 是 Visual Studio Code 使用 Docker 作为开发环境能够实现在本地无需配置开发环境在容器开发有近乎本地体验的解决方案。

VSCode devcontainer

系统依赖

在开发之前,你需要安装最新版本的 Git,Virsual Studio Code,Docker 和 docker-compose。

安装 Git

因操作系统不同,建议按照官方安装教程操作。

安装 Docker & docker-compose

安装 Visual Studio Code

Visual Studio Code 是一个跨平台运行的免费的代码编辑器,根据操作系统选择你的安装方式:

  1. 下载 Visual Studio Code macOS 版。
  2. 打开浏览器下载界面找到已下载的应用文件或压缩文件。
  3. 如果是压缩文件先进行解压缩操作,如果使用 Safari 下载通常会帮你自动解压缩。
  4. 拖拽 Visual Studio Code.app 到系统应用文件夹。
  5. 双击 VS Code 应用即可打开应用。

安装 Remote container 扩展

按照官方教程安装 Remote Container extension

VSCode extension

获取 Zealot Codespace

Zealot Codespace 同样存放在 Zealot 项目 .devcontailer 目录,你需要先克隆项目源代码。

git clone https://github.com/tryzealot/zealot.git

Codespace 包含了一系列文件:

文件名说明
devcontainer.jsonVSCode devcontainer 配置文件
Dockerfile.base镜像核心,变更会自动推送到不同 registry 仓库
Dockerfile间接镜像,主要是节省编译时间
docker-compose.yml项目服务依赖
create-db-user.sql用于初始化 Postgres 默认用户及权限

在容器内打开项目

打开 Visual Studio Code 应用后在 Command Palette 输入 Dev Containers: Open Folder in Container... 回车选择刚克隆下来的 Zealot 项目目录。

VSCode Command Palette

首次执行会拉取 Zealot Codespace 镜像并开始构建,过程会持续一段时间期间可点击 Starting Dev Container (show log) 查看构建实时日志。

VSCode Command Palette

构建完成并启动完毕会加载项目文件和 zsh 终端,通过日志可以看到如下信息:

[7293 ms] Start: Run in container: cat /proc/344/environ
[9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container.
[9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e
[9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established
[14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close
[14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null.
[29221 ms] Port forwarding 53148 > 43379 > 43379: Local close

在宿主机也能看到 Docker 启动了 docker-compose 在运行:

Docker-Compose containers

启动项目

如果没有打开 VSCode 内置终端可以通过快捷键 Ctrl + ` 打开,新打开一个终端运行 bin/dev 可运行 Zealot 依赖的所有服务。

VSCode Zealot in Container

浏览器访问服务

在运行 bin/dev 一会后你会在右下角窗口看到 Open in Browser 窗口点击可打开 Zealot 网页服务。同样也可以通过终端区域顶部 Ports 选项查看可转发端口的服务,点击浏览器图标会把容器的端口转发并绑定到本地随机断开后上面访问。

VSCode forwarded ports

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/contributing-guide/local-development/source-code/index.html b/zh-Hans/docs/next/contributing-guide/local-development/source-code/index.html index 01a90772b..1af19c448 100644 --- a/zh-Hans/docs/next/contributing-guide/local-development/source-code/index.html +++ b/zh-Hans/docs/next/contributing-guide/local-development/source-code/index.html @@ -4,13 +4,13 @@ 源码部署 Zealot 指南 | Zealot - - + +
版本:开发版本 🚧

源码部署 Zealot 指南

如下整理了不同操作系统的本地部署开发教程。

准备部署环境

macOS

安装 homebrew

首先需要安装 Xcode Command tools:

$ xcode-select --install

如果提示安装失败,需要从 https://developer.apple.com/downloads 下载安装。

之后安装 macOS 的包管理工具 Homebrew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装依赖

之后开始安装环境依赖

$ brew install redis postgresql webp imagemagick node git

M1 用户需要设置依赖编译路径到 SHELL 的配置文件中:

export CPATH=/opt/homebrew/include/
export LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/lib/

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ brew services start postgresql
$ brew services start redis

Postgresql 还需要创建默认用户名:

$ createuser --superuser zealot

# 如果担心权限过高可以只开启创建数据库权限
$ createuser --createdb zealot

yarn

$ npm install -g yarn

运行起来后使用浏览器访问 http://localhost:3000

疑难杂症

M1 芯片 MacOS 问题
aarch64-darwin/libwebp_ffi.bundle => aarch64-darwin/jpegdec.o

使用 bundle install 会遇到如上问题这个是因为 homebrew 安装 webp 依赖之后编译路径无法被找到,上面有解决办法。

Debian (Ubuntu)

安装环境依赖

$ apt update
$ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev

安装依赖

$ apt install -y redis postgresql-client node

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ systemctl postgres start
$ systemctl redis start

Postgresql 还需要创建默认用户名:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# If you are worried about the high privilege, you can only enable the create database privilege
$ createuser --createdb zealot

node

$ npm install -g yarn

Alpine Linux

安装环境依赖

$ apk --update --no-cache add build-base libxml2 libxslt git \
libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \
tzdata

如果是在 arm 架构安装还需要额外安装 gcompat glib 兼容层,否则会报 "Error loading shared library" 异常错误。

安装依赖

$ apk --update --no-cache redis postgresql node

配置 Postgres 和 Redis

运行 postgresql 和 redis 服务

$ rc-service postgres start
$ rc-service redis start

Postgresql 还需要创建默认用户名:

$ initdb -D /var/lib/postgresql/data
$ createuser --superuser zealot

# 如果担心数据库用户权限,可仅开启创建数据库权限
$ createuser --createdb zealot

yarn

$ npm install -g yarn

安装 Ruby

可以通过 asdf、rvm 任意一种方式安装。

一个支持主流开发语言版本切换的工具,请按照官方安装教程好之后安装 ruby:

# 开启 Ruby 3.2.0 YJIT 新特性需要安装 rust 1.58+
# 可选安装:
asdf plugin add rust
asdf install rust latest
asdf global rust latest
export RUBY_CONFIGURE_OPTS=--enable-yjit

# 必须安装
asdf plugin add ruby
asdf install ruby 3.2.0
asdf global ruby 3.2.0

克隆源代码

git clone https://github.com/tryzealot/zealot.git

初始化

以下步骤均需要在 zealot 根目录执行。

bundler

安装 Ruby gems 第三方类库

$ [sudo] gem install bundler
$ bundle install

yarn

安装前端第三方类库

$ yarn install

初始化数据库

确保连接数据库信息没有问题,后将会创建数据库表并创建表结构

$ rails db:create
$ rails db:migrate

配置数据库连接参数可通过环境变量或更改 config/database.yml 文件。

初始化预制数据

初始化管理员账号和应用样例

$ rails db:seed

运行 Zealot 服务

$ bin/dev

打开浏览器访问 http://localhost:3000

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/api/apps/index.html b/zh-Hans/docs/next/developer-guide/api/apps/index.html index 5a8ad89a5..bff3b5e3c 100644 --- a/zh-Hans/docs/next/developer-guide/api/apps/index.html +++ b/zh-Hans/docs/next/developer-guide/api/apps/index.html @@ -4,13 +4,13 @@ 应用接口 | Zealot - - + +
版本:开发版本 🚧

应用接口

上传应用

上传应用,仅支持 iOS, Android 和 macOS 类型。

POST /api/apps/upload

参数

信息
名称类型是否必须描述
fileFiletrue应用本地路径的内容
channel_keyStringfalse应用具体渠道的 Key,没有传此参数会字段创建对于的应用、类型和渠道
nameStringfalse应用名称,为空时取 App 的信息
release_typeStringfalse应用类型,比如 debug, beta, adhoc, release, enterprise 等
sourceStringfalse上传渠道名称,默认是 api
changelogStringfalse变更日志,接受纯文本或 JSON 格式化的数据
branchStringfalse上传应用时的git branch名称
git_commitStringfalse上传应用时的 git commit hash
ci_urlStringfalseCI 项目构建地址
custom_fieldsStringfalse这是一个用 JSON 字符串定义的自定义字段,
可配置名称,值以及 fontawesome 图标用于在页面详情展示

For changelog attribute which it accepts both plain text and JSON formatted contents:

plain text:

message 1\nmessage 2

JSON:

[
{
"message": "message 1",
"author": "admin",
"email": "admin@zealot.com",
"date": "2021-11-11 11:11:11"
},
{
"message": "message 1",
"author": "developer",
"email": "developer@zealot.com",
"date": "2021-11-11 11:11:11"
}
]

对于 custom_fields 的用法,它是一个使用 JSON 格式的以键值对为单位的数组,比如需要自定义国家 country=China 并配置图标为 fontawesome 的 flag

curl -X POST \
'https://YOUR_ZEALOT_URL/api/apps/upload' \
--form 'token="token"' \
--form 'channel_key="channel_key"' \
+ --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \
--form 'file=@/path/to/your/app'

返回样例

{
"id": 50,
"version": 7,
"app_name": "Test Android",
"bundle_id": "com.test.app",
"release_version": "1.0",
"build_version": "1",
"source": "SOURCE",
"branch": "master",
"git_commit": "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx",
"ci_url": "",
"size": 1565486,
"icon_url": "/uploads/apps/a1/r1/icons/app_icon.png",
"release_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1",
"install_url": "https://YOUR_ZEALOT_URL/download/releases/1",
"qrcode_url": "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb",
"changelog": [
{
"message": "Changelog message 1"
},
{
"message": "Changelog message 2"
}
],
"text_changelog": "- Changelog message 1\n- Changelog message 2",
"custom_fields": [],
"created_at": "2021-09-01T11:43:33.977+08:00",
"app": {
"id": 1,
"name": "App name"
},
"scheme": {
"id": 8,
"name": "Test"
},
"channel": {
"slug": "1XmpC",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
}

应用列表

获取创建的应用列表,支持分页

GET /api/apps

参数

名称类型是否必须描述
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

[
{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 1,
"name": "测试版",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
},
{
"id": 2,
"name": "内测版",
"channels": [
{
"slug": "l19Tl",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "8selv",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}
]

应用详情

查看应用的明细:应用类型、渠道等信息

GET /api/apps/:id

参数

名称类型是否必须描述
idStringtrue应用 ID

返回样例

{
"id": 1,
"name": "Zealot",
"schemes": [
{
"id": 5,
"name": "测试版",
"channels": [
{
"slug": "X1IXN",
"name": "Android",
"device_type": "android",
"bundle_id": "*",
"git_url": null,
"has_password": false
},
{
"slug": "O1qHk",
"name": "iOS",
"device_type": "ios",
"bundle_id": "*",
"git_url": null,
"has_password": false
}
]
}
]
}

应用版本列表

获取应用已上传的版本列表,按照上传时间倒序排列

GET /api/apps/versions

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

{
"app_name": "Zealot iOS 测试版",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "测试版"
},
"releases": [
{
"version": 2,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10292024",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
{
"version": 1,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
},
]
}

应用最新版本

获取指定应用的最新版本信息

GET /api/apps/latest

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
release_versionStringtrue应用的发布版本
build_versionStringtrue应用的构建版本

返回样例

{
"app_name": "Zealot iOS 测试版",
"bundle_id": "*",
"git_url": null,
"app": {
"id": 3,
"name": "Zealot"
},
"scheme": {
"id": 5,
"name": "测试版"
},
"releases": {
"version": 1,
"app_name": "Zealot iOS 测试版",
"bundle_id": "im.ews.zealot",
"release_version": "1.0.0",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}
}

检查当前版本是否存在

使用 bundle_id、release_version、build_verion 或 bundle_id、git_commit 组合检查当前版本是否存在

GET /api/apps/version_exist

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
bundle_idStringtrue应用的包名,iOS 取 bundle_id,Android 取 package_name
release_versionStringfalse应用的发布版本
build_versionStringfalse应用的构建版本
git_commitStringfalse上传应用时的 git commit hash

返回样例

  • 版本存在返回 200 状态码并返回版本的信息
  • 版本不存在返回 404 状态码和错误信息

版本存在的返回信息

{
"version": 1,
"app_name": "好好住 iOS 测试版",
"bundle_id": "com.haohaozhu.hhz",
"release_version": "4.1.1",
"build_version": "10291524",
"source": "Web",
"branch": "",
"git_commit": "",
"ci_url": "",
"size": 79712596,
"icon_url": "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png",
"install_url": "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install",
"changelog": [],
"created_at": "2019-12-25T14:26:06.608+08:00"
}

版本不存在的返回信息:

{
"error": "应用版本不存在"
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/api/debug_files/index.html b/zh-Hans/docs/next/developer-guide/api/debug_files/index.html index 929862e9d..e3b1d071a 100644 --- a/zh-Hans/docs/next/developer-guide/api/debug_files/index.html +++ b/zh-Hans/docs/next/developer-guide/api/debug_files/index.html @@ -4,13 +4,13 @@ 调试文件接口 | Zealot - - + +
版本:开发版本 🚧

调试文件接口

上传调试文件

上传 iOS 和 Android 的调试文件:

  • iOS: 使用 Zip 压缩后的 dSYM 文件
  • Android: 使用 Zip 压缩后包含 mapping.txt、R.txt 和 AndroidManifest.xml 的文件
POST /api/debug_files/upload

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
fileFiletrueZip 压缩文件后的调试文件
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringtrue内部版本号,iOS 类型可忽略该参数

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

下载调试文件

下载 iOS 和 Android 的调试文件

POST /api/debug_files/download

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringfalse内部版本号,iOS 类型可忽略该参数
orderStringfalse获取最新的方式,可选值有:
version = 最新版本 和 upload_date = 最新上传时间
仅限接受 release_version 值为 latest 有效

返回样例

  • 版本存在返回 200 状态码并返回 302 重定向到下载地址
  • 版本不存在返回 404 状态码和错误信息

调试文件列表

获取创建的应用列表,支持分页

GET /api/debug_files

参数

名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
pageIntegerfalse页数
per_pageIntegerfalse每页返回最大数目

返回样例

[
{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}
]

调试文件详情

查看调试文件的明细,包含上传调试文件的具体解析。

GET /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

更新调试文件

更新调试文件

PUT /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID
fileFiletrueZip 压缩文件后的调试文件
release_versionStringtrue发布版本号,iOS 类型可忽略该参数
build_versionStringtrue内部版本号,iOS 类型可忽略该参数

返回样例

{
"id": 1,
"app_name": "演示应用",
"device_type": "ios",
"release_version": "1.14.0",
"build_version": "980",
"file_url": "https://tryzealot.ews.im/download/debug_files/1",
"metadata": [
{
"id": 1,
"debug_file_id": 1,
"uuid": "34656552-21ae-3722-a7fb-3582bc9b1d98",
"type": "arm64",
"object": "AppName",
"data": {},
"size": 4137941,
"created_at": "2022-11-25T15:53:15.157+08:00",
"updated_at": "2022-11-25T15:53:15.157+08:00"
}
]
}

删除调试文件

删除指定调试文件

DELETE /api/debug_files/:id

参数

信息
名称类型是否必须描述
channel_keyStringtrue应用具体渠道的 Key
idStringtrue调试文件 ID

返回样例

{
"mesage": "OK"
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/api/index.html b/zh-Hans/docs/next/developer-guide/api/index.html index 3bbf28a63..9bc548a63 100644 --- a/zh-Hans/docs/next/developer-guide/api/index.html +++ b/zh-Hans/docs/next/developer-guide/api/index.html @@ -4,13 +4,13 @@ APIs | Zealot - - + +
版本:开发版本 🚧

APIs

Zealot 提供提供 REST APIs 接口服务可用于自定义的查看 App 信息或者上传、下载 App。

接口认证

接口请求目前仅支持 User Token 的 query 认证,在登录用户的详情页面最下面 API - 密钥 找到。

example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN

接口版本

当前是 v1 版本,接口无需显性传递版本参数,另外 GraphGL 接口也在逐步开发中后续会考虑两个版本同时存在。

接口列表

目前可用的 API 接口基本满足打包和下载流程的范围:

应用接口

定义地址
上传应用/api/apps/upload
应用列表/api/apps
应用详情/api/apps/:id
应用版本列表/api/apps/versions
应用最新版本/api/apps/latest
检查当前版本/api/apps/version_exist

全部接口 api/apps

调试文件接口

定义地址
上传调试文件/api/debug_files/upload
下载调试文件/api/debug_files/download
调试文件列表/api/debug_files
调试文件详情/api/debug_files/:id
检查调试文件是否存在/api/debug_files/version_exist
更新调试文件/api/debug_files/:id
删除调试文件/api/debug_files/:id

全部接口api/debug_files

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/fastlane/index.html b/zh-Hans/docs/next/developer-guide/fastlane/index.html index 6940bdd47..4beee313e 100644 --- a/zh-Hans/docs/next/developer-guide/fastlane/index.html +++ b/zh-Hans/docs/next/developer-guide/fastlane/index.html @@ -4,14 +4,14 @@ Fastlane 插件 | Zealot - - + +
版本:开发版本 🚧

Fastlane 插件

信息

第一次听说 fastlane,那你得多 out 了?!快看看开发者准备的 Fastlane 系列教程补补课吧。

添加 Zealot 插件

fastlane-plugin-zealot 是专门为 Zealot 提供 的上传 iOS、Andorid 应用和调试文件的 fastlane 插件。

通过下面方法添加到 fastlane 体系中:

$ fastlane add_plugin zealot

插件包含多个 action:

  • zealot: 上传 iOS 或 Android 应用
  • zealot_debug_file: 上传调试文件(iOS 是 dSYM,Android 是 Proguard)
  • zealot_version_check: 检查当前版本是否已存在
  • zealot_sync_devices: 同步 Apple 开发者账号的设备列表信息到 Zealot 用于关联 AdHoc 证书应用的设备名称
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/fastlane/zealot/index.html b/zh-Hans/docs/next/developer-guide/fastlane/zealot/index.html index d0efbcfd7..2b267a276 100644 --- a/zh-Hans/docs/next/developer-guide/fastlane/zealot/index.html +++ b/zh-Hans/docs/next/developer-guide/fastlane/zealot/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot | Zealot - - + +
版本:开发版本 🚧

Fastlane action: zealot

上传 iOS 或 Android 应用,传入如下参数插件会在成功打包后自动获取 app 的路径并进行上传:

zealot(
endpoint: 'https://zealot.com',
token: '...',
channel_key: '...',
)

参数

+-----------------+---------------------------------+------------------------+----------+
| zealot Options |
+-----------------+---------------------------------+------------------------+----------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+----------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| file | The path of app file. Optional | ZEALOT_FILE | |
| | if you use the `gym`, `ipa`, | | |
| | `xcodebuild` or `gradle` | | |
| | action. | | |
| name | The name of app to display on | ZEALOT_NAME | |
| | zealot | | |
| changelog | The changelog of app | ZEALOT_CHANGELOG | |
| slug | The slug of app | ZEALOT_SLUG | |
| release_type | The release type of app | ZEALOT_RELEASE_TYPE | |
| branch | The name of git branch | ZEALOT_BRANCH | |
| git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | |
| custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | |
| | fields | | |
| password | The password of app to download | ZEALOT_PASSWORD | |
| source | The name of upload source | ZEALOT_SOURCE | fastlane |
| ci_url | The name of upload source | ZEALOT_CI_CURL | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true |
| | keep secret | | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure | | |
+-----------------+---------------------------------+------------------------+----------+
* = default value is dependent on the user's system

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+

环境变量

+-----------------------+---------------------------------------------+
| zealot Output Variables |
+-----------------------+---------------------------------------------+
| Key | Description |
+-----------------------+---------------------------------------------+
| ZEALOT_APP_ID | The id of app |
| ZEALOT_RELEASE_ID | The id of app's release |
| ZEALOT_RELEASE_URL | The release URL of the newly uploaded build |
| ZEALOT_INSTALL_URL | The install URL of the newly uploaded build |
| ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build |
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+---------------------------------------------+
Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file/index.html b/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file/index.html index fe69ff41a..bbfeb8c1d 100644 --- a/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file/index.html +++ b/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_debug_file | Zealot - - + +
版本:开发版本 🚧

Fastlane action: zealot_debug_file

上传 iOS 的 dSYM 或 Android 的 Proguard 调试文件到 Zealot

  # 上传 iOS dSYM 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :ios,
xcode_scheme: 'AppName',
verify_ssl: false
)

# 上传 Android Proguard 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
platform: :android,
android_build_type: 'release',
android_flavor: 'store',
release_version: '1.1.0',
build_version: '1',
overwrite: true
)

# 上传指定 zip file 调试文件
zealot_debug_file(
endpoint: 'https://tryzealot.ews.im',
token: '...',
channel_key: '...',
zip_file: 'path/to/your/zip_file',
release_version: '1.1.0',
build_version: '1',
verify_ssl: false
)

参数

+--------------------+-----------------------------------+---------------------------+---------+
| zealot_debug_file Options |
+--------------------+-----------------------------------+---------------------------+---------+
| Key | Description | Env Var | Default |
+--------------------+-----------------------------------+---------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | |
| zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | |
| | to direct upload | | |
| platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | |
| | value are | | |
| | ios,mac,macos,osx,android | | |
| path | The path of debug file | ZEALOT_PATH | |
| | (iOS/macOS is archive path for | | |
| | Xcode, Android is path for app | | |
| | project) | | |
| xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | |
| android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release |
| android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | |
| extra_files | A set file names | ZEALOT_EXTRA_FILES | [] |
| output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . |
| | dSYM file | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| | (Android needs) | | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| | (Android needs) | | |
| overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false |
| | if it existed | | |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+--------------------+-----------------------------------+---------------------------+---------+
* = default value is dependent on the user's system

+-----------------------+-----------------------------------------+
| zealot_debug_file Output Variables |
+-----------------------+-----------------------------------------+
| Key | Description |
+-----------------------+-----------------------------------------+
| ZEAALOT_ERROR_MESSAGE | The error message during upload process |
+-----------------------+-----------------------------------------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html b/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html index 19e446a64..133c361a8 100644 --- a/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html +++ b/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_sync_devices | Zealot - - + +
版本:开发版本 🚧

Fastlane action: zealot_sync_devices

信息

🔔 Zealot 4.5.0 版本已经支持使用 Apple API Key

苹果开发者管理并可自动同步测试设备展示,查看详情

同步并关联苹果开发者中心(Apple Developer Portal)的测试设备名称到 Zealot 服务。

# 使用 Apple API Key 授权
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
api_key_path: '/path/to/your/api_key_json_file',
team_id: '...'
)

# 使用密码授权(需要二步认证)
zealot_sync_devices(
endpoint: 'https://zealot.com',
token: '...',
username: 'user@example.com',
team_id: '...'
)

参数

+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| zealot_sync_devices Options |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| Key | Description | Env Var(s) | Default |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * |
| api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -json-file) | | |
| api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * |
| | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | |
| | -hash-option) | | |
| team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * |
| team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * |
| platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios |
| verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true |
| timeout | Request timeout in seconds | ZEALOT_TIMEOUT | |
| fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false |
+---------------+-----------------------------------------------------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check/index.html b/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check/index.html index 2c1ca9bb5..99d6c2b72 100644 --- a/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check/index.html +++ b/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check/index.html @@ -4,13 +4,13 @@ Fastlane action: zealot_version_check | Zealot - - + +
版本:开发版本 🚧

Fastlane action: zealot_version_check

检查当前版本是否已经上传,减少重复打包和上传。

zealot_version_check(
endpoint: 'https://zealot.com',
token: '...',
bundle_id: 'com.example.app.name',
release_version: '1.0.0',
build_version: '1'
)

参数

+-----------------+---------------------------------+------------------------+---------+
| zealot_version_check Options |
+-----------------+---------------------------------+------------------------+---------+
| Key | Description | Env Var | Default |
+-----------------+---------------------------------+------------------------+---------+
| endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | |
| token | The token of user | ZEALOT_TOKEN | |
| channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | |
| bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | |
| | app | | |
| release_version | The release version of app | ZEALOT_RELEASE_VERSION | |
| build_version | The build version of app | ZEALOT_BUILD_VERSION | |
| git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | |
| verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true |
| | service | | |
| fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false |
| | cause a failure? (true/false) | | |
+-----------------+---------------------------------+------------------------+---------+
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/index.html b/zh-Hans/docs/next/developer-guide/index.html index 4ab435b45..6cd7baba4 100644 --- a/zh-Hans/docs/next/developer-guide/index.html +++ b/zh-Hans/docs/next/developer-guide/index.html @@ -4,13 +4,13 @@ 开发者资源 | Zealot - - + +
版本:开发版本 🚧

开发者资源

Zealot 为开发者提供了丰富的组件,包括 iOS 和 Android 使用的 SDK,用于持久化构建自动化脚本 fastlane 插件等。

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/sdk/android/index.html b/zh-Hans/docs/next/developer-guide/sdk/android/index.html index 6c9c3af3e..568c94550 100644 --- a/zh-Hans/docs/next/developer-guide/sdk/android/index.html +++ b/zh-Hans/docs/next/developer-guide/sdk/android/index.html @@ -4,13 +4,13 @@ Zealot Android SDK | Zealot - - + +
版本:开发版本 🚧

Zealot Android SDK

Android 组件提供为 Zealot 检查新版本和安装的服务,支持 Kotlin 和 Java。

安装

JitPack

使用 jitpack 安装,先需要添加 maven 仓库:

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

之后在主 app 项目的 build.gradle 添加 zealot:

dependencies {
implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT'
}

用户权限

使用 Zealot SDK 需要开启网络权限

<uses-permission android:name="android.permission.INTERNET" />

初始化

在你的 Application 文件的 onCreate 方法添加启动代码:

// 单个渠道
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("...")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()

// 多个渠道,比如测试版本,内测版本
Zealot.create(getActivity())
.setEndpoint("https://zealot.com")
.setChannelKey("xxxxxxx", "beta")
.setCHannelKey("yyyyyyy", "test")
.setBuildType(BuildConfig.BUILD_TYPE)
.launch()
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/developer-guide/sdk/ios/index.html b/zh-Hans/docs/next/developer-guide/sdk/ios/index.html index c2a161fde..e2f4452de 100644 --- a/zh-Hans/docs/next/developer-guide/sdk/ios/index.html +++ b/zh-Hans/docs/next/developer-guide/sdk/ios/index.html @@ -4,13 +4,13 @@ Zealot iOS SDK | Zealot - - + +
版本:开发版本 🚧

Zealot iOS SDK

iOS 组件提供为 Zealot 检查新版本和安装的服务,支持 Swift 和 Objective-C。

安装

Cocoapods

使用 Cocoapods 安装 Zealot 需要把它加到 Podfile:

pod 'Zealot', :git => 'https://github.com/tryzealot/zealot-ios.git', :branch => 'master'

保存后开始安装:

pod install

初始化

  1. 在 AppDelegate 文件引入 Zealot 框架头:
import Zealot
  1. 接着在上面文件的 application:didFinishLaunchingWithOptions: 方法追加启动代码:
// 单个渠道
let zealot = Zealot(endpoint: "http://zealot.com", channelKey: "...")
zealot.checkVersion()

// 多个渠道,比如测试版本,内测版本
let zealot = Zealot(endpoint: "http://zealot.com",
channelKeys: [
"beta": "xxxxxxx",
"test": "yyyyyyy"],
default_enviroment: "beta")

// 最后触发监测方法
zealot.checkVersion()
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/configuration/environment-variables/index.html b/zh-Hans/docs/next/self-hosted/configuration/environment-variables/index.html index 7065788ba..733661fdb 100644 --- a/zh-Hans/docs/next/self-hosted/configuration/environment-variables/index.html +++ b/zh-Hans/docs/next/self-hosted/configuration/environment-variables/index.html @@ -4,13 +4,13 @@ 环境变量 | Zealot - - + +
版本:开发版本 🚧

环境变量

.env 文件

Zealot 可通过如下环境变量或使用项目根目录的 .env 文件配置系统参数,通过上述方式更改后需要重启服务才可生效。

HTTPS 证书

因苹果的硬性要求线上部署和下载服务强制 HTTPS,因此再部署的时候下载应用会强制走 HTTPS 协议。

如果部署是单台机器的独立服务,建议开启 Let's Encrypt 免费 SSL 证书,只需要设置

ZEALOT_CERT_EMAIL=zealot@example.com

和下面自签名证书文件名二选一,不能同时设置

如果部署的机器只能使用自签名证书,则需要配置,但需要注意的是 iOS 的下载需要在 iOS 设备授权自签名的证书后才允许下载安装。(不推荐)

ZEALOT_CERT=zealot.test.pem
ZEALOT_CERT_KEY=zealot.test-key.pem

和 Let's Encrypt 注册电子邮箱名二选一,不能同时设置

配置域名 (URL)

必须配置否则下载应用和一些静态资源会无法正确访问到

# 域名配置,无需配置 http:// 或 https://
ZEALOT_DOMAIN=zealot.com

配置数据库和缓存

假如你有可以复用的 postgresql 和 redis 服务也可以自定义配置使用,而无需使用 docker-compose 默认配置的服务。

Postgresql

ZEALOT_POSTGRES_HOST=127.0.0.1
ZEALOT_POSTGRES_PORT=5432
ZEALOT_POSTGRES_USERNAME=postgres
ZEALOT_POSTGRES_PASSWORD=ze@l0t
ZEALOT_POSTGRES_DB_NAME=zealot

Redis

兼容大多数云服务部署采用的 URL 连接方式

REDIS_URL=redis://user:pass@127.0.0.1:6379/0

# 基于 SSL 的 Redis
REDIS_URL=rediss://user:pass@127.0.0.1:6379/0

配置网站默认语言

语言包
zh-CN简体中文 (默认)
en英文
DEFAULT_LOCALE=en

配置网站默认外观

外观
light浅色 (默认)
dark深色(黑暗模式)
auto随系统自动
ZEALOT_APPEARANCE=dark

配置管理员账户和密码

默认不配置如下也会生成下面的账户和密码作为管理员权限的账户,建议配置后重新修改密码。

ZEALOT_ADMIN_EMAIL=admin@zealot.com
ZEALOT_ADMIN_PASSWORD=ze@l0t

开启用户注册

关闭注册之后,管理员可以通过管理面板的用户管理手动添加用户。

# 开启注册
ZEALOT_REGISTER_ENABLED=true

# 关闭注册
ZEALOT_REGISTER_ENABLED=false

开启游客模式

开启游客模式后允许应用的查看、下载和安装,建议公司内部对权限依赖不高的状况使用,具体权限对比可以看这里查看详情

# 开启游客模式
ZEALOT_GUEST_MODE=true

# 关闭游客模式
ZEALOT_GUEST_MODE=false

邮件服务

目前仅支持 smtp 的方式配置邮件通知服务,邮件通知主要影响用户注册、发送激活邮件、更改密码服务,如果不开启也不影响使用,账户激活的链接也会在用户管理那边找到。

# 发送邮件配置
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=you@gmail.com
SMTP_PASSWORD=yourpassword
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

# 邮件默认收发人配置
ACTION_MAILER_DEFAULT_FROM=you@gmail.com
ACTION_MAILER_DEFAULT_TO=you@gmail.com
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs/index.html b/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs/index.html index b9337be56..5ed56aaff 100644 --- a/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs/index.html +++ b/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs/index.html @@ -4,14 +4,14 @@ 定时任务 | Zealot - - + +
版本:开发版本 🚧

定时任务

清理老版本

按照项目维护者长期的使用观察一个可靠的清理老版本的逻辑是时刻关注当前主版本的所有上传版本, 之前上传的历史版本只需要保留最后一个上传构建版本基本上就满足绝大数情况,举个例子:

额外补充:当前逻辑相对省事但缺乏灵活度,其实有想过支持多种处理逻辑,具体参见 https://github.com/tryzealot/zealot/issues/376

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 9
- 8
...
- 1.0
- 5
- 4
- 3
...

任务执行时会清理掉 1.0.1 版本包含 9 以下和 1.0 版本包含 4 以下所有版本,最终保留的版本文件是:

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 1.0
- 5

如果磁盘空间有限,可以通过设置环境变量 ZEALOT_KEEP_UPLOADS=false 来开启定时任务的清理。

信息

ZEALOT_KEEP_UPLOADS 模式是 true 开启状态 。

备份

当你通过管理员面板创建任何的备份计划都会加入到定时任务队列中。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication/index.html b/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication/index.html index f74f01ee0..503d0f14c 100644 --- a/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication/index.html +++ b/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication/index.html @@ -4,13 +4,13 @@ 第三方登录 | Zealot - - + +
版本:开发版本 🚧

第三方登录

Zealot 支持使用已经支持的第三方服务授权登录,当前可以通过如下的环境变量或者在管理员面板的设置页面配置。

第三方服务标识符
飞书feishu
Gitlabgitlab
Googlegoogle_oauth2
LDAPldap
OpenID Connectopenid_connect

如果以上服务需要设置回调地址的话请统一设置为:

http://zealot.com/users/auth/:provider/callback

其中 :provider 是上面支持第三方服务的标识符,例如开启飞书那就把 :provider 替换成 feishu

飞书

  1. 去注册一个飞书账号并下载手机 App
  2. 注册飞书开发平台并创建企业自建应用获得 app_id, app_secret
  3. 填写 callback url 为 http://zealot.com/users/auth/feishu/callback (域名根据实际情况修改)
  4. 添加用户字段信息授权:email 地址 (可选)
  5. 至少勾选一个应用方式并创建新版本后发布
FEISHU_ENABLED=true
FEISHU_APP_ID=
FEISHU_APP_SECRET=

Gitlab

  1. 注册 Gitlab 官方账户或自部署 Gitlab 服务
  2. 在用户设置(Preferences) -> 应用(Applications) 创建一个新应用
  3. 回调地址(Redirect URI) 配置为 http://zealot.com/users/auth/gitlab/callback (域名根据实际情况修改)
  4. 添加用户字段信息授权(scope):read_user,默认 zealot 仅用此授权,如果你的授权范围是 api 也没问题
GITLAB_ENABLED=true
GITLAB_SITE=https://gitlab.com/api/v4
GITLAB_SCOPE=read_user
GITLAB_APP_ID=
GITLAB_SECRET=

Google

  1. 注册 Google 账号
  2. 开通 Google Cloud Platform 服务
  3. 选择或创建 Project 并前往 Credentials
  4. 创建 OAuth Client ID 选择 Web Application 后添加回调地址(Authorized redirect URI) 配置为 http://zealot.com/users/auth/google_oauth2/callback (域名根据实际情况修改)
  5. 创建成功后获得 Client ID 和 Client Secret
GOOGLE_OAUTH_ENABLED=true
GOOGLE_CLIENT_ID=
GOOGLE_SECRET=

LDAP

  1. 自部署或使用现有的 LDAP 服务
  2. 自配置或查找如下参数的值
LDAP_ENABLED=true
LDAP_HOST=10.0.0.1
LDAP_PORT=389
LDAP_METHOD=plain
LDAP_BIND_DN="cn=Manager,dc=example,dc=com"
LDAP_PASSWORD=password
LDAP_BASE="ou=People,dc=example,dc=com"
LDAP_UID=uid

OpenID Connect

支持开启自动发现模式和手动设置两种方式

自动发现

开启自动发现模式会自动获取 [OIDC_ISSUER_URL]/.well-known/openid-configuration 配置。

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_DISCOVERY=true

手动配置

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_AUTH_URI=/authorize
OIDC_TOKEN_URI=/token
OIDC_USERINFO_URI=/userinfo

以上 OIDC_AUTH_URIOIDC_TOKEN_URIOIDC_USERINFO_URI 未设置时会使用如上的默认路径。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/architecture/index.html b/zh-Hans/docs/next/self-hosted/deployment/architecture/index.html index 64fd05ef5..11080ccfb 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/architecture/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/architecture/index.html @@ -4,13 +4,13 @@ Zealot 服务架构 | Zealot - - + +
版本:开发版本 🚧

Zealot 服务架构

运行 Zealot 依赖如下服务才能保证正常运行

ArchitectureArchitecture
  • 使用 amd86/arm64/armv7 运行的主流 Linux 系统
  • Ruby on Rails 提供核心网页和 API 服务
  • Sidekiq 提供后台的异步任务管理服务
  • PostgreSQL 数据库服务
  • Redis 缓存服务
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/docker/index.html b/zh-Hans/docs/next/self-hosted/deployment/docker/index.html index 262da39e0..4c2a218b6 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/docker/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/docker/index.html @@ -4,8 +4,8 @@ Docker 部署 Zealot 指南 | Zealot - - + +
@@ -15,7 +15,7 @@ 首先需要克隆官方 Zealot 部署工具,进入 zealot-docker 目录后需要打开 example.env 文件配置必要的参数后可直接执行 ./deploy.sh 脚本:

提示

默认会生成管理员账号:admin@zealot.com 和密码 ze@l0t 和一些演示应用。

$ git clone https://github.com/tryzealot/zealot-docker.git
$ cd zealot-docker
$ ./deploy

一键部署生成脚本默认内置了下面三种模板配置 SSL 证书:

配置 SSL 证书

Let's Encrypt

信息

免费且自动续签 SSL 证书,新手使用的最佳选择

第一步:执行部署脚本:

$ ./deploy

第二步:检查和配置 .env 文件,主要是 ZEALOT_DOMAINZEALOT_CERT_EMAIL 是否填写正确, 其他部分可根据实际情况做对应的配置调整

第三步:运行 Zealot 服务:

$ docker-compose up -d

反向代理托管 SSL 证书

配置说明迁移值反向代理指南,里面包含了更多的服务配置。

自签名 SSL 证书

警告

在条件满足其他情况下绝对不推荐此方案,iOS 设备对使用自签名证书的任何 Web 服务必须在其设备上手动安装自签名证书后才能正常安装应用

如果域名是非注册域名则需要绑 host 才可以访问,通常是修改系统的 /etc/hosts 文件。

$ sudo vim /etc/hosts

127.0.0.1 zealot.test
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step/index.html b/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step/index.html index 061fe0ff2..1acce8d37 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step/index.html @@ -4,13 +4,13 @@ Docker 手把手部署文档 | Zealot - - + +
版本:开发版本 🚧

Docker 手把手部署文档

这是一篇手把手来指导使用 Docker 部署文档,同时也是解释Docker 部署 Zealot 指南的分解

版本列表

  • 稳定版本 - 5.0.0/latest - ghcr.io/tryzealot/zealot:latest
  • 测试版本 - develop - ghcr.io/tryzealot/zealot:nightly - 基于 develop 分支每次提交构建的版本

镜像仓库

Docker hub 取消了免费组织计划,不再同步更新推送。

Github Container Registry: https://github.com/tryzealot/zealot/pkgs/container/zealot (推荐)

步骤解析

安装 Docker

按照官方教程安装

安装 Docker-Compose

按照官方教程安装

生成 .env 配置文件

从预先 config.env 配置文件复制一份部署使用的配置文件

配置域名

二次校验如果没有配置会再提醒

配置证书

部署脚本提供三种方式,就算使用最后一种生成的也是 https 的协议头

  • 使用 Let's Encrypt 证书
  • 使用自签名证书
  • 纯 Zealot 服务(需反代网关或负载均衡生成 SSL 证书)

生成 docker-compose.yml

配置文件会生成至少四个服务(service),使用上面前两个证书方式会额外增加一个服务:

  • zealot-zealot: 核心 Web 和 API 服务
  • zealot-worker: 核心异步任务服务
  • zealot-postgres: 数据库服务
  • zealot-redis: 缓存服务
  • zealot-web: 提供(服务和证书)反代的网关服务,非必需

创建持久化存储的 docker volumes

存储持久化数据

  • zealot-data: 静态资源,JS、CSS、图片以及上传的应用、应用图标和调试文件
  • zealot-postgres: 数据库数据
  • zealot-redis: 缓存数据

拉取(更新)镜像

第一次使用会自动从 Docker hub 下载镜像,后续是更新操作,通常只会更新 zealot 镜像。其他几个依赖服务镜像都是固定版本号

docker-compose pull

设置数据库数据

第一次使用会初始化数据库、加载范例应用数据和设置管理员账号,后续这是因 zealot 更新需要的操作

docker-compose run --rm zealot run_upgrade

运行 docker-compose

为了安全期间和用户的自定义操作需要手动执行来运行服务:

docker-compose up -d

高级配置

自定义 volume 路径

自定义路径有两种方法: (假设自定义的路径是 /data/zealot)

1. 创建 volume 自定义路径

docker volume create --name zealot-data \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/zealot-data

docker volume create --name zealot-redis \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/redis

docker volume create --name zealot-postgres \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/postgres

2. 修改 docker-compose 的 volumes 部分

打开 docker-compose.yml 拉到最底部找到 volumes: 开头的部分,修改为如下内容:

volumes:
zealot-data:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/data
zealot-redis:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/redis

zealot-postgres:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/postgres
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/fly/index.html b/zh-Hans/docs/next/self-hosted/deployment/fly/index.html index f53cdafba..6e742aaf6 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/fly/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/fly/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Fly 指南 | Zealot - - + +
版本:开发版本 🚧

部署 Zealot 到 Fly 指南

Zealot 支持 fly.io 官方的应用配置格式(fly.toml)。

部署步骤

  • 预先安装 flyctl 命令行工具。
  • 复制下面配置文件 保存为 fly.toml 文件放在项目根目录,根据创建的 fly app 项目修改 app 的值。
  • 运行 flyctl deploy 开始构建和部署工作。
  • 运行 fly scale vm shared-cpu-1x --memory 512 来达到 Zealot 可允许的内存环境,默认免费的 256M 内存实际只有 205M,Zealot 运行起来闲置状态会 190M 到会提示 OOM 内存溢出。

配置文件

app = "[app-name:changeme]"
kill_signal = "SIGINT"
kill_timeout = 120
processes = []

[build]
image = "ghcr.io/tryzealot/zealot:nightly"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 80
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

[[statics]]
guest_path = "/app/public"
url_prefix = "/"
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/kubernetes/index.html b/zh-Hans/docs/next/self-hosted/deployment/kubernetes/index.html index fa2ce8a38..b448ec1f3 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/kubernetes/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/kubernetes/index.html @@ -4,13 +4,13 @@ Kubernetes 部署 Zealot 指南 | Zealot - - + +
版本:开发版本 🚧

Kubernetes 部署 Zealot 指南

Zealot 原生支持使用 Kubernetes 部署,不过一直还没有梳理 .yaml 配置文件用于安装。

部署清单

  • 生成 Secret/Configmap 存储环境变量。
  • 生成 PersistentVolumeClaim 用于 public/uploads, public/bakcup 的持久化存储。
  • 生成 Deployment 来管理 zealot Pod。
  • 生成 Ingress 配置 Zealot 路由访问。

详细步骤

10-zealot-namespace.yml

创建 Zealot 命名空间。

10-zealot-namespace.yml
api Version: v1
kind: Namespace
metadata:
name: zealot

20-zealot-secrets.yml

配置 Zealot 涉及隐私数据的环境变量,值是需要经过 base64 加密。

20-zealot-secrets.yml
apiVersion: v1
kind: Secret
metadata:
namespace: zealot
name: zealot-secrets
data:
ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=
ZEALOT_ADMIN_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=
ZEALOT_POSTGRES_PORT: NTQzMg==
ZEALOT_POSTGRES_USERNAME: emVhbG90
ZEALOT_POSTGRES_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_DB_NAME: emVhbG90
REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=

# echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64
SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==

21-zealot-configmap.yml

配置 Zealot 正常数据的环境变量

21-zealot-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: zealot
name: zealot-config
data:
ZEALOT_DOMAIN: zealot.icyleaf.dev
DEFAULT_LOCALE: en
ZEALOT_REGISTER_ENABLED: "true"

30-zealot-storage.yml

为上传文件(应用包和调试文件)以及备份文件创建持久化存储卷。你可能需要根据实际情况修改存储大小。

30-zealot-storage.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-uploads
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-backup
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

40-zealot-deployment.yml

创建 Zealot 部署,根据实际情况修改 replicas 扩容值和 image 镜像 tag。

40-zealot-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zealot
namespace: zealot
spec:
restartPolicy: Always
replicas: 1
selector:
matchLabels:
app: zealot
template:
metadata:
labels:
app: zealot
spec:
containers:
- name: zealot
image: ghcr.io/tryzealot/zealot:nightly
# imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
envFrom:
- configMapRef:
name: zealot-env
- secretRef:
name: zealot-secrets
volumeMounts:
- mountPath: /app/public/uploads
name: uploads
- mountPath: /app/public/backup
name: backup
volumes:
- name: uploads
persistentVolumeClaim:
claimName: zealot-uploads
- name: backup
persistentVolumeClaim:
claimName: zealot-backup

50-zealot-service.yml

创建 zealot 服务。

50-zealot-service.yml
apiVersion: v1
kind: Service
metadata:
name: zealot
namespace: zealot
labels:
app: zealot
spec:
selector:
app: zealot
ports:
- port: 80
targetPort: http
name: http
protocol: TCP

60-zealot-ingress.yml

为 Zealot 服务设置 ingress。

50-zealot-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zealot
namespace: zealot
annotations:
#cert-manager.io/cluster-issuer: letsencrypt-prod
#kubernetes.io/ingress.class: nginx
spec:
rules:
- host: zealot.icyleaf.dev
http:
paths:
- web:
service:
name: zealot
port:
number: 80
path: /
pathType: Prefix
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/nomad/index.html b/zh-Hans/docs/next/self-hosted/deployment/nomad/index.html index 7709848f9..0ba65534b 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/nomad/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/nomad/index.html @@ -4,15 +4,15 @@ Nomad 部署 Zealot 指南 | Zealot - - + +
版本:开发版本 🚧

Nomad 部署 Zealot 指南

Zealot 原生支持使用 Nomad 部署。这得益于 Nomad 有很不错的插件机制,官方默认支持 Docker 插件。 在配置上接近于 docker compose 的配置,只不过它的配置语言是 HCL 而不是 YAML。

基本部署

使用 Nomad 部署

先按照官方教程依次安装好 nomad,这个二进制文件是包含了客户端和服务端。 不了解的建议跟着官方教程演练一遍。

下面文件将会创建 postgres、redis 和 zealot 三个服务,对于已有的外部数据库和缓存服务,可以删除掉对应的 port, servicetask 后编辑 zealot task 里面的模板变量。

zealot.nomad
job "zealot" {
type = "service"
datacenters = "dc1" // 根据实际情况修改

update {
max_parallel = 1
min_healthy_time = "30s"
auto_revert = true
}

group "zealot" {
network {
port "zealot" {
to = 80
}

port "postgres" {
to = 5678
}

port "redis" {
to = 6379
}
}

service {
name = "zealot"
port = "zealot"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.http.routers.zealot.entrypoints=web, websecure",
// "traefik.http.routers.zealot.rule=Host(`zealot.example.com`)",
// ]
}

service {
name = "postgres"
port = "postgres"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.tcp.routers.postgres.rule=HostSNI(`*`)",
// "traefik.tcp.routers.postgres.entrypoints=postgres",
// ]
}

service {
name = "redis"
port = "redis"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.tcp.routers.redis.rule=HostSNI(`*`)",
// "traefik.tcp.routers.redis.entrypoints=redis",
// ]
}

task "zealot" {
driver = "docker"

config {
image = "ghcr.io/tryzealot/zealot:latest"
ports = ["zealot"]

// 根据实际情况修改,或采用 CSI 协议的外部存储
volumes = [
"/tmp/zealot/uploads:/app/public/uploads",
"/tmp/zealot/backups:/app/public/backups",
]

// 添加服务到 homepage dashboard 面板
// labels = {
// "homepage.group" = "Dev"
// "homepage.name" = "Zealot"
// "homepage.icon" = "mdi-progress-download"
// "homepage.href" = "https://zealot.example.com"
// "homepage.description" = "Beta App Distribution"
// }
}

// Zealot example config
// https://github.com/tryzealot/zealot-docker/blob/master/config.env
template {
destination = "local/config.env"
change_mode = "restart"
env = true
data = <<-EOF
ZEALOT_APPEARANCE = dark
ZEALOT_DOMAIN = zealot.example.com

ZEALOT_GUEST_MODE = false
ZEALOT_REGISTER_ENABLED = true
EOF
}

template {
destination = "secrets/secret.env"
change_mode = "restart"
env = true
data = <<-EOF
# admin account
ZEALOT_ADMIN_EMAIL = admin@zealot.com
ZEALOT_ADMIN_PASSWORD = ze@l0t

# datbase
ZEALOT_POSTGRES_HOST = {{ env "NOMAD_IP_postgres" }}
ZEALOT_POSTGRES_PORT = {{ env "NOMAD_PORT_postgres" }}
ZEALOT_POSTGRES_USERNAME = "zealot"
ZEALOT_POSTGRES_PASSWORD = "zealot"
ZEALOT_POSTGRES_DB_NAME = "zealot"

# cache
REDIS_URL = redis://{{ env "NOMAD_ARRR_redis" }}/0

# secret token
SECRET_TOKEN = $${ sha256(uuidv5("url", "zealot.ews.im")) }
EOF
}

resources {
cpu = 500
memory = 500
memory_max = 1000
}
}

task "postgres" {
driver = "docker"

lifecycle {
hook = "prestart"
sidecar = true
}

config {
image = "postgres:15-alpine"
ports = ["postgres"]
volumes = [
"secrets/init-role.sql:/init-role.sql",
"secrets/init-db.sql:/init-db.sql"
]
}

env {
POSTGRES_INITDB_ARGS = "--data-checksums"
POSTGRES_USER = "zealot"
POSTGRES_PASSWORD = "zealot"
POSTGRES_DB = "zealot"
}

resources{
cpu = 512
memory = 200
memory_max = 512
}
}

task "redis" {
driver = "docker"

lifecycle {
hook = "prestart"
sidecar = true
}

config {
image = "redis:7-alpine"
ports = ["redis"]
}

resources {
cpu = 200
memory = 200
}
}
}
}

确认无误后执行 nomad job run zealot.nomad

使用 Terraform 部署

Terraform 和 Nomad 是同家公司的产品。

先按照官方教程依次安装好 terraformnomad 插件后,复用上面的 zealot.nomad 文件再额外加一个 main.tf 文件即可。

resource "nomad_job" "jobs" {
jobspec = file("${path.module}/zealot.nomad")
}

执行 terraform plan 确认无误后在通过 terraform apply 应用。

外部文件存储

Nomad 支持多集群管理,很多情况下服务部署的存储不可能直接挂载到对应的文件系统中,更多的是放在一个共享文件存储协议上面,比如 SMB、NFS、S3 等等。

CSI 协议

Nomad 支持 CSI 协议,理论上实现 CSI 接口的服务都可以满足。

截止 Nomad 1.5 版本为止,Nomad 可以使用 CSI 卷,但它不能自身控制创建、销毁或管理。卷必须在外部创建,然后向 Nomad 注册后才能使用。

插件支持协议兼容情况terraform nomad 资源
kubernetes-csi-driver-smbsmb未测试未测试
kubernetes-csi-driver-nfsnfs支持nomad_csi_volume_registration
kubernetes-csi-driver-iscsiiscsi未测试未测试
democraticcsi/democratic-csismb/nfs/iscsi支持nomad_csi_volume
rocketduck/csi-plugin-nfsnfs支持nomad_csi_volume
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/railway/index.html b/zh-Hans/docs/next/self-hosted/deployment/railway/index.html index 5ac6af58f..74e19f339 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/railway/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/railway/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Railway 指南 | Zealot - - + +
版本:开发版本 🚧

部署 Zealot 到 Railway 指南

Zealot 支持使用 Docker 部署服务到 Railway

部署步骤

  • Fork Zealot 项目到你自己的 Github 账户。
  • 使用 "deploy from Github repo" 新建项目
  • 新增你需要的环境变量到 Variables 页面。
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/render/index.html b/zh-Hans/docs/next/self-hosted/deployment/render/index.html index edd82bc73..c1a2cdbb1 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/render/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/render/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Render 指南 | Zealot - - + +
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/requirements/index.html b/zh-Hans/docs/next/self-hosted/deployment/requirements/index.html index 827823c67..f7e974846 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/requirements/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/requirements/index.html @@ -4,14 +4,14 @@ Zealot 自部署依赖 | Zealot - - + +
版本:开发版本 🚧

Zealot 自部署依赖

如果想要顺利并发挥 Zealot 最佳状态运行,本页面提供了安装所需的各自软硬环境的依赖安装信息。

操作系统

Zealot 可以安装在绝大多数 Linux 操作系统,但目前并没有测试和统计具体有哪些。

硬件依赖

系统架构

支持使用 amd86/arm64/armv7 运行的主流 Linux 系统,比如 Debian,Ubuntu、CentOS、Arch Linux、Armbian 等。

CPU

CPU 数量取决于 Zealot 使用的资源和任务量,工作量受(包括但不仅限于)以下因素影响:有多少应用和调试文件被上传和解析;有多少应用被下载;有多少网络钩子被触发;苹果开发者同步测试设备的频率以及备份计划作业的数量和频率。

下面是最小硬件条件推荐的 CPU 硬件规格,请不要低于这个标准否则服务运行会收到一定的影响造成服务无法正常工作:

  • 1 核必须的最小核心数。

内存

内存大小取决于 Zealot 使用的资源和任务量,工作量受(包括但不仅限于)以下因素影响:有多少应用和调试文件被上传和解析;有多少应用被下载;有多少网络钩子被触发;苹果开发者同步测试设备的频率以及备份计划作业的数量和频率。

下面是最小硬件条件推荐的内存大小规格,请不要低于这个标准否则服务运行会收到一定的影响造成服务无法正常工作:

  • 512MB必须的最少的内存大小。

存储

存储容量的大小取决于有多少应用和调试文件版本上传,当然也包含生成的备份文件。

软件依赖

Ruby 版本

  • Ruby 3.0+

必须使用标准的 MRI 实现的 Ruby 版本。Zealot 内部依赖的 Gems 需要原生扩展。

Node.js 版本

Zealot 使用 esbuildsass 编译前端资源。

推荐使用 Node 14.x 以上版本。

可以在终端应用通过运行 node -v 命令查看 node 的版本。如果运行的版本低于 v8.0 你需要更新到推荐的版本。你可在官方网站查看更多安装或升级教程。

数据库

数据库仅支持 PostgreSQL 且目前没有计划支持更多其他数据库。

PostgreSQL 依赖

PostgreSQL 预留至少 5-10 GB 空间,更多的空间意味着可以存储更多的数据。

我们强烈推荐使用且保持 PostgreSQL 永远是最新的稳定版本作为开发和测试使用。

Redis

Zealot 后台异步任务和定时任务依赖于 Redis 做数据的存储和统计使用,存储空间依赖很小,50MB 足矣。

Redis 最低支持版本 6.2+,推荐 7.x 版本

Sidekiq

Sidekiq 是 Zealot 后台异步任务和定时任务使用的服务,它支持多线程操作且运行时依托于 Rails (也就是 Zealot 使用的框架)。 它可能会随着时间的推移而增长内存的占用,如果 Zealot 运行的时间很长造成的服务不稳定请适当调整内存的大小,建议是 1GB+。

已支持 Web 浏览器

提示

Zealot 运行部分页面依赖于 Javascript,请不要设置浏览器禁止它。

Zealot 支持如下 Web 浏览器:

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/deployment/source-code/index.html b/zh-Hans/docs/next/self-hosted/deployment/source-code/index.html index 6a5f7441a..3a4d1e9e2 100644 --- a/zh-Hans/docs/next/self-hosted/deployment/source-code/index.html +++ b/zh-Hans/docs/next/self-hosted/deployment/source-code/index.html @@ -4,13 +4,13 @@ 源码部署 Zealot 指南 (遗弃) | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/index.html b/zh-Hans/docs/next/self-hosted/index.html index cecc79e05..83d2bc3e6 100644 --- a/zh-Hans/docs/next/self-hosted/index.html +++ b/zh-Hans/docs/next/self-hosted/index.html @@ -4,13 +4,13 @@ 自建服务指南 | Zealot - - + +
版本:开发版本 🚧

自建服务指南

本指南将会帮助你安装和部署 Zealot 到产品环境。

ArchitectureArchitecture
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/reverse-proxies/index.html b/zh-Hans/docs/next/self-hosted/reverse-proxies/index.html index c51da9847..d57a1a654 100644 --- a/zh-Hans/docs/next/self-hosted/reverse-proxies/index.html +++ b/zh-Hans/docs/next/self-hosted/reverse-proxies/index.html @@ -4,13 +4,13 @@ 反向代理 | Zealot - - + +
版本:开发版本 🚧

反向代理

方便 SSL 证书的统一管理和分发、服务的扩容及接入现成的网关服务,文档提供几种给网关配置反向代理服务的配置。

ArchitectureArchitecture

准备工作

配置反向代理需要准备好如下数据:

名称范例值备注
域名zealot.icyleaf.dev
反向代理 IP 地址172.16.56.1
Zealot IP 地址172.16.56.100反向代理服务可访问
同一台服务可改为 127.0.0.1
Zealot 外部映射端口号8901反向代理服务可访问
Zealot 内部端口号80无需修改
Let's Encrypt 邮箱your-email@example.com

Traefik

Traefik 是一款开源的反向代理与负载均衡工具,它自身提供多种 Providers 可以实现接入反向代理并配置 SSL 的方式。

配置解释

无论使用那种 Provider 核心的配置项是相同的,构成反向代理服务配置主要有三部分组成:发现端口号、路由规则(包含访问端口号、域名绑定和SSL)

Traefik 服务

entryPoints:
web:
address: ":80"

websecure:
address: ":443"

certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web

Docker

首先需要开启 Docker provider 后在修改 zealot 的 Docker Compose 配置:

docker-compose.yml
version: '3'
services:
zealot:
<<: *defaults
labels:
- "traefik.enable=true"
- "traefik.http.services.zealot.loadbalancer.server.port=80"
- "traefik.http.routers.zealot.service=zealot"
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"
- "traefik.http.routers.zealot.tls=true"
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt"
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
# 由 Treafik 接管无需在对外暴露端口号
# ports:
# - "8901:80"
network:
# 根据 traefik 服务的 network 按需调整
- traefik-services

networks:
# 根据 traefik 服务的 network 按需调整
traefik-services:
external: true

Docker 部署的局限于 Traefik 和 Zealot 服务通常在同一个机器的同一个 OS 系统中,跨机器就没法实现通讯,对于跨机器就需要参考下面两种配置方案:

Consul

首先需要开启 Consul providerConsul Catalog provider,我们只需要利用它的 Key-Value 存储:

consul kv put traefik/http/services/zealot/loadbalancer/server/port 5
consul kv put traefik/http/routers/zealot/service zealot
consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'
consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt
consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev
consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev

Nomad

首先需要开启 Nomad provider 且 Nomad 版本要大于等于 1.3 才可以哟:

zealot.nomad
job "zealot" {
datacenters = ["dc1"]
type = "service"

group "zealot" {
count = 1

network {
port "http"{
static = 80
}
}

service {
name = "zealot-http"
provider = "nomad"
port = "http"
}

task "server" {
driver = "docker"
config {
image = "ghcr.io/tryzealot/zealot:nightly"
ports = ["http"]
args = [
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",
- "traefik.http.routers.zealot.tls=true",
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt",
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
]
}
}
}
}

Caddy 2 配置

Caddyfile
:443

log

# 使用 Let's Encrypt 服务
tls your-email@example.com

reverse_proxy 172.16.56.100:8901

配置只需配置 tlsproxy 后面 IP 地址和端口部分即可。

Nginx

如下是通用配置,如果不可用欢迎提问题

conf.d/zealot.conf
upstream zealot {
zone upstreams 64K;
server 172.16.56.100:8901;
keepalive 32;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name zealot.icyleaf.dev;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2; # 可选:http2 可能需要安装额外扩展,不需要可移除
listen [::]:443 ssl http2; # 可选:http2 可能需要安装额外扩展,不需要可移除
server_name zealot.icyleaf.dev;

ssl_certificate /etc/certs/zealot-cert.pem;
ssl_certificate_key /etc/certs/zealot.pem;

# Optional
# ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
# ssl_session_timeout 5m;
# ssl_session_cache shared:SSL:1m;
# ssl_prefer_server_ciphers on;

location / {
proxy_pass http://zealot;
proxy_redirect off;

proxy_pass_header Authorization;
proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Ssl on; # 可选
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

client_max_body_size 0;
proxy_read_timeout 36000s;
}
}

Nginx 还需要在 http 中配置最大上传文件上传大小,普通应用建议是在 200MB 左右,如果是游戏可根据实际文件大小再多出 50% 打出富余。

nginx.conf
http {
[...]

client_max_body_size 200M;
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/self-hosted/storage/index.html b/zh-Hans/docs/next/self-hosted/storage/index.html index 5dd07ce5a..537ec55ef 100644 --- a/zh-Hans/docs/next/self-hosted/storage/index.html +++ b/zh-Hans/docs/next/self-hosted/storage/index.html @@ -4,13 +4,13 @@ 数据存储 | Zealot - - + +
版本:开发版本 🚧

数据存储

这里罗列了 Zealot 服务所需的所有数据存储,在还没有提供更好的备份管理工具之前,方便有能力的用户能够手动备份和恢复数据使用。

Postgres

用于存储和管理一切和 Zealot 有关数据,这个就不用多说了。

Redis

目前只有 sidekiq 异步任务服务在使用它做一些任务状态、统计数据的存储。

文件存储

Zealot 服务除了依赖 postgresql、redis 之外还有一部分的磁盘存储是上传的应用、调试文件且仅提供存储在文件系统之中,目录位于 public/uploads

  • apps 上传应用的目录
  • debugs_files 上传调试文件的目录

备份存储

Zealot 服务目前支持通过管理员面板管理和生成备份数据,备份数据可配置范围包括数据库和上传应用,目录位于 public/backup

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/apple-team/index.html b/zh-Hans/docs/next/user-guide/administrator/apple-team/index.html index 519dde49d..6399122b9 100644 --- a/zh-Hans/docs/next/user-guide/administrator/apple-team/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/apple-team/index.html @@ -4,13 +4,13 @@ 苹果开发者 | Zealot - - + +
版本:开发版本 🚧

苹果开发者

iOS Ad-Hoc 签发的应用分发最大的困难是需要给大量不懂这些概念的人传递什么是 UDID、学习如何获取、获取后再提供给开发者,再通过重新签发证书、打包、上传才能安装。

Zealot 可以自动获取 Ad-Hoc 应用的 UDID,面对一串串的 UDID 没人能够看懂这都是谁的设备,明明这些设备在注册的时候都已经备注或自动获取了设备名,但它有不能够自动同步过来。

为了解决以上两个重大难题,Zealot 分别尝试了几种方案来解决这个困难,早期使用 fastlane 插件 zealot_sync_device 调用时会同步测试设备的名称和机型,直到苹果开发者推出 AppStoreConnect API 后完全可以托管到 Zealot 来自动化处理,通过常规流程大大简化注册流程的同时,也能过让测试应用能够显示可识别且友好的测试设备名称。

注册流程注册流程

虽然提供的设备 UDID 功能确认哪些应用可以安装,假如设备没有注册到任何一个应用这个时候提供一个测试设备注册的功能岂不是大大提升团队的效率?这也就是苹果开发者的作用。

苹果开发者详情预览苹果开发者详情预览

最初功能介绍:https://github.com/tryzealot/zealot/issues/723 后续在做更全面的不全

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/backup/index.html b/zh-Hans/docs/next/user-guide/administrator/backup/index.html index 70dfacdbe..eebf245cd 100644 --- a/zh-Hans/docs/next/user-guide/administrator/backup/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/backup/index.html @@ -4,13 +4,13 @@ 备份计划 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs/index.html b/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs/index.html index 9855fca5f..33651f152 100644 --- a/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs/index.html @@ -4,13 +4,13 @@ 后台任务 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics/index.html b/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics/index.html index f003674fa..a9106cf7c 100644 --- a/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics/index.html @@ -4,13 +4,13 @@ 数据库分析 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/monitoring/logging/index.html b/zh-Hans/docs/next/user-guide/administrator/monitoring/logging/index.html index 297658ce1..85394cfe4 100644 --- a/zh-Hans/docs/next/user-guide/administrator/monitoring/logging/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/monitoring/logging/index.html @@ -4,13 +4,13 @@ 系统日志 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info/index.html b/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info/index.html index c8aa4b224..6a343ce86 100644 --- a/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info/index.html @@ -4,13 +4,13 @@ 系统信息 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/permissions/index.html b/zh-Hans/docs/next/user-guide/administrator/permissions/index.html index f6d60ac53..86594ce5a 100644 --- a/zh-Hans/docs/next/user-guide/administrator/permissions/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/permissions/index.html @@ -4,13 +4,13 @@ 用户权限 | Zealot - - + +
版本:开发版本 🚧

用户权限

Zealot 提供四种用户权限:

  • 游客
  • 普通用户
  • 开发者
  • 管理员

权限明细

功能游客[开/关]普通用户开发者管理员
控制面板
浏览所有的数据
✓/✕
应用
浏览应用列表
✓/✕
应用
浏览应用类型和渠道详情
✓/✕
应用
浏览应用版本详情
✓/✓
支持密码访问
应用
浏览应用内的网络钩子
✓/✕
应用
上传/安装/下载应用
应用
创建/编辑/删除应用
应用
创建/编辑/删除应用的类型或渠道
应用
删除指定的应用版本和上传的应用文件
应用
测试应用的网络钩子
应用
启用或禁用网络钩子
应用
删除应用
调试文件
浏览调试文件列表
✓/✕
调试文件
浏览上传调试文件的解析详情
调试文件
下载调试文件
调试文件
上传/删除调试文件
应用解包
浏览应用解包列表
✓/✕
应用解包
浏览应用解包的详情数据
✓/✕
应用解包
删除应用解包
管理面板
浏览和管理用户
管理面板
浏览和管理全部的网络钩子
管理面板
浏览和管理全部的苹果开发者
管理面板
浏览和管理系统设置
管理面板
浏览系统环境的数据
管理面板
浏览和管理后台任务
管理面板
浏览页面访问统计
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/administrator/settings/index.html b/zh-Hans/docs/next/user-guide/administrator/settings/index.html index 31fa5feca..c4b32eb7b 100644 --- a/zh-Hans/docs/next/user-guide/administrator/settings/index.html +++ b/zh-Hans/docs/next/user-guide/administrator/settings/index.html @@ -4,13 +4,13 @@ 系统设置 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/apps/create/index.html b/zh-Hans/docs/next/user-guide/apps/create/index.html index 4034d209f..6c43418a0 100644 --- a/zh-Hans/docs/next/user-guide/apps/create/index.html +++ b/zh-Hans/docs/next/user-guide/apps/create/index.html @@ -4,13 +4,13 @@ 创建应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/apps/detail/index.html b/zh-Hans/docs/next/user-guide/apps/detail/index.html index 2778e4ee9..81ee26fc5 100644 --- a/zh-Hans/docs/next/user-guide/apps/detail/index.html +++ b/zh-Hans/docs/next/user-guide/apps/detail/index.html @@ -4,13 +4,13 @@ 已上传应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/apps/index.html b/zh-Hans/docs/next/user-guide/apps/index.html index 7df4c5b85..5bd6dee0a 100644 --- a/zh-Hans/docs/next/user-guide/apps/index.html +++ b/zh-Hans/docs/next/user-guide/apps/index.html @@ -4,13 +4,13 @@ 管理应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/apps/upload/index.html b/zh-Hans/docs/next/user-guide/apps/upload/index.html index 670dfedbe..7454e1c9f 100644 --- a/zh-Hans/docs/next/user-guide/apps/upload/index.html +++ b/zh-Hans/docs/next/user-guide/apps/upload/index.html @@ -4,13 +4,13 @@ 上传应用包 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/best_practices/index.html b/zh-Hans/docs/next/user-guide/best_practices/index.html index 00b24b06d..9e5b6da1a 100644 --- a/zh-Hans/docs/next/user-guide/best_practices/index.html +++ b/zh-Hans/docs/next/user-guide/best_practices/index.html @@ -4,13 +4,13 @@ 最佳实践 | Zealot - - + +
版本:开发版本 🚧

最佳实践

iOS 和 Android 应用

集成 Zealot SDK

集成 Zealot SDK 可以让非客户端研发自动触发新版本检查、查看变更日志和安装功能。

安装 fastlane

通过官方文档安装 fastlane.

配置 Fastfile

# 构建 iOS 的 ipa 文件并上传 zealot 服务器
lane :upload_app do
# 打包,比如 iOS 的 gym 或 Android 的 gradle
gym

# 上传应用到 Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# 上传 iOS 的 dSYM
zealot_debug_file(
scheme: 'AppName'
)
end

# 构建 android 的 apk 文件并生成 progguard 包后上传 zealot 服务器
lane :upload_debug_file do
# 打包,比如 iOS 的 gym 或 Android 的 gradle
gradle

# 自动化搜索 Android Proguard(混淆)并打包 Zip 文件
debug_file

# 上传应用到 Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# 上传 Android 的 Proguard
zealot_debug_file(
build_type: 'release',
flavor: 'googleplay'
)
end

CI 打包构建服务

自行选择使用 Jenkins、Gitlab CI 等任何可构建 iOS 或 Android 的构建服务完成项目构建的配置。这部分不同的 CI 服务配置都有所不同,暂时无法展开,大家可根据自己熟悉情况或借助运维部门的协助搭建。

Zealot 服务

除了管理每次上传的应用和调试文件,在每次接收到上传的应用会触发已配置的网络钩子用来给第三方服务发送通知有新版本收到,同时对于集成 Zealot SDK 的手机客户端每次第一次打开 App 都会收到新版本的安装提醒。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/changelog/index.html b/zh-Hans/docs/next/user-guide/changelog/index.html index 43cad69f8..6626be574 100644 --- a/zh-Hans/docs/next/user-guide/changelog/index.html +++ b/zh-Hans/docs/next/user-guide/changelog/index.html @@ -4,13 +4,13 @@ 变更日志 | Zealot - - + +
版本:开发版本 🚧

变更日志

未发布

提示

如下罗列的变更是还未发布的列表,代码变更历史:未发布

暂无

新增

  • Web/API 支持泛应用托管(支持解析会自动解析,不支持解析会跳过),默认新增 Windows 和 Linux 平台 #1121
  • Web/API 新增 Windows 应用托管(上传和元信息解析展示) #1124
  • Web 全新调试文件页面并新增多 dSYM 调试文件解析和托管 #1127 #1124 #961
  • Web 支持 Android 应用解包 v1, v2, v3 签名信息 #1124
  • Web 强化 Android 和 iOS 应用解包的 X509 证书信息 #1124
  • Web 新增 “重新解析” 功能更新老结构的调试文件元信息
  • Web 上传应用版本的变更日志支持 markdown 格式
  • Web 设置页可配置全局 “每页返回最小” 和 “最大条目数”
  • Web 应用版本详情页面针对 iOS 应用展示签名证书过期时间信息和签名证书过期无法安装(可以下载)的逻辑限制
  • Web 网络钩子及设置页添加或更新增加 JSON 格式校验
  • Web 注册测试设备到苹果开发者支持自定义设备名称和创建后编辑更新设备名称
  • Web 苹果开发者的私钥证书支持下载

修复

  • Web 修复解包应用无法删除问题
  • Web 部分页面的样式优化
  • Web 纠正英语语言包错误(en language i18n)
  • Web 修复应用类型创建为空时错误的报错页面
  • Web 修复找不到文件报 404 错误页面
  • API 修复应用获取最新版本 build_version 版本比较逻辑优化
  • Web 优化上传应用自定义字段格式错误处理
  • Web 优化 url 注入、应用历史版本为空、没有注册设备等正确跳转
  • Web 优化展示备份任务错误信息
  • Web 上传应用对应用类型、调试文件增加类型检测
  • Web 修复创建苹果开发者没有预选创建 Distribution Certificate 的错误信息

4.7.1 (2023-03-10)

支持最新 Android aapt2 构建工具生成的 aab 应用解析,详细[代码变更记录][4.7.1]

修复

  • Web 升级最新 appt2 模型避免 aab 解析异常
  • Web 解析异常的重复处理

新增

  • Web Android 应用解包详情页增加应用类型
  • Web 应用渠道编辑后调整原先的页面

4.7.0 (2023-03-03)

变更

  • Docker 重大变更 Redis 最低版本依赖从原来的 5.x 升级至 6.2+,建议使用 7.x 主版本,升级时请手动修改。详细代码变更记录

新增

  • Web 应用类型新增 “新上传版本提示窗” 控制开关 #1058 感谢 softwind0214
  • Web 应用列表页面图标可点击跳转应用详情页
  • Web 环境信息新增依赖服务的版本号显示
  • Web 版本号增加对 nightly 构建的版本的显示

修复

  • Web Ruby 版本降级至 3.0 暂时解决高版本带来的 iOS 应用解析崩溃,具体情况看 #1070
  • Web 应用/类型/渠道展示顺序固定为按照创建时间正序排列
  • Web 修复用户注销时没有弹出二次确认提示
  • Web 修复应用版本在主历史版本无法删除
  • Web 改善多个页面的样式问题
  • Web 产品环境不再展示 Javascript 调试器日志输出

4.6.0 (2023-01-17)

运行环境升级至 Ruby 3.2 并支持 arm64 平台。详细代码变更记录

修复

  • Web 捕获创建应用渠道名称为空问题 #968 感谢 congpeijun
  • Web 备份文件在磁盘不存在的逻辑完善 #995

新增

  • Docker 支持 arm64/v8 及 armv7 镜像 #970
  • Web 采用新 50x 错误页面

变更

  • Web 开发环境 Ruby 升级至 3.2 版本,devcontainer 及容器默认开启 YJIT 特性 #1011
  • API 更新调试文件返回数据结构并修改状态码从 204 改为 200

4.5.3 (2022-11-22)

详细代码变更记录

修复

新增

  • Docker 新增环境变量来关闭 WebSocket (ActionCable) 的请求保护 (实验性质) #950

4.5.2 (2022-11-01)

详细代码变更记录

修复

  • Web 修复注册测试设备异常 #935 感谢 ycy0430
  • Web 适配二维码支持黑暗模式
  • Web 修正 en 英文语言包

新增

  • WebHook 变量结构体新增 usernameemail 字段 #934 感谢 rkonfj
  • Docker 支持 SIDEKIQ_CONCURRENCY 环境变量设置后台任务的并发量,默认 5

变更

  • Docker 减少安全隐患,Web 服务包含 puma 和 puma_control_server 监听更换成 127.0.0.1
  • Web 优化 iOS 设备 UDID 描述文件的文案
  • Web 更新页面底部的文案,感谢 Rails 和 AdminLTE 开源项目!

4.5.1 (2022-09-14)

详细代码变更记录

修复

  • Web 修复应用解包解析报错

4.5.0 (2022-08-19)

详细代码变更记录

支持 👨🏻‍🔧 苹果开发者托管测试设备顺手把 🌑 黑暗模式搞来了!

新增

  • Web 支持黑暗模式 #816
  • Web 新增苹果开发者管理用于注册测试设备 #817
  • Web 新增数据备份管理 #835
  • Web 管理面板完成依赖服务的监控 #586
  • API 涉及 release 字典的地方新增三个字段 platform, device_typecustom_fields

变更

  • Web 不兼容变更 Google 统计强制升级 v4 版本,之前设置的需要重新配置才可以生效 #815
  • CLI 不兼容变更 数据备份和还原功能因结构发生变更不再提供,请使用管理员面板的数据备份功能
  • Web 针对获取设备 UDID 及 iOS 版本安装和下载变更根据设备展示对应的功能界面,不再全部展示
  • Web 移除管理员面板的页面统计功能 #814
  • Web 前端技术栈从 webpacker 迁移至 esbuild + sass, Turbolinks 迁移至 Stimulus 带来更好的前端交互体验 #829
  • Web 鉴于编辑应用的类型和渠道逻辑较复杂,变更只能修改应用名

修复

  • Web 处理应用类型下没有存在渠道的选择错误 #795 感谢 tasselsd
  • API 修复 Android 地址返回错误 #813 感谢 denymz
  • Web/API 修正 aab 解析部分参数为空引发的异常 tryzealot/fastlane-plugin-zealot#9 感谢 tasselsd
  • Web 修复第一次初始化项目生成演示数据异常 #821
  • API 修复检查应用最新版本数据异常 #856 感谢 denymz
  • Web 修复应用渠道详情因关联网络钩子数据异常报错
  • Web 修正英文语言包很多拼写错误

4.4.1 (2022-06-20)

详细代码变更记录

修复

4.4.0 (2022-06-09)

详细代码变更记录

变更

  • Web 对于未登录且未开启游客模式的用户权限新增查看应用版本详情之外还提供按照版本、分支、打包类型方式的筛选显示列表
  • Web 运行时环境升级至 Ruby 3.0,服务框架升级至 Rails 7.0
  • Web 兼容 macOS M1 芯片组

新增

  • Web 便于分享简化和统一部分应用链接 #666
  • Web 补全一些遗漏的权限检查页面

修复

  • Job 修复 iOS 文件解析 URL Schemes 异常
  • Web 修复服务日志没有输出到终端控制台
  • Web 增加处理上传调试文件在解析时它被删除掉或其他原因没有找到本地文件的异常捕获
  • Web 适配超宽屏幕的 UI
  • Web 修复第三方登录依赖库的安全隐患
  • API 修复上传 Android 再不传 channel_key 异常 #779 感谢 likfe

4.3.1 (2021-12-22)

详细代码变更记录

新增

  • Web 设置项更新后可恢复原始默认值
  • Web 应用解包支持 Android 对 app links (区分 deep links 和 url schemes) 的解析显示
  • Web 设置页面强化设置开启、关闭状态的视觉效果

修复

  • Web 修复演示模式异步任务方法错误
  • Web 修复创建和编辑应用无法勾选选中的应用类型和渠道
  • Web 修复在环境页面无法
  • Web 修复解析 aab 没有 intent filters 无法解析
  • Web 增加取消勾选任何类型和渠道更新应用的报错
  • Web 修复加载策略造成第三方登录全部不可用

4.3.0 (2021-12-08)

支持 aab 格式解析、多语言支持!详细代码变更记录

变更

  • Web 使用默认提示的结构体作为网络钩子的数据结构,不再是一个奇怪的结构
  • Web 设置页面不再提供第三方登录授权的参数变更(依赖服务重启)
  • API 上传应用接口和版本详情返回主体新增 text_changelog 650f1ffd
  • API 上传应用接口返回主体 changelog_list 改名 changelog 719f0b1e
  • Web 变更日志输出的内容不再是一个数组内容,而是改为兼容 markdown list 格式的文本内容 719f0b1e
  • Web 一些隐私的配置 key 或 token 仅在管理员权限下明文显示;其他权限不可见;演示只读且会做部分加密处理 #644
  • Web 构建日期和哈希值无法获取不显示

新增

  • Web 支持 Android App Bundle (aab) 文件格式和 webp 图标的解析
  • Web 支持语言国际化,可选语言包:简体中文,英文 (支持页面配置)
  • Web 支持配置更多的系统设置项 #643
  • Web 管理面板支持网络钩子的编辑功能
  • Web 重写并优化应用列表的样式布局
  • Web 优化基础的邮件模板
  • Web 调整登录窗口的样式和错误逻辑
  • Web 管理面板的环境变量页面新增文件权限检查 #608
  • Web 管理面板的新增错误异步任务的详情展示,最大错误数量为 5000
  • Web 使用更好的日志输出格式 #646

修复

  • Web 修复设置页面默认情况下 boolean 值类型的参数勾选状态错误
  • Web 修复在钉钉 App 点击安装或下载出现异常问题(改为微信逻辑处理)
  • Web 修复在环境页面无法显示构建日期(构建 docker 镜像时的时间戳)
  • Web 修复异步通知域名作用域无法生效
  • Web 修复获取 gems 异常
  • Web 修复 iOS 证书过期时间判断异常
  • Web 修复使用虚拟机开发挂载磁盘空间无法获取
  • Web 修复演示模式下的一些已知错误

4.2.2 (2021-10-15)

详细代码变更记录

修复

  • API 解决因批量替换造成的参数不匹配没有正确输出错误信息 #615 感谢 gin7758258
  • Web 解决了针对部分 apk Android 文件解析异常问题 #587

4.2.1 (2021-09-14)

详细代码变更记录

变更

  • Web 应用的图标不再按照预设尺寸裁切并移除图片处理依赖减少将近 200MB 镜像体积
  • Docker 反代服务 Caddy 不再输出日志到 STDOUT 而是直接到文件

修复

  • Web 修复上传应用后图标没有正常处理和显示
  • Web 兼容上传 dSYM 不同的 zip 解压缩逻辑
  • Web 修复安装 iOS 无法显示应用图标
  • Web 安全隐患:禁止编辑设置只读的系统设置
  • Web 修复 macOS 下载文件后缀不正确
  • Web 修复个别情况下不显示弹出无法安装的窗口

4.2.0 (2021-09-01)

详细代码变更记录

变更

  • Web 清理老版本逻辑默认改为关闭,如需开启请设置环境变量 ZEALOT_KEEP_UPLOADS=false #570
  • Web 文件解析改名为应用解包 #529
  • Web 下线应用解包中对已上传应用的解包支持(现在上传的应用都会自动触发额外的应用解包)
  • API 上传应用的自定义字段图标支持 fontawesome css 的值,比如 flag 的值是 fas fa-flag
  • Docker 镜像由 caddy 作为反代提供服务并对 volume 持久化做了变更,涉及迁移,具体看 #540

新功能

  • Web 支持 macOS 应用的上传、解析和下载 #562
  • Web 新增手机设备在渠道详情页对应用类型和渠道快速筛选项 #510 感谢 huacnlee
  • Web 管理员面板可配置应用的类型模板和默认注册用户的权限 #562 #568
  • Web 环境变量涉及隐私的做部分加密处理
  • Web 内存和磁盘使用率增加图形展示
  • Docker 新增支持 Github Container Registry 镜像同步更新
  • Docker 新增支持环境变量配置 postgres 端口号

修复

  • Web 修复在 iPad 和 M1 芯片的 macOS 无法显示 iOS 安装按钮 #519 感谢 ohdarling
  • Web 修复注册但未验证邮件的同时使用第三方登录失败 #517 感谢 huacnlee
  • Web 修复使用网页上传没有触发应用解包
  • Web 修复 tubrolink 开启下左侧导航样式错位
  • Web Android 上传应用也显示解包链接
  • Web 优化解包文件列表判断为空的显示提示
  • Web 修复 LDAP 参数获取错误 #541 感谢 Martwu
  • Web 优化捕获页面上传应用错误改为可读的错误信息
  • Web 修复创建应用类型出错判断异常
  • Web 补充在应用删除全部渠道后点击详情报错的一个异常情况的判断
  • Web 修复上传应用因解析过程变量释放错误
  • Web 修复应用设置密码保护校验时报错 #564 感谢 EasierLu
  • Web 修复管理员面板编辑用户资料报错 #564 感谢 EasierLu
  • Web 修复应用详情页面 "安装" 按钮会在错误的系统和设备上异常显示(正常只有 iOS 应用在 iOS 及 macOS 设备才会显示)
  • Web 优化应用解包对于开发者证书因包含特殊字符集(目前已知的是中文编码)解析失败及 UI 样式的重新布局
  • Web 修复无法编辑当前用户
  • Web 改正调试文件的标题重复
  • Docker 修复镜像初始化 logrotate 错误
  • Docker 修复使用 Caddy 部署需要确认 #551 感谢 ReverseScale

4.1.0 (2021-07-17)

详细代码变更记录

变更

  • Web 因 iPad 的 User-Agent 和 Desktop 一样更改获取设备 UDID 的显示逻辑
  • Docker 设置 Gihub Container Registry (gcr.io) 作为默认 Docker 镜像源

新功能

  • Web 支持飞书、Gitlab 第三方一键登录认证
  • Web 优化找不到应用版本详情页面并可以手动跳转到最新版本
  • Web 系统配置新增部分配置项的查看和部分不通过重启的参数修改
  • Web 管理面板新增页面统计报表

修复

  • Web 修复网络钩子无法获取 title 变量的值
  • Web 修复解析应用过程中异常报错
  • Web 修复创建应用过程中会有异常报错
  • Web 修复系统配置保存时为空造成无法编辑
  • Job 处理移除老版本的逻辑造成删除的版本逻辑和文档逻辑是反的

4.0.0 (2020-12-31)

详细代码变更记录

修复

  • Web 修正文件解析 iOS 证书对失效时间判断异常造成的页面错误显示
  • Web 忽略默认开发版本号检查新版本

4.0.0.rc2 (2020-12-25)

详细代码变更记录

新功能

  • Web 新的文件解析会保存到列表,上传的应用也会同步一份文件解析(异步任务) #346
  • Web 控制面板新增文件解析数据统计
  • Web 控制面板针对管理员新增网络钩子、后台任务和磁盘使用的数据统计
  • Web 版本详情提示文件缺失增加有权限者快速删除功能

变更

  • API 调试文件版本检查接口改名并新增按照文件指纹和 dSYM uuid 检查是否存在 #349

修复

  • Web 修复禁用 LDAP 登录认证报错( IP 白名单设置错误)
  • Web 修正 Android 微信打开版本详情提示的文案

4.0.0.rc1 (2020-10-29)

详细代码变更记录

变更

  • Docker 重大变更 合并 rails 和 worker 到同一镜像部署需要同步更新 zealot-docker 库 #235
  • Docker Ruby 升级 2.7 部署
  • Web font-awesome 从 4.7.0 升级至 5.13.0,可能会有遗漏的 Icon 显示不正常
  • Web 调整邀请邮件的文案
  • Web 应用和调试文件下载路径统一到 /download 路径
  • Web 在线解析应用需要登录权限
  • Web 优化已经删除的或不存在的版本详情地址会自动跳转最新版本
  • Web 应用安装和下载逻辑做了调整(主要 iPadOS UserAgent 和 Desktop 一样无法判断)

新功能

  • Web 涉及下载文件不存在会提示无法下载
  • Web 在线解析支持 .mobileprovision 格式文件以及解析 .ipa 新增开启功能等
  • Web 部分系统设置可以使用管理员面板在线修改 #245
  • Web 新增游客模式 #243
  • Web 支持显示 iOS AdHoc 版本测试设备的名称 #211
  • Web 支持解析已上传版本安装包的内容 #210
  • Web 支持获取 iOS 设备 UDID 功能 #203
  • Web 支持定期数据初始化且有功能限制的演示模式 #198
  • Web 上传 App 后在版本详情显示原本应用的名称
  • Web 可通过版本、Git 分支、打包类型筛选过滤应用列表
  • Web 版本详情最近上传关联 git commit 链接(如果在渠道设置了 git url)
  • Web LDAP 登录融合到现有登录界面,不再使用第三方依赖提供的简陋界面
  • Job 支持通过 rails 命令管理生成恢复数据备份功能(数据库、上传文件数据)#207
  • API 新增检查调试文件是否存在接口 /api/debug_files/version_exist

修复

  • Web 修复上传 App 填写变更日志解析报错
  • Web 解决版本详情中二维码在中等分辨率会超出父视图
  • Web 解决应用渠道一些值为空确没有不显示默认值
  • Web 优化在线解析 iOS 包的内容展示(和永远展示假数据的问题)
  • Web 解决版本详情在使用 fastlane-plugin-ci_changelog 生成的变更日志没有展示提交者信息
  • Web 修复并优化检查新版本逻辑
  • Web 修复删除调试文件确认弹窗信息获取为空
  • Web 优化版本详情设备列表在一些手机的显示方式
  • Web 修复解析应用在不传参数提交的报错
  • Web 优化版本列表在手机查看
  • Web 渠道版本的最近上传动态仅显示底部分页,上部改为版本总数
  • Web 修复管理员编辑用户留空密码提示不能为空
  • Web/API 修复在线下载和安装版本不存在时会采用最新版本
  • Web 修复游客模式登录界面会显示边栏菜单
  • Web 修复上传同一应用同一平台调试文件总是会被覆盖的问题
  • Web 系统设置页面优化对布尔类型、字典类型的显示
  • Job 修复定时任务来清理老版本时因版本判断错误发生的误删版本
  • Docker 修复因为 volume 存储 public 文件夹造成内部静态资源不会更新
  • Docker 容器内的版本和外部不一致

4.0.0.beta4 (2020-05-07)

详细代码变更记录

新功能

  • Docker 支持 Heroku 部署
  • Web 游客模式允许查看 App 详情、列表和上传 App 详情
  • API 上传 App 支持自定义字段 #178
  • Web/API 上传 App 传递了 branch 值开头包含 origin/ 开头会自动清理掉
  • Web 登录、注册、找回密码、重设密码等用户认证界面增加项目简介

修复

  • Web 修正用户密码描述文案
  • Web 修复网络钩子(WebHook)包含 url 字段的地址错误
  • Web/API 修复上传 iOS dSYM 文件上传报错
  • API 修复获取 App 接口 has_password 参数异常
  • API 修复上传 App 记录的 source 来源都是 Web
  • API 修复并支持上传 App 传递字符串类型的 json 格式的 changelog
  • Web 修复系统信息没有正常获取 CPU 和内存信息
  • Web 修复在线解析 Android 应用偶尔报错
  • Web 修复使用微信扫描二维码页面报错

变更

  • API 应用最新版本接口(apps/latest)增加 bundle_id 纬度的验证
  • Web 游客模式可以访问应用版本详情和下载操作
  • Web 应用版本详情对于 iOS AdHoc 右侧的设备列表左移并默认收起状态
  • Web 开发环境移除 GraphQL 控制台功能,推荐使用 graphql-playground
  • Web 页面底部移除 footbar,版本信息可以在系统信息查看

4.0.0.beta3 (2020-01-16)

详细代码变更记录

新功能

  • Web 管理员添加的用户在邮箱未激活会提示并显示确认邮箱的链接
  • Web 默认开启 Sentry 匿名上报机制(可关闭)

修复

  • API 修复上传应用总会创建新渠道
  • Web/API 修复上传 Android 应用无法显示图标

变更

  • Docker 初始化数据从镜像移出到 zealot-docker 操作 #120
  • Docker 精简镜像的体积大小从 1.18G 降到 308M #114
  • Job 使用异步任务代替传统 cron job 来实现定时清理老版本历史包文件(可关闭)
  • Job 对异步任务进行分组和设置优先级
  • API 所有报错信息改成中文显示,因数据库写操作会返回具体错误信息
  • Web 使用 Rubocop Lint 规范化代码

4.0.0.beta2 (2020-01-10)

详细代码变更记录

新功能

  • Web 新增上传到具体应用渠道的全部版本列表同时支持删除操作

修复

  • Web 对于上传应用不是有效 ipa 或 apk 的会给予错误提示而不是报错
  • API 修复获取应用最新版本列表因查询版本号不存在数据库无法返回最新版本列表
  • API 只针对写操作的接口才会要求 token 验证(之前是绝大部分都需要)

4.0.0.beta1

🌈 第一个公测版本发布啦

更早的版本

之前多年一直是公司内部开发和运营并没有开源,曾经承担过很多的功能到现在脱离出来专注提供应用托管和分发的服务。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/credits/index.html b/zh-Hans/docs/next/user-guide/credits/index.html index fbafa974e..1e1a6f9a2 100644 --- a/zh-Hans/docs/next/user-guide/credits/index.html +++ b/zh-Hans/docs/next/user-guide/credits/index.html @@ -4,13 +4,13 @@ Credits | Zealot - - + +
版本:开发版本 🚧

Credits

实在不知道怎么翻译 Credits,就这么招吧。

贡献成员

感谢你们让 Zealot 变得更有用!

项目名

Zealot 来自星际争霸种神族基础兵种。

图标

最初项目历史提交资源图标版权归属暴雪,后期改为自己设计的图标,如果有热心设计师能够帮助设计更好的图标,本人代表本项目表示衷心的感谢。

发布协议

Zealot 是一个基于 MIT 发布协议 (MIT) 发布的开源项目,协议内容请参见协议文件

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/dashboard/index.html b/zh-Hans/docs/next/user-guide/dashboard/index.html index 0caf148bf..c017c398d 100644 --- a/zh-Hans/docs/next/user-guide/dashboard/index.html +++ b/zh-Hans/docs/next/user-guide/dashboard/index.html @@ -4,13 +4,13 @@ 控制面板 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/debug-files/index.html b/zh-Hans/docs/next/user-guide/debug-files/index.html index 2f138fb91..121efe96b 100644 --- a/zh-Hans/docs/next/user-guide/debug-files/index.html +++ b/zh-Hans/docs/next/user-guide/debug-files/index.html @@ -4,13 +4,13 @@ 应用列表 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/debug-files/review/index.html b/zh-Hans/docs/next/user-guide/debug-files/review/index.html index 6a7cfa992..e3e5207d6 100644 --- a/zh-Hans/docs/next/user-guide/debug-files/review/index.html +++ b/zh-Hans/docs/next/user-guide/debug-files/review/index.html @@ -4,13 +4,13 @@ 查看调试文件详情 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/debug-files/upload/index.html b/zh-Hans/docs/next/user-guide/debug-files/upload/index.html index b374b627f..82fd64515 100644 --- a/zh-Hans/docs/next/user-guide/debug-files/upload/index.html +++ b/zh-Hans/docs/next/user-guide/debug-files/upload/index.html @@ -4,13 +4,13 @@ 上传调试文件 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/index.html b/zh-Hans/docs/next/user-guide/index.html index 0e93d6602..292f6cc18 100644 --- a/zh-Hans/docs/next/user-guide/index.html +++ b/zh-Hans/docs/next/user-guide/index.html @@ -4,8 +4,8 @@ 用户手册 | Zealot - - + +
@@ -14,7 +14,7 @@ Chat on Telegram Maintainability License

开源自部署持续集成一切跟应用有关事情,接入任意 CI 系统一切自动化处理,企业多年实战经验,独立部署提供企业打包分发流程、上传应用全套流程方案 En Taro Adun! 🖖

功能预览功能预览

特性

  • 🌏 多平台应用托管: macOS、iOS、Android(apk/aab)、Windows、Linux 泛平台
  • 📱 测试设备一网打进: 自动同步 iOS 测试设备信息,允许一键注册新设备到苹果开发者
  • 🧑‍💻 丰富开发者套件: 提供 REST API、iOSAndroid SDK 以及 fastlane 自动化构建插件
  • 💥 剖析应用内部的秘密: 解读 iOS、Android 应用或 iOS 描述文件的元信息
  • 🚨 内置多种事件通知: 数据可自定义 Income WebHook 到任意通知服务
  • 🗄 多渠道分类管理: 自由划分不同场景不同产品形态的应用渠道管理
  • 🎳 多架构部署: amd86/arm64/armv7 及各种部署方案应有尽有
  • 🔑 第三方登录: 飞书、Gitlab、Google、LDAP 和 OIDC 一键授权
  • 🌑 黑暗模式: 黑夜白昼自由切换

在线演示

注意: 演示服务部署在免费资源存在不稳定情况且数据每日都会重新初始化,不对用户上传的应用承担任何法律风险,后果自负!

发布协议

MIT

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/qa/index.html b/zh-Hans/docs/next/user-guide/qa/index.html index e91127dea..0dc4daaec 100644 --- a/zh-Hans/docs/next/user-guide/qa/index.html +++ b/zh-Hans/docs/next/user-guide/qa/index.html @@ -4,15 +4,15 @@ 疑惑解答 | Zealot - - + +
版本:开发版本 🚧

疑惑解答

下面会列出来一些遇到的问题并汇总提供给大家。

为什么不能使用 HTTP 部署服务

鉴于 iOS 使用下载服务依赖开启 SSL/TLS 证书,建议使用经过授权的证书服务,如果服务不需要提供 iOS、macOS 的安装服务可以考虑使用 HTTPS 部署服务, 这里推荐使用免费 Let's Encrypt 提供 SSL 证书服务。

使用自签名的证书无法安装 iOS 应用

如果使用自签名证书需要每个 iOS 设备在下载安装应用前必须安装自签名证书才行,每个设备都需要进行安装,操作比较复杂在有免费 SSL 证书服务的情况下不到逼不得已不建议使用自签名证书。

使用负载均衡部署服务,下载总会从 https 变成 http

负载均衡在提供服务的时候会在最前端部署 https 服务,内部的分发实际上还是走的 http,解决办法在负载均衡上把转发的协议头从 http 改成 https,这样服务再转发的时候就会继承最前端的协议头(X-Forwarded-Proto)。

是否支持外部 redis、postgresql 链接

支持的,如果有公用的 redis、postgresql 服务器那就可以单独部署 zealot 服务,在 .env 配置或 Docker、K8s 的环境变量手动指定如下配置:

# Redis
REDIS_URL=redis://127.0.0.1:6379/0

# Postgresl
ZEALOT_POSTGRES_HOST=127.0.0.1
ZEALOT_POSTGRES_PORT=5432
ZEALOT_POSTGRES_USERNAME=postgres
ZEALOT_POSTGRES_PASSWORD=ze@l0t
ZEALOT_POSTGRES_DB_NAME=zealot

是否支持 Kubernetes(k8s)部署

服务是支持 K8S 的单机部署但不支持伸缩特性,具体原因是因为应用上传使用的是容器内的本地存储没有支持亚马逊 S3 或阿里云第三方云存储的支持。

是否提供类似 FIR、蒲公英服务的应用的分享页面

服务提供两种页面地址:

1 应用渠道详情页

https://YOUR_ZEALOT_URL/channels/SLUG

其实 YOUR_ZEALOT_URL 是 zealot 服务地址,SLUG 是你对应应用渠道的唯一地址。

2 上传的版本详情页

https://YOUR_ZEALOT_URL/channels/SLUG/releases/ID

其实 YOUR_ZEALOT_URL 是 zealot 服务地址,SLUG 是你对应应用渠道的唯一地址,ID 是上传的版本 ID,为空的时候会自动调整到最新版本,所以可以直接分享

https://YOUR_ZEALOT_URL/channels/SLUG/releases

服务运行一段时间 CPU 或内存资源暴涨不下,如何解决?

根据用户 Cleam反馈部署服务之后,托管的应用很少,上传频率不高,服务器硬件规格也完全达标的情况下还是会引发 CPU 或内存资源暴涨造成服务器卡死, 当前的情况属于还属于个人情况,目前情况未知,但可以通过限制 CPU 和内存来规避这个问题,编辑 docker-compose.yml 文件:

zealot:
<<: *defaults
+ deploy:
+ resources:
+ limits:
+ cpus: 2.0
+ memory: 2G
+ reservations:
+ cpus: 0.5
+ memory: 256M
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/toolkits/fetch-udid/index.html b/zh-Hans/docs/next/user-guide/toolkits/fetch-udid/index.html index ac6b6fefb..e9bcb2e85 100644 --- a/zh-Hans/docs/next/user-guide/toolkits/fetch-udid/index.html +++ b/zh-Hans/docs/next/user-guide/toolkits/fetch-udid/index.html @@ -4,13 +4,13 @@ 获取 iOS 设备 UDID | Zealot - - + +
版本:开发版本 🚧

获取 iOS 设备 UDID

Zealot 提供的获取 iOS 设备 UDID 除了市面上最最最基础的功能之外,内置了强大扩展功能:

  1. 通过 UDID 罗列可以安装的应用列表
  2. 开启苹果开发者功能允许把未注册测试设备添加到对于的开发者账号

安装描述文件

信息

此功能仅对 iOS 设备有效,如果是电脑打开会提示用手机扫描二维码打开。

无论使用什么用户登录模式(包括游客模式)都可以通过左侧菜单栏的 "获取设备 UDID" 安装描述文件后获取当前 iOS 设备的 UDID。

不要在意安装的描述文件展示"未签名",这个不影响安装,且此描述文件是一次性的获取之后会被系统销毁绝对不会存在安全隐患。

安装描述文件安装描述文件

描述文件安装后会返回浏览器打开一个新的页面展示设备 UDID,这个时候会出现如下两种情况:

未注册设备

未注册设备提供最基本的设备信息,包含 UDID、内部型号和序列化号之外,服务管理员如果添加了苹果开发者还会显示注册测试设备到对于的开发者账号中。

提示

注册到苹果开发者账号仅仅意味着设备更新到苹果开发者账号的 Devices 下面,对于 iOS 开发者还需要手动或脚本自动化把该测试设备添加到对应的 Ad-Hoc 证书,再进行安装并重新打包上传才允许该设备安装。

未注册设备未注册设备

已注册设备

已注册的测试设备就会展示可以安装的应用列表。服务管理员如果添加了苹果开发者还会显示注册测试设备到对于的开发者账号中。

已注册设备已注册设备
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/toolkits/teardown/index.html b/zh-Hans/docs/next/user-guide/toolkits/teardown/index.html index 75bba1f9b..55164c021 100644 --- a/zh-Hans/docs/next/user-guide/toolkits/teardown/index.html +++ b/zh-Hans/docs/next/user-guide/toolkits/teardown/index.html @@ -4,13 +4,13 @@ 解析应用分析内部元信息 (Metadata) | Zealot - - + +
版本:开发版本 🚧

解析应用分析内部元信息 (Metadata)

Android

获取 AndroidManifest.xml 元数据,解析 v1 至 v3 签名信息。

iOS

获取 Info.plist 元信息、Frameworks 和描述文件及证书信息。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/webhooks/dingtalk/index.html b/zh-Hans/docs/next/user-guide/webhooks/dingtalk/index.html index 249a689da..8f6860569 100644 --- a/zh-Hans/docs/next/user-guide/webhooks/dingtalk/index.html +++ b/zh-Hans/docs/next/user-guide/webhooks/dingtalk/index.html @@ -4,14 +4,14 @@ 钉钉 | Zealot - - + +
版本:开发版本 🚧

钉钉

钉钉的网络钩子结构体通常支持文本和 markdown 两种方式, 由于系统限制尽量使用关键词或 IP 地址白名单机制来接受消息。可通过如下配置实现:

Text 文本格式

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Markdown 格式

title 字段仅在对话列表展示,进入对话框的聊天内容则展示 text 字段

{
"msgtype": "markdown",
"markdown": {
"title": @title,
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/webhooks/discord/index.html b/zh-Hans/docs/next/user-guide/webhooks/discord/index.html index dcd9ddfb3..1ee767e0f 100644 --- a/zh-Hans/docs/next/user-guide/webhooks/discord/index.html +++ b/zh-Hans/docs/next/user-guide/webhooks/discord/index.html @@ -4,13 +4,13 @@ Discord | Zealot - - + +
版本:开发版本 🚧

Discord

Discord 支持 Slack 兼容的网络钩子因此其结构体通常支持文本和 block 富文本两种方式,可通过如下配置实现:

Text 文本格式

{
"text": "#{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}"
}

Block 富文本格式

一个简单的支持 markdown 的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
]
}

稍微好看点有些结构展示的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*平台:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*上传时间:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/webhooks/feishu/index.html b/zh-Hans/docs/next/user-guide/webhooks/feishu/index.html index 3e1ba761e..df581c3e3 100644 --- a/zh-Hans/docs/next/user-guide/webhooks/feishu/index.html +++ b/zh-Hans/docs/next/user-guide/webhooks/feishu/index.html @@ -4,14 +4,14 @@ 飞书 | Zealot - - + +
版本:开发版本 🚧

飞书

飞书的网络钩子结构体通常支持文本和卡片两种方式, 由于系统限制尽量使用关键词或 IP 地址白名单机制来接受消息。可通过如下配置实现:

Text 文本格式

{
"msg_type": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Interactive 卡片格式

通过这种格式可以实现支持 markdown 的部分语法:

{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"elements": [
{
"tag": "div",
"text": {
"content": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})",
"tag": "lark_md"
}
},
{
"actions": [{
"tag": "button",
"text": {
"content": "点击安装",
"tag": "lark_md"
},
"url": @install_url,
"type": "default",
"value": {}
}],
"tag": "action"
}
]
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/webhooks/index.html b/zh-Hans/docs/next/user-guide/webhooks/index.html index 3968365ec..39520beec 100644 --- a/zh-Hans/docs/next/user-guide/webhooks/index.html +++ b/zh-Hans/docs/next/user-guide/webhooks/index.html @@ -4,15 +4,15 @@ 网络钩子(WebHook) | Zealot - - + +
版本:开发版本 🚧

网络钩子(WebHook)

Zealot 为每个应用渠道都提供一个消息通知的网络钩子,网络钩子完全可自定义结构体可适用于绝大多数的通知服务, 比如企业微信、钉钉、Slack 等等。

默认结构体

默认结构体每个参数都已变量的方式提供它的值,每个变量都以 @ 开头,在创建网络钩子如果留空自定义结构体就会使用默认结构体, 如下全部提供的变量:

{
event: @event,
title: @title,
app_name: @name,
device_type: @device_type,
release_version: @release_version,
build_version: @build_version,
size: @file_size,
changelog: @changelog,
install_url: @install_url,
icon_url: @icon_url,
qrcode_url: @qrcode_url,
uploaded_at: @uploaded_at
}

输出的结果如下:

{
"event": "upload_events",
"title": "Zealot 样例 iOS 内测版上传了 1.0.0 版本",
"app_name": "Zealot 样例 iOS 内测版",
"device_type": "iOS",
"release_version": "1.0.0",
"build_version": "1",
"size": "30 MB",
"install_url": "https://zealot.test/api/apps/download/12354",
"icon_url": "https://zealot.test/api/apps/icon.png",
"qrcode_url": "https://zealot.test/api/apps/354/qrcode",
"uploaded_at": "2019-12-30 11:33:00",
"changelog": "- 新增了 A 功能\n- 修复了 B 问题\n- 发布 1.0.0 版本",
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/webhooks/slack/index.html b/zh-Hans/docs/next/user-guide/webhooks/slack/index.html index 8074c7e00..357e98f6c 100644 --- a/zh-Hans/docs/next/user-guide/webhooks/slack/index.html +++ b/zh-Hans/docs/next/user-guide/webhooks/slack/index.html @@ -4,13 +4,13 @@ Slack | Zealot - - + +
版本:开发版本 🚧

Slack

Slack 的网络钩子使用 Incoming Webhooks 其结构体通常支持文本和 block 富文本两种方式,可通过如下配置实现:

Text 文本格式

{
"text": "#{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}"
}

Block 富文本格式

一个简单的支持 markdown 的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
]
}

稍微好看点有些结构展示的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*平台:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*上传时间:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/next/user-guide/webhooks/wecom/index.html b/zh-Hans/docs/next/user-guide/webhooks/wecom/index.html index 94917c653..f358e26a1 100644 --- a/zh-Hans/docs/next/user-guide/webhooks/wecom/index.html +++ b/zh-Hans/docs/next/user-guide/webhooks/wecom/index.html @@ -4,13 +4,13 @@ 企业微信 | Zealot - - + +
版本:开发版本 🚧

企业微信

企业微信的网络钩子结构体通常支持文本和 markdown 两种方式,可通过如下配置实现:

Text 文本格式

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Markdown 格式

{
"msgtype": "markdown",
"markdown": {
"content": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/configuration/environment-variables/index.html b/zh-Hans/docs/self-hosted/configuration/environment-variables/index.html index 52b77ea99..4f4cf6bf1 100644 --- a/zh-Hans/docs/self-hosted/configuration/environment-variables/index.html +++ b/zh-Hans/docs/self-hosted/configuration/environment-variables/index.html @@ -4,13 +4,13 @@ 环境变量 | Zealot - - + +
版本:5.0.0

环境变量

.env 文件

Zealot 可通过如下环境变量或使用项目根目录的 .env 文件配置系统参数,通过上述方式更改后需要重启服务才可生效。

HTTPS 证书

因苹果的硬性要求线上部署和下载服务强制 HTTPS,因此再部署的时候下载应用会强制走 HTTPS 协议。

如果部署是单台机器的独立服务,建议开启 Let's Encrypt 免费 SSL 证书,只需要设置

ZEALOT_CERT_EMAIL=zealot@example.com

和下面自签名证书文件名二选一,不能同时设置

如果部署的机器只能使用自签名证书,则需要配置,但需要注意的是 iOS 的下载需要在 iOS 设备授权自签名的证书后才允许下载安装。(不推荐)

ZEALOT_CERT=zealot.test.pem
ZEALOT_CERT_KEY=zealot.test-key.pem

和 Let's Encrypt 注册电子邮箱名二选一,不能同时设置

配置域名 (URL)

必须配置否则下载应用和一些静态资源会无法正确访问到

# 域名配置,无需配置 http:// 或 https://
ZEALOT_DOMAIN=zealot.com

配置数据库和缓存

假如你有可以复用的 postgresql 和 redis 服务也可以自定义配置使用,而无需使用 docker-compose 默认配置的服务。

Postgresql

ZEALOT_POSTGRES_HOST=127.0.0.1
ZEALOT_POSTGRES_PORT=5432
ZEALOT_POSTGRES_USERNAME=postgres
ZEALOT_POSTGRES_PASSWORD=ze@l0t
ZEALOT_POSTGRES_DB_NAME=zealot

Redis

兼容大多数云服务部署采用的 URL 连接方式

REDIS_URL=redis://user:pass@127.0.0.1:6379/0

# 基于 SSL 的 Redis

配置网站默认语言

语言包
zh-CN简体中文 (默认)
en英文
DEFAULT_LOCALE=en

配置网站默认外观

外观
light浅色 (默认)
dark深色(黑暗模式)
auto随系统自动
ZEALOT_APPEARANCE=dark

配置管理员账户和密码

默认不配置如下也会生成下面的账户和密码作为管理员权限的账户,建议配置后重新修改密码。

ZEALOT_ADMIN_EMAIL=admin@zealot.com
ZEALOT_ADMIN_PASSWORD=ze@l0t

开启用户注册

关闭注册之后,管理员可以通过管理面板的用户管理手动添加用户。

# 开启注册
ZEALOT_REGISTER_ENABLED=true

# 关闭注册
ZEALOT_REGISTER_ENABLED=false

开启游客模式

开启游客模式后允许应用的查看、下载和安装,建议公司内部对权限依赖不高的状况使用,具体权限对比可以看这里查看详情

# 开启游客模式
ZEALOT_GUEST_MODE=true

# 关闭游客模式
ZEALOT_GUEST_MODE=false

邮件服务

目前仅支持 smtp 的方式配置邮件通知服务,邮件通知主要影响用户注册、发送激活邮件、更改密码服务,如果不开启也不影响使用,账户激活的链接也会在用户管理那边找到。

# 发送邮件配置
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=you@gmail.com
SMTP_PASSWORD=yourpassword
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS_AUTO=true

# 邮件默认收发人配置
ACTION_MAILER_DEFAULT_FROM=you@gmail.com
ACTION_MAILER_DEFAULT_TO=you@gmail.com
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/configuration/schedule-jobs/index.html b/zh-Hans/docs/self-hosted/configuration/schedule-jobs/index.html index 37e8be47f..315ffc875 100644 --- a/zh-Hans/docs/self-hosted/configuration/schedule-jobs/index.html +++ b/zh-Hans/docs/self-hosted/configuration/schedule-jobs/index.html @@ -4,14 +4,14 @@ 定时任务 | Zealot - - + +
版本:5.0.0

定时任务

清理老版本

按照项目维护者长期的使用观察一个可靠的清理老版本的逻辑是时刻关注当前主版本的所有上传版本, 之前上传的历史版本只需要保留最后一个上传构建版本基本上就满足绝大数情况,举个例子:

额外补充:当前逻辑相对省事但缺乏灵活度,其实有想过支持多种处理逻辑,具体参见 https://github.com/tryzealot/zealot/issues/376

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 9
- 8
...
- 1.0
- 5
- 4
- 3
...

任务执行时会清理掉 1.0.1 版本包含 9 以下和 1.0 版本包含 4 以下所有版本,最终保留的版本文件是:

- 2.0
- 3
- 2
- 1
- 1.0.1
- 10
- 1.0
- 5

如果磁盘空间有限,可以通过设置环境变量 ZEALOT_KEEP_UPLOADS=false 来开启定时任务的清理。

信息

ZEALOT_KEEP_UPLOADS 模式是 true 开启状态 。

备份

当你通过管理员面板创建任何的备份计划都会加入到定时任务队列中。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/configuration/third-party-authentication/index.html b/zh-Hans/docs/self-hosted/configuration/third-party-authentication/index.html index 74e37393f..2b5ae5c84 100644 --- a/zh-Hans/docs/self-hosted/configuration/third-party-authentication/index.html +++ b/zh-Hans/docs/self-hosted/configuration/third-party-authentication/index.html @@ -4,13 +4,13 @@ 第三方登录 | Zealot - - + +
版本:5.0.0

第三方登录

Zealot 支持使用已经支持的第三方服务授权登录,当前可以通过如下的环境变量或者在管理员面板的设置页面配置。

第三方服务标识符
飞书feishu
Gitlabgitlab
Googlegoogle_oauth2
LDAPldap
OpenID Connectopenid_connect

如果以上服务需要设置回调地址的话请统一设置为:

http://zealot.com/users/auth/:provider/callback

其中 :provider 是上面支持第三方服务的标识符,例如开启飞书那就把 :provider 替换成 feishu

飞书

  1. 去注册一个飞书账号并下载手机 App
  2. 注册飞书开发平台并创建企业自建应用获得 app_id, app_secret
  3. 填写 callback url 为 http://zealot.com/users/auth/feishu/callback (域名根据实际情况修改)
  4. 添加用户字段信息授权:email 地址 (可选)
  5. 至少勾选一个应用方式并创建新版本后发布
FEISHU_ENABLED=true
FEISHU_APP_ID=
FEISHU_APP_SECRET=

Gitlab

  1. 注册 Gitlab 官方账户或自部署 Gitlab 服务
  2. 在用户设置(Preferences) -> 应用(Applications) 创建一个新应用
  3. 回调地址(Redirect URI) 配置为 http://zealot.com/users/auth/gitlab/callback (域名根据实际情况修改)
  4. 添加用户字段信息授权(scope):read_user,默认 zealot 仅用此授权,如果你的授权范围是 api 也没问题
GITLAB_ENABLED=true
GITLAB_SITE=https://gitlab.com/api/v4
GITLAB_SCOPE=read_user
GITLAB_APP_ID=
GITLAB_SECRET=

Google

  1. 注册 Google 账号
  2. 开通 Google Cloud Platform 服务
  3. 选择或创建 Project 并前往 Credentials
  4. 创建 OAuth Client ID 选择 Web Application 后添加回调地址(Authorized redirect URI) 配置为 http://zealot.com/users/auth/google_oauth2/callback (域名根据实际情况修改)
  5. 创建成功后获得 Client ID 和 Client Secret
GOOGLE_OAUTH_ENABLED=true
GOOGLE_CLIENT_ID=
GOOGLE_SECRET=

LDAP

  1. 自部署或使用现有的 LDAP 服务
  2. 自配置或查找如下参数的值
LDAP_ENABLED=true
LDAP_HOST=10.0.0.1
LDAP_PORT=389
LDAP_METHOD=plain
LDAP_BIND_DN="cn=Manager,dc=example,dc=com"
LDAP_PASSWORD=password
LDAP_BASE="ou=People,dc=example,dc=com"
LDAP_UID=uid

OpenID Connect

支持开启自动发现模式和手动设置两种方式

自动发现

开启自动发现模式会自动获取 [OIDC_ISSUER_URL]/.well-known/openid-configuration 配置。

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_DISCOVERY=true

手动配置

OIDC_ENABLED=true
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_ISSUER_URL=https://oidc.example.com
OIDC_AUTH_URI=/authorize
OIDC_TOKEN_URI=/token
OIDC_USERINFO_URI=/userinfo

以上 OIDC_AUTH_URIOIDC_TOKEN_URIOIDC_USERINFO_URI 未设置时会使用如上的默认路径。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/architecture/index.html b/zh-Hans/docs/self-hosted/deployment/architecture/index.html index a844bf3ae..4f523024c 100644 --- a/zh-Hans/docs/self-hosted/deployment/architecture/index.html +++ b/zh-Hans/docs/self-hosted/deployment/architecture/index.html @@ -4,13 +4,13 @@ Zealot 服务架构 | Zealot - - + +
版本:5.0.0

Zealot 服务架构

运行 Zealot 依赖如下服务才能保证正常运行

ArchitectureArchitecture
  • 使用 amd86/arm64/armv7 运行的主流 Linux 系统
  • Ruby on Rails 提供核心网页和 API 服务
  • Sidekiq 提供后台的异步任务管理服务
  • PostgreSQL 数据库服务
  • Redis 缓存服务
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/docker/index.html b/zh-Hans/docs/self-hosted/deployment/docker/index.html index 38aadb392..e8715c772 100644 --- a/zh-Hans/docs/self-hosted/deployment/docker/index.html +++ b/zh-Hans/docs/self-hosted/deployment/docker/index.html @@ -4,8 +4,8 @@ Docker 部署 Zealot 指南 | Zealot - - + +
@@ -15,7 +15,7 @@ 首先需要克隆官方 Zealot 部署工具,进入 zealot-docker 目录后需要打开 example.env 文件配置必要的参数后可直接执行 ./deploy.sh 脚本:

提示

默认会生成管理员账号:admin@zealot.com 和密码 ze@l0t 和一些演示应用。

$ git clone https://github.com/tryzealot/zealot-docker.git
$ cd zealot-docker
$ ./deploy

一键部署生成脚本默认内置了下面三种模板配置 SSL 证书:

配置 SSL 证书

Let's Encrypt

信息

免费且自动续签 SSL 证书,新手使用的最佳选择

第一步:执行部署脚本:

$ ./deploy

第二步:检查和配置 .env 文件,主要是 ZEALOT_DOMAINZEALOT_CERT_EMAIL 是否填写正确, 其他部分可根据实际情况做对应的配置调整

第三步:运行 Zealot 服务:

$ docker-compose up -d

反向代理托管 SSL 证书

配置说明迁移值反向代理指南,里面包含了更多的服务配置。

自签名 SSL 证书

警告

在条件满足其他情况下绝对不推荐此方案,iOS 设备对使用自签名证书的任何 Web 服务必须在其设备上手动安装自签名证书后才能正常安装应用

如果域名是非注册域名则需要绑 host 才可以访问,通常是修改系统的 /etc/hosts 文件。

$ sudo vim /etc/hosts

127.0.0.1 zealot.test
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/docker/step-by-step/index.html b/zh-Hans/docs/self-hosted/deployment/docker/step-by-step/index.html index cd902d931..893b84742 100644 --- a/zh-Hans/docs/self-hosted/deployment/docker/step-by-step/index.html +++ b/zh-Hans/docs/self-hosted/deployment/docker/step-by-step/index.html @@ -4,13 +4,13 @@ Docker 手把手部署文档 | Zealot - - + +
版本:5.0.0

Docker 手把手部署文档

这是一篇手把手来指导使用 Docker 部署文档,同时也是解释Docker 部署 Zealot 指南的分解

版本列表

  • 稳定版本 - 5.0.0/latest - ghcr.io/tryzealot/zealot:latest
  • 测试版本 - develop - ghcr.io/tryzealot/zealot:nightly - 基于 develop 分支每次提交构建的版本

镜像仓库

Docker hub 取消了免费组织计划,不再同步更新推送。

Github Container Registry: https://github.com/tryzealot/zealot/pkgs/container/zealot (推荐)

步骤解析

安装 Docker

按照官方教程安装

安装 Docker-Compose

按照官方教程安装

生成 .env 配置文件

从预先 config.env 配置文件复制一份部署使用的配置文件

配置域名

二次校验如果没有配置会再提醒

配置证书

部署脚本提供三种方式,就算使用最后一种生成的也是 https 的协议头

  • 使用 Let's Encrypt 证书
  • 使用自签名证书
  • 纯 Zealot 服务(需反代网关或负载均衡生成 SSL 证书)

生成 docker-compose.yml

配置文件会生成至少四个服务(service),使用上面前两个证书方式会额外增加一个服务:

  • zealot-zealot: 核心 Web 和 API 服务
  • zealot-worker: 核心异步任务服务
  • zealot-postgres: 数据库服务
  • zealot-redis: 缓存服务
  • zealot-web: 提供(服务和证书)反代的网关服务,非必需

创建持久化存储的 docker volumes

存储持久化数据

  • zealot-data: 静态资源,JS、CSS、图片以及上传的应用、应用图标和调试文件
  • zealot-postgres: 数据库数据
  • zealot-redis: 缓存数据

拉取(更新)镜像

第一次使用会自动从 Docker hub 下载镜像,后续是更新操作,通常只会更新 zealot 镜像。其他几个依赖服务镜像都是固定版本号

docker-compose pull

设置数据库数据

第一次使用会初始化数据库、加载范例应用数据和设置管理员账号,后续这是因 zealot 更新需要的操作

docker-compose run --rm zealot run_upgrade

运行 docker-compose

为了安全期间和用户的自定义操作需要手动执行来运行服务:

docker-compose up -d

高级配置

自定义 volume 路径

自定义路径有两种方法: (假设自定义的路径是 /data/zealot)

1. 创建 volume 自定义路径

docker volume create --name zealot-data \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/zealot-data

docker volume create --name zealot-redis \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/redis

docker volume create --name zealot-postgres \
--opt type=none \
--opt o=bind \
--opt device=/data/zealot/postgres

2. 修改 docker-compose 的 volumes 部分

打开 docker-compose.yml 拉到最底部找到 volumes: 开头的部分,修改为如下内容:

volumes:
zealot-data:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/data
zealot-redis:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/redis

zealot-postgres:
driver: local
driver_opts:
o: bind
type: none
device: /data/zealot/postgres
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/fly/index.html b/zh-Hans/docs/self-hosted/deployment/fly/index.html index 5355a99de..a49480455 100644 --- a/zh-Hans/docs/self-hosted/deployment/fly/index.html +++ b/zh-Hans/docs/self-hosted/deployment/fly/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Fly 指南 | Zealot - - + +
版本:5.0.0

部署 Zealot 到 Fly 指南

Zealot 支持 fly.io 官方的应用配置格式(fly.toml)。

部署步骤

  • 预先安装 flyctl 命令行工具。
  • 复制下面配置文件 保存为 fly.toml 文件放在项目根目录,根据创建的 fly app 项目修改 app 的值。
  • 运行 flyctl deploy 开始构建和部署工作。
  • 运行 fly scale vm shared-cpu-1x --memory 512 来达到 Zealot 可允许的内存环境,默认免费的 256M 内存实际只有 205M,Zealot 运行起来闲置状态会 190M 到会提示 OOM 内存溢出。

配置文件

app = "[app-name:changeme]"
kill_signal = "SIGINT"
kill_timeout = 120
processes = []

[build]
image = "ghcr.io/tryzealot/zealot:nightly"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 80
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

[[statics]]
guest_path = "/app/public"
url_prefix = "/"
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/kubernetes/index.html b/zh-Hans/docs/self-hosted/deployment/kubernetes/index.html index 54938ef5d..f947bda6c 100644 --- a/zh-Hans/docs/self-hosted/deployment/kubernetes/index.html +++ b/zh-Hans/docs/self-hosted/deployment/kubernetes/index.html @@ -4,13 +4,13 @@ Kubernetes 部署 Zealot 指南 | Zealot - - + +
版本:5.0.0

Kubernetes 部署 Zealot 指南

Zealot 原生支持使用 Kubernetes 部署,不过一直还没有梳理 .yaml 配置文件用于安装。

部署清单

  • 生成 Secret/Configmap 存储环境变量。
  • 生成 PersistentVolumeClaim 用于 public/uploads, public/bakcup 的持久化存储。
  • 生成 Deployment 来管理 zealot Pod。
  • 生成 Ingress 配置 Zealot 路由访问。

详细步骤

10-zealot-namespace.yml

创建 Zealot 命名空间。

10-zealot-namespace.yml
api Version: v1
kind: Namespace
metadata:
name: zealot

20-zealot-secrets.yml

配置 Zealot 涉及隐私数据的环境变量,值是需要经过 base64 加密。

20-zealot-secrets.yml
apiVersion: v1
kind: Secret
metadata:
namespace: zealot
name: zealot-secrets
data:
ZEALOT_ADMIN_EMAIL: V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk=
ZEALOT_ADMIN_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_HOST: cG9zdGdyZXM=
ZEALOT_POSTGRES_PORT: NTQzMg==
ZEALOT_POSTGRES_USERNAME: emVhbG90
ZEALOT_POSTGRES_PASSWORD: emVAbDB0
ZEALOT_POSTGRES_DB_NAME: emVhbG90
REDIS_URL: cmVkaXM6Ly9yZWRpczo2Mzc5LzE=

# echo -n 'secret-key' | sha256sum | awk '{ printf $1 }' | base64
SECRET_TOKEN: ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==

21-zealot-configmap.yml

配置 Zealot 正常数据的环境变量

21-zealot-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: zealot
name: zealot-config
data:
ZEALOT_DOMAIN: zealot.icyleaf.dev
DEFAULT_LOCALE: en
ZEALOT_REGISTER_ENABLED: "true"

30-zealot-storage.yml

为上传文件(应用包和调试文件)以及备份文件创建持久化存储卷。你可能需要根据实际情况修改存储大小。

30-zealot-storage.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-uploads
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zealot-backup
namespace: zealot
labels:
app: zealot
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

40-zealot-deployment.yml

创建 Zealot 部署,根据实际情况修改 replicas 扩容值和 image 镜像 tag。

40-zealot-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zealot
namespace: zealot
spec:
restartPolicy: Always
replicas: 1
selector:
matchLabels:
app: zealot
template:
metadata:
labels:
app: zealot
spec:
containers:
- name: zealot
image: ghcr.io/tryzealot/zealot:nightly
# imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
envFrom:
- configMapRef:
name: zealot-env
- secretRef:
name: zealot-secrets
volumeMounts:
- mountPath: /app/public/uploads
name: uploads
- mountPath: /app/public/backup
name: backup
volumes:
- name: uploads
persistentVolumeClaim:
claimName: zealot-uploads
- name: backup
persistentVolumeClaim:
claimName: zealot-backup

50-zealot-service.yml

创建 zealot 服务。

50-zealot-service.yml
apiVersion: v1
kind: Service
metadata:
name: zealot
namespace: zealot
labels:
app: zealot
spec:
selector:
app: zealot
ports:
- port: 80
targetPort: http
name: http
protocol: TCP

60-zealot-ingress.yml

为 Zealot 服务设置 ingress。

50-zealot-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zealot
namespace: zealot
annotations:
#cert-manager.io/cluster-issuer: letsencrypt-prod
#kubernetes.io/ingress.class: nginx
spec:
rules:
- host: zealot.icyleaf.dev
http:
paths:
- web:
service:
name: zealot
port:
number: 80
path: /
pathType: Prefix
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/nomad/index.html b/zh-Hans/docs/self-hosted/deployment/nomad/index.html index e2c3e5947..c97b60d2f 100644 --- a/zh-Hans/docs/self-hosted/deployment/nomad/index.html +++ b/zh-Hans/docs/self-hosted/deployment/nomad/index.html @@ -4,15 +4,15 @@ Nomad 部署 Zealot 指南 | Zealot - - + +
版本:5.0.0

Nomad 部署 Zealot 指南

Zealot 原生支持使用 Nomad 部署。这得益于 Nomad 有很不错的插件机制,官方默认支持 Docker 插件。 在配置上接近于 docker compose 的配置,只不过它的配置语言是 HCL 而不是 YAML。

基本部署

使用 Nomad 部署

先按照官方教程依次安装好 nomad,这个二进制文件是包含了客户端和服务端。 不了解的建议跟着官方教程演练一遍。

下面文件将会创建 postgres、redis 和 zealot 三个服务,对于已有的外部数据库和缓存服务,可以删除掉对应的 port, servicetask 后编辑 zealot task 里面的模板变量。

zealot.nomad
job "zealot" {
type = "service"
datacenters = "dc1" // 根据实际情况修改

update {
max_parallel = 1
min_healthy_time = "30s"
auto_revert = true
}

group "zealot" {
network {
port "zealot" {
to = 80
}

port "postgres" {
to = 5678
}

port "redis" {
to = 6379
}
}

service {
name = "zealot"
port = "zealot"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.http.routers.zealot.entrypoints=web, websecure",
// "traefik.http.routers.zealot.rule=Host(`zealot.example.com`)",
// ]
}

service {
name = "postgres"
port = "postgres"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.tcp.routers.postgres.rule=HostSNI(`*`)",
// "traefik.tcp.routers.postgres.entrypoints=postgres",
// ]
}

service {
name = "redis"
port = "redis"
provider = "nomad"

// 注册服务到 traefik
// tags = [
// "traefik.enable=true",
// "traefik.tcp.routers.redis.rule=HostSNI(`*`)",
// "traefik.tcp.routers.redis.entrypoints=redis",
// ]
}

task "zealot" {
driver = "docker"

config {
image = "ghcr.io/tryzealot/zealot:latest"
ports = ["zealot"]

// 根据实际情况修改,或采用 CSI 协议的外部存储
volumes = [
"/tmp/zealot/uploads:/app/public/uploads",
"/tmp/zealot/backups:/app/public/backups",
]

// 添加服务到 homepage dashboard 面板
// labels = {
// "homepage.group" = "Dev"
// "homepage.name" = "Zealot"
// "homepage.icon" = "mdi-progress-download"
// "homepage.href" = "https://zealot.example.com"
// "homepage.description" = "Beta App Distribution"
// }
}

// Zealot example config
// https://github.com/tryzealot/zealot-docker/blob/master/config.env
template {
destination = "local/config.env"
change_mode = "restart"
env = true
data = <<-EOF
ZEALOT_APPEARANCE = dark
ZEALOT_DOMAIN = zealot.example.com

ZEALOT_GUEST_MODE = false
ZEALOT_REGISTER_ENABLED = true
EOF
}

template {
destination = "secrets/secret.env"
change_mode = "restart"
env = true
data = <<-EOF
# admin account
ZEALOT_ADMIN_EMAIL = admin@zealot.com
ZEALOT_ADMIN_PASSWORD = ze@l0t

# datbase
ZEALOT_POSTGRES_HOST = {{ env "NOMAD_IP_postgres" }}
ZEALOT_POSTGRES_PORT = {{ env "NOMAD_PORT_postgres" }}
ZEALOT_POSTGRES_USERNAME = "zealot"
ZEALOT_POSTGRES_PASSWORD = "zealot"
ZEALOT_POSTGRES_DB_NAME = "zealot"

# cache
REDIS_URL = redis://{{ env "NOMAD_ARRR_redis" }}/0

# secret token
SECRET_TOKEN = $${ sha256(uuidv5("url", "zealot.ews.im")) }
EOF
}

resources {
cpu = 500
memory = 500
memory_max = 1000
}
}

task "postgres" {
driver = "docker"

lifecycle {
hook = "prestart"
sidecar = true
}

config {
image = "postgres:15-alpine"
ports = ["postgres"]
volumes = [
"secrets/init-role.sql:/init-role.sql",
"secrets/init-db.sql:/init-db.sql"
]
}

env {
POSTGRES_INITDB_ARGS = "--data-checksums"
POSTGRES_USER = "zealot"
POSTGRES_PASSWORD = "zealot"
POSTGRES_DB = "zealot"
}

resources{
cpu = 512
memory = 200
memory_max = 512
}
}

task "redis" {
driver = "docker"

lifecycle {
hook = "prestart"
sidecar = true
}

config {
image = "redis:7-alpine"
ports = ["redis"]
}

resources {
cpu = 200
memory = 200
}
}
}
}

确认无误后执行 nomad job run zealot.nomad

使用 Terraform 部署

Terraform 和 Nomad 是同家公司的产品。

先按照官方教程依次安装好 terraformnomad 插件后,复用上面的 zealot.nomad 文件再额外加一个 main.tf 文件即可。

resource "nomad_job" "jobs" {
jobspec = file("${path.module}/zealot.nomad")
}

执行 terraform plan 确认无误后在通过 terraform apply 应用。

外部文件存储

Nomad 支持多集群管理,很多情况下服务部署的存储不可能直接挂载到对应的文件系统中,更多的是放在一个共享文件存储协议上面,比如 SMB、NFS、S3 等等。

CSI 协议

Nomad 支持 CSI 协议,理论上实现 CSI 接口的服务都可以满足。

截止 Nomad 1.5 版本为止,Nomad 可以使用 CSI 卷,但它不能自身控制创建、销毁或管理。卷必须在外部创建,然后向 Nomad 注册后才能使用。

插件支持协议兼容情况terraform nomad 资源
kubernetes-csi-driver-smbsmb未测试未测试
kubernetes-csi-driver-nfsnfs支持nomad_csi_volume_registration
kubernetes-csi-driver-iscsiiscsi未测试未测试
democraticcsi/democratic-csismb/nfs/iscsi支持nomad_csi_volume
rocketduck/csi-plugin-nfsnfs支持nomad_csi_volume
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/railway/index.html b/zh-Hans/docs/self-hosted/deployment/railway/index.html index 5402a1c95..d281fc5b8 100644 --- a/zh-Hans/docs/self-hosted/deployment/railway/index.html +++ b/zh-Hans/docs/self-hosted/deployment/railway/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Railway 指南 | Zealot - - + +
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/render/index.html b/zh-Hans/docs/self-hosted/deployment/render/index.html index 75dadc61c..0018ba9b0 100644 --- a/zh-Hans/docs/self-hosted/deployment/render/index.html +++ b/zh-Hans/docs/self-hosted/deployment/render/index.html @@ -4,13 +4,13 @@ 部署 Zealot 到 Render 指南 | Zealot - - + +
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/requirements/index.html b/zh-Hans/docs/self-hosted/deployment/requirements/index.html index f2eaead4f..df40e9822 100644 --- a/zh-Hans/docs/self-hosted/deployment/requirements/index.html +++ b/zh-Hans/docs/self-hosted/deployment/requirements/index.html @@ -4,14 +4,14 @@ Zealot 自部署依赖 | Zealot - - + +
版本:5.0.0

Zealot 自部署依赖

如果想要顺利并发挥 Zealot 最佳状态运行,本页面提供了安装所需的各自软硬环境的依赖安装信息。

操作系统

Zealot 可以安装在绝大多数 Linux 操作系统,但目前并没有测试和统计具体有哪些。

硬件依赖

系统架构

支持使用 amd86/arm64/armv7 运行的主流 Linux 系统,比如 Debian,Ubuntu、CentOS、Arch Linux、Armbian 等。

CPU

CPU 数量取决于 Zealot 使用的资源和任务量,工作量受(包括但不仅限于)以下因素影响:有多少应用和调试文件被上传和解析;有多少应用被下载;有多少网络钩子被触发;苹果开发者同步测试设备的频率以及备份计划作业的数量和频率。

下面是最小硬件条件推荐的 CPU 硬件规格,请不要低于这个标准否则服务运行会收到一定的影响造成服务无法正常工作:

  • 1 核必须的最小核心数。

内存

内存大小取决于 Zealot 使用的资源和任务量,工作量受(包括但不仅限于)以下因素影响:有多少应用和调试文件被上传和解析;有多少应用被下载;有多少网络钩子被触发;苹果开发者同步测试设备的频率以及备份计划作业的数量和频率。

下面是最小硬件条件推荐的内存大小规格,请不要低于这个标准否则服务运行会收到一定的影响造成服务无法正常工作:

  • 512MB必须的最少的内存大小。

存储

存储容量的大小取决于有多少应用和调试文件版本上传,当然也包含生成的备份文件。

软件依赖

Ruby 版本

  • Ruby 3.0+

必须使用标准的 MRI 实现的 Ruby 版本。Zealot 内部依赖的 Gems 需要原生扩展。

Node.js 版本

Zealot 使用 esbuildsass 编译前端资源。

推荐使用 Node 14.x 以上版本。

可以在终端应用通过运行 node -v 命令查看 node 的版本。如果运行的版本低于 v8.0 你需要更新到推荐的版本。你可在官方网站查看更多安装或升级教程。

数据库

数据库仅支持 PostgreSQL 且目前没有计划支持更多其他数据库。

PostgreSQL 依赖

PostgreSQL 预留至少 5-10 GB 空间,更多的空间意味着可以存储更多的数据。

我们强烈推荐使用且保持 PostgreSQL 永远是最新的稳定版本作为开发和测试使用。

Redis

Zealot 后台异步任务和定时任务依赖于 Redis 做数据的存储和统计使用,存储空间依赖很小,50MB 足矣。

Redis 最低支持版本 6.2+,推荐 7.x 版本

Sidekiq

Sidekiq 是 Zealot 后台异步任务和定时任务使用的服务,它支持多线程操作且运行时依托于 Rails (也就是 Zealot 使用的框架)。 它可能会随着时间的推移而增长内存的占用,如果 Zealot 运行的时间很长造成的服务不稳定请适当调整内存的大小,建议是 1GB+。

已支持 Web 浏览器

提示

Zealot 运行部分页面依赖于 Javascript,请不要设置浏览器禁止它。

Zealot 支持如下 Web 浏览器:

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/deployment/source-code/index.html b/zh-Hans/docs/self-hosted/deployment/source-code/index.html index 27a345daf..52727431a 100644 --- a/zh-Hans/docs/self-hosted/deployment/source-code/index.html +++ b/zh-Hans/docs/self-hosted/deployment/source-code/index.html @@ -4,13 +4,13 @@ 源码部署 Zealot 指南 (遗弃) | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/index.html b/zh-Hans/docs/self-hosted/index.html index 7f8bb01b0..fbad4240f 100644 --- a/zh-Hans/docs/self-hosted/index.html +++ b/zh-Hans/docs/self-hosted/index.html @@ -4,13 +4,13 @@ 自建服务指南 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/reverse-proxies/index.html b/zh-Hans/docs/self-hosted/reverse-proxies/index.html index 3c52c86f1..b29f72a6e 100644 --- a/zh-Hans/docs/self-hosted/reverse-proxies/index.html +++ b/zh-Hans/docs/self-hosted/reverse-proxies/index.html @@ -4,13 +4,13 @@ 反向代理 | Zealot - - + +
版本:5.0.0

反向代理

方便 SSL 证书的统一管理和分发、服务的扩容及接入现成的网关服务,文档提供几种给网关配置反向代理服务的配置。

ArchitectureArchitecture

准备工作

配置反向代理需要准备好如下数据:

名称范例值备注
域名zealot.icyleaf.dev
反向代理 IP 地址172.16.56.1
Zealot IP 地址172.16.56.100反向代理服务可访问
同一台服务可改为 127.0.0.1
Zealot 外部映射端口号8901反向代理服务可访问
Zealot 内部端口号80无需修改
Let's Encrypt 邮箱your-email@example.com

Traefik

Traefik 是一款开源的反向代理与负载均衡工具,它自身提供多种 Providers 可以实现接入反向代理并配置 SSL 的方式。

配置解释

无论使用那种 Provider 核心的配置项是相同的,构成反向代理服务配置主要有三部分组成:发现端口号、路由规则(包含访问端口号、域名绑定和SSL)

Traefik 服务

entryPoints:
web:
address: ":80"

websecure:
address: ":443"

certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web

Docker

首先需要开启 Docker provider 后在修改 zealot 的 Docker Compose 配置:

docker-compose.yml
version: '3'
services:
zealot:
<<: *defaults
labels:
- "traefik.enable=true"
- "traefik.http.services.zealot.loadbalancer.server.port=80"
- "traefik.http.routers.zealot.service=zealot"
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)"
- "traefik.http.routers.zealot.tls=true"
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt"
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev"
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
# 由 Treafik 接管无需在对外暴露端口号
# ports:
# - "8901:80"
network:
# 根据 traefik 服务的 network 按需调整
- traefik-services

networks:
# 根据 traefik 服务的 network 按需调整
traefik-services:
external: true

Docker 部署的局限于 Traefik 和 Zealot 服务通常在同一个机器的同一个 OS 系统中,跨机器就没法实现通讯,对于跨机器就需要参考下面两种配置方案:

Consul

首先需要开启 Consul providerConsul Catalog provider,我们只需要利用它的 Key-Value 存储:

consul kv put traefik/http/services/zealot/loadbalancer/server/port 5
consul kv put traefik/http/routers/zealot/service zealot
consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)'
consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt
consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev
consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev

Nomad

首先需要开启 Nomad provider 且 Nomad 版本要大于等于 1.3 才可以哟:

zealot.nomad
job "zealot" {
datacenters = ["dc1"]
type = "service"

group "zealot" {
count = 1

network {
port "http"{
static = 80
}
}

service {
name = "zealot-http"
provider = "nomad"
port = "http"
}

task "server" {
driver = "docker"
config {
image = "ghcr.io/tryzealot/zealot:nightly"
ports = ["http"]
args = [
- "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)",
- "traefik.http.routers.zealot.tls=true",
- "traefik.http.routers.zealot.tls.certresolver=letsencrypt",
- "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev",
- "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev"
]
}
}
}
}

Caddy 2 配置

Caddyfile
:443

log

# 使用 Let's Encrypt 服务
tls your-email@example.com

reverse_proxy 172.16.56.100:8901

配置只需配置 tlsproxy 后面 IP 地址和端口部分即可。

Nginx

如下是通用配置,如果不可用欢迎提问题

conf.d/zealot.conf
upstream zealot {
zone upstreams 64K;
server 172.16.56.100:8901;
keepalive 32;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name zealot.icyleaf.dev;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2; # 可选:http2 可能需要安装额外扩展,不需要可移除
listen [::]:443 ssl http2; # 可选:http2 可能需要安装额外扩展,不需要可移除
server_name zealot.icyleaf.dev;

ssl_certificate /etc/certs/zealot-cert.pem;
ssl_certificate_key /etc/certs/zealot.pem;

# Optional
# ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
# ssl_session_timeout 5m;
# ssl_session_cache shared:SSL:1m;
# ssl_prefer_server_ciphers on;

location / {
proxy_pass http://zealot;
proxy_redirect off;

proxy_pass_header Authorization;
proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Ssl on; # 可选
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

client_max_body_size 0;
proxy_read_timeout 36000s;
}
}

Nginx 还需要在 http 中配置最大上传文件上传大小,普通应用建议是在 200MB 左右,如果是游戏可根据实际文件大小再多出 50% 打出富余。

nginx.conf
http {
[...]

client_max_body_size 200M;
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/self-hosted/storage/index.html b/zh-Hans/docs/self-hosted/storage/index.html index 4aa711ccc..e68b28152 100644 --- a/zh-Hans/docs/self-hosted/storage/index.html +++ b/zh-Hans/docs/self-hosted/storage/index.html @@ -4,13 +4,13 @@ 数据存储 | Zealot - - + +
版本:5.0.0

数据存储

这里罗列了 Zealot 服务所需的所有数据存储,在还没有提供更好的备份管理工具之前,方便有能力的用户能够手动备份和恢复数据使用。

Postgres

用于存储和管理一切和 Zealot 有关数据,这个就不用多说了。

Redis

目前只有 sidekiq 异步任务服务在使用它做一些任务状态、统计数据的存储。

文件存储

Zealot 服务除了依赖 postgresql、redis 之外还有一部分的磁盘存储是上传的应用、调试文件且仅提供存储在文件系统之中,目录位于 public/uploads

  • apps 上传应用的目录
  • debugs_files 上传调试文件的目录

备份存储

Zealot 服务目前支持通过管理员面板管理和生成备份数据,备份数据可配置范围包括数据库和上传应用,目录位于 public/backup

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/apple-team/index.html b/zh-Hans/docs/user-guide/administrator/apple-team/index.html index e2efd0967..8b9ecc37a 100644 --- a/zh-Hans/docs/user-guide/administrator/apple-team/index.html +++ b/zh-Hans/docs/user-guide/administrator/apple-team/index.html @@ -4,13 +4,13 @@ 苹果开发者 | Zealot - - + +
版本:5.0.0

苹果开发者

iOS Ad-Hoc 签发的应用分发最大的困难是需要给大量不懂这些概念的人传递什么是 UDID、学习如何获取、获取后再提供给开发者,再通过重新签发证书、打包、上传才能安装。

Zealot 可以自动获取 Ad-Hoc 应用的 UDID,面对一串串的 UDID 没人能够看懂这都是谁的设备,明明这些设备在注册的时候都已经备注或自动获取了设备名,但它有不能够自动同步过来。

为了解决以上两个重大难题,Zealot 分别尝试了几种方案来解决这个困难,早期使用 fastlane 插件 zealot_sync_device 调用时会同步测试设备的名称和机型,直到苹果开发者推出 AppStoreConnect API 后完全可以托管到 Zealot 来自动化处理,通过常规流程大大简化注册流程的同时,也能过让测试应用能够显示可识别且友好的测试设备名称。

注册流程注册流程

虽然提供的设备 UDID 功能确认哪些应用可以安装,假如设备没有注册到任何一个应用这个时候提供一个测试设备注册的功能岂不是大大提升团队的效率?这也就是苹果开发者的作用。

苹果开发者详情预览苹果开发者详情预览

最初功能介绍:https://github.com/tryzealot/zealot/issues/723 后续在做更全面的不全

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/backup/index.html b/zh-Hans/docs/user-guide/administrator/backup/index.html index ceca87c7f..45490856d 100644 --- a/zh-Hans/docs/user-guide/administrator/backup/index.html +++ b/zh-Hans/docs/user-guide/administrator/backup/index.html @@ -4,13 +4,13 @@ 备份计划 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs/index.html b/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs/index.html index 71ca05fd0..1ddea0404 100644 --- a/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs/index.html +++ b/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs/index.html @@ -4,13 +4,13 @@ 后台任务 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics/index.html b/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics/index.html index f31d4c553..8223ea81f 100644 --- a/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics/index.html +++ b/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics/index.html @@ -4,13 +4,13 @@ 数据库分析 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/monitoring/logging/index.html b/zh-Hans/docs/user-guide/administrator/monitoring/logging/index.html index e7773d067..659aaf501 100644 --- a/zh-Hans/docs/user-guide/administrator/monitoring/logging/index.html +++ b/zh-Hans/docs/user-guide/administrator/monitoring/logging/index.html @@ -4,13 +4,13 @@ 系统日志 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/monitoring/system-info/index.html b/zh-Hans/docs/user-guide/administrator/monitoring/system-info/index.html index 66b56e9b4..ac22cf953 100644 --- a/zh-Hans/docs/user-guide/administrator/monitoring/system-info/index.html +++ b/zh-Hans/docs/user-guide/administrator/monitoring/system-info/index.html @@ -4,13 +4,13 @@ 系统信息 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/permissions/index.html b/zh-Hans/docs/user-guide/administrator/permissions/index.html index e15857972..21e00b495 100644 --- a/zh-Hans/docs/user-guide/administrator/permissions/index.html +++ b/zh-Hans/docs/user-guide/administrator/permissions/index.html @@ -4,13 +4,13 @@ 用户权限 | Zealot - - + +
版本:5.0.0

用户权限

Zealot 提供四种用户权限:

  • 游客
  • 普通用户
  • 开发者
  • 管理员

权限明细

功能游客[开/关]普通用户开发者管理员
控制面板
浏览所有的数据
✓/✕
应用
浏览应用列表
✓/✕
应用
浏览应用类型和渠道详情
✓/✕
应用
浏览应用版本详情
✓/✓
支持密码访问
应用
浏览应用内的网络钩子
✓/✕
应用
上传/安装/下载应用
应用
创建/编辑/删除应用
应用
创建/编辑/删除应用的类型或渠道
应用
删除指定的应用版本和上传的应用文件
应用
测试应用的网络钩子
应用
启用或禁用网络钩子
应用
删除应用
调试文件
浏览调试文件列表
✓/✕
调试文件
浏览上传调试文件的解析详情
调试文件
下载调试文件
调试文件
上传/删除调试文件
应用解包
浏览应用解包列表
✓/✕
应用解包
浏览应用解包的详情数据
✓/✕
应用解包
删除应用解包
管理面板
浏览和管理用户
管理面板
浏览和管理全部的网络钩子
管理面板
浏览和管理全部的苹果开发者
管理面板
浏览和管理系统设置
管理面板
浏览系统环境的数据
管理面板
浏览和管理后台任务
管理面板
浏览页面访问统计
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/project-settings/index.html b/zh-Hans/docs/user-guide/administrator/project-settings/index.html index a7ec75c5e..1a0a83144 100644 --- a/zh-Hans/docs/user-guide/administrator/project-settings/index.html +++ b/zh-Hans/docs/user-guide/administrator/project-settings/index.html @@ -4,13 +4,13 @@ Project Settings | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/administrator/settings/index.html b/zh-Hans/docs/user-guide/administrator/settings/index.html index 028838fe9..82fedb90e 100644 --- a/zh-Hans/docs/user-guide/administrator/settings/index.html +++ b/zh-Hans/docs/user-guide/administrator/settings/index.html @@ -4,13 +4,13 @@ 系统设置 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/apps/create/index.html b/zh-Hans/docs/user-guide/apps/create/index.html index 7fe10e54a..cc6aac115 100644 --- a/zh-Hans/docs/user-guide/apps/create/index.html +++ b/zh-Hans/docs/user-guide/apps/create/index.html @@ -4,13 +4,13 @@ 创建应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/apps/detail/index.html b/zh-Hans/docs/user-guide/apps/detail/index.html index 314d8558e..b0ffbd2f1 100644 --- a/zh-Hans/docs/user-guide/apps/detail/index.html +++ b/zh-Hans/docs/user-guide/apps/detail/index.html @@ -4,13 +4,13 @@ 已上传应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/apps/index.html b/zh-Hans/docs/user-guide/apps/index.html index 8530da7a2..5b42cfd55 100644 --- a/zh-Hans/docs/user-guide/apps/index.html +++ b/zh-Hans/docs/user-guide/apps/index.html @@ -4,13 +4,13 @@ 管理应用 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/apps/upload/index.html b/zh-Hans/docs/user-guide/apps/upload/index.html index ac2cd0685..36dc6a6fe 100644 --- a/zh-Hans/docs/user-guide/apps/upload/index.html +++ b/zh-Hans/docs/user-guide/apps/upload/index.html @@ -4,13 +4,13 @@ 上传应用包 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/best_practices/index.html b/zh-Hans/docs/user-guide/best_practices/index.html index 726f77378..949636cec 100644 --- a/zh-Hans/docs/user-guide/best_practices/index.html +++ b/zh-Hans/docs/user-guide/best_practices/index.html @@ -4,13 +4,13 @@ 最佳实践 | Zealot - - + +
版本:5.0.0

最佳实践

iOS 和 Android 应用

集成 Zealot SDK

集成 Zealot SDK 可以让非客户端研发自动触发新版本检查、查看变更日志和安装功能。

安装 fastlane

通过官方文档安装 fastlane.

配置 Fastfile

# 构建 iOS 的 ipa 文件并上传 zealot 服务器
lane :upload_app do
# 打包,比如 iOS 的 gym 或 Android 的 gradle
gym

# 上传应用到 Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# 上传 iOS 的 dSYM
zealot_debug_file(
scheme: 'AppName'
)
end

# 构建 android 的 apk 文件并生成 progguard 包后上传 zealot 服务器
lane :upload_debug_file do
# 打包,比如 iOS 的 gym 或 Android 的 gradle
gradle

# 自动化搜索 Android Proguard(混淆)并打包 Zip 文件
debug_file

# 上传应用到 Zealot
zealot(
endpoint: '...',
token: '...',
channel_key: '...'
)

# 上传 Android 的 Proguard
zealot_debug_file(
build_type: 'release',
flavor: 'googleplay'
)
end

CI 打包构建服务

自行选择使用 Jenkins、Gitlab CI 等任何可构建 iOS 或 Android 的构建服务完成项目构建的配置。这部分不同的 CI 服务配置都有所不同,暂时无法展开,大家可根据自己熟悉情况或借助运维部门的协助搭建。

Zealot 服务

除了管理每次上传的应用和调试文件,在每次接收到上传的应用会触发已配置的网络钩子用来给第三方服务发送通知有新版本收到,同时对于集成 Zealot SDK 的手机客户端每次第一次打开 App 都会收到新版本的安装提醒。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/changelog/index.html b/zh-Hans/docs/user-guide/changelog/index.html index 080e18314..8984bb7d2 100644 --- a/zh-Hans/docs/user-guide/changelog/index.html +++ b/zh-Hans/docs/user-guide/changelog/index.html @@ -4,13 +4,13 @@ 变更日志 | Zealot - - + +
版本:5.0.0

变更日志

未发布

提示

如下罗列的变更是还未发布的列表,代码变更历史:未发布

暂无

新增

  • Web/API 支持泛应用托管(支持解析会自动解析,不支持解析会跳过),默认新增 Windows 和 Linux 平台 #1121
  • Web/API 新增 Windows 应用托管(上传和元信息解析展示) #1124
  • Web 全新调试文件页面并新增多 dSYM 调试文件解析和托管 #1127 #1124 #961
  • Web 支持 Android 应用解包 v1, v2, v3 签名信息 #1124
  • Web 强化 Android 和 iOS 应用解包的 X509 证书信息 #1124
  • Web 新增 “重新解析” 功能更新老结构的调试文件元信息
  • Web 上传应用版本的变更日志支持 markdown 格式
  • Web 设置页可配置全局 “每页返回最小” 和 “最大条目数”
  • Web 应用版本详情页面针对 iOS 应用展示签名证书过期时间信息和签名证书过期无法安装(可以下载)的逻辑限制
  • Web 网络钩子及设置页添加或更新增加 JSON 格式校验
  • Web 注册测试设备到苹果开发者支持自定义设备名称和创建后编辑更新设备名称
  • Web 苹果开发者的私钥证书支持下载

修复

  • Web 修复解包应用无法删除问题
  • Web 部分页面的样式优化
  • Web 纠正英语语言包错误(en language i18n)
  • Web 修复应用类型创建为空时错误的报错页面
  • Web 修复找不到文件报 404 错误页面
  • API 修复应用获取最新版本 build_version 版本比较逻辑优化
  • Web 优化上传应用自定义字段格式错误处理
  • Web 优化 url 注入、应用历史版本为空、没有注册设备等正确跳转
  • Web 优化展示备份任务错误信息
  • Web 上传应用对应用类型、调试文件增加类型检测
  • Web 修复创建苹果开发者没有预选创建 Distribution Certificate 的错误信息

4.7.1 (2023-03-10)

支持最新 Android aapt2 构建工具生成的 aab 应用解析,详细[代码变更记录][4.7.1]

修复

  • Web 升级最新 appt2 模型避免 aab 解析异常
  • Web 解析异常的重复处理

新增

  • Web Android 应用解包详情页增加应用类型
  • Web 应用渠道编辑后调整原先的页面

4.7.0 (2023-03-03)

变更

  • Docker 重大变更 Redis 最低版本依赖从原来的 5.x 升级至 6.2+,建议使用 7.x 主版本,升级时请手动修改。详细代码变更记录

新增

  • Web 应用类型新增 “新上传版本提示窗” 控制开关 #1058 感谢 softwind0214
  • Web 应用列表页面图标可点击跳转应用详情页
  • Web 环境信息新增依赖服务的版本号显示
  • Web 版本号增加对 nightly 构建的版本的显示

修复

  • Web Ruby 版本降级至 3.0 暂时解决高版本带来的 iOS 应用解析崩溃,具体情况看 #1070
  • Web 应用/类型/渠道展示顺序固定为按照创建时间正序排列
  • Web 修复用户注销时没有弹出二次确认提示
  • Web 修复应用版本在主历史版本无法删除
  • Web 改善多个页面的样式问题
  • Web 产品环境不再展示 Javascript 调试器日志输出

4.6.0 (2023-01-17)

运行环境升级至 Ruby 3.2 并支持 arm64 平台。详细代码变更记录

修复

  • Web 捕获创建应用渠道名称为空问题 #968 感谢 congpeijun
  • Web 备份文件在磁盘不存在的逻辑完善 #995

新增

  • Docker 支持 arm64/v8 及 armv7 镜像 #970
  • Web 采用新 50x 错误页面

变更

  • Web 开发环境 Ruby 升级至 3.2 版本,devcontainer 及容器默认开启 YJIT 特性 #1011
  • API 更新调试文件返回数据结构并修改状态码从 204 改为 200

4.5.3 (2022-11-22)

详细代码变更记录

修复

新增

  • Docker 新增环境变量来关闭 WebSocket (ActionCable) 的请求保护 (实验性质) #950

4.5.2 (2022-11-01)

详细代码变更记录

修复

  • Web 修复注册测试设备异常 #935 感谢 ycy0430
  • Web 适配二维码支持黑暗模式
  • Web 修正 en 英文语言包

新增

  • WebHook 变量结构体新增 usernameemail 字段 #934 感谢 rkonfj
  • Docker 支持 SIDEKIQ_CONCURRENCY 环境变量设置后台任务的并发量,默认 5

变更

  • Docker 减少安全隐患,Web 服务包含 puma 和 puma_control_server 监听更换成 127.0.0.1
  • Web 优化 iOS 设备 UDID 描述文件的文案
  • Web 更新页面底部的文案,感谢 Rails 和 AdminLTE 开源项目!

4.5.1 (2022-09-14)

详细代码变更记录

修复

  • Web 修复应用解包解析报错

4.5.0 (2022-08-19)

详细代码变更记录

支持 👨🏻‍🔧 苹果开发者托管测试设备顺手把 🌑 黑暗模式搞来了!

新增

  • Web 支持黑暗模式 #816
  • Web 新增苹果开发者管理用于注册测试设备 #817
  • Web 新增数据备份管理 #835
  • Web 管理面板完成依赖服务的监控 #586
  • API 涉及 release 字典的地方新增三个字段 platform, device_typecustom_fields

变更

  • Web 不兼容变更 Google 统计强制升级 v4 版本,之前设置的需要重新配置才可以生效 #815
  • CLI 不兼容变更 数据备份和还原功能因结构发生变更不再提供,请使用管理员面板的数据备份功能
  • Web 针对获取设备 UDID 及 iOS 版本安装和下载变更根据设备展示对应的功能界面,不再全部展示
  • Web 移除管理员面板的页面统计功能 #814
  • Web 前端技术栈从 webpacker 迁移至 esbuild + sass, Turbolinks 迁移至 Stimulus 带来更好的前端交互体验 #829
  • Web 鉴于编辑应用的类型和渠道逻辑较复杂,变更只能修改应用名

修复

  • Web 处理应用类型下没有存在渠道的选择错误 #795 感谢 tasselsd
  • API 修复 Android 地址返回错误 #813 感谢 denymz
  • Web/API 修正 aab 解析部分参数为空引发的异常 tryzealot/fastlane-plugin-zealot#9 感谢 tasselsd
  • Web 修复第一次初始化项目生成演示数据异常 #821
  • API 修复检查应用最新版本数据异常 #856 感谢 denymz
  • Web 修复应用渠道详情因关联网络钩子数据异常报错
  • Web 修正英文语言包很多拼写错误

4.4.1 (2022-06-20)

详细代码变更记录

修复

4.4.0 (2022-06-09)

详细代码变更记录

变更

  • Web 对于未登录且未开启游客模式的用户权限新增查看应用版本详情之外还提供按照版本、分支、打包类型方式的筛选显示列表
  • Web 运行时环境升级至 Ruby 3.0,服务框架升级至 Rails 7.0
  • Web 兼容 macOS M1 芯片组

新增

  • Web 便于分享简化和统一部分应用链接 #666
  • Web 补全一些遗漏的权限检查页面

修复

  • Job 修复 iOS 文件解析 URL Schemes 异常
  • Web 修复服务日志没有输出到终端控制台
  • Web 增加处理上传调试文件在解析时它被删除掉或其他原因没有找到本地文件的异常捕获
  • Web 适配超宽屏幕的 UI
  • Web 修复第三方登录依赖库的安全隐患
  • API 修复上传 Android 再不传 channel_key 异常 #779 感谢 likfe

4.3.1 (2021-12-22)

详细代码变更记录

新增

  • Web 设置项更新后可恢复原始默认值
  • Web 应用解包支持 Android 对 app links (区分 deep links 和 url schemes) 的解析显示
  • Web 设置页面强化设置开启、关闭状态的视觉效果

修复

  • Web 修复演示模式异步任务方法错误
  • Web 修复创建和编辑应用无法勾选选中的应用类型和渠道
  • Web 修复在环境页面无法
  • Web 修复解析 aab 没有 intent filters 无法解析
  • Web 增加取消勾选任何类型和渠道更新应用的报错
  • Web 修复加载策略造成第三方登录全部不可用

4.3.0 (2021-12-08)

支持 aab 格式解析、多语言支持!详细代码变更记录

变更

  • Web 使用默认提示的结构体作为网络钩子的数据结构,不再是一个奇怪的结构
  • Web 设置页面不再提供第三方登录授权的参数变更(依赖服务重启)
  • API 上传应用接口和版本详情返回主体新增 text_changelog 650f1ffd
  • API 上传应用接口返回主体 changelog_list 改名 changelog 719f0b1e
  • Web 变更日志输出的内容不再是一个数组内容,而是改为兼容 markdown list 格式的文本内容 719f0b1e
  • Web 一些隐私的配置 key 或 token 仅在管理员权限下明文显示;其他权限不可见;演示只读且会做部分加密处理 #644
  • Web 构建日期和哈希值无法获取不显示

新增

  • Web 支持 Android App Bundle (aab) 文件格式和 webp 图标的解析
  • Web 支持语言国际化,可选语言包:简体中文,英文 (支持页面配置)
  • Web 支持配置更多的系统设置项 #643
  • Web 管理面板支持网络钩子的编辑功能
  • Web 重写并优化应用列表的样式布局
  • Web 优化基础的邮件模板
  • Web 调整登录窗口的样式和错误逻辑
  • Web 管理面板的环境变量页面新增文件权限检查 #608
  • Web 管理面板的新增错误异步任务的详情展示,最大错误数量为 5000
  • Web 使用更好的日志输出格式 #646

修复

  • Web 修复设置页面默认情况下 boolean 值类型的参数勾选状态错误
  • Web 修复在钉钉 App 点击安装或下载出现异常问题(改为微信逻辑处理)
  • Web 修复在环境页面无法显示构建日期(构建 docker 镜像时的时间戳)
  • Web 修复异步通知域名作用域无法生效
  • Web 修复获取 gems 异常
  • Web 修复 iOS 证书过期时间判断异常
  • Web 修复使用虚拟机开发挂载磁盘空间无法获取
  • Web 修复演示模式下的一些已知错误

4.2.2 (2021-10-15)

详细代码变更记录

修复

  • API 解决因批量替换造成的参数不匹配没有正确输出错误信息 #615 感谢 gin7758258
  • Web 解决了针对部分 apk Android 文件解析异常问题 #587

4.2.1 (2021-09-14)

详细代码变更记录

变更

  • Web 应用的图标不再按照预设尺寸裁切并移除图片处理依赖减少将近 200MB 镜像体积
  • Docker 反代服务 Caddy 不再输出日志到 STDOUT 而是直接到文件

修复

  • Web 修复上传应用后图标没有正常处理和显示
  • Web 兼容上传 dSYM 不同的 zip 解压缩逻辑
  • Web 修复安装 iOS 无法显示应用图标
  • Web 安全隐患:禁止编辑设置只读的系统设置
  • Web 修复 macOS 下载文件后缀不正确
  • Web 修复个别情况下不显示弹出无法安装的窗口

4.2.0 (2021-09-01)

详细代码变更记录

变更

  • Web 清理老版本逻辑默认改为关闭,如需开启请设置环境变量 ZEALOT_KEEP_UPLOADS=false #570
  • Web 文件解析改名为应用解包 #529
  • Web 下线应用解包中对已上传应用的解包支持(现在上传的应用都会自动触发额外的应用解包)
  • API 上传应用的自定义字段图标支持 fontawesome css 的值,比如 flag 的值是 fas fa-flag
  • Docker 镜像由 caddy 作为反代提供服务并对 volume 持久化做了变更,涉及迁移,具体看 #540

新功能

  • Web 支持 macOS 应用的上传、解析和下载 #562
  • Web 新增手机设备在渠道详情页对应用类型和渠道快速筛选项 #510 感谢 huacnlee
  • Web 管理员面板可配置应用的类型模板和默认注册用户的权限 #562 #568
  • Web 环境变量涉及隐私的做部分加密处理
  • Web 内存和磁盘使用率增加图形展示
  • Docker 新增支持 Github Container Registry 镜像同步更新
  • Docker 新增支持环境变量配置 postgres 端口号

修复

  • Web 修复在 iPad 和 M1 芯片的 macOS 无法显示 iOS 安装按钮 #519 感谢 ohdarling
  • Web 修复注册但未验证邮件的同时使用第三方登录失败 #517 感谢 huacnlee
  • Web 修复使用网页上传没有触发应用解包
  • Web 修复 tubrolink 开启下左侧导航样式错位
  • Web Android 上传应用也显示解包链接
  • Web 优化解包文件列表判断为空的显示提示
  • Web 修复 LDAP 参数获取错误 #541 感谢 Martwu
  • Web 优化捕获页面上传应用错误改为可读的错误信息
  • Web 修复创建应用类型出错判断异常
  • Web 补充在应用删除全部渠道后点击详情报错的一个异常情况的判断
  • Web 修复上传应用因解析过程变量释放错误
  • Web 修复应用设置密码保护校验时报错 #564 感谢 EasierLu
  • Web 修复管理员面板编辑用户资料报错 #564 感谢 EasierLu
  • Web 修复应用详情页面 "安装" 按钮会在错误的系统和设备上异常显示(正常只有 iOS 应用在 iOS 及 macOS 设备才会显示)
  • Web 优化应用解包对于开发者证书因包含特殊字符集(目前已知的是中文编码)解析失败及 UI 样式的重新布局
  • Web 修复无法编辑当前用户
  • Web 改正调试文件的标题重复
  • Docker 修复镜像初始化 logrotate 错误
  • Docker 修复使用 Caddy 部署需要确认 #551 感谢 ReverseScale

4.1.0 (2021-07-17)

详细代码变更记录

变更

  • Web 因 iPad 的 User-Agent 和 Desktop 一样更改获取设备 UDID 的显示逻辑
  • Docker 设置 Gihub Container Registry (gcr.io) 作为默认 Docker 镜像源

新功能

  • Web 支持飞书、Gitlab 第三方一键登录认证
  • Web 优化找不到应用版本详情页面并可以手动跳转到最新版本
  • Web 系统配置新增部分配置项的查看和部分不通过重启的参数修改
  • Web 管理面板新增页面统计报表

修复

  • Web 修复网络钩子无法获取 title 变量的值
  • Web 修复解析应用过程中异常报错
  • Web 修复创建应用过程中会有异常报错
  • Web 修复系统配置保存时为空造成无法编辑
  • Job 处理移除老版本的逻辑造成删除的版本逻辑和文档逻辑是反的

4.0.0 (2020-12-31)

详细代码变更记录

修复

  • Web 修正文件解析 iOS 证书对失效时间判断异常造成的页面错误显示
  • Web 忽略默认开发版本号检查新版本

4.0.0.rc2 (2020-12-25)

详细代码变更记录

新功能

  • Web 新的文件解析会保存到列表,上传的应用也会同步一份文件解析(异步任务) #346
  • Web 控制面板新增文件解析数据统计
  • Web 控制面板针对管理员新增网络钩子、后台任务和磁盘使用的数据统计
  • Web 版本详情提示文件缺失增加有权限者快速删除功能

变更

  • API 调试文件版本检查接口改名并新增按照文件指纹和 dSYM uuid 检查是否存在 #349

修复

  • Web 修复禁用 LDAP 登录认证报错( IP 白名单设置错误)
  • Web 修正 Android 微信打开版本详情提示的文案

4.0.0.rc1 (2020-10-29)

详细代码变更记录

变更

  • Docker 重大变更 合并 rails 和 worker 到同一镜像部署需要同步更新 zealot-docker 库 #235
  • Docker Ruby 升级 2.7 部署
  • Web font-awesome 从 4.7.0 升级至 5.13.0,可能会有遗漏的 Icon 显示不正常
  • Web 调整邀请邮件的文案
  • Web 应用和调试文件下载路径统一到 /download 路径
  • Web 在线解析应用需要登录权限
  • Web 优化已经删除的或不存在的版本详情地址会自动跳转最新版本
  • Web 应用安装和下载逻辑做了调整(主要 iPadOS UserAgent 和 Desktop 一样无法判断)

新功能

  • Web 涉及下载文件不存在会提示无法下载
  • Web 在线解析支持 .mobileprovision 格式文件以及解析 .ipa 新增开启功能等
  • Web 部分系统设置可以使用管理员面板在线修改 #245
  • Web 新增游客模式 #243
  • Web 支持显示 iOS AdHoc 版本测试设备的名称 #211
  • Web 支持解析已上传版本安装包的内容 #210
  • Web 支持获取 iOS 设备 UDID 功能 #203
  • Web 支持定期数据初始化且有功能限制的演示模式 #198
  • Web 上传 App 后在版本详情显示原本应用的名称
  • Web 可通过版本、Git 分支、打包类型筛选过滤应用列表
  • Web 版本详情最近上传关联 git commit 链接(如果在渠道设置了 git url)
  • Web LDAP 登录融合到现有登录界面,不再使用第三方依赖提供的简陋界面
  • Job 支持通过 rails 命令管理生成恢复数据备份功能(数据库、上传文件数据)#207
  • API 新增检查调试文件是否存在接口 /api/debug_files/version_exist

修复

  • Web 修复上传 App 填写变更日志解析报错
  • Web 解决版本详情中二维码在中等分辨率会超出父视图
  • Web 解决应用渠道一些值为空确没有不显示默认值
  • Web 优化在线解析 iOS 包的内容展示(和永远展示假数据的问题)
  • Web 解决版本详情在使用 fastlane-plugin-ci_changelog 生成的变更日志没有展示提交者信息
  • Web 修复并优化检查新版本逻辑
  • Web 修复删除调试文件确认弹窗信息获取为空
  • Web 优化版本详情设备列表在一些手机的显示方式
  • Web 修复解析应用在不传参数提交的报错
  • Web 优化版本列表在手机查看
  • Web 渠道版本的最近上传动态仅显示底部分页,上部改为版本总数
  • Web 修复管理员编辑用户留空密码提示不能为空
  • Web/API 修复在线下载和安装版本不存在时会采用最新版本
  • Web 修复游客模式登录界面会显示边栏菜单
  • Web 修复上传同一应用同一平台调试文件总是会被覆盖的问题
  • Web 系统设置页面优化对布尔类型、字典类型的显示
  • Job 修复定时任务来清理老版本时因版本判断错误发生的误删版本
  • Docker 修复因为 volume 存储 public 文件夹造成内部静态资源不会更新
  • Docker 容器内的版本和外部不一致

4.0.0.beta4 (2020-05-07)

详细代码变更记录

新功能

  • Docker 支持 Heroku 部署
  • Web 游客模式允许查看 App 详情、列表和上传 App 详情
  • API 上传 App 支持自定义字段 #178
  • Web/API 上传 App 传递了 branch 值开头包含 origin/ 开头会自动清理掉
  • Web 登录、注册、找回密码、重设密码等用户认证界面增加项目简介

修复

  • Web 修正用户密码描述文案
  • Web 修复网络钩子(WebHook)包含 url 字段的地址错误
  • Web/API 修复上传 iOS dSYM 文件上传报错
  • API 修复获取 App 接口 has_password 参数异常
  • API 修复上传 App 记录的 source 来源都是 Web
  • API 修复并支持上传 App 传递字符串类型的 json 格式的 changelog
  • Web 修复系统信息没有正常获取 CPU 和内存信息
  • Web 修复在线解析 Android 应用偶尔报错
  • Web 修复使用微信扫描二维码页面报错

变更

  • API 应用最新版本接口(apps/latest)增加 bundle_id 纬度的验证
  • Web 游客模式可以访问应用版本详情和下载操作
  • Web 应用版本详情对于 iOS AdHoc 右侧的设备列表左移并默认收起状态
  • Web 开发环境移除 GraphQL 控制台功能,推荐使用 graphql-playground
  • Web 页面底部移除 footbar,版本信息可以在系统信息查看

4.0.0.beta3 (2020-01-16)

详细代码变更记录

新功能

  • Web 管理员添加的用户在邮箱未激活会提示并显示确认邮箱的链接
  • Web 默认开启 Sentry 匿名上报机制(可关闭)

修复

  • API 修复上传应用总会创建新渠道
  • Web/API 修复上传 Android 应用无法显示图标

变更

  • Docker 初始化数据从镜像移出到 zealot-docker 操作 #120
  • Docker 精简镜像的体积大小从 1.18G 降到 308M #114
  • Job 使用异步任务代替传统 cron job 来实现定时清理老版本历史包文件(可关闭)
  • Job 对异步任务进行分组和设置优先级
  • API 所有报错信息改成中文显示,因数据库写操作会返回具体错误信息
  • Web 使用 Rubocop Lint 规范化代码

4.0.0.beta2 (2020-01-10)

详细代码变更记录

新功能

  • Web 新增上传到具体应用渠道的全部版本列表同时支持删除操作

修复

  • Web 对于上传应用不是有效 ipa 或 apk 的会给予错误提示而不是报错
  • API 修复获取应用最新版本列表因查询版本号不存在数据库无法返回最新版本列表
  • API 只针对写操作的接口才会要求 token 验证(之前是绝大部分都需要)

4.0.0.beta1

🌈 第一个公测版本发布啦

更早的版本

之前多年一直是公司内部开发和运营并没有开源,曾经承担过很多的功能到现在脱离出来专注提供应用托管和分发的服务。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/credits/index.html b/zh-Hans/docs/user-guide/credits/index.html index 17d100593..1bbfc1665 100644 --- a/zh-Hans/docs/user-guide/credits/index.html +++ b/zh-Hans/docs/user-guide/credits/index.html @@ -4,13 +4,13 @@ Credits | Zealot - - + +
版本:5.0.0

Credits

实在不知道怎么翻译 Credits,就这么招吧。

贡献成员

感谢你们让 Zealot 变得更有用!

项目名

Zealot 来自星际争霸种神族基础兵种。

图标

最初项目历史提交资源图标版权归属暴雪,后期改为自己设计的图标,如果有热心设计师能够帮助设计更好的图标,本人代表本项目表示衷心的感谢。

发布协议

Zealot 是一个基于 MIT 发布协议 (MIT) 发布的开源项目,协议内容请参见协议文件

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/dashboard/index.html b/zh-Hans/docs/user-guide/dashboard/index.html index 57535dfce..64eac1052 100644 --- a/zh-Hans/docs/user-guide/dashboard/index.html +++ b/zh-Hans/docs/user-guide/dashboard/index.html @@ -4,13 +4,13 @@ 控制面板 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/debug-files/index.html b/zh-Hans/docs/user-guide/debug-files/index.html index 60b9064db..533b69601 100644 --- a/zh-Hans/docs/user-guide/debug-files/index.html +++ b/zh-Hans/docs/user-guide/debug-files/index.html @@ -4,13 +4,13 @@ 应用列表 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/debug-files/review/index.html b/zh-Hans/docs/user-guide/debug-files/review/index.html index 5e3fc71e3..db86beabf 100644 --- a/zh-Hans/docs/user-guide/debug-files/review/index.html +++ b/zh-Hans/docs/user-guide/debug-files/review/index.html @@ -4,13 +4,13 @@ 查看调试文件详情 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/debug-files/upload/index.html b/zh-Hans/docs/user-guide/debug-files/upload/index.html index ada5d03ab..0c88f3a4b 100644 --- a/zh-Hans/docs/user-guide/debug-files/upload/index.html +++ b/zh-Hans/docs/user-guide/debug-files/upload/index.html @@ -4,13 +4,13 @@ 上传调试文件 | Zealot - - + + - - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/index.html b/zh-Hans/docs/user-guide/index.html index 067f34f37..596090e24 100644 --- a/zh-Hans/docs/user-guide/index.html +++ b/zh-Hans/docs/user-guide/index.html @@ -4,8 +4,8 @@ 用户手册 | Zealot - - + +
@@ -14,7 +14,7 @@ Chat on Telegram Maintainability License

开源自部署持续集成一切跟应用有关事情,接入任意 CI 系统一切自动化处理,企业多年实战经验,独立部署提供企业打包分发流程、上传应用全套流程方案 En Taro Adun! 🖖

功能预览功能预览

特性

  • 🌏 多平台应用托管: macOS、iOS、Android(apk/aab)、Windows、Linux 泛平台
  • 📱 测试设备一网打进: 自动同步 iOS 测试设备信息,允许一键注册新设备到苹果开发者
  • 🧑‍💻 丰富开发者套件: 提供 REST API、iOSAndroid SDK 以及 fastlane 自动化构建插件
  • 💥 剖析应用内部的秘密: 解读 iOS、Android 应用或 iOS 描述文件的元信息
  • 🚨 内置多种事件通知: 数据可自定义 Income WebHook 到任意通知服务
  • 🗄 多渠道分类管理: 自由划分不同场景不同产品形态的应用渠道管理
  • 🎳 多架构部署: amd86/arm64/armv7 及各种部署方案应有尽有
  • 🔑 第三方登录: 飞书、Gitlab、Google、LDAP 和 OIDC 一键授权
  • 🌑 黑暗模式: 黑夜白昼自由切换

在线演示

注意: 演示服务部署在免费资源存在不稳定情况且数据每日都会重新初始化,不对用户上传的应用承担任何法律风险,后果自负!

发布协议

MIT

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/qa/index.html b/zh-Hans/docs/user-guide/qa/index.html index 3a0b5d96b..c615a6c40 100644 --- a/zh-Hans/docs/user-guide/qa/index.html +++ b/zh-Hans/docs/user-guide/qa/index.html @@ -4,15 +4,15 @@ 疑惑解答 | Zealot - - + +
版本:5.0.0

疑惑解答

下面会列出来一些遇到的问题并汇总提供给大家。

为什么不能使用 HTTP 部署服务

鉴于 iOS 使用下载服务依赖开启 SSL/TLS 证书,建议使用经过授权的证书服务,如果服务不需要提供 iOS、macOS 的安装服务可以考虑使用 HTTPS 部署服务, 这里推荐使用免费 Let's Encrypt 提供 SSL 证书服务。

使用自签名的证书无法安装 iOS 应用

如果使用自签名证书需要每个 iOS 设备在下载安装应用前必须安装自签名证书才行,每个设备都需要进行安装,操作比较复杂在有免费 SSL 证书服务的情况下不到逼不得已不建议使用自签名证书。

使用负载均衡部署服务,下载总会从 https 变成 http

负载均衡在提供服务的时候会在最前端部署 https 服务,内部的分发实际上还是走的 http,解决办法在负载均衡上把转发的协议头从 http 改成 https,这样服务再转发的时候就会继承最前端的协议头(X-Forwarded-Proto)。

是否支持外部 redis、postgresql 链接

支持的,如果有公用的 redis、postgresql 服务器那就可以单独部署 zealot 服务,在 .env 配置或 Docker、K8s 的环境变量手动指定如下配置:

# Redis
REDIS_URL=redis://127.0.0.1:6379/0

# Postgresl
ZEALOT_POSTGRES_HOST=127.0.0.1
ZEALOT_POSTGRES_PORT=5432
ZEALOT_POSTGRES_USERNAME=postgres
ZEALOT_POSTGRES_PASSWORD=ze@l0t
ZEALOT_POSTGRES_DB_NAME=zealot

是否支持 Kubernetes(k8s)部署

服务是支持 K8S 的单机部署但不支持伸缩特性,具体原因是因为应用上传使用的是容器内的本地存储没有支持亚马逊 S3 或阿里云第三方云存储的支持。

是否提供类似 FIR、蒲公英服务的应用的分享页面

服务提供两种页面地址:

1 应用渠道详情页

https://YOUR_ZEALOT_URL/channels/SLUG

其实 YOUR_ZEALOT_URL 是 zealot 服务地址,SLUG 是你对应应用渠道的唯一地址。

2 上传的版本详情页

https://YOUR_ZEALOT_URL/channels/SLUG/releases/ID

其实 YOUR_ZEALOT_URL 是 zealot 服务地址,SLUG 是你对应应用渠道的唯一地址,ID 是上传的版本 ID,为空的时候会自动调整到最新版本,所以可以直接分享

https://YOUR_ZEALOT_URL/channels/SLUG/releases

服务运行一段时间 CPU 或内存资源暴涨不下,如何解决?

根据用户 Cleam反馈部署服务之后,托管的应用很少,上传频率不高,服务器硬件规格也完全达标的情况下还是会引发 CPU 或内存资源暴涨造成服务器卡死, 当前的情况属于还属于个人情况,目前情况未知,但可以通过限制 CPU 和内存来规避这个问题,编辑 docker-compose.yml 文件:

zealot:
<<: *defaults
+ deploy:
+ resources:
+ limits:
+ cpus: 2.0
+ memory: 2G
+ reservations:
+ cpus: 0.5
+ memory: 256M
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/toolkits/fetch-udid/index.html b/zh-Hans/docs/user-guide/toolkits/fetch-udid/index.html index 37d9890fa..03718cd70 100644 --- a/zh-Hans/docs/user-guide/toolkits/fetch-udid/index.html +++ b/zh-Hans/docs/user-guide/toolkits/fetch-udid/index.html @@ -4,13 +4,13 @@ 获取 iOS 设备 UDID | Zealot - - + +
版本:5.0.0

获取 iOS 设备 UDID

Zealot 提供的获取 iOS 设备 UDID 除了市面上最最最基础的功能之外,内置了强大扩展功能:

  1. 通过 UDID 罗列可以安装的应用列表
  2. 开启苹果开发者功能允许把未注册测试设备添加到对于的开发者账号

安装描述文件

信息

此功能仅对 iOS 设备有效,如果是电脑打开会提示用手机扫描二维码打开。

无论使用什么用户登录模式(包括游客模式)都可以通过左侧菜单栏的 "获取设备 UDID" 安装描述文件后获取当前 iOS 设备的 UDID。

不要在意安装的描述文件展示"未签名",这个不影响安装,且此描述文件是一次性的获取之后会被系统销毁绝对不会存在安全隐患。

安装描述文件安装描述文件

描述文件安装后会返回浏览器打开一个新的页面展示设备 UDID,这个时候会出现如下两种情况:

未注册设备

未注册设备提供最基本的设备信息,包含 UDID、内部型号和序列化号之外,服务管理员如果添加了苹果开发者还会显示注册测试设备到对于的开发者账号中。

提示

注册到苹果开发者账号仅仅意味着设备更新到苹果开发者账号的 Devices 下面,对于 iOS 开发者还需要手动或脚本自动化把该测试设备添加到对应的 Ad-Hoc 证书,再进行安装并重新打包上传才允许该设备安装。

未注册设备未注册设备

已注册设备

已注册的测试设备就会展示可以安装的应用列表。服务管理员如果添加了苹果开发者还会显示注册测试设备到对于的开发者账号中。

已注册设备已注册设备
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/toolkits/teardown/index.html b/zh-Hans/docs/user-guide/toolkits/teardown/index.html index 56b2a190f..9484ad63b 100644 --- a/zh-Hans/docs/user-guide/toolkits/teardown/index.html +++ b/zh-Hans/docs/user-guide/toolkits/teardown/index.html @@ -4,13 +4,13 @@ 解析应用分析内部元信息 (Metadata) | Zealot - - + +
版本:5.0.0

解析应用分析内部元信息 (Metadata)

Android

获取 AndroidManifest.xml 元数据,解析 v1 至 v3 签名信息。

iOS

获取 Info.plist 元信息、Frameworks 和描述文件及证书信息。

- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/webhooks/dingtalk/index.html b/zh-Hans/docs/user-guide/webhooks/dingtalk/index.html index b502f2f98..08b09536a 100644 --- a/zh-Hans/docs/user-guide/webhooks/dingtalk/index.html +++ b/zh-Hans/docs/user-guide/webhooks/dingtalk/index.html @@ -4,14 +4,14 @@ 钉钉 | Zealot - - + +
版本:5.0.0

钉钉

钉钉的网络钩子结构体通常支持文本和 markdown 两种方式, 由于系统限制尽量使用关键词或 IP 地址白名单机制来接受消息。可通过如下配置实现:

Text 文本格式

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Markdown 格式

title 字段仅在对话列表展示,进入对话框的聊天内容则展示 text 字段

{
"msgtype": "markdown",
"markdown": {
"title": @title,
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/webhooks/discord/index.html b/zh-Hans/docs/user-guide/webhooks/discord/index.html index 4841bbb16..efc2da65e 100644 --- a/zh-Hans/docs/user-guide/webhooks/discord/index.html +++ b/zh-Hans/docs/user-guide/webhooks/discord/index.html @@ -4,13 +4,13 @@ Discord | Zealot - - + +
版本:5.0.0

Discord

Discord 支持 Slack 兼容的网络钩子因此其结构体通常支持文本和 block 富文本两种方式,可通过如下配置实现:

Text 文本格式

{
"text": "#{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}"
}

Block 富文本格式

一个简单的支持 markdown 的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
]
}

稍微好看点有些结构展示的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*平台:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*上传时间:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/webhooks/feishu/index.html b/zh-Hans/docs/user-guide/webhooks/feishu/index.html index 1e1c0eb8c..7cb6f8106 100644 --- a/zh-Hans/docs/user-guide/webhooks/feishu/index.html +++ b/zh-Hans/docs/user-guide/webhooks/feishu/index.html @@ -4,14 +4,14 @@ 飞书 | Zealot - - + +
版本:5.0.0

飞书

飞书的网络钩子结构体通常支持文本和卡片两种方式, 由于系统限制尽量使用关键词或 IP 地址白名单机制来接受消息。可通过如下配置实现:

Text 文本格式

{
"msg_type": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Interactive 卡片格式

通过这种格式可以实现支持 markdown 的部分语法:

{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"elements": [
{
"tag": "div",
"text": {
"content": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})",
"tag": "lark_md"
}
},
{
"actions": [{
"tag": "button",
"text": {
"content": "点击安装",
"tag": "lark_md"
},
"url": @install_url,
"type": "default",
"value": {}
}],
"tag": "action"
}
]
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/webhooks/index.html b/zh-Hans/docs/user-guide/webhooks/index.html index 154a6b6d0..8eb30cc33 100644 --- a/zh-Hans/docs/user-guide/webhooks/index.html +++ b/zh-Hans/docs/user-guide/webhooks/index.html @@ -4,15 +4,15 @@ 网络钩子(WebHook) | Zealot - - + +
版本:5.0.0

网络钩子(WebHook)

Zealot 为每个应用渠道都提供一个消息通知的网络钩子,网络钩子完全可自定义结构体可适用于绝大多数的通知服务, 比如企业微信、钉钉、Slack 等等。

默认结构体

默认结构体每个参数都已变量的方式提供它的值,每个变量都以 @ 开头,在创建网络钩子如果留空自定义结构体就会使用默认结构体, 如下全部提供的变量:

{
event: @event,
title: @title,
app_name: @name,
device_type: @device_type,
release_version: @release_version,
build_version: @build_version,
size: @file_size,
changelog: @changelog,
install_url: @install_url,
icon_url: @icon_url,
qrcode_url: @qrcode_url,
uploaded_at: @uploaded_at
}

输出的结果如下:

{
"event": "upload_events",
"title": "Zealot 样例 iOS 内测版上传了 1.0.0 版本",
"app_name": "Zealot 样例 iOS 内测版",
"device_type": "iOS",
"release_version": "1.0.0",
"build_version": "1",
"size": "30 MB",
"install_url": "https://zealot.test/api/apps/download/12354",
"icon_url": "https://zealot.test/api/apps/icon.png",
"qrcode_url": "https://zealot.test/api/apps/354/qrcode",
"uploaded_at": "2019-12-30 11:33:00",
"changelog": "- 新增了 A 功能\n- 修复了 B 问题\n- 发布 1.0.0 版本",
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/webhooks/slack/index.html b/zh-Hans/docs/user-guide/webhooks/slack/index.html index 9a34a548a..affd89028 100644 --- a/zh-Hans/docs/user-guide/webhooks/slack/index.html +++ b/zh-Hans/docs/user-guide/webhooks/slack/index.html @@ -4,13 +4,13 @@ Slack | Zealot - - + +
版本:5.0.0

Slack

Slack 的网络钩子使用 Incoming Webhooks 其结构体通常支持文本和 block 富文本两种方式,可通过如下配置实现:

Text 文本格式

{
"text": "#{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}"
}

Block 富文本格式

一个简单的支持 markdown 的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
]
}

稍微好看点有些结构展示的 block

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": @title,
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*平台:*\n#{@device_type}"
},
{
"type": "mrkdwn",
"text": "*上传时间:*\n#{@uploaded_at}"
}
]
},
"accessory": {
"type": "image",
"image_url": @qrcode_url,
"alt_text": "install qrcode"
}
]
}
- - + + \ No newline at end of file diff --git a/zh-Hans/docs/user-guide/webhooks/wecom/index.html b/zh-Hans/docs/user-guide/webhooks/wecom/index.html index 8758dc254..303c5c63b 100644 --- a/zh-Hans/docs/user-guide/webhooks/wecom/index.html +++ b/zh-Hans/docs/user-guide/webhooks/wecom/index.html @@ -4,13 +4,13 @@ 企业微信 | Zealot - - + +
版本:5.0.0

企业微信

企业微信的网络钩子结构体通常支持文本和 markdown 两种方式,可通过如下配置实现:

Text 文本格式

{
"msgtype": "text",
"text": {
"content": "#{@title}\n\n安装地址:#{@install_url}\n上传时间: #{@uploaded_at}"
}
}

Markdown 格式

{
"msgtype": "markdown",
"markdown": {
"content": "## #{@title}\n平台: #{@device_type}\n上传时间: #{@uploaded_at}\n安装二维码:\n![qrcode](#{@qrcode_url})"
}
}
- - + + \ No newline at end of file diff --git a/zh-Hans/index.html b/zh-Hans/index.html index 2a3ec8422..d6cb346c9 100644 --- a/zh-Hans/index.html +++ b/zh-Hans/index.html @@ -4,13 +4,13 @@ 私有化部署 Android、iOS、macOS、Windows 和 Linux 应用托管服务 | Zealot - - + +

Zealot

开源自部署持续集成一切跟应用有关事情,接入任意 CI 系统一切自动化处理,企业多年实战经验,独立部署提供企业打包分发流程、上传应用全套流程方案

Easy to Use

轻松使用

Zealot 提供简单便捷的部署方式实现一键安装和运行。

Focus on What Matters

专注于重要的事情

Zealot 使得开发者可以关注于应用开发本身,我们来处理持续交付和测试的工作,立即上传应用吧。

Powered by Rails

100% 开源项目

Zealot 是一个开源项目,每个人都可以私有化部署在自己的服务器。

- - + + \ No newline at end of file diff --git a/zh-Hans/markdown-page/index.html b/zh-Hans/markdown-page/index.html index 609c6b032..3d90f46ba 100644 --- a/zh-Hans/markdown-page/index.html +++ b/zh-Hans/markdown-page/index.html @@ -4,13 +4,13 @@ Markdown page example | Zealot - - + +

Markdown page example

You don't need React to write simple standalone pages.

- - + + \ No newline at end of file