PageSourceSearch

https://www.rabbitmq.com/assets/js/38633b63.cf4c29a0.js

js rabbitmq.com collected 2026-09-24 06:06:02 UTC 23,365 bytes, 2 lines download raw bytes

1"use strict";(self.webpackChunkrabbitmq_website=self.webpackChunkrabbitmq_website||[]).push([["17190"],{71881(e,s,n){n.r(s),n.d(s,{metadata:()=>a,default:()=>p,frontMatter:()=>o,contentTitle:()=>u,toc:()=>d,assets:()=>c});var a=JSON.parse('{"id":"ttl","title":"Time-To-Live and Expiration","description":"\x3c!--","source":"@site/versioned_docs/version-4.1/ttl.md","sourceDirName":".","slug":"/ttl","permalink":"/docs/4.1/ttl","draft":false,"unlisted":false,"editUrl":"https://github.com/rabbitmq/rabbitmq-website/tree/main/versioned_docs/version-4.1/ttl.md","tags":[],"version":"4.1","frontMatter":{"title":"Time-To-Live and Expiration"},"sidebar":"docsSidebar","previous":{"title":"Classic Queues","permalink":"/docs/4.1/classic-queues"},"next":{"title":"Queue Length","permalink":"/docs/4.1/maxlength/"}}'),i=n(74848),t=n(28453),r=n(50773),l=n(57250);let o={title:"Time-To-Live and Expiration"},u="Time-to-Live and Expiration",c={},d=[{value:"Time-To-Live Feature",id:"overview",level:2},{value:"Per-Queue Message TTL in Queues",id:"per-queue-message-ttl",level:2},{value:"Define Message TTL for Queues Using a Policy",id:"message-ttl-using-policy",level:3},{value:"Define Message TTL for Queues Using x-arguments During Declaration",id:"message-ttl-using-x-args",level:3},{value:"Per-Message TTL in Publishers",id:"per-message-ttl-in-publishers",level:2},{value:"Per-Message TTL and Dead Lettering",id:"message-ttl-dead-lettering",level:2},{value:"Quorum Queues",id:"quorum-queues",level:3},{value:"Classic Queues",id:"classic-queues",level:3},{value:"Per-message TTL Applied Retroactively (to an Existing Queue)",id:"message-ttl-applied-retroactively",level:2},{value:"Queue TTL",id:"queue-ttl",level:2},{value:"Define Queue TTL for Queues Using a Policy",id:"queue-ttl-using-policy",level:3},{value:"Define Queue TTL for Queues Using x-arguments During Declaration",id:"queue-ttl-using-x-args",level:3}];function h(e){let s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"time-to-live-and-expiration",children:"Time-to-Live and Expiration"})}),"\n",(0,i.jsx)(s.p,{children:"Key topics covered in this documentation guide are"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"An overview of queue TTL and message TTL features supported by RabbitMQ"}),"\n",(0,i.jsxs)(s.li,{children:["Per-queue ",(0,i.jsx)(s.a,{href:"#per-queue-message-ttl",children:"message TTL defined at the queue level"})]}),"\n",(0,i.jsxs)(s.li,{children:["Per-message ",(0,i.jsx)(s.a,{href:"#per-message-ttl-in-publishers",children:"TTL defined by publishers"})]}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"#message-ttl-dead-lettering",children:"Message TTL and dead lettering"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"#message-ttl-applied-retroactively",children:"Message TTL applied retroactively"})}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"#queue-ttl",children:"Queue TTL"})," (expiration of queues)"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"overview",children:"Time-To-Live Feature"}),"\n",(0,i.jsx)(s.p,{children:'With RabbitMQ, you can set a TTL (time-to-live) argument or policy for messages and queues. As the name suggests, TTL specifies the time period that the messages and queues "live for".'}),"\n",(0,i.jsx)(s.p,{children:"Message TTL determines how long messages can be retained in a queue. If the retention period of a message in a queue exceeds the message TTL of the queue, the message expires and is discarded."}),"\n",(0,i.jsxs)(s.p,{children:['"Discarded" means that the message will not be delivered to any of subscribed consumers and won\'t be accessible through ',(0,i.jsx)(s.code,{children:"basic.get"})," method applied directly on queue. Message TTL can be applied to a single queue, a group of queues, or applied on the message-by-message basis."]}),"\n",(0,i.jsx)(s.p,{children:"TTL can also be set on queues, not just queue contents. This feature can be used together with the auto-delete queue property. Setting TTL (expiration) on queues generally only makes sense for transient (non-durable) classic queues. Streams do not support expiration."}),"\n",(0,i.jsx)(s.p,{children:"Queues will expire after a period of time only when they are not used (a queue is used if it has online consumers)."}),"\n",(0,i.jsxs)(s.p,{children:["TTL behavior is controlled by ",(0,i.jsx)(s.a,{href:"./queues",children:"optional queue arguments"})," and the best way to configure it is using a ",(0,i.jsx)(s.a,{href:"./parameters",children:"policy"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["TTL settings also can be enforced by ",(0,i.jsx)(s.a,{href:"./policies#operator-policies",children:"operator policies"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"per-queue-message-ttl",children:"Per-Queue Message TTL in Queues"}),"\n",(0,i.jsxs)(s.p,{children:["Message TTL can be set for a given queue by setting the\n",(0,i.jsx)(s.code,{children:"message-ttl"})," argument with a ",(0,i.jsx)(s.a,{href:"./policies",children:"policy"}),"\nor by specifying the same argument at the time of queue declaration."]}),"\n",(0,i.jsxs)(s.p,{children:["A message that has been in the queue for longer than the configured TTL is said to\nbe ",(0,i.jsx)(s.em,{children:"expired"}),". Note that a message routed to multiple queues\ncan expire at different times, or not at all, in each queue in\nwhich it resides. The death of a message in one queue has no\nimpact on the life of the same message in other queues."]}),"\n",(0,i.jsxs)(s.p,{children:["The server ",(0,i.jsx)(s.strong,{children:"guarantees"})," that expired messages will not be delivered\nusing ",(0,i.jsx)(s.code,{children:"basic.deliver"})," (to a consumer) or sent in response to a polling consumer\n(in a ",(0,i.jsx)(s.code,{children:"basic.get-ok"})," response)."]}),"\n",(0,i.jsx)(s.p,{children:"Further, the server will try to remove messages at or\nshortly after their TTL-based expiry."}),"\n",(0,i.jsxs)(s.p,{children:["The value of the TTL argument or policy must be ",(0,i.jsx)(s.strong,{children:"a\nnon-negative integer"})," (equal to or greater than zero),\ndescribing the TTL period in milliseconds."]}),"\n",(0,i.jsxs)(s.p,{children:["Thus a value of\n1000 means that a message added to the queue will live in the\nqueue for 1 second or until it is delivered to a consumer. The\n
1argument can be of AMQP 0-9-1 type ",(0,i.jsx)(s.code,{children:"short-short-int"}),", ",(0,i.jsx)(s.code,{children:"short-int"}),",\n",(0,i.jsx)(s.code,{children:"long-int"}),", or ",(0,i.jsx)(s.code,{children:"long-long-int"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"message-ttl-using-policy",children:"Define Message TTL for Queues Using a Policy"}),"\n",(0,i.jsx)(s.p,{children:'To specify a TTL using policy, add the key "message-ttl" to a\npolicy definition:'}),"\n",(0,i.jsxs)(r.A,{groupId:"examples",children:[(0,i.jsx)(l.A,{value:"bash",label:"rabbitmqctl with bash",default:!0,children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'rabbitmqctl set_policy TTL ".*" \'{"message-ttl":60000}\' --apply-to queues\n'})})}),(0,i.jsx)(l.A,{value:"rabbitmqadmin",label:"rabbitmqadmin with bash",children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'rabbitmqadmin policies declare \\\n    --name "TTL" \\\n    --pattern ".*" \\\n    --definition \'{"message-ttl":60000}\' \\\n    --apply-to "queues"\n'})})}),(0,i.jsx)(l.A,{value:"PowerShell",label:"rabbitmqctl with PowerShell",children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-PowerShell",children:'rabbitmqctl.bat set_policy TTL ".*" "{""message-ttl"":60000}" --apply-to queues\n'})})}),(0,i.jsx)(l.A,{value:"rabbitmqadmin-PowerShell",label:"rabbitmqadmin with PowerShell",children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-PowerShell",children:'rabbitmqadmin.exe policies declare ^\n    --name "TTL" ^\n    --pattern ".*" ^\n    --definition "{""message-ttl"":60000}" ^\n    --apply-to "queues"\n'})})})]}),"\n",(0,i.jsx)(s.p,{children:"This applies a TTL of 60 seconds to all queues."}),"\n",(0,i.jsx)(s.h3,{id:"message-ttl-using-x-args",children:"Define Message TTL for Queues Using x-arguments During Declaration"}),"\n",(0,i.jsx)(s.p,{children:"This example in Java creates a queue in which messages may\nreside for at most 60 seconds:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-java",children:'Map<String, Object> args = new HashMap<String, Object>();\nargs.put("x-message-ttl", 60000);\nchannel.queueDeclare("myqueue", false, false, false, args);\n'})}),"\n",(0,i.jsx)(s.p,{children:"The same example in C#:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-csharp",children:'var args = new Dictionary<string, object>();\nargs.Add("x-message-ttl", 60000);\nmodel.QueueDeclare("myqueue", false, false, false, args);\n'})}),"\n",(0,i.jsxs)(s.p,{children:["It is possible to apply a message TTL policy to a queue which already\nhas messages in it but this involves ",(0,i.jsx)(s.a,{href:"#message-ttl-applied-retroactively",children:"some caveats"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"The original expiry time of a message is preserved if it\nis requeued (for example due to the use of an AMQP method\nthat features a requeue parameter, or due to a channel\nclosure)."}),"\n",(0,i.jsxs)(s.p,{children:["Setting the TTL to 0 causes messages to be expired upon reaching\na queue unless they can be delivered to a consumer\nimmediately. Thus this provides an alternative to\nthe ",(0,i.jsx)(s.code,{children:"immediate"})," publishing flag, which\nthe RabbitMQ server does not support. Unlike that flag, no\n",(0,i.jsx)(s.code,{children:"basic.return"}),"s are issued, and if a dead letter\nexchange is set then messages will be dead-lettered."]}),"\n",(0,i.jsx)(s.h2,{id:"per-message-ttl-in-publishers",children:"Per-Message TTL in Publishers"}),"\n",(0,i.jsxs)(s.p,{children:["A TTL can be specified on a per-message basis, by setting the\n",(0,i.jsxs)(s.a,{href:"./publishers#message-properties",children:[(0,i.jsx)(s.code,{children:"expiration"})," property"]})," when publishing a message."]}),"\n",(0,i.jsxs)(s.p,{children:["The value of the ",(0,i.jsx)(s.code,{children:"expiration"})," field describes the\nTTL period in milliseconds. The same constraints as for\n",(0,i.jsx)(s.code,{children:"x-message-ttl"})," apply. Since the\n",(0,i.jsx)(s.code,{children:"expiration"})," field must be a string, the broker\nwill (only) accept the string representation of the number."]}),"\n",(0,i.jsx)(s.p,{children:"When both a per-queue and a per-message TTL are specified, the\nlower value between the two will be chosen."}),"\n",(0,i.jsxs)(s.p,{children:["This example uses ",(0,i.jsx)(s.a,{href:"/client-libraries/java-api-guide",children:"RabbitMQ Java client"}),"\nto publish a message which can reside in the queue for at most 60 seconds:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-java",children:'b
1yte[] messageBodyBytes = "Hello, world!".getBytes();\nAMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()\n                                   .expiration("60000")\n                                   .build();\nchannel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);\n'})}),"\n",(0,i.jsx)(s.p,{children:"The same example in C#:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-csharp",children:'byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes("Hello, world!");\n\nIBasicProperties props = model.CreateBasicProperties();\nprops.ContentType = "text/plain";\nprops.DeliveryMode = 2;\nprops.Expiration = "60000";\n\nmodel.BasicPublish(exchangeName,\n                   routingKey, props,\n                   messageBodyBytes);\n'})}),"\n",(0,i.jsx)(s.h2,{id:"message-ttl-dead-lettering",children:"Per-Message TTL and Dead Lettering"}),"\n",(0,i.jsx)(s.h3,{id:"quorum-queues",children:"Quorum Queues"}),"\n",(0,i.jsx)(s.p,{children:"Quorum queues dead letter expired messages when they reach the head of the queue."}),"\n",(0,i.jsx)(s.h3,{id:"classic-queues",children:"Classic Queues"}),"\n",(0,i.jsx)(s.p,{children:"Classic queues dead letter expired messages in a few cases:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"When the message reaches the head of the queue"}),"\n",(0,i.jsx)(s.li,{children:"When the queue is notified of a policy change that affects it"}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"message-ttl-applied-retroactively",children:"Per-message TTL Applied Retroactively (to an Existing Queue)"}),"\n",(0,i.jsx)(s.p,{children:"Queues that had a per-message TTL applied to them\nretroactively (when they already had messages) will discard\nthe messages when specific events occur."}),"\n",(0,i.jsx)(s.p,{children:"Only when expired messages reach the head of a queue will they actually be\ndiscarded (marked for deletion). Consumers will not have\nexpired messages delivered to them. Keep in mind that\nthere can be a natural race condition between message expiration\nand consumer delivery, e.g. a message can expire\nafter it was written to the socket but before it has reached\na consumer."}),"\n",(0,i.jsx)(s.p,{children:"When setting per-message TTL expired messages can queue up\nbehind non-expired ones until the latter are consumed or\nexpired. Hence resources used by such expired messages will\nnot be freed, and they will be counted in queue statistics\n(e.g. the number of messages in the queue)."}),"\n",(0,i.jsx)(s.p,{children:"When retroactively applying a per-message TTL policy, it is\nrecommended to have consumers online to make sure the\nmessages are discarded quicker."}),"\n",(0,i.jsx)(s.p,{children:"Given this behaviour of per-message TTL settings on existing\nqueues, when the need to delete messages to free up\nresources arises, queue TTL should be used instead (or queue\npurging, or queue deletion)."}),"\n",(0,i.jsx)(s.h2,{id:"queue-ttl",children:"Queue TTL"}),"\n",(0,i.jsxs)(s.p,{children:["TTL can also be set on queues, not just queue contents.\nThis feature can be used together with the ",(0,i.jsx)(s.a,{href:"./queues",children:"auto-delete queue property"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Setting TTL (expiration) on queues generally only makes sense\nfor transient (non-durable) classic queues. Streams\ndo not support expiration."}),"\n",(0,i.jsx)(s.p,{children:"Queues will expire after a period of time only when they\nare not used (a queue is used if it has online consumers)."}),"\n",(0,i.jsxs)(s.p,{children:["Expiry time can be set for a given queue by setting the\n",(0,i.jsx)(s.code,{children:"x-expires"})," argument to ",(0,i.jsx)(s.code,{children:"queue.declare"}),",\nor by setting the ",(0,i.jsx)(s.code,{children:"expires"})," ",(0,i.jsx)(s.a,{href:"./policies",children:"policy"}),". This controls for\nhow long a queue can be unused before it is automatically\ndeleted. Unused means the queue has no consumers, the\nqueue has not been recently redeclared (redeclaring renews the lease),\nand ",(0,i.jsx)(s.code,{children:"basic.get"})," has not been invoked for a duration of at least the expiration\nperiod. This can be used, for example, for RPC-style reply\nqueues, where many queues can be created which may never be\ndrained."]}),"\n",(0,i.jsx)(s.p,{children:"The server guarantees that the queue will be deleted, if\nunused for at least the expiration period. No guarantee is\ngiven as to how promptly the queue will be removed after the\nexpiration period has elapsed."}),"\n",(0,i.jsxs)(s.p,{children:["The value of the ",(0,i.jsx)(s.code,{children:"x-expires"})," argument or\n",(0,i.jsx)(s.code,{children:"expires"})," policy describes the expiration period in\nmilliseconds. It must be a positive integer (unlike message\nTTL it cannot be 0). Thus a value of 1000 means a queue which\nis unused for 1 second will be deleted."]}),"\n",(0,i.jsx)(s.h3,{id:"queue-ttl-using-policy",children:"Define Queue TTL for Queues Using a Policy"}),"\n",(0,i.jsx)(s.p,{children:"The following policy makes all queues expire after 30 minutes since last use:"}),"\n",(0,i.jsxs)(r.A,{groupId:"examples",children:[(0,i.jsx)(l.A,{value:"bash",label:"rabbitmqctl with bash",default:!0,children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'rabbitmqctl set_policy expiry ".*" \'{"expires":1800000}\' --apply-to queues\n'})})}),(0,i.jsx)(l.A,{value:"rabbitmqadmin",label:"rabbitmqadmin with bash",children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'rabbitmqadmin policies declare \\\n    --name "expiry" \\\n    --pattern ".*" \\\n    --definition \'{"expires":1800000}\' \\\n    --apply-to "queues"\n'})})}),(0,i.jsx)(l.A,{value:"PowerShell",label:"rabbitmqctl with PowerShell",children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-PowerShell",children:'rabbitmqctl.bat set_policy expiry ".*" "{""expires"":1800000}" --apply-to queues\n'})})}),(0,i.jsx)(l.A,{value:"rabbitmqadmin-PowerShell",label:"rabbitmqadmin with PowerShell",children:(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-PowerShell",children:'rabbitmqadmin.exe policies declare ^\n    --name "expiry" ^\n    --pattern ".*" ^\n    --definition "{""expires"":1800000}" ^\n    --apply-to "queues"\n'})})})]}),"\n",(0,i.jsx)(s.h3,{id:"queue-ttl-using-x-args",children:"Define Queue TTL for Queues Using x-arguments During Declaration"}),"\n",(0,i.jsx)(s.p,{children:"This example in Java creates a queue which expires after\nit has been unused for 30 minutes."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-java",children:'Map<String, Object> args = new HashMap<String, Object>();\nargs.put("x-expires", 1800000);\nchannel.queueDeclare("myqueue", false, false, false, args);\n'})})]})}function p(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},57250(e,s,n){n.d(s,{A:()=>l});var a=n(74848);n(96540);var i=n(34164),t=n(57663);function r({children:e,className:s,hidden:n}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,i.A)("tabItem_Ymn6",s),hidden:n,children:e})}function l({children:e,className:s,value:n}){let{selectedValue:i,lazy:o}=(0,t.uc)(),u=n===i;return!u&&o?null:(0,a.jsx)(r,{className:s,hidden:!u,children:e})}},50773(e,s,n){n.d(s,{A:()=>h});var a=n(74848);n(96540);var i=n(34164),t=n(88287),r=n(57663),l=n(28584),o=n(19863);function u({className:e}){let{selectedValue:s,selectValue:n,tabValues:t,block:o}=(0,r.uc)(),c=[],{blockElementScrollPositionUntilNextRender:d}
1=(0,l.a_)(),h=e=>{let a=e.currentTarget,i=t[c.indexOf(a)].value;i!==s&&(d(a),n(i))},p=e=>{let s=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{let n=c.indexOf(e.currentTarget)+1;s=c[n]??c[0];break}case"ArrowLeft":{let n=c.indexOf(e.currentTarget)-1;s=c[n]??c[c.length-1]}}s?.focus()};return(0,a.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":o},e),children:t.map(({value:e,label:n,attributes:t})=>(0,a.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{c.push(e)},onKeyDown:p,onClick:h,...t,className:(0,i.A)("tabs__item","tabItem_LNqP",t?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function c({children:e}){return(0,a.jsx)("div",{className:"margin-top--md",children:e})}function d({className:e,children:s}){return(0,a.jsxs)("div",{className:(0,i.A)(t.G.tabs.container,"tabs-container","tabList__CuJ"),children:[(0,a.jsx)(u,{className:e}),(0,a.jsx)(c,{children:s})]})}function h(e){let s=(0,o.A)(),n=(0,r.OC)(e);return(0,a.jsx)(r.O_,{value:n,children:(0,a.jsx)(d,{className:e.className,children:(0,r.vT)(e.children)})},String(s))}},57663(e,s,n){n.d(s,{OC:()=>h,O_:()=>g,uc:()=>m,vT:()=>c});var a=n(74848),i=n(96540),t=n(56347),r=n(99989),l=n(96629),o=n(80618),u=n(41367);function c(e){return i.Children.toArray(e).filter(e=>"\n"!==e)}function d({value:e,tabValues:s}){return s.some(s=>s.value===e)}function h(e){let s,{defaultValue:n,queryString:a=!1,groupId:c}=e,h=function(e){let{values:s,children:n}=e;return(0,i.useMemo)(()=>{let e=s??i.Children.toArray(n).flatMap(e=>{if(!e)return[];if((0,i.isValidElement)(e)&&function(e){let{props:s}=e;return!!s&&"object"==typeof s&&"value"in s}(e))return[e];let s="string"==typeof e.type?e.type:e.type.name;throw Error(`Docusaurus error: Bad <Tabs> child <${s}>: 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:s,attributes:n,default:a}})=>({value:e,label:s,attributes:n,default:a})),a=(0,o.XI)(e,(e,s)=>e.value===s.value);if(a.length>0)throw Error(`Docusaurus error: Duplicate values "${a.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`);return e},[s,n])}(e),[p,m]=(0,i.useState)(()=>(function({defaultValue:e,tabValues:s}){if(0===s.length)throw Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!d({value:e,tabValues:s}))throw Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${s.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}let n=s.find(e=>e.default)??s[0];if(!n)throw Error("Unexpected error: 0 tabValues");return n.value})({defaultValue:n,tabValues:h})),[g,x]=function({queryString:e=!1,groupId:s}){let n=(0,t.W6)(),a=function({queryString:e=!1,groupId:s}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!s)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 s??null}({queryString:e,groupId:s});return[(0,l.aZ)(a),(0,i.useCallback)(e=>{if(!a)return;let s=new URLSearchParams(n.location.search);s.set(a,e),n.replace({...n.location,search:s.toString()})},[a,n])]}({queryString:a,groupId:c}),[b,f]=function({groupId:e}){let s=e?`docusaurus.tab.${e}`:null,[n,a]=(0,u.Dv)(s);return[n,(0,i.useCallback)(e=>{s&&a.set(e)},[s,a])]}({groupId:c}),T=d({value:s=g??b,tabValues:h})?s:null;return(0,r.A)(()=>{T&&m(T)},[T]),{selectedValue:p,selectValue:(0,i.useCallback)(e=>{if(!d({value:e,tabValues:h}))throw Error(`Can't select invalid tab value=${e}`);m(e),x(e),f(e)},[x,f,h]),tabValues:h,lazy:e.lazy??!1,block:e.block??!1}}let p=(0,i.createContext)(null);function m(){let e=i.useContext(p);if(!e)throw Error("useTabsContext() must be used within a Tabs component");return e}function g(e){return(0,a.jsx)(p.Provider,{value:e.value,children:e.children})}},28453(e,s,n){n.d(s,{R:()=>r,x:()=>l});var a=n(96540);let i={},t=a.createContext(i);function r(e){let s=a.useContext(t);return a.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(t.Provider,{value:s},e.children)}}}]);

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.