1"use strict";(self.webpackChunkmeshtastic=self.webpackChunkmeshtastic||[]).push([["22726"],{1819(e,t,i){i.r(t),i.d(t,{metadata:()=>n,default:()=>x,frontMatter:()=>c,contentTitle:()=>u,toc:()=>m,assets:()=>h});var n=JSON.parse('{"id":"configuration/module/audio","title":"Audio Module Configuration","description":"Configuration details for the Audio Module of your Meshtastic device.","source":"@site/docs/configuration/module/audio.mdx","sourceDirName":"configuration/module","slug":"/configuration/module/audio","permalink":"/docs/configuration/module/audio","draft":false,"unlisted":false,"editUrl":"https://github.com/meshtastic/meshtastic/edit/master/docs/configuration/module/audio.mdx","tags":[],"version":"current","lastUpdatedBy":"rcarteraz","frontMatter":{"id":"audio","title":"Audio Module Configuration","sidebar_label":"Audio","description":"Configuration details for the Audio Module of your Meshtastic device."},"sidebar":"Sidebar","previous":{"title":"Ambient Lighting","permalink":"/docs/configuration/module/ambient-lighting"},"next":{"title":"Canned Message","permalink":"/docs/configuration/module/canned-message"}}'),r=i(91987),l=i(67008),s=i(87622),o=i(42506),a=i(69671),d=i(82374);let c={id:"audio",title:"Audio Module Configuration",sidebar_label:"Audio",description:"Configuration details for the Audio Module of your Meshtastic device."},u,h={},m=[{value:"Audio Module Config Values",id:"audio-module-config-values",level:2},{value:"Codec2 Enabled",id:"codec2-enabled",level:3},{value:"PTT GPIO",id:"ptt-gpio",level:3},{value:"Audio Bitrate/Codec Mode",id:"audio-bitratecodec-mode",level:3},{value:"I2S Word Select",id:"i2s-word-select",level:3},{value:"I2S Data IN",id:"i2s-data-in",level:3},{value:"I2S Data OUT",id:"i2s-data-out",level:3},{value:"I2S Clock",id:"i2s-clock",level:3},{value:"Audio Module Config Client Availability",id:"audio-module-config-client-availability",level:2},{value:"Android",id:"android",level:3},{value:"Apple",id:"apple",level:3},{value:"CLI",id:"cli",level:3},{value:"Web",id:"web",level:3}];function p(e){let t={admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["The audio module config options are: Codec2 Enabled, PTT ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"}),", Audio Bitrate/Codec Mode, I2S Word Select, I2S Data IN, I2S Data OUT and I2S Clock. Audio Module config uses an admin message sending a ",(0,r.jsx)(t.code,{children:"ConfigModule.Audio"})," ",(0,r.jsx)(s.A,{term:"Protobuf",definition:"A method developed by Google for serializing structured data, used in Meshtastic for efficient communication protocol between devices.",routePath:"/docs/terms/",children:"protobuf"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["With this ",(0,r.jsx)(t.strong,{children:"experimental"})," module, you can add a digital I2S microphone and speaker to any ",(0,r.jsx)(s.A,{term:"ESP32",definition:"A chipset of microcontroller made/designed by Espressif, used by a number of devices. Higher power usage than nRF52, but often cheaper and supports Wi-Fi if desired.",routePath:"/docs/terms/",children:"ESP32"})," device that has a SX128x radio and operates on the 2.4 GHz ISM Band. The Sub-1GHz bands are not wide enough to support continuous audio packets on the mesh, even in the Short and Fast modes. Right now, the only devices supported are the LilyGo TLora 2.1-1.8 and TLora T3S3 boards. The module has been designed for channels with 2kbit / sec of bandwidth or greater."]}),"\n",(0,r.jsx)(t.p,{children:"Required additional hardware:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Max98357 - I2S 3W Class D Amplifier"}),"\n",(0,r.jsx)(t.li,{children:"MSM261S4030H0 - I2S MEMS Low Noise Single Microphone"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"audio-module-config-values",children:"Audio Module Config Values"}),"\n",(0,r.jsx)(t.h3,{id:"codec2-enabled",children:"Codec2 Enabled"}),"\n",(0,r.jsx)(t.p,{children:"Enables the audio module."}),"\n",(0,r.jsx)(t.h3,{id:"ptt-gpio",children:"PTT GPIO"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," to use for the Push-To-Talk button. The default is ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," 39 on the ",(0,r.jsx)(s.A,{term:"ESP32",definition:"A chipset of microcontroller made/designed by Espressif, used by a number of devices. Higher power usage than nRF52, but often cheaper and supports Wi-Fi if desired.",routePath:"/docs/terms/",children:"ESP32"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"audio-bitratecodec-mode",children:"Audio Bitrate/Codec Mode"}),"\n",(0,r.jsxs)(t.p,{children:["The bitrate to use for audio. The default is ",(0,r.jsx)(t.code,{children:"CODEC2_700B"}),". The available options are:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"CODEC2_DEFAULT"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_3200"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_2400"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_1600"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_1400"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_1300"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_1200"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_700B"}),"\n",(0,r.jsx)(t.li,{children:"CODEC2_700"}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"i2s-word-select",children:"I2S Word Select"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," to use for the WS signal in the I2S interface."]}),"\n",(0,r.jsx)(t.h3,{id:"i2s-data-in",children:"I2S Data IN"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," to use for the SD signal in the I2S interface."]}),"\n",(0,r.jsx)(t.h3,{id:"i2s-data-out",children:"I2S Data OUT"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," to use for the DIN signal in the I2S interface."]}),"\n",(0,r.jsx)(t.h3,{id:"i2s-clock",children:"I2S Clock"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," to use for the SCK signal in the I2S interface."]}),"\n",(0,r.jsx)(t.admonition,{title:"What is this?",type:"info",children:(0,r.jsxs)(t.p,{children:["These Pins comprise an I2S digital audio interface. Meshtastic uses it in monoaural mode. The softw
1are will use the logical 'LEFT' Stereo channel for the microphone and the logical 'RIGHT' Stereo channel for the speaker, so configure your breakouts accordingly. Audio is Half-Duplex, so we can re-use part of the pins for a bi-directional configuration. There's ",(0,r.jsx)(t.strong,{children:"no"})," default pin assignment, setting these is mandatory."]})}),"\n",(0,r.jsx)(t.h2,{id:"audio-module-config-client-availability",children:"Audio Module Config Client Availability"}),"\n",(0,r.jsxs)(o.A,{groupId:"settings",defaultValue:"apple",values:[{label:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.In,{icon:"mdi:android",height:"1.5rem",style:{marginRight:"0.25rem"}})," Android"]}),value:"android"},{label:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.In,{icon:"mdi:apple",height:"1.5rem",style:{marginRight:"0.25rem"}})," Apple"]}),value:"apple"},{label:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.In,{icon:"mdi:terminal",height:"1.5rem",style:{marginRight:"0.25rem"}})," CLI"]}),value:"cli"},{label:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.In,{icon:"mdi:internet",height:"1.5rem",style:{marginRight:"0.25rem"}})," Web"]}),value:"web"}],children:[(0,r.jsxs)(a.A,{value:"android",children:[(0,r.jsx)(t.h3,{id:"android",children:"Android"}),(0,r.jsxs)(t.admonition,{type:"info",children:[(0,r.jsx)(t.p,{children:"Audio Config options are available for Android."}),(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"Open the Meshtastic App"}),"\n",(0,r.jsxs)(t.li,{children:["Navigate to: ",(0,r.jsx)(t.strong,{children:"Settings > Audio"})]}),"\n"]})]})]}),(0,r.jsxs)(a.A,{value:"apple",children:[(0,r.jsx)(t.h3,{id:"apple",children:"Apple"}),(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"Audio module config is not available on iOS, iPadOS and macOS."})})]}),(0,r.jsxs)(a.A,{value:"cli",children:[(0,r.jsx)(t.h3,{id:"cli",children:"CLI"}),(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"All audio module config options are available in the python CLI. Example commands are below:"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"center"},children:"Setting"}),(0,r.jsx)(t.th,{style:{textAlign:"center"},children:"Acceptable Values"}),(0,r.jsx)(t.th,{style:{textAlign:"center"},children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.codec2_enabled"}),(0,r.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,r.jsx)(t.code,{children:"true"}),", ",(0,r.jsx)(t.code,{children:"false"})]}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:(0,r.jsx)(t.code,{children:"false"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.ptt_pin"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"GPIO Pin Number 1-39"}),(0,r.jsxs)(t.td,{style:{textAlign:"center"},children:["Default of ",(0,r.jsx)(t.code,{children:"39"})," is Unset"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.bitrate"}),(0,r.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,r.jsx)(t.code,{children:"CODEC2_DEFAULT"})," ",(0,r.jsx)(t.code,{children:"CODEC2_3200"})," ",(0,r.jsx)(t.code,{children:"CODEC2_2400"})," ",(0,r.jsx)(t.code,{children:"CODEC2_1600"})," ",(0,r.jsx)(t.code,{children:"CODEC2_1400"})," ",(0,r.jsx)(t.code,{children:"CODEC2_1300"})," ",(0,r.jsx)(t.code,{children:"CODEC2_1200"})," ",(0,r.jsx)(t.code,{children:"CODEC2_700B"})," ",(0,r.jsx)(t.code,{children:"CODEC2_700"})]}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:(0,r.jsx)(t.code,{children:"CODEC2_DEFAULT"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.i2s_ws"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"GPIO Pin Number 1-34"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"no Default"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.i2s_sd"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"GPIO Pin Number 1-39"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"no Default"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.i2s_din"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"GPIO Pin Number 1-34"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"no Default"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"audio.i2s_sck"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"GPIO Pin Number 1-34"}),(0,r.jsx)(t.td,{style:{textAlign:"center"},children:"no Default"})]})]})]}),(0,r.jsxs)(t.admonition,{type:"tip",children:[(0,r.jsx)(t.p,{children:"Because the device will reboot after each command is sent via CLI, it is recommended when setting multiple values in a config section that commands be chained together as one."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:'title="Example:"',children:"meshtastic --set audio.codec2_enabled true --set audio.bitrate CODEC2_1400\n"})})]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:'title="Enable / Disable Module"',children:"meshtastic --set audio.codec2_enabled true\nmeshtastic --set audio.codec2_enabled false\n"})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:'title="Set WS to GPIO pin number 7"',children:"meshtastic --set audio.i2s_ws 7\n"})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:'title="Set DIN to GPIO pin number 28"',children:"meshtastic --set audio.i2s_din 28\n"})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:'title="Set PTT to GPIO pin number 37"',children:"meshtastic --set audio.ptt_pin 37\n"})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",metastring:'title="Set Codec Bitrate"',children:"meshtastic --set audio.bitrate CODEC2_DEFAULT\nmeshtastic --set audio.bitrate CODEC2_1400\n"})})]}),(0,r.jsxs)(a.A,{value:"web",children:[(0,r.jsx)(t.h3,{id:"web",children:"Web"}),(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"All audio module config options are available in the Web UI."})})]})]}),"\n",(0,r.jsxs)(t.admonition,{type:"warning",children:[(0,r.jsxs)(t.p,{children:[(0,r.jsx)(s.A,{term:"GPIO",definition:"An uncommitted digital signal pin on a device.",routePath:"/docs/terms/",children:"GPIO"})," access is fundamentally dangerous because invalid options can physically damage or destroy your hardware. Ensure that you fully understand the schematic for your particular device before trying this as we do not offer a warranty. Use at your own risk."]}),(0,r.jsx)(t.p,{children:"This module requires attaching a peripheral accessory to your device. It will not work without one."})]})]})}function x(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},69671(e,t,i){i.d(t,{A:()=>
1o});var n=i(91987);i(71763);var r=i(13526),l=i(13897);function s({children:e,className:t,hidden:i}){return(0,n.jsx)("div",{role:"tabpanel",className:(0,r.A)("tabItem_q_8M",t),hidden:i,children:e})}function o({children:e,className:t,value:i}){let{selectedValue:r,lazy:a}=(0,l.uc)(),d=i===r;return!d&&a?null:(0,n.jsx)(s,{className:t,hidden:!d,children:e})}},42506(e,t,i){i.d(t,{A:()=>h});var n=i(91987);i(71763);var r=i(13526),l=i(66977),s=i(13897),o=i(42714),a=i(66928);function d({className:e}){let{selectedValue:t,selectValue:i,tabValues:l,block:a}=(0,s.uc)(),c=[],{blockElementScrollPositionUntilNextRender:u}=(0,o.a_)(),h=e=>{let n=e.currentTarget,r=l[c.indexOf(n)].value;r!==t&&(u(n),i(r))},m=e=>{let t=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{let i=c.indexOf(e.currentTarget)+1;t=c[i]??c[0];break}case"ArrowLeft":{let i=c.indexOf(e.currentTarget)-1;t=c[i]??c[c.length-1]}}t?.focus()};return(0,n.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},e),children:l.map(({value:e,label:i,attributes:l})=>(0,n.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{c.push(e)},onKeyDown:m,onClick:h,...l,className:(0,r.A)("tabs__item","tabItem_Nk8A",l?.className,{"tabs__item--active":t===e}),children:i??e},e))})}function c({children:e}){return(0,n.jsx)("div",{className:"margin-top--md",children:e})}function u({className:e,children:t}){return(0,n.jsxs)("div",{className:(0,r.A)(l.G.tabs.container,"tabs-container","tabList_m28i"),children:[(0,n.jsx)(d,{className:e}),(0,n.jsx)(c,{children:t})]})}function h(e){let t=(0,a.A)(),i=(0,s.OC)(e);return(0,n.jsx)(s.O_,{value:i,children:(0,n.jsx)(u,{className:e.className,children:(0,s.vT)(e.children)})},String(t))}},13897(e,t,i){i.d(t,{OC:()=>h,O_:()=>x,uc:()=>p,vT:()=>c});var n=i(91987),r=i(71763),l=i(66532),s=i(98532),o=i(50191),a=i(10644),d=i(16957);function c(e){return r.Children.toArray(e).filter(e=>"\n"!==e)}function u({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h(e){let t,{defaultValue:i,queryString:n=!1,groupId:c}=e,h=function(e){let{values:t,children:i}=e;return(0,r.useMemo)(()=>{let e=t??r.Children.toArray(i).flatMap(e=>{if(!e)return[];if((0,r.isValidElement)(e)&&function(e){let{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return[e];let t="string"==typeof e.type?e.type:e.type.name;throw Error(`Docusaurus error: Bad <Tabs> child <${t}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop. 2If 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:t,attributes:i,default:n}})=>({value:e,label:t,attributes:i,default:n})),n=(0,a.XI)(e,(e,t)=>e.value===t.value);if(n.length>0)throw Error(`Docusaurus error: Duplicate values "${n.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`);return e},[t,i])}(e),[m,p]=(0,r.useState)(()=>(function({defaultValue:e,tabValues:t}){if(0===t.length)throw Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!u({value:e,tabValues:t}))throw Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" 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 e}let i=t.find(e=>e.default)??t[0];if(!i)throw Error("Unexpected error: 0 tabValues");return i.value})({defaultValue:i,tabValues:h})),[x,g]=function({queryString:e=!1,groupId:t}){let i=(0,l.W6)(),n=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw 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:e,groupId:t});return[(0,o.aZ)(n),(0,r.useCallback)(e=>{if(!n)return;let t=new URLSearchParams(i.location.search);t.set(n,e),i.replace({...i.location,search:t.toString()})},[n,i])]}({queryString:n,groupId:c}),[f,j]=function({groupId:e}){let t=e?`docusaurus.tab.${e}`:null,[i,n]=(0,d.Dv)(t);return[i,(0,r.useCallback)(e=>{t&&n.set(e)},[t,n])]}({groupId:c}),b=u({value:t=x??f,tabValues:h})?t:null;return(0,s.A)(()=>{b&&p(b)},[b]),{selectedValue:m,selectValue:(0,r.useCallback)(e=>{if(!u({value:e,tabValues:h}))throw Error(`Can't select invalid tab value=${e}`);p(e),g(e),j(e)},[g,j,h]),tabValues:h,lazy:e.lazy??!1,block:e.block??!1}}let m=(0,r.createContext)(null);function p(){let e=r.useContext(m);if(!e)throw Error("useTabsContext() must be used within a Tabs component");return e}function x(e){return(0,n.jsx)(m.Provider,{value:e.value,children:e.children})}},87622(e,t,i){i.d(t,{A:()=>s});var n=i(71763),r=i(37773),l=i(91987);function s({term:e,definition:t,abbreviation:i,routePath:o="/glossary",children:a}
2){let[d,c]=(0,n.useState)(!1),[u,h]=(0,n.useState)(null),[m,p]=(0,n.useState)("top"),x=(0,n.useRef)(null),g=(0,n.useRef)(null),f=(0,n.useCallback)(()=>{let e;if(!x.current||!g.current)return;let t=x.current.getBoundingClientRect(),i=g.current.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,l=document.querySelector(".navbar"),s=l?l.getBoundingClientRect().bottom:0,o=t.top-s>=i.height+8,a=r-t.bottom>=i.height+8,d=o||!a?"top":"bottom";e="top"===d?t.top-i.height-8:t.bottom+8;let c=t.left+t.width/2-i.width/2;c=Math.max(8,Math.min(c,n-i.width-8)),p(d),h({top:Math.max(s+4,e),left:c})},[]);(0,n.useEffect)(()=>{let e;if(!d)return;let t=requestAnimationFrame(()=>{e=requestAnimationFrame(()=>{f()})}),i=()=>f(),n=()=>f();return window.addEventListener("scroll",i,!0),window.addEventListener("resize",n),()=>{cancelAnimationFrame(t),e&&cancelAnimationFrame(e),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",n)}},[d,f]);let j=(0,r.P_)("docusaurus-plugin-glossary"),b=(0,n.useMemo)(()=>{if(t&&"string"==typeof t&&t.length>0)return t;let i=(j&&j.terms||[]).find(t=>"string"==typeof t.term&&t.term.toLowerCase()===String(e).toLowerCase());return i&&i.definition?i.definition:void 0},[t,j,e]),v=(0,n.useMemo)(()=>{let t=i;if(!t){let i=(j&&j.terms||[]).find(t=>"string"==typeof t.term&&t.term.toLowerCase()===String(e).toLowerCase());t=i&&i.abbreviation}if("string"!=typeof t)return;let n=t.trim();if(n&&n.toLowerCase()!==String(e).toLowerCase())return n},[i,j,e]),A=(0,n.useMemo)(()=>o&&"string"==typeof o&&o.length>0?o:j&&j.routePath||"/glossary",[j,o]),y=a||e,C=e.toLowerCase().replace(/\s+/g,"-");return(0,l.jsxs)("span",{ref:x,className:"glossaryTermWrapper_ud7W",children:[(0,l.jsx)("a",{href:`${A}#${C}`,className:"glossaryTerm_x2nJ",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),onFocus:()=>c(!0),onBlur:()=>c(!1),"aria-describedby":`tooltip-${C}`,children:y}),b&&(0,l.jsxs)("span",{ref:g,id:`tooltip-${C}`,className:`tooltip_WjgA ${d?"tooltipVisible_AjfD":""} ${"top"===m?"tooltipTop_uMN4":"tooltipBottom_U9P5"} tooltipFloating_nLk7`,role:"tooltip",style:d&&u?{top:`${u.top}px`,left:`${u.left}px`}:void 0,children:[(0,l.jsx)("strong",{children:e}),v?` (${v}). `:"",b]})]})}}}]);
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.