1"use strict";(globalThis.webpackChunkpassbolt_docs||=[]).push([[2126],{29155(e,n,t){t.d(n,{Ay:()=>a});var s=t(74848),r=t(28453);function i(e){const n={h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"if-you-run-into-some-issues",children:"If you run into some issues"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Make a copy or screenshot of the errors messages displayed on the screen"}),"\n",(0,s.jsx)(n.li,{children:"Check for error message in the logs directory"}),"\n",(0,s.jsx)(n.li,{children:"Check for error message in the browser console"}),"\n",(0,s.jsx)(n.li,{children:"Checkout the previous working version using git"}),"\n",(0,s.jsx)(n.li,{children:"Drop the database and load your backup data to restore to a previously working version"}),"\n",(0,s.jsx)(n.li,{children:"Note down the the details of you environment: your OS, php, MariaDB environment versions."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Where to get help:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you are a Passbolt Pro Edition subscriber send us an email with the details."}),"\n",(0,s.jsx)(n.li,{children:"If you are a Passbolt Community Edition user you can open new thread on the community forum."}),"\n",(0,s.jsx)(n.li,{children:"The more information you provide about what you did, what you tried, how your environment look like, the easiest it will be for people to help you."}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}t.d(n,["RM",0,[{value:"If you run into some issues",id:"if-you-run-into-some-issues",level:2}]])},58432(e,n,t){t.d(n,{Ay:()=>o});var s=t(74848),r=t(28453),i=t(37871);function a(e){const n={a:"a",code:"code",h3:"h3",h4:"h4",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"6-troubleshooting",children:"6. Troubleshooting"}),"\n",(0,s.jsx)(n.p,{children:"After the update, the server should automatically ran a dry run of the cleanup to let you know if there is any data integrity issues."}),"\n",(0,s.jsx)(n.h4,{id:"no-issues-found",children:"No issues found"}),"\n",(0,s.jsx)(n.p,{children:"If you see an output that looks like this:"}),"\n",(0,s.jsx)(i.A,{children:"Open source password manager for teams\n-------------------------------------------------------------------------------\nCleanup shell (dry-run)\n-------------------------------------------------------------------------------\nNo issue found, data looks squeaky clean!"}),"\n",(0,s.jsx)(n.p,{children:"It means that you don't have any database integrity issues, you can move forward and run the healthCheck!"}),"\n",(0,s.jsx)(n.h4,{id:"issues-found",children:"Issues found"}),"\n",(0,s.jsx)(i.A,{children:"Open source password manager for teams\n-------------------------------------------------------------------------------\nCleanup shell (dry-run)\n-------------------------------------------------------------------------------\nN issues found in table Y (data integrity message)\nN issues detected, please re-run without --dry-run to fix."}),"\n",(0,s.jsx)(n.p,{children:"Some data integrity issues have been found, to resolve them, you need to re-run the cleanup without the dry run flags:"}),"\n",(0,s.jsx)(i.A,{children:`sudo -H -u ${e.webServerUser.toLowerCase()} bash -c "/usr/share/php/passbolt/bin/cake passbolt cleanup"`}),"\n",(0,s.jsx)(n.p,{children:"You can also run the following command to ensure everything is working properly:"}),"\n",(0,s.jsx)(i.A,{children:`sudo -H -u ${e.webServerUser.toLowerCase()} bash -c "/usr/share/php/passbolt/bin/cake passbolt healthcheck"`}),"\n",(0,s.jsx)(n.h4,{id:"the-update-is-blocked-by-php-dependencies",children:"The update is blocked by PHP dependencies"}),"\n",(0,s.jsx)(n.p,{children:"Since passbolt v5.0.0, the passbolt server package requires PHP 8.2 or newer. If the repositories of your operating system release do not provide PHP 8.2, the package manager cannot install the new passbolt version and your instance stays on the last version compatible with your PHP."}),"\n",(0,s.jsxs)(s.Fragment,{children:["apt"===e.distributionPackage&&(0,s.jsx)(i.A,{children:"The following packages have been kept back:\npassbolt-ce-server\n0 to upgrade, 0 to newly install, 0 to remove and 1 not to upgrade."}),"apt"!==e.distributionPackage&&(0,s.jsx)(i.A,{children:"Problem: cannot install the best update candidate for package passbolt-ce-server\n- nothing provides php-fpm >= 8.2 needed by passbolt-ce-server"})]}),"\n",(0,s.jsx)(s.Fragment,{children:"apt"===e.distributionPackage&&(0,s.jsxs)("p",{children:["Trying to install the package directly instead fails with ",(0,s.jsx)("code",{children:"E: Unable to correct problems, you have held broken packages."})]})}),"\n",(0,s.jsxs)(n.p,{children:["In this situation, update your server to an operating system release that provides PHP 8.2 or newer, or migrate passbolt to a fresh server running a supported release by following the ",(0,s.jsx)(n.a,{href:"/hosting/migrate/",children:"migration guides"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"ldap-synchronisation-stops-working-after-the-update-pro-edition",children:"LDAP synchronisation stops working after the update (Pro Edition)"}),"\n",(0,s.jsxs)(n.p,{children:["Since passbolt v5.12.0, the passbolt server package requires the ",(0,s.jsx)(n.code,{children:"php-ldap"})," extension on all editions, and the package manager installs it automatically during the update."]}),"\n",(0,s.jsx)(s.Fragment,{children:"apt"===e.distributionPackage&&(0,s.jsxs)("p",{children:["On Debian and Ubuntu servers using a third-party PHP repository (such as sury.org or the ondrej PPA), ",(0,s.jsx)("code",{children:"php-ldap"})," is a metapackage that follows the repository default PHP version, which can be newer than the PHP version running passbolt. In that case the update installs the LDAP extension for the wrong PHP version, the ",(0,s.jsx)("code",{children:"ldap_*"})," PHP functions stay missing, and the directory synchronisation fails."]})}),"\n",(0,s.jsx)(s.Fragment,{children:"apt"===e.distributionPackage&&(0,s.jsx)("p",{children:"Install the extension matching the PHP version that serves passbolt, then restart PHP-FPM. For example, for PHP 8.2:"})}),"\n",(0,s.jsx)(s.Fragment,{children:"apt"===e.distributionPackage&&(0,s.jsx)(i.A,{children:"sudo apt install php8.2-ldap\nsudo systemctl restart php8.2-fpm"})}),"\n",(0,s.jsx)(n.p,{children:"If the directory synchronisation still fails after the update, verify the LDAP extension is loaded for the PHP version passbolt runs on before investigating the directory configuration itself."})]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}t.d(n,["RM",0,[{value:"6. Troubleshooting",id:"6-troubleshooting",level:3},{value:"No issues found",id:"no-issues-found",level:4},{value:"Issues found",id:"issues-found",level:4},{value:"The update is blocked by PHP dependencies",id:"the-update-is-blocked-by-php-dependencies",level:4},{value:"LDAP synchronisation stops working after the update (Pro Edition)",id:"ldap-synchronisation-stops-working-after-the-update-pro-edition",level:4}]])},37825(e,n,t){t.d(n,{Ay:()=>d,RM:()=>l});var s=t(74848),r=t(28453);function i(e){const n={admonition:"admonition",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{title:"Please note",type:"caution",children:(0,s.jsx)(n.p,{children:"It is important that you use a vanilla server with no other services or tools already installed on it. The install scripts could potentially damage any existing data on your server."})}),"\n",(0,s.jsx)(n.admonition,{title:"Pro tip",type:"info",children:(0,s.jsx)(n.p,{children:"If you are going to manually provision SSL certificates you may want to do that before beginning!"})})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}var o=t(28774);const l=[{value:"Prerequisites",id:"prerequisites",level:2}];function u(e){const n={h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)("div",{children:[(0,s.jsx)(n.p,{children:"For this tutorial, you will need:"}),(0,s.jsxs)("ul",{children:["Raspberry"===e.distributionLabel?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("li",{children:"Any Raspberry Pi model that supports 64-bit OS (e.g., Raspberry Pi 3, 4, or later)."}),(0,s.jsx)("li",{children:"A 64-bit version of Raspberry Pi OS Lite (formerly Raspbian) or any OS based on Debian 13 Trixie. Raspberry Pi has discontinued 32-bit support for some configurations, so a 64-bit OS is required for this installation."})]}):(0,s.jsxs)("li",{children:["A minimal ",e.distributionLabel," ",e.distributionVersion," server."]}),"updatePackage"===e.type?(0,s.jsx)(s.Fragment,{children:(0,s.jsxs)("li",{children:["Passbolt ",e.distributionLabel," ",e.distributionVersion," package installed."]})}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("li",{children:"A domain / host name pointing to your server, or at least being able to reach your server through a static IP address."}),(0,s.jsx)("li",{children:"A working SMTP server for email notifications"}),(0,s.jsx)("li",{children:"A working NTP service to avoid GPG authentication issues"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"The recommended server requirements are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"2 cores"}),"\n",(0,s.jsx)(n.li,{children:"2GB of RAM"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"FAQ pages:"}),"\n",(0,s.jsx)("div",{children:(0,s.jsxs)("ul",{children:["Debian"!==e.distributionLabel&&"Ubuntu"!==e.distributionLabel&&"Raspberry"!==e.distributionLabel&&(0,s.jsx)("li",{children:(0,s.jsx)(o.A,{to:"/hosting/install/advanced/haveged-on-vms",children:"Considerations about entropy"})}),(0,s.jsx)("li",{children:(0,s.jsx)(o.A,{to:"/docs/hosting/ntp",children:"Set up NTP"})}),(0,s.jsx)("li",{children:(0,s.jsx)(o.A,{to:"/docs/hosting/firewall-rules",children:"Firewall rules"})})]})}),"\n","updatePackage"!==e.type?(0,s.jsx)(a,{}):null]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},95268(e,n,t){t.d(n,{Ay:()=>y,RM:()=>g});var s=t(74848),r=t(28453),i=t(37871);function a(e){const n={admonition:"admonition",p:"p",...(0,r.R)(),...e.components};return(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Sometimes, while updating when there is also an update to MySQL/MariaDB you will get an error on the upgrade step. That's why we are suggesting to manually upgrade passbolt prior to system upgrade"})})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}var l=t(83457);function u(e){return(0,s.jsx)(l.A,{children:"sudo apt update\nsudo apt --only-upgrade install passbolt-ce-server\nsudo apt upgrade"})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u()}function c(e){return(0,s.jsx)(l.A,{children:"sudo apt update\nsudo apt --only-upgrade install passbolt-pro-server\nsudo apt upgrade"})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c()}var p=t(4865),b=t(19365);const g=[{value:"Update passbolt",id:"update-passbolt",level:2},{value:"1. Take down your site",id:"1-take-down-your-site",level:3}
1,{value:"2. Backup your database",id:"2-backup-your-database",level:3},{value:"3. Upgrade your system",id:"3-upgrade-your-system",level:3},{value:"4. Clear the cache",id:"4-clear-the-cache",level:3},{value:"5. Bring your site back online",id:"5-bring-your-site-back-online",level:3}];function m(e){const n={h2:"h2",h3:"h3",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"update-passbolt",children:"Update passbolt"}),"\n",(0,s.jsx)(n.h3,{id:"1-take-down-your-site",children:"1. Take down your site"}),"\n",(0,s.jsx)(n.p,{children:"It is generally a good idea to stop running the site prior to the upgrade. This is to avoid having side effects such as active users corrupting the data in the middle of an upgrade."}),"\n",(0,s.jsx)(i.A,{children:"sudo systemctl stop nginx"}),"\n",(0,s.jsx)(n.h3,{id:"2-backup-your-database",children:"2. Backup your database"}),"\n",(0,s.jsx)(n.p,{children:"It is recommended to always perform a backup of your passbolt installation. Please check the backup article"}),"\n",(0,s.jsx)(n.h3,{id:"3-upgrade-your-system",children:"3. Upgrade your system"}),"\n",(0,s.jsx)(s.Fragment,{children:"Debian"===e.distributionLabel||"Ubuntu"===e.distributionLabel||"Raspberry"===e.distributionLabel?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o,{}),(0,s.jsxs)(p.A,{groupId:"editions",children:[(0,s.jsx)(b.A,{value:"CE Edition",children:(0,s.jsx)(d,{})}),(0,s.jsx)(b.A,{value:"PRO Edition",children:(0,s.jsx)(h,{})})]})]}):"Virtual Appliance"===e.distributionLabel?(0,s.jsx)(h,{}):"Digital Ocean"===e.distributionLabel?(0,s.jsx)(d,{}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("p",{children:["This commands will trigger an upgrade on your whole ",`${e.distributionLabel} ${e.distributionVersion}`," system:"]}),(0,s.jsx)(i.A,{children:`sudo ${e.distributionPackage} update`})]})}),"\n",(0,s.jsx)(n.h3,{id:"4-clear-the-cache",children:"4. Clear the cache"}),"\n",(0,s.jsx)(n.p,{children:"Finally make sure you clear the application cache, to make sure any changes in the database structure are reflected in model cache files:"}),"\n",(0,s.jsx)(i.A,{children:`sudo -H -u ${e.distributionWebUser} bash -c "/usr/share/php/passbolt/bin/cake cache clear_all"`}),"\n",(0,s.jsx)(n.h3,{id:"5-bring-your-site-back-online",children:"5. Bring your site back online"}),"\n",(0,s.jsx)(n.p,{children:"Almost done:"}),"\n",(0,s.jsx)(i.A,{children:"sudo systemctl start nginx"})]})}function y(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}},72228(e,n,t){t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>h,default:()=>m,frontMatter:()=>c,metadata:()=>s,toc:()=>b});const s=JSON.parse('{"id":"hosting/update/ubuntu","title":"Update Passbolt on Ubuntu 26.04","description":"Update Passbolt on Ubuntu 26.04","source":"@site/docs/hosting/update/ubuntu.mdx","sourceDirName":"hosting/update","slug":"/hosting/update/ubuntu","permalink":"/docs/hosting/update/ubuntu","draft":false,"unlisted":false,"editUrl":"https://github.com/passbolt/passbolt-docs/blob/main/docs/hosting/update/ubuntu.mdx","tags":[],"version":"current","lastUpdatedAt":1787560037000,"frontMatter":{"title":"Update Passbolt on Ubuntu 26.04","description":"Update Passbolt on Ubuntu 26.04","sidebar_label":"Ubuntu 26.04","hide_table_of_contents":true},"sidebar":"hostingGuideSidebar","previous":{"title":"SUSE Linux Enterprise Server 16","permalink":"/docs/hosting/update/sles"},"next":{"title":"Virtual Appliance","permalink":"/docs/hosting/update/virtual-appliance"}}');var r=t(74848),i=t(28453),a=t(37825),o=t(95268),l=t(58432),u=t(29155),d=t(25515);const c={title:"Update Passbolt on Ubuntu 26.04",description:"Update Passbolt on Ubuntu 26.04",sidebar_label:"Ubuntu 26.04",hide_table_of_contents:!0},h=void 0,p={},b=[...a.RM,...o.RM,...l.RM,...u.RM];function g(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{style:{display:"flex",gap:"1rem"},children:[(0,r.jsx)(d.A,{link:"https://www.passbolt.com/ce/ubuntu",isUnderMainTitle:!0,children:"CE"}),(0,r.jsx)(d.A,{link:"https://www.passbolt.com/pricing/pro",isUnderMainTitle:!0,children:"Pro"})]}),"\n",(0,r.jsx)(a.Ay,{distributionLabel:"Ubuntu",distributionVersion:"26.04",type:"updatePackage"}),"\n",(0,r.jsx)(o.Ay,{distributionPackage:"apt",distributionLabel:"Ubuntu",distributionVersion:"26.04",distributionWebUser:"www-data"}),"\n",(0,r.jsx)(l.Ay,{distributionPackage:"apt",webServerUser:"www-data"}),"\n",(0,r.jsx)(u.Ay,{})]})}function m(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(g,{...e})}):g()}},19365(e,n,t){t.d(n,{A:()=>l});t(96540);var s=t(18215),r=t(47751);const i="tabItem_Ymn6";var a=t(74848);function o({children:e,className:n,hidden:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(i,n),hidden:t,children:e})}function l({children:e,className:n,value:t}){const{selectedValue:s,lazy:i}=(0,r.uc)(),l=t===s;return!l&&i?null:(0,a.jsx)(o,{className:n,hidden:!l,children:e})}},4865(e,n,t){t.d(n,{A:()=>b});t(96540);var s=t(18215),r=t(17559),i=t(47751),a=t(23104),o=t(92303);const l="tabList__CuJ",u="tabItem_LNqP";var d=t(74848);function c({className:e}){const{selectedValue:n,selectValue:t,tabValues:r,block:o}=(0,i.uc)(),l=[],{blockElementScrollPositionUntilNextRender:c}
1=(0,a.a_)(),h=e=>{const s=e.currentTarget,i=l.indexOf(s),a=r[i].value;a!==n&&(c(s),t(a))},p=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,d.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":o},e),children:r.map(({value:e,label:t,attributes:r})=>(0,d.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{l.push(e)},onKeyDown:p,onClick:h,...r,className:(0,s.A)("tabs__item",u,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function h({children:e}){return(0,d.jsx)("div",{className:"margin-top--md",children:e})}function p({className:e,children:n}){return(0,d.jsxs)("div",{className:(0,s.A)(r.G.tabs.container,"tabs-container",l),children:[(0,d.jsx)(c,{className:e}),(0,d.jsx)(h,{children:n})]})}function b(e){const n=(0,o.A)(),t=(0,i.OC)(e);return(0,d.jsx)(i.O_,{value:t,children:(0,d.jsx)(p,{className:e.className,children:(0,i.vT)(e.children)})},String(n))}},47751(e,n,t){t.d(n,{OC:()=>b,O_:()=>y,uc:()=>m,vT:()=>d});var s=t(96540),r=t(56347),i=t(205),a=t(57485),o=t(70679),l=t(31682),u=t(74848);function d(e){return s.Children.toArray(e).filter(e=>"\n"!==e)}function c(e){const{values:n,children:t}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return s.Children.toArray(e).flatMap(e=>{if(!e)return[];if((0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return[e];const n="string"==typeof e.type?e.type:e.type.name;throw new Error(`Docusaurus error: Bad <Tabs> child <${n}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.\nIf you do not want to pass on a "value" prop to the direct children of <Tabs>, you can also pass an explicit <Tabs values={...}> prop.`)}).map(({props:{value:e,label:n,attributes:t,default:s}})=>({value:e,label:n,attributes:t,default:s}))}(t);return function(e){const n=(0,l.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function p({queryString:e=!1,groupId:n}){const t=(0,r.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!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:e,groupId:n});return[(0,a.aZ)(i),(0,s.useCallback)(e=>{if(!i)return;const n=new URLSearchParams(t.location.search);n.set(i,e),t.replace({...t.location,search:n.toString()})},[i,t])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,a=c(e),[l,u]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" 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 e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[d,b]=p({queryString:t,groupId:r}),[g,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,o.Dv)(n);return[t,(0,s.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),y=(()=>{const e=d??g;return h({value:e,tabValues:a})?e:null})();(0,i.A)(()=>{y&&u(y)},[y]);return{selectedValue:l,selectValue:(0,s.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);u(e),b(e),m(e)},[b,m,a]),tabValues:a,lazy:e.lazy??!1,block:e.block??!1}}const g=(0,s.createContext)(null);function m(){const e=s.useContext(g);if(!e)throw new Error("useTabsContext() must be used within a Tabs component");return e}function y(e){return(0,u.jsx)(g.Provider,{value:e.value,children:e.children})}},25515(e,n,t){t.d(n,{A:()=>c});var s=t(28774),r=t(5556),i=t.n(r);const a="chips_cpy_",o="link_WvDp",l="under-main-menu_SavF";var u=t(74848);const d=({children:e,link:n="",isUnderMainTitle:t=!1})=>{if(!e)return null;const r=n.length>0;return(0,u.jsx)("div",{className:`${t?l:""}`,children:r?(0,u.jsx)(s.A,{className:`${a} ${o}`,to:n,target:"_blank",children:e}):(0,u.jsx)("span",{className:a,children:e})})};d.propTypes={children:i().oneOfType([i().arrayOf(i().node),i().node]).isRequired,isUnderMainTitle:i().bool,link:i().string};const c=d},37871(e,n,t){var s=t(83457),r=t(5556),i=t.n(r),a=t(74848);const o=({children:e})=>e?(0,a.jsx)(s.A,{className:"bash",children:e}):null;o.propTypes={children:i().oneOfType([i().arrayOf(i().node),i().node]).isRequired};const l=o;t.d(n,["A",0,l])}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.