diff --git a/README.md b/README.md index e295979..2ce5c64 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,26 @@ Optional: | `TRIAGEBOT_PORT` | `8080` | Nova HTTP listener | | `TRIAGEBOT_METRICS_PORT` | `9568` | Prometheus /metrics; set to `""` to disable | | `TRIAGEBOT_AGENT_MODEL` | per-backend | Override agent model | +| `TRIAGEBOT_POLICY_PATH` | `priv/TRIAGE.md` | Filesystem path to the triage-policy file fed to every agent | + +### Triage policy + +Every triage run is fed a shared **repository triage context** before the +issue: the contents of a triage-policy file plus the repo's label +taxonomy. The policy teaches the agents how *this* project triages - +what the categories mean, the severity rubric, which labels to use, +escalation rules - and agents follow it where it conflicts with their +built-in defaults. + +The policy ships in the release at `priv/TRIAGE.md`; edit that file and +redeploy, or point `TRIAGEBOT_POLICY_PATH` at another file. A missing +file is fine - agents fall back to their built-in defaults. To reload +without a redeploy, call `triagebot_config:refresh_triage_policy()` from +a remote shell. + +Each issue also carries its high-signal GitHub fields into the context: +contributor association (e.g. `FIRST_TIME_CONTRIBUTOR`), reaction count, +comment count, milestone, and assignees. ### 3. Local development with PAT @@ -141,8 +161,10 @@ That's it. - Spawn-and-forget async (BEAM process per webhook) so the response returns 202 immediately while triage runs in the background - GitHub App or PAT auth (via `gakudan_tickets_github` v0.1.2+) -- Repo-context awareness: classifier + scoper can read repo files; - label_proposer picks from the repo's actual label taxonomy +- Repo-context awareness: a bundled triage policy (`priv/TRIAGE.md`) + + the repo's actual label taxonomy + each issue's contributor/reaction/ + milestone signals are fed to every agent; classifier + scoper can also + read repo files on demand - Prometheus `/metrics` via `gakudan_metrics` - 20-case CT suite covering the runner helpers, agent callbacks, tool shapes, and dynamic prompt building diff --git a/doc/.build b/doc/.build new file mode 100644 index 0000000..7ef757f --- /dev/null +++ b/doc/.build @@ -0,0 +1,25 @@ +404.html +api-reference.html +dist/html-HBZYRXZS.js +dist/html-erlang-7YNYEB7F.css +dist/lato-latin-400-normal-W7754I4D.woff2 +dist/lato-latin-700-normal-2XVSBPG4.woff2 +dist/lato-latin-ext-400-normal-N27NCBWW.woff2 +dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 +dist/remixicon-QPNJX265.woff2 +dist/search_data-4AA356A9.js +dist/sidebar_items-463C534A.js +index.html +search.html +triagebot_classifier.html +triagebot_config.html +triagebot_context.html +triagebot_dashboard_auth.html +triagebot_dup_detector.html +triagebot_label_proposer.html +triagebot_repo_context_tool.html +triagebot_runner.html +triagebot_scoper.html +triagebot_search_tool.html +triagebot_summariser.html +triagebot_webhook_controller.html diff --git a/doc/404.html b/doc/404.html new file mode 100644 index 0000000..6a02443 --- /dev/null +++ b/doc/404.html @@ -0,0 +1,141 @@ + + + + + + + + + + + + + 404 — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +

+ Page not found +

+ +

Sorry, but the page you were trying to get to, does not exist. You +may want to try searching this site using the sidebar + + or using our API Reference page + +to find what you were looking for.

+ +
+
+
+ + + diff --git a/doc/api-reference.html b/doc/api-reference.html new file mode 100644 index 0000000..2286848 --- /dev/null +++ b/doc/api-reference.html @@ -0,0 +1,262 @@ + + + + + + + + + + + API Reference — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

API Reference triagebot v#0.1.13

+ +
+ +
+

Modules

+
+
+ + +

First agent in the triage pipeline. Reads the issue body and emits a +classification line.

+ +
+
+ + +

Runtime configuration for triagebot, sourced from env vars.

+ +
+
+ + +

Builds the run input sent to the gakudan triage pipeline.

+ +
+
+ + +

HTTP Basic auth gate for the triagebot live dashboard.

+ +
+
+ + +

Third agent. Uses the search_issues tool to look for likely duplicates +of the current issue.

+ +
+
+ + +

Fourth agent. Reads the issue + all prior triage turns and proposes a +set of labels, drawn from the repo's label taxonomy in the shared +repository triage context.

+ +
+
+ + +

gakudan tool that fetches a file from the configured GitHub repo, +giving the triage agents a way to ground themselves in repo-specific +context (CLAUDE.md, README.md, CONTRIBUTING.md, the file an +issue links to, etc.).

+ +
+
+ + +

Bridges a verified webhook event to a gakudan triage run.

+ +
+
+ + +

Second agent. Reads the issue + classifier output and assesses severity +and scope.

+ +
+
+ + +

gakudan tool that searches the configured GitHub repo for issues +matching a query, returning a short text summary the LLM can read.

+ +
+
+ + +

Fifth and final agent. Reads everything above and produces the comment +that gets posted to the issue.

+ +
+
+ + +

Nova controller for GitHub webhook deliveries.

+ +
+ +
+
+ + +
+ +
+
+
+ + + diff --git a/doc/dist/html-HBZYRXZS.js b/doc/dist/html-HBZYRXZS.js new file mode 100644 index 0000000..632e4a0 --- /dev/null +++ b/doc/dist/html-HBZYRXZS.js @@ -0,0 +1,210 @@ +(()=>{var Ss=Object.create;var Un=Object.defineProperty;var ks=Object.getOwnPropertyDescriptor;var Ls=Object.getOwnPropertyNames;var Ts=Object.getPrototypeOf,_s=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ps=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ls(e))!_s.call(t,i)&&i!==n&&Un(t,i,{get:()=>e[i],enumerable:!(r=ks(e,i))||r.enumerable});return t};var Y=(t,e,n)=>(n=t!=null?Ss(Ts(t)):{},Ps(e||!t||!t.__esModule?Un(n,"default",{value:t,enumerable:!0}):n,t));var fr=L((dc,hr)=>{var dr="Expected a function",ur=NaN,Hs="[object Symbol]",Ns=/^\s+|\s+$/g,Ds=/^[-+]0x[0-9a-f]+$/i,Bs=/^0b[01]+$/i,Qs=/^0o[0-7]+$/i,qs=parseInt,Fs=typeof global=="object"&&global&&global.Object===Object&&global,Vs=typeof self=="object"&&self&&self.Object===Object&&self,$s=Fs||Vs||Function("return this")(),Us=Object.prototype,js=Us.toString,Ws=Math.max,zs=Math.min,Ht=function(){return $s.Date.now()};function Gs(t,e,n){var r,i,s,o,a,l,u=0,c=!1,d=!1,h=!0;if(typeof t!="function")throw new TypeError(dr);e=cr(e)||0,Ve(n)&&(c=!!n.leading,d="maxWait"in n,s=d?Ws(cr(n.maxWait)||0,e):s,h="trailing"in n?!!n.trailing:h);function p(k){var I=r,$=i;return r=i=void 0,u=k,o=t.apply($,I),o}function g(k){return u=k,a=setTimeout(w,e),c?p(k):o}function m(k){var I=k-l,$=k-u,ee=e-I;return d?zs(ee,s-$):ee}function v(k){var I=k-l,$=k-u;return l===void 0||I>=e||I<0||d&&$>=s}function w(){var k=Ht();if(v(k))return x(k);a=setTimeout(w,m(k))}function x(k){return a=void 0,h&&r?p(k):(r=i=void 0,o)}function P(){a!==void 0&&clearTimeout(a),u=0,r=l=i=a=void 0}function Q(){return a===void 0?o:x(Ht())}function V(){var k=Ht(),I=v(k);if(r=arguments,i=this,l=k,I){if(a===void 0)return g(l);if(d)return a=setTimeout(w,e),p(l)}return a===void 0&&(a=setTimeout(w,e)),o}return V.cancel=P,V.flush=Q,V}function Ks(t,e,n){var r=!0,i=!0;if(typeof t!="function")throw new TypeError(dr);return Ve(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),Gs(t,e,{leading:r,maxWait:e,trailing:i})}function Ve(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function Ys(t){return!!t&&typeof t=="object"}function Js(t){return typeof t=="symbol"||Ys(t)&&js.call(t)==Hs}function cr(t){if(typeof t=="number")return t;if(Js(t))return ur;if(Ve(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Ve(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(Ns,"");var n=Bs.test(t);return n||Qs.test(t)?qs(t.slice(2),n?2:8):Ds.test(t)?ur:+t}hr.exports=Ks});var q=L(N=>{"use strict";N.__esModule=!0;N.extend=Tr;N.indexOf=co;N.escapeExpression=ho;N.isEmpty=fo;N.createFrame=po;N.blockParams=mo;N.appendContextPath=go;var oo={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},ao=/[&<>"'`=]/g,lo=/[&<>"'`=]/;function uo(t){return oo[t]}function Tr(t){for(var e=1;e{"use strict";We.__esModule=!0;var Wt=["description","fileName","lineNumber","endLineNumber","message","name","number","stack"];function zt(t,e){var n=e&&e.loc,r=void 0,i=void 0,s=void 0,o=void 0;n&&(r=n.start.line,i=n.end.line,s=n.start.column,o=n.end.column,t+=" - "+r+":"+s);for(var a=Error.prototype.constructor.call(this,t),l=0;l{"use strict";ze.__esModule=!0;var Gt=q();ze.default=function(t){t.registerHelper("blockHelperMissing",function(e,n){var r=n.inverse,i=n.fn;if(e===!0)return i(this);if(e===!1||e==null)return r(this);if(Gt.isArray(e))return e.length>0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var s=Gt.createFrame(n.data);s.contextPath=Gt.appendContextPath(n.data.contextPath,n.name),n={data:s}}return i(e,n)})};Or.exports=ze.default});var Cr=L((Ge,Ir)=>{"use strict";Ge.__esModule=!0;function vo(t){return t&&t.__esModule?t:{default:t}}var be=q(),yo=X(),wo=vo(yo);Ge.default=function(t){t.registerHelper("each",function(e,n){if(!n)throw new wo.default("Must pass iterator to #each");var r=n.fn,i=n.inverse,s=0,o="",a=void 0,l=void 0;n.data&&n.ids&&(l=be.appendContextPath(n.data.contextPath,n.ids[0])+"."),be.isFunction(e)&&(e=e.call(this)),n.data&&(a=be.createFrame(n.data));function u(g,m,v){a&&(a.key=g,a.index=m,a.first=m===0,a.last=!!v,l&&(a.contextPath=l+g)),o=o+r(e[g],{data:a,blockParams:be.blockParams([e[g],g],[l+g,null])})}if(e&&typeof e=="object")if(be.isArray(e))for(var c=e.length;s{"use strict";Ke.__esModule=!0;function bo(t){return t&&t.__esModule?t:{default:t}}var Eo=X(),xo=bo(Eo);Ke.default=function(t){t.registerHelper("helperMissing",function(){if(arguments.length!==1)throw new xo.default('Missing helper: "'+arguments[arguments.length-1].name+'"')})};Rr.exports=Ke.default});var Br=L((Ye,Dr)=>{"use strict";Ye.__esModule=!0;function So(t){return t&&t.__esModule?t:{default:t}}var Hr=q(),ko=X(),Nr=So(ko);Ye.default=function(t){t.registerHelper("if",function(e,n){if(arguments.length!=2)throw new Nr.default("#if requires exactly one argument");return Hr.isFunction(e)&&(e=e.call(this)),!n.hash.includeZero&&!e||Hr.isEmpty(e)?n.inverse(this):n.fn(this)}),t.registerHelper("unless",function(e,n){if(arguments.length!=2)throw new Nr.default("#unless requires exactly one argument");return t.helpers.if.call(this,e,{fn:n.inverse,inverse:n.fn,hash:n.hash})})};Dr.exports=Ye.default});var qr=L((Je,Qr)=>{"use strict";Je.__esModule=!0;Je.default=function(t){t.registerHelper("log",function(){for(var e=[void 0],n=arguments[arguments.length-1],r=0;r{"use strict";Xe.__esModule=!0;Xe.default=function(t){t.registerHelper("lookup",function(e,n,r){return e&&r.lookupProperty(e,n)})};Fr.exports=Xe.default});var Ur=L((Ze,$r)=>{"use strict";Ze.__esModule=!0;function Lo(t){return t&&t.__esModule?t:{default:t}}var Ee=q(),To=X(),_o=Lo(To);Ze.default=function(t){t.registerHelper("with",function(e,n){if(arguments.length!=2)throw new _o.default("#with requires exactly one argument");Ee.isFunction(e)&&(e=e.call(this));var r=n.fn;if(Ee.isEmpty(e))return n.inverse(this);var i=n.data;return n.data&&n.ids&&(i=Ee.createFrame(n.data),i.contextPath=Ee.appendContextPath(n.data.contextPath,n.ids[0])),r(e,{data:i,blockParams:Ee.blockParams([e],[i&&i.contextPath])})})};$r.exports=Ze.default});var Kt=L(et=>{"use strict";et.__esModule=!0;et.registerDefaultHelpers=Vo;et.moveHelperToHooks=$o;function se(t){return t&&t.__esModule?t:{default:t}}var Po=Ar(),Oo=se(Po),Ao=Cr(),Io=se(Ao),Co=Mr(),Ro=se(Co),Mo=Br(),Ho=se(Mo),No=qr(),Do=se(No),Bo=Vr(),Qo=se(Bo),qo=Ur(),Fo=se(qo);function Vo(t){Oo.default(t),Io.default(t),Ro.default(t),Ho.default(t),Do.default(t),Qo.default(t),Fo.default(t)}function $o(t,e,n){t.helpers[e]&&(t.hooks[e]=t.helpers[e],n||delete t.helpers[e])}});var Wr=L((tt,jr)=>{"use strict";tt.__esModule=!0;var Uo=q();tt.default=function(t){t.registerDecorator("inline",function(e,n,r,i){var s=e;return n.partials||(n.partials={},s=function(o,a){var l=r.partials;r.partials=Uo.extend({},l,n.partials);var u=e(o,a);return r.partials=l,u}),n.partials[i.args[0]]=i.fn,s})};jr.exports=tt.default});var zr=L(Yt=>{"use strict";Yt.__esModule=!0;Yt.registerDefaultDecorators=Go;function jo(t){return t&&t.__esModule?t:{default:t}}var Wo=Wr(),zo=jo(Wo);function Go(t){zo.default(t)}});var Jt=L((nt,Gr)=>{"use strict";nt.__esModule=!0;var Ko=q(),fe={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(e){if(typeof e=="string"){var n=Ko.indexOf(fe.methodMap,e.toLowerCase());n>=0?e=n:e=parseInt(e,10)}return e},log:function(e){if(e=fe.lookupLevel(e),typeof console<"u"&&fe.lookupLevel(fe.level)<=e){var n=fe.methodMap[e];console[n]||(n="log");for(var r=arguments.length,i=Array(r>1?r-1:0),s=1;s{"use strict";Xt.__esModule=!0;Xt.createNewLookupObject=Jo;var Yo=q();function Jo(){for(var t=arguments.length,e=Array(t),n=0;n{"use strict";xe.__esModule=!0;xe.createProtoAccessControl=ta;xe.resultIsAllowed=na;xe.resetLoggedProperties=ia;function Xo(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var Yr=Kr(),Zo=Jt(),ea=Xo(Zo),rt=Object.create(null);function ta(t){var e=Object.create(null);e.constructor=!1,e.__defineGetter__=!1,e.__defineSetter__=!1,e.__lookupGetter__=!1;var n=Object.create(null);return n.__proto__=!1,{properties:{whitelist:Yr.createNewLookupObject(n,t.allowedProtoProperties),defaultValue:t.allowProtoPropertiesByDefault},methods:{whitelist:Yr.createNewLookupObject(e,t.allowedProtoMethods),defaultValue:t.allowProtoMethodsByDefault}}}function na(t,e,n){return Jr(typeof t=="function"?e.methods:e.properties,n)}function Jr(t,e){return t.whitelist[e]!==void 0?t.whitelist[e]===!0:t.defaultValue!==void 0?t.defaultValue:(ra(e),!1)}function ra(t){rt[t]!==!0&&(rt[t]=!0,ea.log("error",'Handlebars: Access has been denied to resolve the property "'+t+`" because it is not an "own property" of its parent. +You can add a runtime option to disable the check or this warning: +See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details`))}function ia(){Object.keys(rt).forEach(function(t){delete rt[t]})}});var rn=L(U=>{"use strict";U.__esModule=!0;U.HandlebarsEnvironment=nn;function Xr(t){return t&&t.__esModule?t:{default:t}}var oe=q(),sa=X(),en=Xr(sa),oa=Kt(),aa=zr(),la=Jt(),it=Xr(la),ua=Zt(),ca="4.7.7";U.VERSION=ca;var da=8;U.COMPILER_REVISION=da;var ha=7;U.LAST_COMPATIBLE_COMPILER_REVISION=ha;var fa={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};U.REVISION_CHANGES=fa;var tn="[object Object]";function nn(t,e,n){this.helpers=t||{},this.partials=e||{},this.decorators=n||{},oa.registerDefaultHelpers(this),aa.registerDefaultDecorators(this)}nn.prototype={constructor:nn,logger:it.default,log:it.default.log,registerHelper:function(e,n){if(oe.toString.call(e)===tn){if(n)throw new en.default("Arg not supported with multiple helpers");oe.extend(this.helpers,e)}else this.helpers[e]=n},unregisterHelper:function(e){delete this.helpers[e]},registerPartial:function(e,n){if(oe.toString.call(e)===tn)oe.extend(this.partials,e);else{if(typeof n>"u")throw new en.default('Attempting to register a partial called "'+e+'" as undefined');this.partials[e]=n}},unregisterPartial:function(e){delete this.partials[e]},registerDecorator:function(e,n){if(oe.toString.call(e)===tn){if(n)throw new en.default("Arg not supported with multiple decorators");oe.extend(this.decorators,e)}else this.decorators[e]=n},unregisterDecorator:function(e){delete this.decorators[e]},resetLoggedPropertyAccesses:function(){ua.resetLoggedProperties()}};var pa=it.default.log;U.log=pa;U.createFrame=oe.createFrame;U.logger=it.default});var ei=L((st,Zr)=>{"use strict";st.__esModule=!0;function sn(t){this.string=t}sn.prototype.toString=sn.prototype.toHTML=function(){return""+this.string};st.default=sn;Zr.exports=st.default});var ti=L(on=>{"use strict";on.__esModule=!0;on.wrapHelper=ma;function ma(t,e){if(typeof t!="function")return t;var n=function(){var i=arguments[arguments.length-1];return arguments[arguments.length-1]=e(i),t.apply(this,arguments)};return n}});var oi=L(Z=>{"use strict";Z.__esModule=!0;Z.checkRevision=Ea;Z.template=xa;Z.wrapProgram=ot;Z.resolvePartial=Sa;Z.invokePartial=ka;Z.noop=ii;function ga(t){return t&&t.__esModule?t:{default:t}}function va(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var ya=q(),z=va(ya),wa=X(),G=ga(wa),K=rn(),ni=Kt(),ba=ti(),ri=Zt();function Ea(t){var e=t&&t[0]||1,n=K.COMPILER_REVISION;if(!(e>=K.LAST_COMPATIBLE_COMPILER_REVISION&&e<=K.COMPILER_REVISION))if(e{"use strict";at.__esModule=!0;at.default=function(t){var e=typeof global<"u"?global:window,n=e.Handlebars;t.noConflict=function(){return e.Handlebars===t&&(e.Handlebars=n),t}};ai.exports=at.default});var ae=L((lt,hi)=>{"use strict";lt.__esModule=!0;function ln(t){return t&&t.__esModule?t:{default:t}}function un(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var Pa=rn(),ui=un(Pa),Oa=ei(),Aa=ln(Oa),Ia=X(),Ca=ln(Ia),Ra=q(),an=un(Ra),Ma=oi(),ci=un(Ma),Ha=li(),Na=ln(Ha);function di(){var t=new ui.HandlebarsEnvironment;return an.extend(t,ui),t.SafeString=Aa.default,t.Exception=Ca.default,t.Utils=an,t.escapeExpression=an.escapeExpression,t.VM=ci,t.template=function(e){return ci.template(e,t)},t}var Se=di();Se.create=di;Na.default(Se);Se.default=Se;lt.default=Se;hi.exports=lt.default});var Vi=L((qi,Fi)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var c=t.utils.clone(n)||{};c.position=[a,u],c.index=s.length,s.push(new t.Token(r.slice(a,o),c))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?c+=2:a==l&&(n+=r[u+1]*i[c+1],u+=2,c+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c=s.str.charAt(0),d=s.str.charAt(1),h;d in s.node.edges?h=s.node.edges[d]:(h=new t.TokenSet,s.node.edges[d]=h),s.str.length==1&&(h.final=!0),i.push({node:h,editsRemaining:s.editsRemaining-1,str:c+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof qi=="object"?Fi.exports=n():e.lunr=n()}(this,function(){return t})})()});var ie={plain:"plain",function:"function",module:"module"},Os=[{href:"typespecs.html#basic-types",hint:{kind:ie.plain,description:"Basic type"}},{href:"typespecs.html#literals",hint:{kind:ie.plain,description:"Literal"}},{href:"typespecs.html#built-in-types",hint:{kind:ie.plain,description:"Built-in type"}}],Me={cancelHintFetching:null};function jn(t){if(zn(t))return!0;let e=/#.*\//;return t.includes("#")&&!e.test(t)?!1:t.includes(".html")}function Wn(t){let e=zn(t);return e?Promise.resolve(e):As(t)}function zn(t){let e=Os.find(n=>t.includes(n.href));return e?e.hint:null}function As(t){let e=t.replace(".html",".html?hint=true");return new Promise((n,r)=>{let i=document.createElement("iframe");i.setAttribute("src",e),i.style.display="none";function s(a){let{href:l,hint:u}=a.data;e===l&&(o(),n(u))}Me.cancelHintFetching=()=>{o(),r(new Error("cancelled"))};function o(){i.remove(),window.removeEventListener("message",s),Me.cancelHintFetching=null}window.addEventListener("message",s),document.body.appendChild(i)})}function Gn(){Me.cancelHintFetching&&Me.cancelHintFetching()}function Kn(t){let n=t.querySelector("h1").textContent,r=t.querySelector(".docstring > p"),i=r?r.innerHTML:"";return{kind:ie.function,title:n.trim(),description:i.trim()}}function Yn(t){let n=t.querySelector("h1 > span").textContent,r=t.querySelector("#moduledoc p"),i=r?r.innerHTML:"";return{kind:ie.module,title:n.trim(),description:i.trim()}}var f=document.querySelector.bind(document),C=document.querySelectorAll.bind(document);function Jn(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function Ne(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function De(){return document.getElementById("main").dataset.type}var He=["H1","H2","H3","H4","H5","H6"];function Xn(t=!1){let e=window.location.hash.replace(/^#/,"");if(!e)return t?document.getElementById("top-content"):null;let n=document.getElementById(e);if(!n)return null;if(n.matches(".detail"))return n;if(He.includes(n.tagName))return Tt(n);let r=Is(n);return r||document.getElementById("top-content")}function Is(t){let e=t.previousElementSibling;for(;e;){if(He.includes(e.tagName))return Tt(e);e=e.previousElementSibling}let n=t.parentNode;for(;n;){for(e=n.previousElementSibling;e;){if(He.includes(e.tagName))return Tt(e);e=e.previousElementSibling}n=n.parentNode}return null}function Tt(t){let e=document.createElement("div"),n=[t],r=t;for(;(r=r.nextSibling)&&!(He.includes(r.tagName)&&r.tagName<=t.tagName);)n.push(r);return e.append(...n),e}function Zn(t){return new URLSearchParams(window.location.search).get(t)}function _t(t){return fetch(t).then(e=>e.ok).catch(()=>!1)}function he(t){return!t||t.trim()===""}function er(t,e){let n;return function(...i){clearTimeout(n),n=setTimeout(()=>{n=null,t(...i)},e)}}function Be(){return document.head.querySelector("meta[name=project][content]").content}function Qe(){return document.documentElement.classList.contains("apple-os")}function E(t,e,n){let r=document.createElement(t);for(let i in e)e[i]!=null&&r.setAttribute(i,e[i]);return n&&r.replaceChildren(...n),r}var Cs=new URLSearchParams(window.location.search),Rs=window.self!==window.parent,Pt=Rs&&Cs.has("hint"),R=Pt;function qe(){return window.sidebarNodes||{}}function tr(){return window.versionNodes||[]}if(Pt&&R){let t=Xn(),e=t?Kn(t):["modules","tasks"].includes(De())?Yn(f(".content-inner")):null;if(e){let n={hint:{...e,version:Be()},href:window.location.href};window.parent.postMessage(n,"*")}f(".content-inner")?.replaceChildren()}var Ot="ex_doc:settings",nr="dark",At="system",It="dark",Ct="light";var Ms={tooltips:!0,theme:null,livebookUrl:null},Rt=class{constructor(){this._subscribers=[],this._settings=Ms,this._loadSettings()}get(){return this._settings}update(e){let n=this._settings;this._settings={...this._settings,...e},this._subscribers.forEach(r=>r(this._settings,n)),this._storeSettings()}getAndSubscribe(e){this._subscribers.push(e),e(this._settings)}_loadSettings(){try{let e=localStorage.getItem(Ot);if(e){let n=JSON.parse(e);this._settings={...this._settings,...n}}this._loadSettingsLegacy()}catch(e){console.error(`Failed to load settings: ${e}`)}}_storeSettings(){try{this._storeSettingsLegacy(),localStorage.setItem(Ot,JSON.stringify(this._settings))}catch(e){console.error(`Failed to persist settings: ${e}`)}}_loadSettingsLegacy(){localStorage.getItem("tooltipsDisabled")!==null&&(this._settings={...this._settings,tooltips:!1}),localStorage.getItem("night-mode")==="true"&&(this._settings={...this._settings,nightMode:!0}),this._settings.nightMode===!0&&(this._settings={...this._settings,theme:"dark"})}_storeSettingsLegacy(){this._settings.tooltips?localStorage.removeItem("tooltipsDisabled"):localStorage.setItem("tooltipsDisabled","true"),this._settings.nightMode!==null?localStorage.setItem("night-mode",this._settings.nightMode===!0?"true":"false"):localStorage.removeItem("night-mode"),this._settings.theme!==null?(localStorage.setItem("night-mode",this._settings.theme==="dark"?"true":"false"),this._settings.nightMode=this._settings.theme==="dark"):(delete this._settings.nightMode,localStorage.removeItem("night-mode"))}},M=new Rt;var rr=!1,Fe=null,J=null;function ir(t){rr||(rr=!0,J=document.getElementById("toast"),J?.addEventListener("click",()=>{clearTimeout(Fe),J.classList.remove("show")})),J&&(clearTimeout(Fe),J.innerText=t,J.classList.add("show"),Fe=setTimeout(()=>{J.classList.remove("show"),Fe=setTimeout(function(){J.innerText=""},1e3)},5e3))}var Mt=[At,It,Ct],sr=window.matchMedia("(prefers-color-scheme: dark)");M.getAndSubscribe(or);sr.addEventListener("change",or);function or(){let t=lr(),e=t===It||t!==Ct&&sr.matches;document.body.classList.toggle(nr,e)}function ar(){let t=Mt[Mt.indexOf(lr())+1]||Mt[0];M.update({theme:t}),ir(`Set theme to "${t}"`)}function lr(){return new URLSearchParams(window.location.search).get("theme")||M.get().theme||At}var Er=Y(fr());var Nt="sidebar_state",Dt="closed",pr="open",mr="sidebar_width";var $e="sidebar-open",Ue="sidebar-transition";var gr=!1;function vr(){if(gr)return;gr=!0;let t=document.getElementById("sidebar-list-nav");if(!t)return;let e=De(),n={extras:t.dataset.extras||"Pages",modules:"Modules",tasks:'Mix Tasks'};Object.entries(n).forEach(([r,i])=>{let s=qe()[r];if(!s?.length)return;let o=`${r}-list-tab-button`,a=`${r}-tab-panel`,l=r===e,u=E("button",{id:o,role:"tab",tabindex:l?0:-1,"aria-selected":l||void 0,"aria-controls":a});u.innerHTML=i,u.addEventListener("keydown",eo),u.addEventListener("click",to),t.appendChild(E("li",{},[u]));let c=E("ul",{class:"full-list"});c.addEventListener("click",no);let d=E("div",{id:a,class:"sidebar-tabpanel",role:"tabpanel","aria-labelledby":o,hidden:l?void 0:""},[c]);document.getElementById("sidebar").appendChild(d);let h="",p,g;c.replaceChildren(...s.flatMap(m=>{let v=[],w=Array.isArray(m.headers),x=w?void 0:"no",P=m?.url||`${m.id}.html`;return m.group!==h&&(v.push(E("li",{class:"group",translate:x},[m.group])),h=m.group,p=void 0),m.nested_context&&m.nested_context!==p?(p=m.nested_context,g!==p&&v.push(E("li",{class:"nesting-context",translate:"no","aria-hidden":!0},[p]))):g=m.title,v.push(E("li",{},[E("a",{href:P,translate:x},[m.nested_title||m.title,m.url?E("i",{class:"external-link ri-external-link-line"}):null].filter(Boolean)),...Qt(`node-${m.id}-headers`,w?Xs(m):Zs(m))])),v}))}),Bt(),requestAnimationFrame(yr),window.addEventListener("hashchange",Bt),window.addEventListener("exdoc:loaded",Bt)}function Qt(t,e){return e.length?[E("button",{"aria-label":"expand","aria-expanded":!1,"aria-controls":t}),E("ul",{id:t},e)]:[]}function Xs(t){return t.headers.map(({id:e,anchor:n})=>E("li",{},[E("a",{href:`${t.id}.html#${n}`},[e])]))}function Zs(t){let e=[];return t.sections?.length&&e.push(E("li",{},[E("a",{href:`${t.id}.html#content`},["Sections"]),...Qt(`${t.id}-sections-list`,t.sections.map(({id:n,anchor:r})=>E("li",{},[E("a",{href:`${t.id}.html#${r}`},[n])])))])),t.nodeGroups&&(e.push(E("li",{},[E("a",{href:`${t.id}.html#summary`},["Summary"])])),e.push(...t.nodeGroups.map(({key:n,name:r,nodes:i})=>E("li",{},[E("a",{href:`${t.id}.html#${n}`},[r]),...Qt(`node-${t.id}-group-${n}-list`,i.map(({anchor:s,title:o,id:a})=>E("li",{},[E("a",{href:`${t.id}.html#${s}`,title:o,translate:"no"},[a])])))])))),e}function qt(t){let e=document.getElementById("sidebar-list-nav").querySelector("[aria-selected]");e!==t&&(e&&(e.removeAttribute("aria-selected"),e.setAttribute("tabindex","-1"),document.getElementById(e.getAttribute("aria-controls")).setAttribute("hidden","hidden")),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0"),document.getElementById(t.getAttribute("aria-controls")).removeAttribute("hidden"))}function yr(){f("#sidebar [role=tabpanel]:not([hidden]) a[aria-selected]")?.scrollIntoView()}function Bt(){let t=document.getElementById("sidebar"),{pathname:e,hash:n}=window.location,r=e.split("/").pop().replace(/\.html$/,"")+".html",i=t.querySelector(`li a[href="${r+n}"]`)||t.querySelector(`li a[href="${r}"]`);if(!i)return;t.querySelectorAll(".full-list a[aria-selected]").forEach(o=>{o.removeAttribute("aria-selected")}),t.querySelectorAll(".full-list button[aria-expanded=true]").forEach(o=>{o.setAttribute("aria-expanded",!1)});let s=i.parentElement;for(;s;){if(s.tagName==="LI"){let o=s.firstChild;o.setAttribute("aria-selected",o.getAttribute("href")===r?"page":"true");let a=o.nextSibling;a?.tagName==="BUTTON"&&a.setAttribute("aria-expanded",!0)}else if(s.role==="tabpanel"){s.hasAttribute("hidden")&&qt(document.getElementById(s.getAttribute("aria-labelledby")));break}s=s.parentElement}}function eo(t){if(!["ArrowRight","ArrowLeft"].includes(t.key))return;let e=Array.from(C('#sidebar-list-nav [role="tab"]')),r=e.indexOf(t.currentTarget)+(t.key==="ArrowRight"?1:-1),i=e.at(r%e.length);qt(i),i.focus()}function to(t){qt(t.currentTarget),yr()}function no(t){let e=t.target;e.tagName==="BUTTON"&&e.setAttribute("aria-expanded",e.getAttribute("aria-expanded")==="false")}var io=300,xr=".sidebar-toggle",Ft=window.matchMedia(`screen and (max-width: ${768}px)`);if(!R){window.addEventListener("exdoc:loaded",wr);let t=document.getElementById("sidebar"),e=f(xr);e.addEventListener("click",je),document.body.addEventListener("click",i=>{Ft.matches&&Vt()&&!t.contains(i.target)&&!e.contains(i.target)&&je()});let n=window.innerWidth;window.addEventListener("resize",(0,Er.default)(()=>{n!==window.innerWidth&&(n=window.innerWidth,wr())},100));let r=new ResizeObserver(([i])=>{if(!i)return;let s=i.contentRect.width;sessionStorage.setItem(mr,s),document.body.style.setProperty("--sidebarWidth",`${s}px`)});t.addEventListener("mousedown",()=>r.observe(t)),t.addEventListener("mouseup",()=>r.unobserve(t)),window.addEventListener("hashchange",so)}function wr(){let e=sessionStorage.getItem(Nt)!==Dt&&!Ft.matches;kr(e)}function je(){let t=!Vt();return sessionStorage.setItem(Nt,t?pr:Dt),$t(t)}function Vt(){return document.body.classList.contains($e)}function Sr(){return document.body.classList.contains($e)&&!document.body.classList.contains(Ue)}function kr(t){t&&vr(),document.body.classList.toggle($e,t),f(xr).setAttribute("aria-expanded",t?"true":"false")}var br;function $t(t){return new Promise(e=>{document.body.classList.add(Ue),document.body.scrollTop,kr(t),clearTimeout(br),br=setTimeout(()=>{document.body.classList.remove(Ue),e()},io)})}function Lr(){return $t(!0)}function so(){Ft.matches&&Vt()&&$t(!1)}var fi=Y(ae());var cn=Y(ae());cn.registerHelper("isArray",function(t,e){return Array.isArray(t)?e.fn(this):e.inverse(this)});cn.registerHelper("isNonEmptyArray",function(t,e){return Array.isArray(t)&&t.length>0?e.fn(this):e.inverse(this)});var pi=fi.template({1:function(t,e,n,r,i){var s,o,a=e??(t.nullContext||{}),l=t.hooks.helperMissing,u="function",c=t.escapeExpression,d=t.lookupProperty||function(h,p){if(Object.prototype.hasOwnProperty.call(h,p))return h[p]};return' +`},2:function(t,e,n,r,i){return" selected disabled"},4:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return` +`},compiler:[8,">= 4.3.0"],main:function(t,e,n,r,i){var s,o=e??(t.nullContext||{}),a=t.lookupProperty||function(l,u){if(Object.prototype.hasOwnProperty.call(l,u))return l[u]};return`
+ +`+((s=a(n,"if").call(o,e!=null?a(e,"latestVersion"):e,{name:"if",hash:{},fn:t.program(4,i,0),inverse:t.noop,data:i,loc:{start:{line:13,column:2},end:{line:19,column:9}}}))!=null?s:"")+`
+`},useData:!0});var Da=".sidebar-projectVersion",mi=".sidebar-projectVersion select",Ba=".sidebar-staleVersion a";if(!R){let t=tr(),e=f(Da);if(t.length>0||!e){let n=e.textContent.trim(),i=(t.some(u=>u.version===n)?t:[{version:n,url:"#"},...t]).map(u=>({...u,isCurrentVersion:u.version===n})),s=t.find(u=>u.latest),o=s?.version!==n&&!n.includes("-")?s?.url:null;e.innerHTML=pi({nodes:i,latestVersion:o});let a=f(mi);a.addEventListener("change",qa),Qa(a);let l=f(Ba);l&&l.addEventListener("click",Fa)}}function Qa(t){let e=document.createElement("span");e.style.visibility="hidden",e.style.position="absolute",e.style.whiteSpace="nowrap",e.style.font=window.getComputedStyle(t).font,e.textContent=t.options[t.selectedIndex].text,document.body.appendChild(e),t.style.width=`${e.offsetWidth+20}px`,document.body.removeChild(e)}function qa(t){let e=t.target.value,n=window.location.pathname.split("/").pop()+window.location.hash,r=`${e}/${n}`;_t(r).then(i=>{i?window.location.href=r:window.location.href=e})}function Fa(t){let e=this.href,n=window.location.pathname.split("/").pop()+window.location.hash,r=`${e}/${n}`;t.preventDefault(),_t(r).then(i=>{i?window.location.href=r:window.location.href=e})}function dn(){let t=f(mi);t&&(t.focus(),t.addEventListener("keydown",e=>{(e.key==="Escape"||e.key==="v")&&(e.preventDefault(),t.blur())}),navigator.userActivation.isActive&&"showPicker"in HTMLSelectElement.prototype&&t.showPicker())}var Va="content",$a="tabs-open",Ua="tabs-close",ja="H3",Wa="tabset";window.addEventListener("exdoc:loaded",za);function za(){let t=[],e=[],n=document.createNodeIterator(document.getElementById(Va),NodeFilter.SHOW_COMMENT,i=>i.nodeValue.trim()===$a?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT),r;for(;r=n.nextNode();){let i=[];t.push([r,i]);let s,o=r;for(;o=o.nextSibling;)if(o.nodeName===ja){s=[];let a=o.querySelector(".text")?.childNodes||o.childNodes;i.push([a,s]),e.push(o)}else if(o.nodeName==="#comment"&&o.nodeValue.trim()===Ua){e.push(o);break}else s&&s.push(o)}t.forEach(([i,s],o)=>{let a=E("div",{class:Wa});i.parentNode.replaceChild(a,i);let l=E("div",{role:"tablist",class:"tabset-tablist"});a.appendChild(l),s.forEach(([u,c],d)=>{let h=d===0,p=`tab-${o}-${d}`,g=`tabpanel-${o}-${d}`,m=E("button",{role:"tab",id:p,class:"tabset-tab",tabindex:h?0:-1,"aria-selected":h,"aria-controls":g},u);m.addEventListener("click",Ga),m.addEventListener("keydown",Ka),l.appendChild(m);let v=E("div",{role:"tabpanel",id:g,class:"tabset-panel",hidden:h?void 0:"","aria-labelledby":p},c);a.appendChild(v)})}),e.forEach(i=>{i.parentNode.removeChild(i)})}function Ga(t){vi(t.currentTarget)}function Ka(t){if(gi[t.code]){t.preventDefault();let e=[...t.currentTarget.parentNode.childNodes],n=e.indexOf(t.currentTarget),r=gi[t.code](n,e.length);vi(e.at(r%e.length))}}var gi={ArrowLeft:t=>t-1,ArrowRight:t=>t+1,Home:()=>0,End:(t,e)=>e-1};function vi(t){let e=t.parentNode.querySelector("[aria-selected=true]");if(e===t)return;e.setAttribute("aria-selected","false"),e.tabIndex=-1,t.setAttribute("aria-selected","true"),t.tabIndex=0,t.focus();let n=document.getElementById(e.getAttribute("aria-controls"));n.setAttribute("hidden",""),n.tabIndex=-1;let r=document.getElementById(t.getAttribute("aria-controls"));r.removeAttribute("hidden"),r.tabIndex=0}window.addEventListener("exdoc:loaded",Ya);function Ya(){let t=window.location.pathname.replace(/(\.html)?$/,".livemd"),e=encodeURIComponent(new URL(t,window.location.href).toString());M.getAndSubscribe(({livebookUrl:n})=>{let r=n?`${n}/import?url=${e}`:`https://livebook.dev/run?url=${e}`;for(let i of C(".livebook-badge"))i.href=r})}var Ja="hll";window.addEventListener("exdoc:loaded",Xa);function Xa(){C("[data-group-id]").forEach(t=>{t.addEventListener("mouseenter",yi),t.addEventListener("mouseleave",yi)})}function yi(t){let e=t.currentTarget,n=t.type==="mouseenter",r=e.getAttribute("data-group-id");e.parentElement.querySelectorAll(`[data-group-id="${r}"]`).forEach(i=>{i.classList.toggle(Ja,n)})}var j={module:"module",moduleChild:"module-child",mixTask:"mix-task",extra:"extra",section:"section"},Za=10;function bi(t,e=null){let n=e||window.autocompleteLimit||Za;if(he(t))return[];let r=qe(),i=[...hn(r.modules,t,j.module,"module"),...el(r.modules,t,j.moduleChild),...hn(r.tasks,t,j.mixTask,"mix task"),...hn(r.extras,t,j.extra,"page"),...fn(r.modules,t,j.section,"module"),...fn(r.tasks,t,j.section,"mix task"),...fn(r.extras,t,j.section,"page")].filter(s=>s!==null);return al(i).slice(0,n)}function hn(t,e,n,r){return t.map(i=>i.searchData?null:nl(i,e,n,r))}function el(t,e,n){return t.filter(r=>r.nodeGroups).flatMap(r=>r.nodeGroups.flatMap(({key:i,nodes:s})=>{let o=ol(i);return s.map(a=>rl(a,r.id,e,n,o)||sl(a,r.id,e,n,o))}))}function fn(t,e,n,r){return t.flatMap(i=>tl(i).map(s=>il(i,s,e,n,r)))}function tl(t){return t.searchData?t.searchData:(t.sections||[]).concat(t.headers||[])}function nl(t,e,n,r){return ct(t.title,e)?{link:`${t.id}.html`,title:ft(t.title,e),description:null,matchQuality:dt(t.title,e),deprecated:t.deprecated,labels:[r],category:n}:null}function rl(t,e,n,r,i){return ct(t.id,n)?{link:`${e}.html#${t.anchor}`,title:ft(t.id,n),labels:[i],description:e,matchQuality:dt(t.id,n),deprecated:t.deprecated,category:r}:null}function il(t,e,n,r,i){if(!Ei(e.id,n))return null;let s;return e.anchor===""?s=`${t.id}.html`:s=`${t.id}.html#${e.anchor}`,{link:s,title:ft(e.id,n),description:t.title,matchQuality:dt(e.id,n),labels:e.labels||[i,"section"],category:r}}function sl(t,e,n,r,i){let s=`${e}.${t.id}`,o=`${e}:${t.id}`,a,l;if(ct(s,n))a=s,l=/\./g;else if(ct(o,n))a=o,l=/:/g;else return null;let u=n.replace(l," ");return Ei(t.id,u)?{link:`${e}.html#${t.anchor}`,title:ft(t.id,u),label:i,description:e,matchQuality:dt(a,n),deprecated:t.deprecated,category:r}:null}function ol(t){switch(t){case"callbacks":return"callback";case"types":return"type";default:return"function"}}function al(t){return t.slice().sort((e,n)=>e.matchQuality!==n.matchQuality?n.matchQuality-e.matchQuality:wi(e.category)-wi(n.category))}function wi(t){switch(t){case j.module:return 1;case j.moduleChild:return 2;case j.mixTask:return 3;default:return 4}}function Ei(t,e){return ht(e).some(r=>xi(t,r))}function ct(t,e){return ht(e).every(r=>xi(t,r))}function xi(t,e){return t.toLowerCase().includes(e.toLowerCase())}function dt(t,e){let n=ht(e),i=n.map(o=>o.length).reduce((o,a)=>o+a,0)/t.length,s=ll(t,n[0])?1:0;return i+s}function ll(t,e){return t.toLowerCase().startsWith(e.toLowerCase())}function ht(t){return t.trim().split(/\s+/)}function ft(t,e){let n=ht(e).sort((r,i)=>i.length-r.length);return ut(t,n)}function ut(t,e){if(e.length===0)return t;let[n,...r]=e,i=t.match(new RegExp(`(.*)(${Jn(n)})(.*)`,"i"));if(i){let[,s,o,a]=i;return ut(s,e)+""+Ne(o)+""+ut(a,e)}else return ut(t,r)}var Si=Y(ae());var ki=Si.template({1:function(t,e,n,r,i){return` Autocompletion results within this project +`},3:function(t,e,n,r,i){return` No autocompletion results within this project +`},5:function(t,e,n,r,i){var s,o,a=e??(t.nullContext||{}),l=t.hooks.helperMissing,u="function",c=t.escapeExpression,d=t.lookupProperty||function(h,p){if(Object.prototype.hasOwnProperty.call(h,p))return h[p]};return' + `+((s=(o=(o=d(n,"title")||(e!=null?d(e,"title"):e))!=null?o:l,typeof o===u?o.call(a,{name:"title",hash:{},data:i,loc:{start:{line:19,column:44},end:{line:19,column:55}}}):o))!=null?s:"")+` +`+((s=d(n,"if").call(a,e!=null?d(e,"description"):e,{name:"if",hash:{},fn:t.program(6,i,0),inverse:t.noop,data:i,loc:{start:{line:20,column:8},end:{line:23,column:15}}}))!=null?s:"")+((s=d(n,"if").call(a,e!=null?d(e,"deprecated"):e,{name:"if",hash:{},fn:t.program(8,i,0),inverse:t.noop,data:i,loc:{start:{line:24,column:8},end:{line:26,column:15}}}))!=null?s:"")+((s=d(n,"each").call(a,e!=null?d(e,"labels"):e,{name:"each",hash:{},fn:t.program(10,i,0),inverse:t.noop,data:i,loc:{start:{line:27,column:8},end:{line:29,column:17}}}))!=null?s:"")+` +`},6:function(t,e,n,r,i){var s,o,a=t.lookupProperty||function(l,u){if(Object.prototype.hasOwnProperty.call(l,u))return l[u]};return` + `+((s=(o=(o=a(n,"description")||(e!=null?a(e,"description"):e))!=null?o:t.hooks.helperMissing,typeof o=="function"?o.call(e??(t.nullContext||{}),{name:"description",hash:{},data:i,loc:{start:{line:22,column:49},end:{line:22,column:66}}}):o))!=null?s:"")+` +`},8:function(t,e,n,r,i){return` deprecated +`},10:function(t,e,n,r,i){return' '+t.escapeExpression(t.lambda(e,e))+` +`},compiler:[8,">= 4.3.0"],main:function(t,e,n,r,i){var s,o=e??(t.nullContext||{}),a=t.lookupProperty||function(l,u){if(Object.prototype.hasOwnProperty.call(l,u))return l[u]};return`
+
+
+
+ +`+((s=a(n,"if").call(o,(s=e!=null?a(e,"suggestions"):e)!=null?a(s,"length"):s,{name:"if",hash:{},fn:t.program(1,i,0),inverse:t.program(3,i,0),data:i,loc:{start:{line:6,column:8},end:{line:10,column:15}}}))!=null?s:"")+` + + Press RETURN for full-text search + +
+
+`+((s=a(n,"each").call(o,e!=null?a(e,"suggestions"):e,{name:"each",hash:{},fn:t.program(5,i,0),inverse:t.noop,data:i,loc:{start:{line:17,column:6},end:{line:31,column:15}}}))!=null?s:"")+`
+
+
+`},useData:!0});var pe=".autocomplete",pn=".autocomplete-suggestions",Li=".autocomplete-suggestion",W={autocompleteSuggestions:[],selectedIdx:-1};function ul(){f(pe).classList.add("shown")}function mn(){f(pe).classList.remove("shown")}function Ti(){return f(pe).classList.contains("shown")}function gn(t){W.autocompleteSuggestions=bi(t),W.selectedIdx=-1,he(t)?mn():(cl({term:t,suggestions:W.autocompleteSuggestions}),pt(0),ul())}function cl({term:t,suggestions:e}){let n=ki({suggestions:e,term:t}),r=f(pe);r.innerHTML=n}function _i(){return W.selectedIdx===-1?null:W.autocompleteSuggestions[W.selectedIdx]}function pt(t){dl(hl(t))}function dl(t){W.selectedIdx=t;let e=f(pn),n=f(`${Li}.selected`),r=f(`${Li}[data-index="${W.selectedIdx}"]`);n&&n.classList.remove("selected"),r?(r.classList.add("selected"),r.scrollIntoView({block:"nearest"})):e&&(e.scrollTop=0)}function hl(t){let e=W.autocompleteSuggestions.length+1;return(W.selectedIdx+t+1+e)%e-1}var me="form.search-bar input",fl="form.search-bar .search-close-button",pl=".engine-selector",Le=".engine-button",Te=".engine-dropdown",vt=null;R||window.addEventListener("exdoc:loaded",ml);function ml(){gl(),wl(),yl()}function gl(){let t=document.querySelectorAll(".engine-option");if(t.length===0){vt="search.html?q=";return}let e=window.location.pathname;if(e.endsWith("/search.html")||e.endsWith("/search")){let n=Array.from(t).find(r=>r.dataset.engineUrl.startsWith("search.html"));if(n){Ii(n);return}}vt=t[0].dataset.engineUrl}function Ii(t){vt=t.dataset.engineUrl;let n=f(Le)?.querySelector(".engine-name");n&&(n.textContent=t.querySelector(".name").textContent),f(Te)?.querySelectorAll(".engine-option").forEach(i=>{i.setAttribute("aria-checked",i===t?"true":"false")})}function Pi(){let t=f(Le),e=f(Te);if(!t||!e)return;t.getAttribute("aria-expanded")==="true"?ke():vl()}function vl(){let t=f(Le),e=f(Te);if(!t||!e)return;t.setAttribute("aria-expanded","true"),e.removeAttribute("hidden"),e.querySelector(".engine-option")?.focus()}function ke(){let t=f(Le),e=f(Te);!t||!e||(t.setAttribute("aria-expanded","false"),e.setAttribute("hidden",""))}function Ci(t){let e=f(me);e.value=t}function Ri(){let t=f(me);document.body.classList.add("search-focused"),t.focus()}function yl(){let t=f(me),e=parseInt(document.querySelector('meta[name="exdoc:autocomplete-limit"]')?.content);e&&(window.autocompleteLimit=e),t.setAttribute("autocomplete-limit",e)}function wl(){let t=f(me);if(document.querySelector('meta[name="exdoc:autocomplete"][content="off"]'))return t.addEventListener("keydown",r=>{r.key==="Enter"&&Oi(r)}),!0;t.addEventListener("keydown",r=>{let i=Qe();r.key==="Escape"?(mt(),t.blur()):r.key==="Enter"?Oi(r):r.key==="ArrowUp"||i&&r.ctrlKey&&r.key==="p"?(pt(-1),r.preventDefault()):(r.key==="ArrowDown"||i&&r.ctrlKey&&r.key==="n")&&(pt(1),r.preventDefault())}),t.addEventListener("input",r=>{gn(r.target.value)}),t.addEventListener("focus",r=>{document.body.classList.contains("search-focused")||(document.body.classList.add("search-focused"),gn(r.target.value))}),t.addEventListener("blur",r=>{let i=r.relatedTarget,s=f(pn);if(i&&s&&s.contains(i))return setTimeout(()=>{Ti()&&t.focus()},1e3),null;gt()}),f(pe).addEventListener("click",r=>{r.shiftKey||r.ctrlKey?t.focus():(mt(),gt())}),f(fl).addEventListener("click",r=>{mt(),gt(),t.blur()});let e=f(Le);e&&(e.addEventListener("click",r=>{r.stopPropagation(),Pi()}),e.addEventListener("keydown",r=>{r.key==="Enter"||r.key===" "?(r.preventDefault(),Pi()):r.key==="Escape"&&ke()})),document.addEventListener("click",r=>{let i=f(pl);i&&!i.contains(r.target)&&ke()});let n=f(Te);n&&(n.querySelectorAll(".engine-option").forEach(r=>{r.addEventListener("click",()=>{Ii(r),ke()})}),n.addEventListener("keydown",r=>{let i=Array.from(n.querySelectorAll(".engine-option")),s=i.indexOf(document.activeElement);if(r.key==="ArrowDown"){r.preventDefault();let o=(s+1)%i.length;i[o]?.focus()}else if(r.key==="ArrowUp"){r.preventDefault();let o=(s-1+i.length)%i.length;i[o]?.focus()}else r.key==="Escape"?(r.preventDefault(),ke(),e?.focus()):(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),document.activeElement?.click())}))}function Oi(t){let e=f(me),n=t.shiftKey||t.ctrlKey,r=_i();t.preventDefault();let i=n?"_blank":"_self",s=document.createElement("a");s.setAttribute("target",i),r?s.setAttribute("href",r.link):s.setAttribute("href",`${vt}${encodeURIComponent(e.value)}`),s.click(),n||(mt(),gt())}function mt(){let t=f(me);t.value=""}function gt(){document.body.classList.remove("search-focused"),mn()}var vn,Ai=2;window.addEventListener("scroll",function(){let t=window.scrollY;if(vn!==void 0){let e=t-vn;t===0||e>Ai?document.body.classList.remove("scroll-sticky"):t>0&&-e>Ai&&document.body.classList.add("scroll-sticky")}vn=Math.max(0,t)},!1);var Mi=Y(ae());var Hi=Mi.template({1:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return`
+ `+t.escapeExpression(t.lambda((s=e!=null?o(e,"hint"):e)!=null?o(s,"description"):s,e))+` +
+`},3:function(t,e,n,r,i){var s,o=t.lambda,a=t.escapeExpression,l=t.lookupProperty||function(u,c){if(Object.prototype.hasOwnProperty.call(u,c))return u[c]};return`
+

+ `+a(o((s=e!=null?l(e,"hint"):e)!=null?l(s,"title"):s,e))+` +
`+a(o((s=e!=null?l(e,"hint"):e)!=null?l(s,"version"):s,e))+`
+

+
+`+((s=l(n,"if").call(e??(t.nullContext||{}),(s=e!=null?l(e,"hint"):e)!=null?l(s,"description"):s,{name:"if",hash:{},fn:t.program(4,i,0),inverse:t.noop,data:i,loc:{start:{line:12,column:2},end:{line:16,column:9}}}))!=null?s:"")},4:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return`
+ `+((s=t.lambda((s=e!=null?o(e,"hint"):e)!=null?o(s,"description"):s,e))!=null?s:"")+` +
+`},compiler:[8,">= 4.3.0"],main:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return(s=o(n,"if").call(e??(t.nullContext||{}),e!=null?o(e,"isPlain"):e,{name:"if",hash:{},fn:t.program(1,i,0),inverse:t.program(3,i,0),data:i,loc:{start:{line:1,column:0},end:{line:17,column:7}}}))!=null?s:""},useData:!0});var bl='
',El='.content a:not([data-no-tooltip=""])',yn=".tooltip",Ni=".tooltip .tooltip-body",Di="body .content-inner",xl="#content",Bi="tooltip-shown",_e=10,Sl=_e*4,kl=768,Ll=450,Tl=100,le={currentLinkElement:null,hoverDelayTimeout:null};window.addEventListener("exdoc:loaded",_l);function _l(){C(El).forEach(t=>{Pl(t)&&(t.addEventListener("mouseenter",Al),t.addEventListener("mouseleave",Cl))})}function Pl(t){return!(Ol(t.href)||!jn(t.href))}function Ol(t){let e=t.replace(xl,"");return window.location.href.split("#")[0]===e}function Al(t){if(window.innerWidth{Wn(e.href).then(Il).catch(()=>{})},Tl)}function Il(t){let e=Hi({isPlain:t.kind===ie.plain,hint:t}),n=f(Ni);n||(f(Di).insertAdjacentHTML("beforeend",bl),n=f(Ni)),n.innerHTML=e,Rl(),f(yn).classList.add(Bi)}function Cl(){le.currentLinkElement&&(clearTimeout(le.hoverDelayTimeout),Gn(),le.currentLinkElement=null,f(yn)?.classList.remove(Bi))}function Rl(){if(!le.currentLinkElement)return;let t=f(yn),e=le.currentLinkElement.getBoundingClientRect(),n=f(Di).getBoundingClientRect(),r=t.getBoundingClientRect(),i=Ml(e,n);if(e.left+r.width+_e code:first-child):not(:has(.copy-button))").forEach(t=>{if(!wn){let r=document.createElement("div");r.innerHTML=Qi,wn=r.firstChild}let e=wn.cloneNode(!0);t.appendChild(e);let n;e.addEventListener("click",()=>{clearTimeout(n);let r=Array.from(t.querySelectorAll("code > *:not(.unselectable)")).map(i=>i.textContent).join("");navigator.clipboard.writeText(r),e.classList.add("clicked"),e.disabled=!0,n=setTimeout(()=>{e.classList.remove("clicked"),e.disabled=!1},3e3)})})}var F=Y(Vi());var $i=Y(ae());var Ui=$i.template({1:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return" Search results for "+t.escapeExpression((s=(s=o(n,"value")||(e!=null?o(e,"value"):e))!=null?s:t.hooks.helperMissing,typeof s=="function"?s.call(e??(t.nullContext||{}),{name:"value",hash:{},data:i,loc:{start:{line:3,column:27},end:{line:3,column:36}}}):s))+` +`},3:function(t,e,n,r,i){return` Invalid search +`},5:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return(s=o(n,"each").call(e??(t.nullContext||{}),e!=null?o(e,"results"):e,{name:"each",hash:{},fn:t.program(6,i,0),inverse:t.noop,data:i,loc:{start:{line:10,column:2},end:{line:21,column:11}}}))!=null?s:""},6:function(t,e,n,r,i){var s,o=t.lambda,a=t.escapeExpression,l=t.lookupProperty||function(u,c){if(Object.prototype.hasOwnProperty.call(u,c))return u[c]};return`
+

+ + `+a(o(e!=null?l(e,"title"):e,e))+" ("+a(o(e!=null?l(e,"type"):e,e))+`) + +

+`+((s=l(n,"each").call(e??(t.nullContext||{}),e!=null?l(e,"excerpts"):e,{name:"each",hash:{},fn:t.program(7,i,0),inverse:t.noop,data:i,loc:{start:{line:17,column:8},end:{line:19,column:17}}}))!=null?s:"")+`
+`},7:function(t,e,n,r,i){var s;return'

'+((s=t.lambda(e,e))!=null?s:"")+`

+`},9:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return((s=(o(n,"isArray")||e&&o(e,"isArray")||t.hooks.helperMissing).call(e??(t.nullContext||{}),e!=null?o(e,"results"):e,{name:"isArray",hash:{},fn:t.program(10,i,0),inverse:t.program(12,i,0),data:i,loc:{start:{line:23,column:2},end:{line:29,column:14}}}))!=null?s:"")+` +

The search functionality is full-text based. Here are some tips:

+ +
    +
  • Multiple words (such as foo bar) are searched as OR
  • +
  • Use * anywhere (such as fo*) as wildcard
  • +
  • Use + before a word (such as +foo) to make its presence required
  • +
  • Use - before a word (such as -foo) to make its absence required
  • +
  • Use : to search on a particular field (such as field:word). The available fields are title, doc and type
  • +
  • Use WORD^NUMBER (such as foo^2) to boost the given word
  • +
  • Use WORD~NUMBER (such as foo~2) to do a search with edit distance on word
  • +
+ +

To quickly go to a module, type, or function, use the autocompletion feature in the sidebar search.

+`},10:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return"

Sorry, we couldn't find anything for "+t.escapeExpression((s=(s=o(n,"value")||(e!=null?o(e,"value"):e))!=null?s:t.hooks.helperMissing,typeof s=="function"?s.call(e??(t.nullContext||{}),{name:"value",hash:{},data:i,loc:{start:{line:24,column:48},end:{line:24,column:57}}}):s))+`.

+`},12:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return(s=o(n,"if").call(e??(t.nullContext||{}),e!=null?o(e,"value"):e,{name:"if",hash:{},fn:t.program(13,i,0),inverse:t.program(15,i,0),data:i,loc:{start:{line:25,column:2},end:{line:29,column:2}}}))!=null?s:""},13:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return"

Invalid search: "+t.escapeExpression((s=(s=o(n,"errorMessage")||(e!=null?o(e,"errorMessage"):e))!=null?s:t.hooks.helperMissing,typeof s=="function"?s.call(e??(t.nullContext||{}),{name:"errorMessage",hash:{},data:i,loc:{start:{line:26,column:23},end:{line:26,column:39}}}):s))+`.

+`},15:function(t,e,n,r,i){return`

Please type something into the search bar to perform a search.

+ `},compiler:[8,">= 4.3.0"],main:function(t,e,n,r,i){var s,o=e??(t.nullContext||{}),a=t.lookupProperty||function(l,u){if(Object.prototype.hasOwnProperty.call(l,u))return l[u]};return`

+`+((s=a(n,"if").call(o,e!=null?a(e,"value"):e,{name:"if",hash:{},fn:t.program(1,i,0),inverse:t.program(3,i,0),data:i,loc:{start:{line:2,column:2},end:{line:6,column:9}}}))!=null?s:"")+`

+ +`+((s=(a(n,"isNonEmptyArray")||e&&a(e,"isNonEmptyArray")||t.hooks.helperMissing).call(o,e!=null?a(e,"results"):e,{name:"isNonEmptyArray",hash:{},fn:t.program(5,i,0),inverse:t.program(9,i,0),data:i,loc:{start:{line:9,column:0},end:{line:44,column:20}}}))!=null?s:"")},useData:!0});var Nl="#search";F.default.tokenizer.separator=/\s+/;F.default.QueryLexer.termSeparator=/\s+/;F.default.Pipeline.registerFunction(zi,"docTokenSplitter");F.default.Pipeline.registerFunction(Gi,"docTrimmer");window.addEventListener("exdoc:loaded",Dl);function Dl(){let t=window.location.pathname;if(t.endsWith("/search.html")||t.endsWith("/search")){let e=Zn("q");Bl(e)}}async function Bl(t){if(he(t))bn({value:t});else{Ci(t);let e=await Ql();try{let n=t.replaceAll(/(\B|\\):/g,"\\:"),r=Kl(e.search(n));bn({value:t,results:r})}catch(n){bn({value:t,errorMessage:n.message})}}}function bn({value:t,results:e,errorMessage:n}){let r=f(Nl),i=Ui({value:t,results:e,errorMessage:n});r.innerHTML=i}async function Ql(){let t=await ql();if(t)return t;let e=Wl();return Fl(e),e}async function ql(){try{let t=sessionStorage.getItem(Wi());if(t){let e=await $l(t);return F.default.Index.load(e)}else return null}catch(t){return console.error("Failed to load index: ",t),null}}async function Fl(t){try{let e=await Vl(t);sessionStorage.setItem(Wi(),e)}catch(e){console.error("Failed to save index: ",e)}}async function Vl(t){let e=new Blob([JSON.stringify(t)],{type:"application/json"}).stream().pipeThrough(new window.CompressionStream("gzip")),r=await(await new Response(e).blob()).arrayBuffer();return Ul(r)}async function $l(t){let e=new Blob([jl(t)],{type:"application/json"}).stream().pipeThrough(new window.DecompressionStream("gzip")),n=await new Response(e).text();return JSON.parse(n)}function Ul(t){let e="",n=new Uint8Array(t),r=n.byteLength;for(let i=0;i{this.add(t)})})}function zl(t){t.pipeline.before(F.default.stemmer,zi)}function zi(t){let e=[t],n=/\/\d+$/,r=/\:|\./,i=t.toString();if(i.replace(/^[.,;?!]+|[.,;]+$/g,""),i.startsWith("`")&&i.endsWith("`")&&(i=i.slice(1,-1)),n.test(i)){let o=t.toString().replace(n,"");e.push(t.clone().update(()=>o));let a=o.split(r);if(a.length>1){for(let u of a)e.push(t.clone().update(()=>u));let l=t.toString().split(r);e.push(t.clone().update(()=>l[l.length-1]))}i=a[a.length-1]}else i.startsWith("@")?(i=i.substring(1),e.push(t.clone().update(()=>i))):i.startsWith(":")&&(i=i.substring(1),e.push(t.clone().update(()=>i)));let s=i.split(/\_|\-/);if(s.length>1)for(let o of s)e.push(t.clone().update(()=>o));return e}function Gl(t){t.pipeline.before(F.default.stemmer,Gi)}function Gi(t){return t.update(function(e){return e.replace(/^[^@:\w]+/,"").replace(/[^\?\!\w]+$/,"")})}function Kl(t){return t.filter(e=>ji(e.ref)).map(e=>{let n=ji(e.ref),r=e.matchData.metadata;return{...n,metadata:r,excerpts:Yl(n,r)}})}function ji(t){return searchData.items.find(e=>e.ref===t)||null}function Yl(t,e){let{doc:n}=t,r=Object.keys(e);return[Jl(n,r)]}function Jl(t,e){let r=t.split(`\r +\r +`).flatMap(a=>a.split(` + +`)),i;r.length>=2?r[0].trim().startsWith("#")?i=r[1]:i=r[0]:r.length===1?i=r[0]:i=t;let s;i.length>200?s=i.slice(0,200)+"...":s=i;let o=Ne(s);for(let a of e){if(a.trim()==="")continue;let l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(l,"gi");o=o.replace(u,c=>`${c}`)}return o}var Ki='';var Xl='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',H=null,Sn=null,En=null,xn=!1;function Zl(){H||(document.body.insertAdjacentHTML("beforeend",Ki),H=f(".modal"),H.addEventListener("keydown",t=>{t.key==="Escape"&&ue()}),H.querySelector(".modal-close").addEventListener("click",ue),H.addEventListener("click",t=>{t.target===H&&ue()}))}function Yi(t){if(!xn)if(H.contains(t.target))En=t.target;else{xn=!0;let e=H.querySelectorAll(Xl);En===e[0]?e[e.length-1].focus():e[0].focus(),xn=!1,En=document.activeElement}}function yt({title:t,body:e}){Zl(),Sn=document.activeElement,document.addEventListener("focus",Yi,!0),H.querySelector(".modal-title").innerHTML=t,H.querySelector(".modal-body").innerHTML=e,H.classList.add("shown"),H.focus()}function ue(){H?.classList.remove("shown"),document.removeEventListener("focus",Yi,!0),Sn?.focus(),Sn=null}function Ji(){return Boolean(H?.classList.contains("shown"))}var Xi='
';var eu="https://hexdocs.pm/%%",tu="https://www.erlang.org/doc/apps/%%",nu="https://hex.pm/api/packages?search=name:%%*",ru=".display-quick-switch",es="#quick-switch-input",ts="#quick-switch-results",iu=300,su=9,ns=["erts","asn1","common_test","compiler","crypto","debugger","dialyzer","diameter","edoc","eldap","erl_interface","et","eunit","ftp","inets","jinterface","kernel","megaco","mnesia","observer","odbc","os_mon","parsetools","public_key","reltool","runtime_tools","sasl","snmp","ssh","ssl","stdlib","syntax_tools","tftp","tools","wx","xmerl"],ou=["elixir","eex","ex_unit","hex","iex","logger","mix"].concat(ns).map(t=>({name:t})),rs=2,D={autocompleteResults:[],selectedIdx:null};R||window.addEventListener("exdoc:loaded",au);function au(){C(ru).forEach(t=>{t.addEventListener("click",Ln)})}function lu(t){if(t.key==="Enter"){let e=t.target.value;cu(e),t.preventDefault()}else t.key==="ArrowUp"?(Zi(-1),t.preventDefault()):t.key==="ArrowDown"&&(Zi(1),t.preventDefault())}function uu(t){let e=t.target.value;if(e.lengthn.json()).then(n=>{Array.isArray(n)&&(D.autocompleteResults=pu(t,n),D.selectedIdx=null,f(es).value.length>=rs&&fu(D.autocompleteResults))})}function fu(t){f(ts).replaceChildren(...t.map(({name:e},n)=>{let r=E("div",{class:"quick-switch-result","data-index":n},[e]);return r.addEventListener("click",()=>kn(e)),r}))}function pu(t,e){return ou.concat(e).filter(n=>n.name.toLowerCase().includes(t.toLowerCase())).filter(n=>n.releases===void 0||n.releases[0].has_docs===!0).slice(0,su)}function Zi(t){D.selectedIdx=mu(t);let e=f(".quick-switch-result.selected"),n=f(`.quick-switch-result[data-index="${D.selectedIdx}"]`);e&&e.classList.remove("selected"),n&&n.classList.add("selected")}function mu(t){let e=D.autocompleteResults.length;if(D.selectedIdx===null){if(t>=0)return 0;if(t<0)return e-1}return(D.selectedIdx+t+e)%e}var gu="#settings-modal-content",Pn=[{key:"c",description:"Toggle sidebar",action:je},{key:"n",description:"Cycle themes",action:ar},{key:"s",description:"Focus search bar",displayAs:"/ or s",action:Tn},{key:"/",action:Tn},{key:"k",hasModifier:!0,action:Tn},{key:"v",description:"Open/focus version select",action:wu},{key:"g",description:"Go to package docs",displayAs:"g",action:Ln},{key:"?",displayAs:"?",description:"Bring up this modal",action:bu}],_n={shortcutBeingPressed:null};R||(document.addEventListener("keydown",vu),document.addEventListener("keyup",yu));function vu(t){if(_n.shortcutBeingPressed||t.target.matches("input, select, textarea"))return;let e=Pn.find(n=>n.hasModifier?Qe()&&t.metaKey||t.ctrlKey?n.key===t.key:!1:t.ctrlKey||t.metaKey||t.altKey?!1:n.key===t.key);e&&(_n.shortcutBeingPressed=e,t.preventDefault(),e.action(t))}function yu(t){_n.shortcutBeingPressed=null}function Tn(t){ue(),Ri()}function wu(){ue(),Sr()?dn():Lr().then(dn)}function bu(){Eu()?ue():On()}function Eu(){return Ji()&&f(gu)}var is=Y(ae());var ss=is.template({1:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return(s=o(n,"if").call(e??(t.nullContext||{}),e!=null?o(e,"description"):e,{name:"if",hash:{},fn:t.program(2,i,0),inverse:t.noop,data:i,loc:{start:{line:40,column:6},end:{line:53,column:13}}}))!=null?s:""},2:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return`
+
+ `+t.escapeExpression(t.lambda(e!=null?o(e,"description"):e,e))+` +
+
+`+((s=o(n,"if").call(e??(t.nullContext||{}),e!=null?o(e,"displayAs"):e,{name:"if",hash:{},fn:t.program(3,i,0),inverse:t.program(5,i,0),data:i,loc:{start:{line:46,column:12},end:{line:50,column:19}}}))!=null?s:"")+`
+
+`},3:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return" "+((s=t.lambda(e!=null?o(e,"displayAs"):e,e))!=null?s:"")+` +`},5:function(t,e,n,r,i){var s=t.lookupProperty||function(o,a){if(Object.prototype.hasOwnProperty.call(o,a))return o[a]};return" "+t.escapeExpression(t.lambda(e!=null?s(e,"key"):e,e))+` +`},compiler:[8,">= 4.3.0"],main:function(t,e,n,r,i){var s,o=t.lookupProperty||function(a,l){if(Object.prototype.hasOwnProperty.call(a,l))return a[l]};return`
+
+ + + + +
+ +
+`},useData:!0});var xu=".display-settings",Su="#settings-modal-content",An="#modal-settings-tab",In="#modal-keyboard-shortcuts-tab",as="#settings-content",ls="#keyboard-shortcuts-content",ku=[{title:"Settings",id:"modal-settings-tab"},{title:"Keyboard shortcuts",id:"modal-keyboard-shortcuts-tab"}];window.addEventListener("exdoc:loaded",Lu);function Lu(){C(xu).forEach(t=>{t.addEventListener("click",On)})}function os(){f(In).classList.remove("active"),f(An).classList.add("active"),f(as).classList.remove("hidden"),f(ls).classList.add("hidden")}function Tu(){f(In).classList.add("active"),f(An).classList.remove("active"),f(ls).classList.remove("hidden"),f(as).classList.add("hidden")}function On(){yt({title:ku.map(({id:s,title:o})=>``).join(""),body:ss({shortcuts:Pn})});let t=f(Su),e=t.querySelector('[name="theme"]'),n=t.querySelector('[name="tooltips"]'),r=t.querySelector('[name="direct_livebook_url"]'),i=t.querySelector('[name="livebook_url"]');M.getAndSubscribe(s=>{e.value=s.theme||"system",n.checked=s.tooltips,s.livebookUrl===null?(r.checked=!1,i.classList.add("hidden"),i.tabIndex=-1):(r.checked=!0,i.classList.remove("hidden"),i.tabIndex=0,i.value=s.livebookUrl)}),e.addEventListener("change",s=>{M.update({theme:s.target.value})}),n.addEventListener("change",s=>{M.update({tooltips:s.target.checked})}),r.addEventListener("change",s=>{let o=s.target.checked?i.value:null;M.update({livebookUrl:o})}),i.addEventListener("input",s=>{M.update({livebookUrl:s.target.value})}),f(An).addEventListener("click",s=>{os()}),f(In).addEventListener("click",s=>{Tu()}),os()}var Cn=new WeakMap;function Rn(t,e,n,r){if(!t&&!Cn.has(e))return!1;let i=Cn.get(e)??new WeakMap;Cn.set(e,i);let s=i.get(n)??new Set;i.set(n,s);let o=s.has(r);return t?s.add(r):s.delete(r),o&&t}function _u(t,e){let n=t.target;if(n instanceof Text&&(n=n.parentElement),n instanceof Element&&t.currentTarget instanceof Element){let r=n.closest(e);if(r&&t.currentTarget.contains(r))return r}}function Pu(t,e,n,r={}){let{signal:i,base:s=document}=r;if(i?.aborted)return;let{once:o,...a}=r,l=s instanceof Document?s.documentElement:s,u=Boolean(typeof r=="object"?r.capture:r),c=p=>{let g=_u(p,String(t));if(g){let m=Object.assign(p,{delegateTarget:g});n.call(l,m),o&&(l.removeEventListener(e,c,a),Rn(!1,l,n,d))}},d=JSON.stringify({selector:t,type:e,capture:u});Rn(!0,l,n,d)||l.addEventListener(e,c,a),i?.addEventListener("abort",()=>{Rn(!1,l,n,d)})}var wt=Pu;function O(){return O=Object.assign?Object.assign.bind():function(t){for(var e=1;eString(t).toLowerCase().replace(/[\s/_.]+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+|-+$/g,"")||e||"",Oe=({hash:t}={})=>window.location.pathname+window.location.search+(t?window.location.hash:""),Ou=(t,e={})=>{let n=O({url:t=t||Oe({hash:!0}),random:Math.random(),source:"swup"},e);window.history.pushState(n,"",t)},Pe=(t=null,e={})=>{t=t||Oe({hash:!0});let n=O({},window.history.state||{},{url:t,random:Math.random(),source:"swup"},e);window.history.replaceState(n,"",t)},Au=(t,e,n,r)=>{let i=new AbortController;return r=O({},r,{signal:i.signal}),wt(t,e,n,r),{destroy:()=>i.abort()}},A=class extends URL{constructor(e,n=document.baseURI){super(e.toString(),n),Object.setPrototypeOf(this,A.prototype)}get url(){return this.pathname+this.search}static fromElement(e){let n=e.getAttribute("href")||e.getAttribute("xlink:href")||"";return new A(n)}static fromUrl(e){return new A(e)}};var ge=class extends Error{constructor(e,n){super(e),this.url=void 0,this.status=void 0,this.aborted=void 0,this.timedOut=void 0,this.name="FetchError",this.url=n.url,this.status=n.status,this.aborted=n.aborted||!1,this.timedOut=n.timedOut||!1}};async function Iu(t,e={}){var n;t=A.fromUrl(t).url;let{visit:r=this.visit}=e,i=O({},this.options.requestHeaders,e.headers),s=(n=e.timeout)!=null?n:this.options.timeout,o=new AbortController,{signal:a}=o;e=O({},e,{headers:i,signal:a});let l,u=!1,c=null;s&&s>0&&(c=setTimeout(()=>{u=!0,o.abort("timeout")},s));try{l=await this.hooks.call("fetch:request",r,{url:t,options:e},(v,{url:w,options:x})=>fetch(w,x)),c&&clearTimeout(c)}catch(v){throw u?(this.hooks.call("fetch:timeout",r,{url:t}),new ge(`Request timed out: ${t}`,{url:t,timedOut:u})):v?.name==="AbortError"||a.aborted?new ge(`Request aborted: ${t}`,{url:t,aborted:!0}):v}let{status:d,url:h}=l,p=await l.text();if(d===500)throw this.hooks.call("fetch:error",r,{status:d,response:l,url:h}),new ge(`Server error: ${h}`,{status:d,url:h});if(!p)throw new ge(`Empty response: ${h}`,{status:d,url:h});let{url:g}=A.fromUrl(h),m={url:g,html:p};return!r.cache.write||e.method&&e.method!=="GET"||t!==g||this.cache.set(m.url,m),m}var Hn=class{constructor(e){this.swup=void 0,this.pages=new Map,this.swup=e}get size(){return this.pages.size}get all(){let e=new Map;return this.pages.forEach((n,r)=>{e.set(r,O({},n))}),e}has(e){return this.pages.has(this.resolve(e))}get(e){let n=this.pages.get(this.resolve(e));return n&&O({},n)}set(e,n){n=O({},n,{url:e=this.resolve(e)}),this.pages.set(e,n),this.swup.hooks.callSync("cache:set",void 0,{page:n})}update(e,n){e=this.resolve(e);let r=O({},this.get(e),n,{url:e});this.pages.set(e,r)}delete(e){this.pages.delete(this.resolve(e))}clear(){this.pages.clear(),this.swup.hooks.callSync("cache:clear",void 0,void 0)}prune(e){this.pages.forEach((n,r)=>{e(r,n)&&this.delete(r)})}resolve(e){let{url:n}=A.fromUrl(e);return this.swup.resolveUrl(n)}},Nn=(t,e=document)=>e.querySelector(t),Qn=(t,e=document)=>Array.from(e.querySelectorAll(t)),fs=()=>new Promise(t=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t()})})});function ps(t){return!!t&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"}function Cu(t,e=[]){return new Promise((n,r)=>{let i=t(...e);ps(i)?i.then(n,r):n(i)})}function us(t,e){let n=t?.closest(`[${e}]`);return n!=null&&n.hasAttribute(e)?n?.getAttribute(e)||!0:void 0}var Dn=class{constructor(e){this.swup=void 0,this.swupClasses=["to-","is-changing","is-rendering","is-popstate","is-animating","is-leaving"],this.swup=e}get selectors(){let{scope:e}=this.swup.visit.animation;return e==="containers"?this.swup.visit.containers:e==="html"?["html"]:Array.isArray(e)?e:[]}get selector(){return this.selectors.join(",")}get targets(){return this.selector.trim()?Qn(this.selector):[]}add(...e){this.targets.forEach(n=>n.classList.add(...e))}remove(...e){this.targets.forEach(n=>n.classList.remove(...e))}clear(){this.targets.forEach(e=>{let n=e.className.split(" ").filter(r=>this.isSwupClass(r));e.classList.remove(...n)})}isSwupClass(e){return this.swupClasses.some(n=>e.startsWith(n))}},xt=class{constructor(e,n){this.id=void 0,this.state=void 0,this.from=void 0,this.to=void 0,this.containers=void 0,this.animation=void 0,this.trigger=void 0,this.cache=void 0,this.history=void 0,this.scroll=void 0,this.meta=void 0;let{to:r,from:i,hash:s,el:o,event:a}=n;this.id=Math.random(),this.state=1,this.from={url:i??e.location.url,hash:e.location.hash},this.to={url:r,hash:s},this.containers=e.options.containers,this.animation={animate:!0,wait:!1,name:void 0,native:e.options.native,scope:e.options.animationScope,selector:e.options.animationSelector},this.trigger={el:o,event:a},this.cache={read:e.options.cache,write:e.options.cache},this.history={action:"push",popstate:!1,direction:void 0},this.scroll={reset:!0,target:void 0},this.meta={}}advance(e){this.state=7}};function Ru(t){return new xt(this,t)}var Bn=class{constructor(e){this.swup=void 0,this.registry=new Map,this.hooks=["animation:out:start","animation:out:await","animation:out:end","animation:in:start","animation:in:await","animation:in:end","animation:skip","cache:clear","cache:set","content:replace","content:scroll","enable","disable","fetch:request","fetch:error","fetch:timeout","history:popstate","link:click","link:self","link:anchor","link:newtab","page:load","page:view","scroll:top","scroll:anchor","visit:start","visit:transition","visit:abort","visit:end"],this.swup=e,this.init()}init(){this.hooks.forEach(e=>this.create(e))}create(e){this.registry.has(e)||this.registry.set(e,new Map)}exists(e){return this.registry.has(e)}get(e){let n=this.registry.get(e);if(n)return n;console.error(`Unknown hook '${e}'`)}clear(){this.registry.forEach(e=>e.clear())}on(e,n,r={}){let i=this.get(e);if(!i)return console.warn(`Hook '${e}' not found.`),()=>{};let s=O({},r,{id:i.size+1,hook:e,handler:n});return i.set(n,s),()=>this.off(e,n)}before(e,n,r={}){return this.on(e,n,O({},r,{before:!0}))}replace(e,n,r={}){return this.on(e,n,O({},r,{replace:!0}))}once(e,n,r={}){return this.on(e,n,O({},r,{once:!0}))}off(e,n){let r=this.get(e);r&&n?r.delete(n)||console.warn(`Handler for hook '${e}' not found.`):r&&r.clear()}async call(e,n,r,i){let[s,o,a]=this.parseCallArgs(e,n,r,i),{before:l,handler:u,after:c}=this.getHandlers(e,a);await this.run(l,s,o);let[d]=await this.run(u,s,o,!0);return await this.run(c,s,o),this.dispatchDomEvent(e,s,o),d}callSync(e,n,r,i){let[s,o,a]=this.parseCallArgs(e,n,r,i),{before:l,handler:u,after:c}=this.getHandlers(e,a);this.runSync(l,s,o);let[d]=this.runSync(u,s,o,!0);return this.runSync(c,s,o),this.dispatchDomEvent(e,s,o),d}parseCallArgs(e,n,r,i){return n instanceof xt||typeof n!="object"&&typeof r!="function"?[n,r,i]:[void 0,n,r]}async run(e,n=this.swup.visit,r,i=!1){let s=[];for(let{hook:o,handler:a,defaultHandler:l,once:u}of e)if(n==null||!n.done){u&&this.off(o,a);try{let c=await Cu(a,[n,r,l]);s.push(c)}catch(c){if(i)throw c;console.error(`Error in hook '${o}':`,c)}}return s}runSync(e,n=this.swup.visit,r,i=!1){let s=[];for(let{hook:o,handler:a,defaultHandler:l,once:u}of e)if(n==null||!n.done){u&&this.off(o,a);try{let c=a(n,r,l);s.push(c),ps(c)&&console.warn(`Swup will not await Promises in handler for synchronous hook '${o}'.`)}catch(c){if(i)throw c;console.error(`Error in hook '${o}':`,c)}}return s}getHandlers(e,n){let r=this.get(e);if(!r)return{found:!1,before:[],handler:[],after:[],replaced:!1};let i=Array.from(r.values()),s=this.sortRegistrations,o=i.filter(({before:d,replace:h})=>d&&!h).sort(s),a=i.filter(({replace:d})=>d).filter(d=>!0).sort(s),l=i.filter(({before:d,replace:h})=>!d&&!h).sort(s),u=a.length>0,c=[];if(n&&(c=[{id:0,hook:e,handler:n}],u)){let d=a.length-1,{handler:h,once:p}=a[d],g=m=>{let v=a[m-1];return v?(w,x)=>v.handler(w,x,g(m-1)):n};c=[{id:0,hook:e,once:p,handler:h,defaultHandler:g(d)}]}return{found:!0,before:o,handler:c,after:l,replaced:u}}sortRegistrations(e,n){var r,i;return((r=e.priority)!=null?r:0)-((i=n.priority)!=null?i:0)||e.id-n.id||0}dispatchDomEvent(e,n,r){if(n!=null&&n.done)return;let i={hook:e,args:r,visit:n||this.swup.visit};document.dispatchEvent(new CustomEvent("swup:any",{detail:i,bubbles:!0})),document.dispatchEvent(new CustomEvent(`swup:${e}`,{detail:i,bubbles:!0}))}parseName(e){let[n,...r]=e.split(".");return[n,r.reduce((i,s)=>O({},i,{[s]:!0}),{})]}},Mu=t=>{if(t&&t.charAt(0)==="#"&&(t=t.substring(1)),!t)return null;let e=decodeURIComponent(t),n=document.getElementById(t)||document.getElementById(e)||Nn(`a[name='${CSS.escape(t)}']`)||Nn(`a[name='${CSS.escape(e)}']`);return n||t!=="top"||(n=document.body),n},bt="transition",Mn="animation";async function Hu({selector:t,elements:e}){if(t===!1&&!e)return;let n=[];if(e)n=Array.from(e);else if(t&&(n=Qn(t,document.body),!n.length))return void console.warn(`[swup] No elements found matching animationSelector \`${t}\``);let r=n.map(i=>function(s){let{type:o,timeout:a,propCount:l}=function(u){let c=window.getComputedStyle(u),d=Et(c,`${bt}Delay`),h=Et(c,`${bt}Duration`),p=cs(d,h),g=Et(c,`${Mn}Delay`),m=Et(c,`${Mn}Duration`),v=cs(g,m),w=Math.max(p,v),x=w>0?p>v?bt:Mn:null;return{type:x,timeout:w,propCount:x?x===bt?h.length:m.length:0}}(s);return!(!o||!a)&&new Promise(u=>{let c=`${o}end`,d=performance.now(),h=0,p=()=>{s.removeEventListener(c,g),u()},g=m=>{m.target===s&&((performance.now()-d)/1e3=l&&p())};setTimeout(()=>{h0?await Promise.all(r):t&&console.warn(`[swup] No CSS animation duration defined on elements matching \`${t}\``)}function Et(t,e){return(t[e]||"").split(", ")}function cs(t,e){for(;t.lengthds(n)+ds(t[r])))}function ds(t){return 1e3*parseFloat(t)}function Nu(t,e={},n={}){if(typeof t!="string")throw new Error("swup.navigate() requires a URL parameter");if(this.shouldIgnoreVisit(t,{el:n.el,event:n.event}))return void window.location.assign(t);let{url:r,hash:i}=A.fromUrl(t),s=this.createVisit(O({},n,{to:r,hash:i}));this.performNavigation(s,e)}async function Du(t,e={}){if(this.navigating){if(this.visit.state>=6)return t.state=2,void(this.onVisitEnd=()=>this.performNavigation(t,e));await this.hooks.call("visit:abort",this.visit,void 0),delete this.visit.to.document,this.visit.state=8}this.navigating=!0,this.visit=t;let{el:n}=t.trigger;e.referrer=e.referrer||this.location.url,e.animate===!1&&(t.animation.animate=!1),t.animation.animate||this.classes.clear();let r=e.history||us(n,"data-swup-history");typeof r=="string"&&["push","replace"].includes(r)&&(t.history.action=r);let i=e.animation||us(n,"data-swup-animation");var s,o;typeof i=="string"&&(t.animation.name=i),t.meta=e.meta||{},typeof e.cache=="object"?(t.cache.read=(s=e.cache.read)!=null?s:t.cache.read,t.cache.write=(o=e.cache.write)!=null?o:t.cache.write):e.cache!==void 0&&(t.cache={read:!!e.cache,write:!!e.cache}),delete e.cache;try{await this.hooks.call("visit:start",t,void 0),t.state=3;let a=this.hooks.call("page:load",t,{options:e},async(u,c)=>{let d;return u.cache.read&&(d=this.cache.get(u.to.url)),c.page=d||await this.fetchPage(u.to.url,c.options),c.cache=!!d,c.page});a.then(({html:u})=>{t.advance(5),t.to.html=u,t.to.document=new DOMParser().parseFromString(u,"text/html")});let l=t.to.url+t.to.hash;if(t.history.popstate||(t.history.action==="replace"||t.to.url===this.location.url?Pe(l):(this.currentHistoryIndex++,Ou(l,{index:this.currentHistoryIndex}))),this.location=A.fromUrl(l),t.history.popstate&&this.classes.add("is-popstate"),t.animation.name&&this.classes.add(`to-${hs(t.animation.name)}`),t.animation.wait&&await a,t.done||(await this.hooks.call("visit:transition",t,void 0,async()=>{if(!t.animation.animate)return await this.hooks.call("animation:skip",void 0),void await this.renderPage(t,await a);t.advance(4),await this.animatePageOut(t),t.animation.native&&document.startViewTransition?await document.startViewTransition(async()=>await this.renderPage(t,await a)).finished:await this.renderPage(t,await a),await this.animatePageIn(t)}),t.done))return;await this.hooks.call("visit:end",t,void 0,()=>this.classes.clear()),t.state=7,this.navigating=!1,this.onVisitEnd&&(this.onVisitEnd(),this.onVisitEnd=void 0)}catch(a){if(!a||a!=null&&a.aborted)return void(t.state=8);t.state=9,console.error(a),this.options.skipPopStateHandling=()=>(window.location.assign(t.to.url+t.to.hash),!0),window.history.back()}finally{delete t.to.document}}var Bu=async function(t){await this.hooks.call("animation:out:start",t,void 0,()=>{this.classes.add("is-changing","is-animating","is-leaving")}),await this.hooks.call("animation:out:await",t,{skip:!1},(e,{skip:n})=>{if(!n)return this.awaitAnimations({selector:e.animation.selector})}),await this.hooks.call("animation:out:end",t,void 0)},Qu=function(t){var e;let n=t.to.document;if(!n)return!1;let r=((e=n.querySelector("title"))==null?void 0:e.innerText)||"";document.title=r;let i=Qn('[data-swup-persist]:not([data-swup-persist=""])'),s=t.containers.map(o=>{let a=document.querySelector(o),l=n.querySelector(o);return a&&l?(a.replaceWith(l.cloneNode(!0)),!0):(a||console.warn(`[swup] Container missing in current document: ${o}`),l||console.warn(`[swup] Container missing in incoming document: ${o}`),!1)}).filter(Boolean);return i.forEach(o=>{let a=o.getAttribute("data-swup-persist"),l=Nn(`[data-swup-persist="${a}"]`);l&&l!==o&&l.replaceWith(o)}),s.length===t.containers.length},qu=function(t){let e={behavior:"auto"},{target:n,reset:r}=t.scroll,i=n??t.to.hash,s=!1;return i&&(s=this.hooks.callSync("scroll:anchor",t,{hash:i,options:e},(o,{hash:a,options:l})=>{let u=this.getAnchorElement(a);return u&&u.scrollIntoView(l),!!u})),r&&!s&&(s=this.hooks.callSync("scroll:top",t,{options:e},(o,{options:a})=>(window.scrollTo(O({top:0,left:0},a)),!0))),s},Fu=async function(t){if(t.done)return;let e=this.hooks.call("animation:in:await",t,{skip:!1},(n,{skip:r})=>{if(!r)return this.awaitAnimations({selector:n.animation.selector})});await fs(),await this.hooks.call("animation:in:start",t,void 0,()=>{this.classes.remove("is-animating")}),await e,await this.hooks.call("animation:in:end",t,void 0)},Vu=async function(t,e){if(t.done)return;t.advance(6);let{url:n}=e;this.isSameResolvedUrl(Oe(),n)||(Pe(n),this.location=A.fromUrl(n),t.to.url=this.location.url,t.to.hash=this.location.hash),await this.hooks.call("content:replace",t,{page:e},(r,{})=>{if(this.classes.remove("is-leaving"),r.animation.animate&&this.classes.add("is-rendering"),!this.replaceContent(r))throw new Error("[swup] Container mismatch, aborting");r.animation.animate&&(this.classes.add("is-changing","is-animating","is-rendering"),r.animation.name&&this.classes.add(`to-${hs(r.animation.name)}`))}),await this.hooks.call("content:scroll",t,void 0,()=>this.scrollToContent(t)),await this.hooks.call("page:view",t,{url:this.location.url,title:document.title})},$u=function(t){var e;if(e=t,Boolean(e?.isSwupPlugin)){if(t.swup=this,!t._checkRequirements||t._checkRequirements())return t._beforeMount&&t._beforeMount(),t.mount(),this.plugins.push(t),this.plugins}else console.error("Not a swup plugin instance",t)};function Uu(t){let e=this.findPlugin(t);if(e)return e.unmount(),e._afterUnmount&&e._afterUnmount(),this.plugins=this.plugins.filter(n=>n!==e),this.plugins;console.error("No such plugin",e)}function ju(t){return this.plugins.find(e=>e===t||e.name===t||e.name===`Swup${String(t)}`)}function Wu(t){if(typeof this.options.resolveUrl!="function")return console.warn("[swup] options.resolveUrl expects a callback function."),t;let e=this.options.resolveUrl(t);return e&&typeof e=="string"?e.startsWith("//")||e.startsWith("http")?(console.warn("[swup] options.resolveUrl needs to return a relative url"),t):e:(console.warn("[swup] options.resolveUrl needs to return a url"),t)}function zu(t,e){return this.resolveUrl(t)===this.resolveUrl(e)}var Gu={animateHistoryBrowsing:!1,animationSelector:'[class*="transition-"]',animationScope:"html",cache:!0,containers:["#swup"],hooks:{},ignoreVisit:(t,{el:e}={})=>!(e==null||!e.closest("[data-no-swup]")),linkSelector:"a[href]",linkToSelf:"scroll",native:!1,plugins:[],resolveUrl:t=>t,requestHeaders:{"X-Requested-With":"swup",Accept:"text/html, application/xhtml+xml"},skipPopStateHandling:t=>{var e;return((e=t.state)==null?void 0:e.source)!=="swup"},timeout:0},St=class{get currentPageUrl(){return this.location.url}constructor(e={}){var n,r;this.version="4.8.1",this.options=void 0,this.defaults=Gu,this.plugins=[],this.visit=void 0,this.cache=void 0,this.hooks=void 0,this.classes=void 0,this.location=A.fromUrl(window.location.href),this.currentHistoryIndex=void 0,this.clickDelegate=void 0,this.navigating=!1,this.onVisitEnd=void 0,this.use=$u,this.unuse=Uu,this.findPlugin=ju,this.log=()=>{},this.navigate=Nu,this.performNavigation=Du,this.createVisit=Ru,this.delegateEvent=Au,this.fetchPage=Iu,this.awaitAnimations=Hu,this.renderPage=Vu,this.replaceContent=Qu,this.animatePageIn=Fu,this.animatePageOut=Bu,this.scrollToContent=qu,this.getAnchorElement=Mu,this.getCurrentUrl=Oe,this.resolveUrl=Wu,this.isSameResolvedUrl=zu,this.options=O({},this.defaults,e),this.handleLinkClick=this.handleLinkClick.bind(this),this.handlePopState=this.handlePopState.bind(this),this.cache=new Hn(this),this.classes=new Dn(this),this.hooks=new Bn(this),this.visit=this.createVisit({to:""}),this.currentHistoryIndex=(n=(r=window.history.state)==null?void 0:r.index)!=null?n:1,this.enable()}async enable(){var e;let{linkSelector:n}=this.options;this.clickDelegate=this.delegateEvent(n,"click",this.handleLinkClick),window.addEventListener("popstate",this.handlePopState),this.options.animateHistoryBrowsing&&(window.history.scrollRestoration="manual"),this.options.native=this.options.native&&!!document.startViewTransition,this.options.plugins.forEach(r=>this.use(r));for(let[r,i]of Object.entries(this.options.hooks)){let[s,o]=this.hooks.parseName(r);this.hooks.on(s,i,o)}((e=window.history.state)==null?void 0:e.source)!=="swup"&&Pe(null,{index:this.currentHistoryIndex}),await fs(),await this.hooks.call("enable",void 0,void 0,()=>{let r=document.documentElement;r.classList.add("swup-enabled"),r.classList.toggle("swup-native",this.options.native)})}async destroy(){this.clickDelegate.destroy(),window.removeEventListener("popstate",this.handlePopState),this.cache.clear(),this.options.plugins.forEach(e=>this.unuse(e)),await this.hooks.call("disable",void 0,void 0,()=>{let e=document.documentElement;e.classList.remove("swup-enabled"),e.classList.remove("swup-native")}),this.hooks.clear()}shouldIgnoreVisit(e,{el:n,event:r}={}){let{origin:i,url:s,hash:o}=A.fromUrl(e);return i!==window.location.origin||!(!n||!this.triggerWillOpenNewWindow(n))||!!this.options.ignoreVisit(s+o,{el:n,event:r})}handleLinkClick(e){let n=e.delegateTarget,{href:r,url:i,hash:s}=A.fromElement(n);if(this.shouldIgnoreVisit(r,{el:n,event:e}))return;if(this.navigating&&i===this.visit.to.url)return void e.preventDefault();let o=this.createVisit({to:i,hash:s,el:n,event:e});e.metaKey||e.ctrlKey||e.shiftKey||e.altKey?this.hooks.callSync("link:newtab",o,{href:r}):e.button===0&&this.hooks.callSync("link:click",o,{el:n,event:e},()=>{var a;let l=(a=o.from.url)!=null?a:"";e.preventDefault(),i&&i!==l?this.isSameResolvedUrl(i,l)||this.performNavigation(o):s?this.hooks.callSync("link:anchor",o,{hash:s},()=>{Pe(i+s),this.scrollToContent(o)}):this.hooks.callSync("link:self",o,void 0,()=>{this.options.linkToSelf==="navigate"?this.performNavigation(o):(Pe(i),this.scrollToContent(o))})})}handlePopState(e){var n,r,i,s;let o=(n=(r=e.state)==null?void 0:r.url)!=null?n:window.location.href;if(this.options.skipPopStateHandling(e)||this.isSameResolvedUrl(Oe(),this.location.url))return;let{url:a,hash:l}=A.fromUrl(o),u=this.createVisit({to:a,hash:l,event:e});u.history.popstate=!0;let c=(i=(s=e.state)==null?void 0:s.index)!=null?i:0;c&&c!==this.currentHistoryIndex&&(u.history.direction=c-this.currentHistoryIndex>0?"forwards":"backwards",this.currentHistoryIndex=c),u.animation.animate=!1,u.scroll.reset=!1,u.scroll.target=!1,this.options.animateHistoryBrowsing&&(u.animation.animate=!0,u.scroll.reset=!0),this.hooks.callSync("history:popstate",u,{event:e},()=>{this.performNavigation(u)})}triggerWillOpenNewWindow(e){return!!e.matches('[download], [target="_blank"]')}};function Ae(){return Ae=Object.assign?Object.assign.bind():function(t){for(var e=1;eString(t).split(".").map(e=>String(parseInt(e||"0",10))).concat(["0","0"]).slice(0,3).join("."),ve=class{constructor(){this.isSwupPlugin=!0,this.swup=void 0,this.version=void 0,this.requires={},this.handlersToUnregister=[]}mount(){}unmount(){this.handlersToUnregister.forEach(e=>e()),this.handlersToUnregister=[]}_beforeMount(){if(!this.name)throw new Error("You must define a name of plugin when creating a class.")}_afterUnmount(){}_checkRequirements(){return typeof this.requires!="object"||Object.entries(this.requires).forEach(([e,n])=>{if(!function(r,i,s){let o=function(a,l){var u;if(a==="swup")return(u=l.version)!=null?u:"";{var c;let d=l.findPlugin(a);return(c=d?.version)!=null?c:""}}(r,s);return!!o&&((a,l)=>l.every(u=>{let[,c,d]=u.match(/^([\D]+)?(.*)$/)||[];var h,p;return((g,m)=>{let v={"":w=>w===0,">":w=>w>0,">=":w=>w>=0,"<":w=>w<0,"<=":w=>w<=0};return(v[m]||v[""])(g)})((p=d,h=ms(h=a),p=ms(p),h.localeCompare(p,void 0,{numeric:!0})),c||">=")}))(o,i)}(e,n=Array.isArray(n)?n:[n],this.swup)){let r=`${e} ${n.join(", ")}`;throw new Error(`Plugin version mismatch: ${this.name} requires ${r}`)}}),!0}on(e,n,r={}){var i;n=!(i=n).name.startsWith("bound ")||i.hasOwnProperty("prototype")?n.bind(this):n;let s=this.swup.hooks.on(e,n,r);return this.handlersToUnregister.push(s),s}once(e,n,r={}){return this.on(e,n,Ae({},r,{once:!0}))}before(e,n,r={}){return this.on(e,n,Ae({},r,{before:!0}))}replace(e,n,r={}){return this.on(e,n,Ae({},r,{replace:!0}))}off(e,n){return this.swup.hooks.off(e,n)}};(function(){if(!(typeof window>"u"||typeof document>"u"||typeof HTMLElement>"u")){var t=!1;try{var e=document.createElement("div");e.addEventListener("focus",function(s){s.preventDefault(),s.stopPropagation()},!0),e.focus(Object.defineProperty({},"preventScroll",{get:function(){if(navigator&&typeof navigator.userAgent<"u"&&navigator.userAgent&&navigator.userAgent.match(/Edge\/1[7-8]/))return t=!1;t=!0}}))}catch{}if(HTMLElement.prototype.nativeFocus===void 0&&!t){HTMLElement.prototype.nativeFocus=HTMLElement.prototype.focus;var n=function(s){for(var o=s.parentNode,a=[],l=document.scrollingElement||document.documentElement;o&&o!==l;)(o.offsetHeightn.replace(`{${r}}`,e[r]||""),t||"")}var Fn=class{constructor(){var e;this.id="swup-announcer",this.style="position:absolute;top:0;left:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap;word-wrap:normal;width:1px;height:1px;",this.region=void 0,this.region=(e=this.getRegion())!=null?e:this.createRegion()}getRegion(){return document.getElementById(this.id)}createRegion(){let e=function(n){let r=document.createElement("template");return r.innerHTML=n,r.content.children[0]}(`

`);return document.body.appendChild(e),e}announce(e,n=0){return new Promise(r=>{setTimeout(()=>{this.region.textContent===e&&(e=`${e}.`),this.region.textContent="",this.region.textContent=e,r()},n)})}};function vs(t){let e;if(e=typeof t=="string"?document.querySelector(t):t,!(e instanceof HTMLElement))return;let n=e.getAttribute("tabindex");e.setAttribute("tabindex","-1"),e.focus({preventScroll:!0}),n!==null&&e.setAttribute("tabindex",n)}var kt=class extends ve{constructor(e={}){super(),this.name="SwupA11yPlugin",this.requires={swup:">=4"},this.defaults={headingSelector:"h1",respectReducedMotion:!0,autofocus:!1,announcements:{visit:"Navigated to: {title}",url:"New page at {url}"}},this.options=void 0,this.announcer=void 0,this.announcementDelay=100,this.rootSelector="body",this.handleAnchorScroll=(n,{hash:r})=>{let i=this.swup.getAnchorElement(r);i instanceof HTMLElement&&vs(i)},this.options=qn({},this.defaults,e),this.announcer=new Fn}mount(){this.swup.hooks.create("content:announce"),this.swup.hooks.create("content:focus"),this.before("visit:start",this.prepareVisit),this.on("visit:start",this.markAsBusy),this.on("visit:end",this.unmarkAsBusy),this.on("visit:end",this.focusContent),this.on("visit:end",this.announceContent),this.on("scroll:anchor",this.handleAnchorScroll),this.before("visit:start",this.disableAnimations),this.before("link:self",this.disableAnimations),this.before("link:anchor",this.disableAnimations),this.swup.announce=this.announce.bind(this)}unmount(){this.swup.announce=void 0}async announce(e){await this.announcer.announce(e)}markAsBusy(){document.documentElement.setAttribute("aria-busy","true")}unmarkAsBusy(){document.documentElement.removeAttribute("aria-busy")}prepareVisit(e){e.a11y={announce:void 0,focus:this.rootSelector}}announceContent(e){this.swup.hooks.callSync("content:announce",e,void 0,n=>{n.a11y.announce===void 0&&(n.a11y.announce=this.getPageAnnouncement()),n.a11y.announce&&this.announcer.announce(n.a11y.announce,this.announcementDelay)})}focusContent(e){this.swup.hooks.callSync("content:focus",e,void 0,n=>{n.a11y.focus&&(this.options.autofocus&&function(){let r=function(){let i=document.querySelector("body [autofocus]");if(i&&!i.closest('[inert], [aria-disabled], [aria-hidden="true"]'))return i}();return!!r&&(r!==document.activeElement&&r.focus(),!0)}()===!0||vs(n.a11y.focus))})}getPageAnnouncement(){let{headingSelector:e,announcements:n}=this.options;return function({headingSelector:r="h1",announcements:i={}}){var s,o;let a=document.documentElement.lang||"*",{href:l,url:u,pathname:c}=A.fromUrl(window.location.href),d=(s=(o=i[a])!=null?o:i["*"])!=null?s:i;if(typeof d!="object")return;let h=document.querySelector(r);h||console.warn(`SwupA11yPlugin: No main heading (${r}) found on new page`);let p=h?.getAttribute("aria-label")||h?.textContent||document.title||gs(d.url,{href:l,url:u,path:c});return gs(d.visit,{title:p,href:l,url:u,path:c})}({headingSelector:e,announcements:n})}disableAnimations(e){this.options.respectReducedMotion&&window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(e.animation.animate=!1,e.scroll.animate=!1)}};function Vn(){return Vn=Object.assign?Object.assign.bind():function(t){for(var e=1;e{let a=Math.random()*this.trickleValue;this.setValue(this.value+a)},e!==void 0&&(this.className=String(e)),n!==void 0&&(this.styleAttr=String(n)),r!==void 0&&(this.animationDuration=Number(r)),i!==void 0&&(this.minValue=Number(i)),s!==void 0&&(this.initialValue=Number(s)),o!==void 0&&(this.trickleValue=Number(o)),this.styleElement=this.createStyleElement(),this.progressElement=this.createProgressElement()}get defaultStyles(){return` + .${this.className} { + position: fixed; + display: block; + top: 0; + left: 0; + width: 100%; + height: 3px; + background-color: black; + z-index: 9999; + transition: + transform ${this.animationDuration}ms ease-out, + opacity ${this.animationDuration/2}ms ${this.animationDuration/2}ms ease-in; + transform: translate3d(0, 0, 0) scaleX(var(--progress, 0)); + transform-origin: 0; + } + `}show(){this.visible||(this.visible=!0,this.installStyleElement(),this.installProgressElement(),this.startTrickling())}hide(){this.visible&&!this.hiding&&(this.hiding=!0,this.fadeProgressElement(()=>{this.uninstallProgressElement(),this.stopTrickling(),this.visible=!1,this.hiding=!1}))}setValue(e){this.value=Math.min(1,Math.max(this.minValue,e)),this.refresh()}installStyleElement(){document.head.prepend(this.styleElement)}installProgressElement(){this.progressElement.style.setProperty("--progress",String(0)),this.progressElement.style.opacity="1",document.body.prepend(this.progressElement),this.progressElement.scrollTop=0,this.setValue(Math.random()*this.initialValue)}fadeProgressElement(e){this.progressElement.style.opacity="0",setTimeout(e,1.5*this.animationDuration)}uninstallProgressElement(){this.progressElement.remove()}startTrickling(){this.trickleInterval||(this.trickleInterval=window.setInterval(this.trickle,this.animationDuration))}stopTrickling(){window.clearInterval(this.trickleInterval),delete this.trickleInterval}refresh(){requestAnimationFrame(()=>{this.progressElement.style.setProperty("--progress",String(this.value))})}createStyleElement(){let e=document.createElement("style");return this.styleAttr.split(" ").forEach(n=>e.setAttribute(n,"")),e.textContent=this.defaultStyles,e}createProgressElement(){let e=document.createElement("div");return e.className=this.className,e.setAttribute("aria-hidden","true"),e}},Lt=class extends ve{constructor(e={}){super(),this.name="SwupProgressPlugin",this.defaults={className:"swup-progress-bar",delay:300,transition:300,minValue:.1,initialValue:.25,finishAnimation:!0},this.options=void 0,this.progressBar=void 0,this.showProgressBarTimeout=void 0,this.hideProgressBarTimeout=void 0,this.options=Vn({},this.defaults,e);let{className:n,minValue:r,initialValue:i,transition:s}=this.options;this.progressBar=new $n({className:n,minValue:r,initialValue:i,animationDuration:s})}mount(){this.on("visit:start",this.startShowingProgress),this.on("page:view",this.stopShowingProgress)}startShowingProgress(){this.progressBar.setValue(0),this.showProgressBarAfterDelay()}stopShowingProgress(){this.progressBar.setValue(1),this.options.finishAnimation?this.finishAnimationAndHideProgressBar():this.hideProgressBar()}showProgressBar(){this.cancelHideProgressBarTimeout(),this.progressBar.show()}showProgressBarAfterDelay(){this.cancelShowProgressBarTimeout(),this.cancelHideProgressBarTimeout(),this.showProgressBarTimeout=window.setTimeout(this.showProgressBar.bind(this),this.options.delay)}hideProgressBar(){this.cancelShowProgressBarTimeout(),this.progressBar.hide()}finishAnimationAndHideProgressBar(){this.cancelShowProgressBarTimeout(),this.hideProgressBarTimeout=window.setTimeout(this.hideProgressBar.bind(this),this.options.transition)}cancelShowProgressBarTimeout(){window.clearTimeout(this.showProgressBarTimeout),delete this.showProgressBarTimeout}cancelHideProgressBarTimeout(){window.clearTimeout(this.hideProgressBarTimeout),delete this.hideProgressBarTimeout}};var ys=()=>{window.dispatchEvent(new Event("exdoc:loaded"))},Ku=(t,{page:e})=>{//i.test(e.html)&&(t.abort(),window.location.reload())};window.addEventListener("DOMContentLoaded",ys);!R&&window.location.protocol!=="file:"&&new St({animationSelector:!1,containers:["#main"],ignoreVisit:t=>{let e=t.split("#")[0];return e===window.location.pathname||e===window.location.pathname+".html"},linkSelector:'a[href]:not([href^="/"]):not([href^="http"])',hooks:{"page:load":Ku,"page:view":ys},plugins:[new kt,new Lt({delay:500})]});})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/doc/dist/html-erlang-7YNYEB7F.css b/doc/dist/html-erlang-7YNYEB7F.css new file mode 100644 index 0000000..5b1e7e8 --- /dev/null +++ b/doc/dist/html-erlang-7YNYEB7F.css @@ -0,0 +1,6 @@ +:root{--main: hsl(0, 100%, 44%);--mainDark: hsl(0, 100%, 34%);--mainDarkest: hsl(0, 100%, 24%);--mainLight: hsl(0, 100%, 64%);--mainLightest: hsl(0, 100%, 74%);--searchBarFocusColor: hsl(0, 100%, 50%);--searchBarBorderColor: rgb(255, 71, 71, .1);--link-color: hsl(212, 96%, 45%);--link-visited-color: hsl(212, 96%, 40%)}body.dark{--link-color: hsl(212, 56%, 72%);--link-visited-color: hsl(212, 56%, 67%)}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:400;src:url(./lato-latin-ext-400-normal-N27NCBWW.woff2) format("woff2"),url(./lato-all-400-normal-MNITWADU.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:400;src:url(./lato-latin-400-normal-W7754I4D.woff2) format("woff2"),url(./lato-all-400-normal-MNITWADU.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:700;src:url(./lato-latin-ext-700-normal-Q2L5DVMW.woff2) format("woff2"),url(./lato-all-700-normal-XMT5XFBS.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:700;src:url(./lato-latin-700-normal-2XVSBPG4.woff2) format("woff2"),url(./lato-all-700-normal-XMT5XFBS.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--content-width: 949px;--content-gutter: 60px;--borderRadius-lg: 14px;--borderRadius-base: 8px;--borderRadius-sm: 3px;--navTabBorderWidth: 2px;--sansFontFamily: "Lato", system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";--monoFontFamily: ui-monospace, SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;--baseLineHeight: 1.5em;--gray10: hsl(207, 43%, 98.5%);--gray25: hsl(207, 43%, 98%);--gray50: hsl(207, 43%, 96%);--gray100: hsl(212, 33%, 91%);--gray200: hsl(210, 29%, 88%);--gray300: hsl(210, 26%, 76%);--gray400: hsl(210, 21%, 64%);--gray450: hsl(210, 21%, 49%);--gray500: hsl(210, 21%, 34%);--gray600: hsl(210, 27%, 26%);--gray650: hsl(211, 32%, 22%);--gray700: hsl(212, 35%, 17%);--gray750: hsl(214, 46%, 14%);--gray800: hsl(216, 52%, 11%);--gray800-opacity-0: hsla(216, 52%, 11%, 0%);--gray850: hsl(216, 63%, 8%);--gray900: hsl(218, 73%, 4%);--gray900-opacity-50: hsla(218, 73%, 4%, 50%);--gray900-opacity-0: hsla(218, 73%, 4%, 0%);--coldGrayFaint: hsl(240, 5%, 97%);--coldGrayLight: hsl(240, 5%, 88%);--coldGray-lightened-10: hsl(240, 5%, 56%);--coldGray: hsl(240, 5%, 46%);--coldGray-opacity-10: hsla(240, 5%, 46%, 10%);--coldGrayDark: hsl(240, 5%, 28%);--coldGrayDim: hsl(240, 5%, 18%);--yellowLight: hsl(43, 100%, 95%);--yellowDark: hsl(44, 100%, 15%);--yellow: hsl(60, 100%, 43%);--green-lightened-10: hsl(90, 100%, 45%);--green: hsl(90, 100%, 35%);--white: hsl(0, 0%, 100%);--white-opacity-80: hsla(0, 0%, 100%, 80%);--white-opacity-50: hsla(0, 0%, 100%, 50%);--white-opacity-10: hsla(0, 0%, 100%, 10%);--white-opacity-0: hsla(0, 0%, 100%, 0%);--black: hsl(0, 0%, 0%);--black-opacity-80: hsla(0, 0%, 0%, 80%);--black-opacity-50: hsla(0, 0%, 0%, 50%);--black-opacity-30: hsla(0, 0%, 0%, 30%);--black-opacity-10: hsla(0, 0%, 0%, 10%);--black-opacity-0: hsla(0, 0%, 0%, 10%);--orangeDark: hsl(30, 90%, 40%);--orangeLight: hsl(30, 80%, 50%);--text-xs: .75rem;--text-sm: .875rem;--text-md: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--transition-duration: .15s;--transition-timing: cubic-bezier(.4, 0, .2, 1);--transition-all: all var(--transition-duration) var(--transition-timing);--transition-colors: color var(--transition-duration) var(--transition-timing), background-color var(--transition-duration) var(--transition-timing), border-color var(--transition-duration) var(--transition-timing), text-decoration-color var(--transition-duration) var(--transition-timing), fill var(--transition-duration) var(--transition-timing), stroke var(--transition-duration) var(--transition-timing);--transition-opacity: opacity var(--transition-duration) var(--transition-timing)}@media screen and (max-width: 768px){:root{--content-width: 100%;--content-gutter: 20px}}option{background-color:var(--sidebarBackground)}:root{--background: var(--white);--contrast: var(--black);--textBody: var(--gray800);--textHeaders: var(--gray900);--textDetailAccent: var(--mainLight);--textDetailBackground: var(--coldGrayFaint);--iconAction: var(--coldGray);--iconActionHover: var(--gray800);--blockquoteBackground: var(--coldGrayFaint);--blockquoteBorder: var(--coldGrayLight);--tableHeadBorder: var(--gray100);--tableBodyBorder: var(--gray50);--warningHue: 34;--errorHue: 7;--infoHue: 206;--neutralHue: 212;--tipHue: 142;--admMixCol: var(--gray100);--admMixAmt: 25%;--warningBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--warningHue), 100%, 96%) 100%);--warningHeading: hsl(var(--warningHue), 95%, 38%);--errorBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--errorHue), 85%, 96%) 100%);--errorHeading: hsl(var(--errorHue), 80%, 40%);--infoBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--infoHue), 90%, 96%) 100%);--infoHeading: hsl(var(--infoHue), 60%, 30%);--neutralBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--neutralHue), 40%, 93%) 100%);--neutralHeading: hsl(var(--neutralHue), 35%, 30%);--tipBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--tipHue), 40%, 93%) 100%);--tipHeading: hsl(var(--tipHue), 55%, 25%);--fnSpecAttr: var(--coldGray);--fnDeprecated: var(--yellowLight);--blink: var(--yellowLight);--codeBackground: var(--gray10);--codeBorder: var(--gray100);--codeScrollThumb: var(--gray400);--codeScrollBackground: var(--codeBorder);--admCodeBackground: var(--white-opacity-80);--admCodeBorder: var(--black-opacity-10);--admCodeColor: var(--black);--tabBorder: var(--gray300);--tabBorderTop: var(--gray100);--tabShadow: var(--gray25);--bottomActionsBtnBorder: var(--black-opacity-10);--bottomActionsBtnTitle: var(--mainDark);--modalBackground: var(--white);--settingsInput: var(--gray500);--settingsInputBackground: var(--white);--settingsInputBorder: var(--gray300);--settingsSectionBorder: var(--gray300);--quickSwitchInput: var(--gray500);--quickSwitchContour: var(--coldGray);--success: var(--green);--progressBarColor: var(--gray400);--sidebarAccentMain: var(--black);--sidebarBackground: var(--gray50);--sidebarHeader: var(--gray100);--sidebarMuted: var(--gray800);--sidebarHover: var(--black);--sidebarStaleVersion: var(--orangeDark);--sidebarSubheadings: var(--gray500);--sidebarItem: var(--black);--sidebarInactiveItemBorder: var(--gray500);--sidebarInactiveItemMarker: var(--gray200);--sidebarLanguageAccentBar: var(--mainDark);--sidebarActiveItem: var(--mainDarkest);--searchBarBorder: var(--gray200);--searchAccentMain: var(--gray600);--searchLanguageAccentBar: var(--main);--searchSearch: var(--white);--autocompleteBorder: rgba(3, 9, 19, .1);--autocompletePreview: var(--gray25);--autocompleteSelected: var(--gray25);--autocompleteHover: var(--gray50);--autocompleteBackground: var(--white);--suggestionBorder: var(--gray200);--autocompleteResults: var(--gray600);--autocompleteResultsBold: var(--gray800);--autocompleteLabelBack: var(--gray100);--autocompleteLabelFont: var(--gray600)}body.dark{--background: var(--gray900);--contrast: var(--white);--textBody: var(--gray200);--textHeaders: var(--gray100);--textDetailAccent: var(--mainLight);--textDetailBackground: var(--gray700);--iconAction: var(--coldGray-lightened-10);--iconActionHover: var(--white);--blockquoteBackground: var(--coldGray-opacity-10);--blockquoteBorder: var(--coldGrayDim);--tableHeadBorder: var(--gray600);--tableBodyBorder: var(--gray700);--warningHue: 34;--errorHue: 7;--infoHue: 206;--neutralHue: 212;--tipHue: 142;--admMixCol: var(--gray900);--admMixAmt: 40%;--warningBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--warningHue), 40%, 14%) 100%);--warningHeading: hsl(var(--warningHue), 100%, 50%);--errorBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--errorHue), 40%, 14%) 100%);--errorHeading: hsl(var(--errorHue), 100%, 52%);--infoBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--infoHue), 60%, 15%) 100%);--infoHeading: hsl(var(--infoHue), 100%, 52%);--neutralBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--neutralHue), 40%, 14%) 100%);--neutralHeading: hsl(var(--neutralHue), 50%, 80%);--tipBackground: color-mix(in xyz, var(--admMixCol) var(--admMixAmt), hsl(var(--tipHue), 40%, 14%) 100%);--tipHeading: hsl(var(--tipHue), 55%, 48%);--fnSpecAttr: var(--gray400);--fnDeprecated: var(--yellowDark);--blink: var(--gray600);--codeBackground: var(--gray800);--codeBorder: var(--gray650);--codeScrollThumb: var(--gray500);--codeScrollBackground: var(--codeBorder);--admCodeBackground: var(--black-opacity-30);--admCodeBorder: var(--white-opacity-10);--admCodeColor: var(--gray100);--tabBorder: var(--gray700);--tabBorderTop: var(--gray700);--tabShadow: var(--black);--bottomActionsBtnBorder: var(--white-opacity-10);--bottomActionsBtnTitle: var(--mainLightest);--modalBackground: var(--gray800);--settingsInput: var(--white);--settingsInputBackground: var(--gray700);--settingsInputBorder: var(--gray700);--settingsSectionBorder: var(--gray700);--quickSwitchInput: var(--gray300);--quickSwitchContour: var(--gray500);--success: var(--green-lightened-10);--progressBarColor: var(--gray300);--sidebarAccentMain: var(--gray50);--sidebarBackground: var(--gray800);--sidebarHeader: var(--gray700);--sidebarMuted: var(--gray300);--sidebarHover: var(--white);--sidebarStaleVersion: var(--orangeLight);--sidebarSubheadings: var(--gray400);--sidebarItem: var(--gray200);--sidebarInactiveItemBorder: var(--gray400);--sidebarInactiveItemMarker: var(--gray600);--sidebarLanguageAccentBar: var(--mainLight);--sidebarActiveItem: var(--mainLightest);--searchBarBorder: var(--gray500);--searchAccentMain: var(--gray300);--searchSearch: var(--gray900);--autocompleteBorder: rgba(28,42,60,.75);--autocompletePreview: var(--gray750);--autocompleteSelected: var(--gray750);--autocompleteHover: var(--gray700);--autocompleteBackground: var(--gray800);--suggestionBorder: var(--gray600);--autocompleteResults: var(--gray200);--autocompleteResultsBold: var(--gray100);--autocompleteLabelBack: var(--gray600);--autocompleteLabelFont: rgba(255, 255, 255, .8)}:root:has(body.dark){color-scheme:dark}*,:before,:after{box-sizing:border-box}html{font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-color:currentcolor}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}@font-face{font-family:remixicon;src:url(./remixicon-QPNJX265.woff2) format("woff2");font-display:swap}[class^=ri-],[class*=" ri-"],.remix-icon{font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:root{--icon-arrow-up-s: "\ea78";--icon-arrow-down-s: "\ea4e";--icon-arrow-right-s: "\ea6e";--icon-add: "\ea13";--icon-subtract: "\f1af";--icon-error-warning: "\eca1";--icon-external-link-line: "\ecaf";--icon-information: "\ee59";--icon-alert: "\ea21";--icon-double-quotes-l: "\ec51";--icon-link-m: "\eeaf";--icon-close-line: "\eb99";--icon-code-s-slash-line: "\ebad";--icon-menu-line: "\ef3e";--icon-search-2-line: "\f0cd";--icon-settings-3-line: "\f0e6";--icon-printer-line: "\f029"}.ri-lg{font-size:1.3333em;line-height:.75em;vertical-align:-.0667em}.ri-settings-3-line:before{content:var(--icon-settings-3-line)}.ri-add-line:before{content:var(--icon-add)}.ri-subtract-line:before{content:var(--icon-subtract)}.ri-arrow-up-s-line:before{content:var(--icon-arrow-up-s)}.ri-arrow-down-s-line:before{content:var(--icon-arrow-down-s)}.ri-arrow-right-s-line:before{content:var(--icon-arrow-right-s)}.ri-external-link-line:before{content:var(--icon-external-link-line)}.ri-search-2-line:before{content:var(--icon-search-2-line)}.ri-menu-line:before{content:var(--icon-menu-line)}.ri-close-line:before{content:var(--icon-close-line)}.ri-link-m:before{content:var(--icon-link-m)}.ri-code-s-slash-line:before{content:var(--icon-code-s-slash-line)}.ri-error-warning-line:before{content:var(--icon-error-warning)}.ri-information-line:before{content:var(--icon-information)}.ri-alert-line:before{content:var(--icon-alert)}.ri-double-quotes-l:before{content:var(--icon-double-quotes-l)}.ri-printer-line:before{content:var(--icon-printer-line)}html,body{box-sizing:border-box;height:100%;width:100%}body{--sidebarWidth: 300px;--sidebarMinWidth: 300px;--sidebarTransitionDuration: .3s;background-color:var(--background);color:var(--textBody);font-size:var(--text-md);line-height:1.6875em;outline:none!important}*,*:before,*:after{box-sizing:inherit}.body-wrapper{display:flex;height:100%}.sidebar{display:none;flex-direction:column;width:var(--sidebarWidth);min-width:var(--sidebarMinWidth);max-width:50vw;height:100%;position:fixed;top:0;left:calc(-1 * var(--sidebarWidth));z-index:100;resize:horizontal}.sidebar-button{padding:20px 12px 18px 19px;position:fixed;z-index:200;top:0;left:0;will-change:transform;transform:translate(0)}.content{left:0;width:100%;height:100%;position:absolute}.content .content-inner{container:content / inline-size;max-width:var(--content-width);min-height:100%;margin:0 auto;padding:0 var(--content-gutter) 10px}.content-inner:focus{outline:none}.sidebar-transition .sidebar,.sidebar-transition .sidebar-button,.sidebar-transition .content{transition:all var(--sidebarTransitionDuration) ease-in-out allow-discrete}.sidebar-open .sidebar,.sidebar-transition .sidebar{display:flex}.sidebar-open .sidebar{left:0}.sidebar-open .sidebar-button{transform:translate(calc(var(--sidebarWidth) - 100%))}.sidebar-open .content{width:calc(100% - var(--sidebarWidth));left:var(--sidebarWidth)}@media screen and (max-width: 768px){.sidebar-open .content{left:0;width:100%}.sidebar{max-width:90vw}body:not(.sidebar-open) .sidebar-button{position:absolute}}.swup-progress-bar{height:2px;background-color:var(--progressBarColor)}.sidebar{--sidebarFontSize: 16px;--sidebarLineHeight: 20px;font-family:var(--sansFontFamily);font-size:var(--sidebarFontSize);line-height:var(--sidebarLineHeight);background-color:var(--sidebarBackground);color:var(--sidebarAccentMain);overflow:hidden;& .sidebar-tabpanel{scrollbar-width:thin}}.apple-os .sidebar{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sidebar ul{list-style:none}.sidebar ul li{margin:0;padding:0 10px}.sidebar a{color:var(--sidebarAccentMain);text-decoration:none;transition:var(--transition-colors)}.sidebar a:hover{color:var(--sidebarHover)}.sidebar .external-link{margin-left:2.5px}.sidebar .sidebar-header{background-color:var(--sidebarHeader);width:100%}.sidebar .sidebar-projectInfo{display:flex;justify-content:start;align-items:center;gap:8px;margin:8px 34px 12px 14px}.sidebar .sidebar-projectInfo>div{flex:1}.sidebar .sidebar-projectImage{align-self:flex-end}.sidebar .sidebar-projectImage img{display:block;max-width:48px;max-height:48px}.sidebar .sidebar-projectName{font-weight:700;font-size:var(--text-xl);line-height:24px;color:var(--sidebarAccentMain);margin:0;padding:0;word-wrap:break-word;display:block;width:calc(100% - 12px)}.sidebar .sidebar-projectVersion{display:block;position:relative;margin:0;padding:0;font-size:var(--sidebarFontSize);line-height:var(--sidebarLineHeight);color:var(--sidebarMuted);width:calc(100% - 12px)}.sidebar .sidebar-projectVersion form{display:flex}.sidebar .sidebar-projectVersion select{cursor:pointer;position:relative;margin:0;padding:0 0 0 10px;border:none;-webkit-appearance:none;appearance:none;background-color:transparent;color:var(--sidebarMuted);z-index:2}.sidebar .sidebar-projectVersion option{color:initial}.sidebar .sidebar-projectVersionsCaret{position:absolute;left:0;top:2px;z-index:1;font-size:8px;color:var(--sidebarMuted)}.sidebar .sidebar-projectVersion select::-ms-expand{display:none}.sidebar .sidebar-staleVersion{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--sidebarStaleVersion)}.sidebar .sidebar-staleVersion>a{color:var(--sidebarStaleVersion);font-weight:400}.sidebar .sidebar-staleIcon{font-size:var(--text-lg);line-height:0}.sidebar .sidebar-list-nav{display:flex;margin:0;padding:0;overflow:auto;scrollbar-width:thin}.sidebar .sidebar-list-nav :is(li,li button){text-transform:uppercase;letter-spacing:.02em;font-size:var(--text-sm);color:var(--sidebarSubheadings);white-space:nowrap}.sidebar .sidebar-list-nav li{display:inline-block;padding:0}.sidebar .sidebar-list-nav button{background:none;border:0;border-radius:0;-webkit-appearance:none;text-align:inherit;color:inherit;font-weight:inherit;cursor:pointer;display:inline-block;line-height:27px;padding:4px 14px;transition:var(--transition-all)}.sidebar .sidebar-list-nav button{border-bottom:var(--navTabBorderWidth) solid transparent}.sidebar .sidebar-list-nav button:not([aria-selected]):hover{border-bottom:var(--navTabBorderWidth) solid var(--sidebarInactiveItemBorder);color:var(--sidebarAccentMain);transition:var(--transition-all)}.sidebar .sidebar-list-nav button[aria-selected]{border-bottom:var(--navTabBorderWidth) solid var(--sidebarLanguageAccentBar);color:var(--sidebarAccentMain)}.sidebar .sidebar-tabpanel{flex:1 1 .01%;overflow-y:auto;overscroll-behavior:contain;position:relative;-webkit-overflow-scrolling:touch;padding-top:12px;scroll-padding-top:40px}.sidebar .full-list{margin:0;padding:0 0 20px;position:relative}.sidebar .full-list :is(li,a){display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.sidebar .full-list li{padding:0;line-height:27px}.sidebar .full-list li.group{text-transform:uppercase;font-weight:700;font-size:.8em;margin:1.5em 0 0;line-height:1.8em;color:var(--sidebarSubheadings);padding-left:15px}.sidebar .full-list li.nesting-context{font-weight:700;font-size:.9em;line-height:1.8em;color:var(--sidebarSubheadings);margin-top:10px;padding-left:15px}.sidebar .full-list a{margin-right:30px;padding:3px 0 3px 12px;border-left:var(--navTabBorderWidth) solid transparent;color:var(--sidebarItem)}.sidebar .full-list a[aria-selected]{color:var(--sidebarActiveItem)}.sidebar .full-list button{appearance:none;background-color:transparent;border:0;padding:0;cursor:pointer;color:inherit;width:20px;text-align:center;font-size:calc(1.2 * var(--sidebarFontSize));line-height:var(--sidebarLineHeight);position:absolute;display:block;right:10px;transform:translateY(-100%)}.sidebar .full-list a[aria-selected]+button{color:var(--sidebarActiveItem)}.sidebar .full-list button:after{font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:var(--icon-arrow-down-s)}.sidebar .full-list button[aria-expanded=true]:after{content:var(--icon-arrow-up-s)}.sidebar .full-list ul{display:none;margin:10px 0 10px 10px;padding:0}.sidebar .full-list button[aria-expanded=true]+ul{display:block}.sidebar .full-list>li>a{height:27px;line-height:var(--sidebarLineHeight)}.sidebar .full-list>li>a:hover{border-left-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list>li>a[aria-selected]{border-left-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list>li:last-child{margin-bottom:30px}.sidebar .full-list>li.group:first-child{margin-top:0}.sidebar .full-list>li>ul>li:not(:has(li a[aria-selected=true]))>a[aria-selected=true]:before,.sidebar .full-list>li>ul>li>a:hover:before{content:"\2022";position:absolute;margin-left:-15px;color:var(--sidebarActiveItem)}.sidebar .full-list ul li{line-height:var(--sidebarFontSize);padding:0 8px}.sidebar .full-list ul a{padding-left:15px;height:24px}.sidebar .full-list ul button{font-size:var(--sidebarFontSize)}.sidebar .full-list ul button:after{content:var(--icon-add)}.sidebar .full-list ul button[aria-expanded=true]:after{content:var(--icon-subtract)}.sidebar .full-list ul ul{margin:9px 0 9px 10px}.sidebar .full-list ul ul li{height:20px;color:var(--sidebarAccentMain)}.sidebar .full-list ul ul a{border-left:1px solid var(--sidebarInactiveItemMarker);padding:0 10px;height:20px}.sidebar .full-list ul ul a:hover{border-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list ul ul a[aria-selected]{color:var(--sidebarActiveItem);border-color:var(--sidebarLanguageAccentBar)}.sidebar-button{cursor:pointer;background-color:transparent;border:none;font-size:var(--sidebarFontSize);color:var(--sidebarAccentMain)}.sidebar-button:hover{color:var(--sidebarHover)}body:not(.sidebar-open) .sidebar-button{color:var(--contrast)}@media screen and (max-height: 500px){.sidebar{overflow-y:auto}.sidebar .full-list{overflow:visible}}.top-search{background-color:var(--background);top:0;z-index:99;position:relative;width:100%;padding:10px 0}.search-settings{display:flex;column-gap:12px;align-items:center;width:100%;position:relative}.search-bar{border:1px solid var(--searchBarBorder);border-radius:var(--borderRadius-base);height:40px;position:relative;width:100%}.top-search .search-bar .search-input{background-color:var(--searchSearch);border:1px solid transparent;border-radius:var(--borderRadius-base);color:var(--searchAccentMain);position:relative;height:38px;padding:8px 40px 8px 12px;width:100%;transition:var(--transition-all)}.top-search .search-bar .search-input::placeholder{color:var(--searchAccentMain);opacity:.5}.top-search .search-bar .search-input:focus{border:1px solid var(--searchBarFocusColor);border-radius:calc(var(--borderRadius-base) - 1px);position:relative}.top-search .search-bar .search-label{position:relative}.top-search .search-bar .search-input-wrapper{position:relative;display:flex;align-items:center}.top-search .search-settings .engine-selector{position:relative}.top-search .search-settings .engine-selector[data-multiple=false]{display:none}.top-search .search-settings .engine-selector[data-multiple=false] .engine-button{cursor:default}.top-search .search-settings .engine-selector[data-multiple=false] .engine-button .ri-arrow-down-s-line{display:none}.top-search .search-settings .engine-button{display:flex;align-items:center;gap:6px;background-color:var(--autocompleteHover);border:none;color:var(--searchAccentMain);cursor:pointer;font-size:var(--text-sm);padding:8px 12px;border-radius:var(--borderRadius-base);transition:var(--transition-all);height:40px}.top-search .search-settings .engine-button:hover,.top-search .search-settings .engine-button[aria-expanded=true]{background-color:var(--autocompleteSelected)}.top-search .search-settings .engine-name{font-size:var(--text-sm);white-space:nowrap}.top-search .search-settings .engine-dropdown{position:absolute;top:calc(100% + 10px);right:0;min-width:200px;max-width:50vh;width:max-content;background-color:var(--autocompleteBackground);border-radius:var(--borderRadius-base);box-shadow:0 4px 12px #0003;z-index:200}.top-search .search-settings .engine-dropdown[hidden]{display:none}.top-search .search-settings .engine-option{display:block;width:100%;text-align:left;background-color:transparent;border:0;color:var(--textHeaders);cursor:pointer;padding:10px 12px;transition:var(--transition-colors)}.top-search .search-settings .engine-option:hover{background-color:var(--autocompleteHover)}.top-search .search-settings .engine-option:focus{border-left:2px solid var(--main);padding-left:10px;background-color:var(--autocompleteHover);outline:none}.top-search .search-settings .engine-option[aria-checked=true]{background-color:var(--autocompleteSelected)}.top-search .search-settings .engine-option .name{display:block;font-size:var(--text-sm);font-weight:500;margin-bottom:2px}.top-search .search-settings .engine-option .help{display:block;font-size:var(--text-xs);opacity:.7}.top-search .search-bar .search-close-button{font-size:var(--text-md);color:var(--searchAccentMain);background-color:transparent;border:none;cursor:pointer;margin:0;opacity:.5;padding:5px;transform:scaleY(0);transition:var(--transition-all);display:flex;align-items:center;position:absolute;right:0;top:50%;transform:translateY(-50%) scaleY(0)}.top-search .search-bar .search-close-button:hover{opacity:.7}.top-search .search-settings button.icon-settings{display:flex;align-items:center;justify-content:flex-end}.top-search .search-settings .icon-settings{font-size:var(--text-xl);float:right;color:var(--iconAction);text-decoration:none;border:none;transition:color .3s ease-in-out;background-color:transparent;cursor:pointer;padding:0}.top-search .search-settings .icon-settings:hover{color:var(--iconActionHover)}.top-search .search-settings .icon-settings:visited{color:var(--iconAction)}@media screen and (max-width: 768px){.top-search{padding-left:calc(var(--content-gutter) + 36px);padding-right:var(--content-gutter);margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter));width:calc(2 * var(--content-gutter) + 100%)}.search-settings{width:100%;box-sizing:border-box}.top-search .search-settings .engine-name{display:none}}body.search-focused .search-bar .search-close-button{transform:translateY(-50%) scaleY(1);transition:var(--transition-all)}@media screen and (hover: hover){body.search-focused .top-search{position:sticky!important}body.search-focused .sidebar-button{position:fixed!important}}@media screen and (hover: none){body.scroll-sticky .top-search{position:sticky!important}body.scroll-sticky .sidebar-button{position:fixed!important}}*:focus,button:focus,[type=button]:focus,[type=reset]:focus,[type=submit]:focus{outline:2px solid var(--main);outline-offset:-2px}*:focus:not(:focus-visible),button:focus:not(:focus-visible),[type=button]:focus:not(:focus-visible),[type=reset]:focus:not(:focus-visible),[type=submit]:focus:not(:focus-visible){outline:0}input[type=text],input[type=number],input[type=date],input[type=datetime],input[type=datetime-local],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=time],input[type=url],input[type=week],textarea{outline:0}.content-inner{font-size:1em;line-height:1.6875em;position:relative;background-color:var(--background);color:var(--textBody)}.content-inner .heading-with-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px}.content-inner .heading-with-actions>*:not(h1){flex-shrink:0}.content-inner .heading-with-actions h1{flex-grow:1;justify-self:flex-start;max-width:100%;margin:0;overflow-wrap:break-word}.content-inner .heading-with-actions .icon-action{width:20px;height:20px;display:flex;justify-content:center;align-items:center;font-weight:400}.content-inner .heading-with-actions.top-heading .icon-action{font-size:1.2rem}@container content (width > 600px){.content-inner .heading-with-actions.top-heading{flex-wrap:nowrap;align-items:flex-start;& h1{padding-right:32px}& .icon-action{padding-top:1.7rem}}}.content-inner .top-heading{padding-top:1rem}.content-inner :is(h1,h2,h3,h4,h5,h6){font-family:var(--sansFontFamily);font-weight:700;line-height:1.5em;word-wrap:break-word;color:var(--textHeaders)}.content-inner h1{font-size:2em;margin:.5em 0}.content-inner h1.section-heading{margin:1.5em 0 .5em}.content-inner div.group-description{margin:0 0 3em}.content-inner h1 small{font-weight:400}.content-inner h2{font-size:1.6em;padding-top:1em;margin-bottom:.5em}.content-inner h3{font-size:1.375em;margin:1em 0 .5em}.content-inner li+li{margin-top:.25em}.content-inner :is(a,.a-main){color:var(--link-color);text-decoration:underline;text-decoration-skip-ink:auto}.content-inner :is(a:visited,.a-main:visited){color:var(--link-visited-color)}.content-inner .icon-action{color:var(--iconAction);text-decoration:none;border:none;transition:var(--transition-colors);background-color:transparent;cursor:pointer}.content-inner .icon-action:hover{color:var(--iconActionHover)}.content-inner .icon-action:visited{color:var(--iconAction)}.content-inner .livebook-badge-container{display:flex}.content-inner a.livebook-badge{display:inline-flex}.content-inner .note{color:var(--iconAction);font-size:var(--text-xs);font-weight:400}.content-inner{& :is(blockquote,section.admonition){position:relative;margin:1.5625em 0;padding:0 1.2rem;overflow:auto;border-radius:var(--borderRadius-base);& :is(code,pre code){background-color:var(--admCodeBackground);border:1px solid var(--admCodeBorder);color:var(--admCodeColor)}& :is(a,a:visited){color:inherit}& :is(h1,h2,h3,h4,h5,h6):first-child{padding-bottom:1em;border-bottom:2px solid hsl(from currentColor h s l / 15%)}& p:last-child{padding-bottom:1em;margin-bottom:0}}& blockquote{border-left:3px solid var(--blockquoteBorder);background-color:var(--blockquoteBackground)}}@media print{.content-inner :is(blockquote,section.admonition){border:2px solid hsl(from var(--textBody) h s l / 15%);& :is(code,pre code){border-color:var(--gray400)}& pre code.makeup{white-space:break-spaces;break-inside:avoid}}}.content-inner table{margin:2em 0;border-collapse:collapse;display:block;overflow:auto}.content-inner th{text-align:left;font-family:var(--sansFontFamily);font-weight:700;padding-bottom:.5em;white-space:nowrap}.content-inner thead tr{border-bottom:1px solid var(--tableHeadBorder)}.content-inner tbody tr{border-bottom:1px solid var(--tableBodyBorder)}.content-inner tbody tr:last-child{border-bottom:none}.content-inner tr{vertical-align:bottom;height:2.5em}.content-inner :is(td,th){padding:.25em .25em .25em 1em;line-height:2em;vertical-align:top}.content-inner .section-heading{--icon-size: 16px;--icon-spacing: 5px;display:grid;grid-template:1fr / 1fr}@media screen and (max-width: 768px){.content-inner .section-heading{--icon-spacing: 2px}}.content-inner .section-heading>:is(.hover-link,.text){grid-row:1;grid-column:1}.content-inner .section-heading .hover-link{text-decoration:none}.content-inner .section-heading i{font-size:var(--icon-size);color:var(--mainLight);top:-2px;margin-left:calc(-1 * (var(--icon-size) + var(--icon-spacing)));padding-right:var(--icon-spacing);position:relative;opacity:0}.content-inner :is(blockquote,section.admonition) .section-heading i{display:none}.content-inner .section-heading:is(:hover,:focus,:target) i{opacity:1}.content-inner .app-vsn{display:none!important;font-size:.6em;line-height:1.5em}@media screen and (max-width: 768px){.content-inner .app-vsn{display:block!important}}.content-inner img{max-width:100%}@media screen and (max-width: 768px){.content-inner :is(ol,ul){padding-left:calc(1.5 * var(--content-gutter))}}.content-inner section.admonition{border-radius:var(--borderRadius-base)}.content-inner section.admonition>.admonition-title{color:var(--contrast);padding-left:2.2rem;font-weight:700;font-style:normal}.content-inner section.admonition>.admonition-title:before{color:var(--contrast);position:absolute;left:1rem;font-size:1.8rem;font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.content-inner section.admonition{& .admonition-title:before{content:var(--icon-error-warning)}&.warning{background-color:var(--warningBackground);& .admonition-title{&,&:before{color:var(--warningHeading)}}}&.error{background-color:var(--errorBackground);& .admonition-title{&,&:before{color:var(--errorHeading)}}}&.info{background-color:var(--infoBackground);& .admonition-title{&,&:before{color:var(--infoHeading)}}}&.neutral{background-color:var(--neutralBackground);& .admonition-title{&,&:before{content:var(--icon-double-quotes-l);color:var(--neutralHeading)}}}&.tip{background-color:var(--tipBackground);& .admonition-title{&,&:before{color:var(--tipHeading)}}}}@media print{.content-inner section.admonition{&.warning{border-color:hsl(from var(--warningHeading) h s l / 15%);& .admonition-title{&,&:before{color:hsl(var(--warningHue),90%,40%)}}}&.error{border-color:hsl(from var(--errorHeading) h s l / 15%);& .admonition-title{&,&:before{color:hsl(var(--errorHue),80%,40%)}}}&.info{border-color:hsl(from var(--infoHeading) h s l / 15%);& .admonition-title{&,&:before{color:hsl(var(--infoHue),80%,40%)}}}&.neutral{border-color:hsl(from var(--neutralHeading) h s l / 15%);& .admonition-title{&,&:before{color:hsl(var(--neutralHue),30%,40%)}}}&.tip{border-color:hsl(from var(--tipHeading) h s l / 15%);& .admonition-title{&,&:before{color:hsl(var(--tipHue),50%,40%)}}}}}.content-inner section.admonition>.admonition-title code{margin:0 .5ch}@media screen and (max-width: 768px){.content-inner section.admonition{margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter));padding-left:var(--content-gutter);padding-right:var(--content-gutter);border-radius:0}}.content-inner .summary h2 a{text-decoration:none;border:none;color:var(--textHeaders)!important}.content-inner .summary span.deprecated{color:var(--darkDeprecated);font-weight:400}.content-inner .summary .summary-row .summary-signature{font-family:var(--monoFontFamily);font-size:13px;font-weight:700}.content-inner .summary .summary-row .summary-signature a{text-decoration:none;border:none}.content-inner .summary .summary-row .summary-synopsis{padding:0 1.2em;margin:0 0 .5em}.content-inner .summary .summary-row .summary-synopsis p{margin:0;padding:0}@font-face{font-family:Consolas;src:local("Consolas");size-adjust:110%}.content-inner.content-inner :is(a:has(code,img),pre a){color:var(--link-color);text-shadow:none;text-decoration:none;background-image:none}.content-inner.content-inner :is(a:has(code,img),pre a):is(:visited,:active,:focus,:hover){color:var(--link-visited-color)}.content-inner strong>code{font-weight:700}.content-inner code{font-family:var(--monoFontFamily);font-style:normal;line-height:24px;font-weight:400;font-size:var(--text-sm);background-color:var(--codeBackground);vertical-align:baseline;border-radius:var(--borderRadius-sm);padding:.1em .2em;border:1px solid var(--codeBorder);text-transform:none}.content-inner code.inline{border-radius:var(--borderRadius-sm);word-wrap:break-word}.content-inner pre{margin:var(--baseLineHeight) 0}.content-inner pre code{display:block;overflow-x:auto;white-space:inherit;padding:1em;scrollbar-width:thin}.content-inner pre code.output{margin:0 12px;max-height:400px;overflow:auto}.content-inner pre code.output+.copy-button{margin-right:12px}.content-inner pre code.output:before{content:"Output";display:block;position:absolute;top:-16px;left:12px;padding:2px 4px;font-size:var(--text-xs);font-family:var(--monoFontFamily);line-height:1;color:var(--textHeaders);background-color:var(--codeBackground);border:1px solid var(--codeBorder);border-bottom:0;border-radius:2px}@media screen and (max-width: 768px){.content-inner>pre:has(code),.content-inner section>pre:has(code){margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter))}.content-inner>pre code,.content-inner section>pre code{padding-left:var(--content-gutter);padding-right:var(--content-gutter);border-radius:0;border-left-width:0;border-right-width:0}}@keyframes blink-background{0%,to{background-color:var(--textDetailBackground)}50%{background-color:var(--blink)}}.content-inner .detail:target .detail-header{animation-duration:.55s;animation-name:blink-background;animation-iteration-count:1;animation-timing-function:ease-in-out}.content-inner .detail-header{margin:1em 0;padding:.5em .85em .5em 1em;background-color:var(--textDetailBackground);border-left:3px solid var(--textDetailAccent);font-size:1em;font-family:var(--monoFontFamily);position:relative}.content-inner .detail-header .signature{font-family:var(--monoFontFamily);font-size:13px;font-weight:700;line-height:2em}.content-inner .detail-header:hover a.detail-link,.content-inner .detail-header a.detail-link:focus{opacity:1;text-decoration:none}.content-inner .detail-header a.detail-link{transition:var(--transition-opacity);position:absolute;top:0;left:0;display:block;opacity:0;padding:.6em;line-height:1.5em;margin-left:-2.5em;text-decoration:none;border:none}@media screen and (max-width: 768px){.content-inner .detail-header a.detail-link{margin-left:-30px}}.content-inner .specs pre{font-family:var(--monoFontFamily);font-size:var(--text-xs);font-style:normal;line-height:24px;white-space:pre-wrap;margin:0;padding:0}.content-inner .specs .attribute{color:var(--fnSpecAttr)}.content-inner .docstring{margin:1.2em 0 3em 1.2em}@media screen and (max-width: 768px){.content-inner .docstring{margin-left:0}}.content-inner .docstring:is(h2,h3,h4,h5){font-weight:700}.content-inner .docstring h2{font-size:1.1em}.content-inner .docstring h3{font-size:1em}.content-inner .docstring h4{font-size:.95em}.content-inner .docstring h5{font-size:.9em}.content-inner div.deprecated{display:block;padding:1em;background-color:var(--fnDeprecated);border-radius:var(--borderRadius-sm);margin:var(--baseLineHeight) 0}.content-inner .footer{margin:4em auto 1em;text-align:center;font-size:var(--text-sm)}.content-inner .footer .line{display:inline-block}.content-inner .footer .footer-button{background-color:transparent;border:0;cursor:pointer;padding:0 4px}.content-inner .footer .footer-hex-package{margin-right:4px}.content-inner .bottom-actions{display:flex;justify-content:space-between;margin-top:7em;gap:12px}.bottom-actions-item{flex:1 1 0%}.content-inner .bottom-actions .bottom-actions-button{display:flex;text-decoration:none;flex-direction:column;border-radius:var(--borderRadius-sm);border:1px solid var(--bottomActionsBtnBorder);padding:12px 16px;min-width:150px;transition:var(--transition-all)}.content-inner .bottom-actions .bottom-actions-button:hover{border-color:var(--mainLight)}.content-inner .bottom-actions .bottom-actions-button .subheader{font-size:.8em;color:var(--textHeaders);white-space:nowrap}.content-inner .bottom-actions .bottom-actions-button .title{color:var(--bottomActionsBtnTitle)}.content-inner .bottom-actions .bottom-actions-button[rel=prev]{text-align:start}.content-inner .bottom-actions .bottom-actions-button[rel=next]{text-align:end}@media screen and (max-width: 768px){.content-inner .bottom-actions{flex-direction:column-reverse}}.page-cheatmd .content-inner{--horizontal-space: 1.5em;--vertical-space: 1em}@media (max-width: 600px){.page-cheatmd .content-inner{--horizontal-space: 1em;--vertical-space: .75em}}.page-cheatmd .content-inner{max-width:1200px}.page-cheatmd .content-inner h1{margin-bottom:var(--vertical-space)}.page-cheatmd .content-inner h2{margin:var(--vertical-space) 0;column-span:all;color:var(--gray700);font-weight:500}.dark .page-cheatmd .content-inner h2{color:var(--gray200)}.page-cheatmd .content-inner h3{margin:0 0 1em;font-weight:400}.page-cheatmd .content-inner section.h3{min-width:300px;margin:0;padding:0 0 calc(var(--vertical-space) * 2) 0;break-inside:avoid}.page-cheatmd .content-inner h3 .text{overflow:hidden}.page-cheatmd .content-inner h3 .text:after{content:"";margin-left:calc(var(--horizontal-space) / 2);vertical-align:baseline;display:inline-block;width:100%;height:1px;margin-right:-100%;margin-bottom:5px;background-color:var(--codeBorder)}.page-cheatmd .content-inner h4{display:block;margin:0;padding:.25em var(--horizontal-space);font-weight:400;background:var(--gray100);color:#567;border:solid 1px 1px 0 1px var(--gray100)}.dark .page-cheatmd .content-inner h4{background:#192f50;color:var(--textBody);border:1px solid #192f50;border-bottom:0}.page-cheatmd .content-inner .h2 p{margin:0;display:block;background:var(--gray50);padding:var(--vertical-space) var(--horizontal-space)}.dark .page-cheatmd .content-inner .h2 p{background:var(--gray700)}.page-cheatmd .content-inner .h2 p>code{color:#eb5757;border-radius:var(--borderRadius-sm);padding:.2em .4em}.page-cheatmd .content-inner pre code{padding:var(--vertical-space) var(--horizontal-space)}.page-cheatmd .content-inner .h2 pre{margin:0}.page-cheatmd .content-inner .h2 pre+pre{margin-top:-1px}.page-cheatmd .content-inner pre.wrap{white-space:break-spaces}@media screen and (max-width: 768px){.page-cheatmd .content-inner pre code{border-left-width:1px!important;border-right-width:1px!important}}.page-cheatmd .content-inner .h2 table{display:table;box-sizing:border-box;width:100%;border-collapse:collapse;margin:0}.page-cheatmd .content-inner .h2 th{padding:var(--vertical-space) var(--horizontal-space);line-height:inherit;margin-bottom:-1px;vertical-align:middle;border-bottom:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 td{padding:var(--vertical-space) var(--horizontal-space);border:0;border-bottom:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 tr:first-child{border-top:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 td code{color:#eb5757;border-radius:var(--borderRadius-sm);padding:.2em .4em}.page-cheatmd .content-inner .h2 thead{background-color:var(--gray50)}.dark .page-cheatmd .content-inner .h2 thead{background-color:var(--gray700)}.page-cheatmd .content-inner .h2 tbody{background-color:var(--codeBackground)}.page-cheatmd .content-inner .h2 :is(ul,ol){margin:0;padding:0}.page-cheatmd .content-inner .h2 li{list-style-position:inside;padding:.5em var(--horizontal-space);line-height:2em;vertical-align:middle;background-color:var(--codeBackground);border-bottom:1px solid var(--codeBorder);margin-top:0}.page-cheatmd .content-inner .h2 :is(ul,ol)+pre code{border-top:0}.page-cheatmd .content-inner .h2 li>code{color:#eb5757;border-radius:var(--borderRadius-sm);padding:.2em .4em}.page-cheatmd .content-inner section.width-50{display:block;width:50%;margin:0}.page-cheatmd .content-inner section.width-50>section>table{width:100%}.page-cheatmd .content-inner section:is(.col-2,.col-2-left,.col-3){column-gap:40px}.page-cheatmd .content-inner section.col-2{column-count:2;height:auto}.page-cheatmd .content-inner section.col-2-left{display:grid;grid-template-columns:calc(100% / 3) auto}.page-cheatmd .content-inner section.col-2-left>h2{grid-column-end:span 2}.page-cheatmd .content-inner section.col-3{column-count:3;height:auto}.page-cheatmd .content-inner section.list-4>ul{display:flex;flex-wrap:wrap}.page-cheatmd .content-inner section.list-4>ul>li{flex:0 0 25%}.page-cheatmd .content-inner section.list-6>ul{display:flex;flex-wrap:wrap}.page-cheatmd .content-inner section.list-6>ul>li{flex:0 0 calc(100% / 6)}@media screen and (max-width: 1400px){.page-cheatmd .content-inner section.col-3{column-count:2}.page-cheatmd .content-inner section.col-2-left{display:flex;flex-direction:column}}@media screen and (max-width: 1200px){.page-cheatmd .content-inner section:is(.col-2,.col-3){display:flex;flex-direction:column}.page-cheatmd .content-inner section.list-6>ul>li{flex:0 0 25%}}@media screen and (max-width: 1000px){.page-cheatmd .content-inner section:is(.list-4,.list-6)>ul>li{flex:0 0 calc(100% / 3)}}@media screen and (max-width: 600px){.page-cheatmd .content-inner section:is(.list-4,.list-6)>ul>li{flex:0 0 50%}.page-cheatmd .content-inner section.width-50{width:100%}}#search{min-height:200px;position:relative}#search .loading{height:64px;width:64px;position:absolute;top:50%;left:calc(50% - 32px)}#search .loading div{box-sizing:border-box;display:block;position:absolute;width:51px;height:51px;margin:6px;border:6px solid var(--coldGray);border-radius:50%;animation:loading 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--coldGray) transparent transparent transparent}#search .loading div:nth-child(1){animation-delay:-.45s}#search .loading div:nth-child(2){animation-delay:-.3s}#search .loading div:nth-child(3){animation-delay:-.15s}@keyframes loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#search .result{margin:2em 0}#search .result p{margin:0}#search .result-id{font-size:1.4em;margin:0}#search .result-id a{text-decoration:none;color:var(--textHeaders);transition:var(--transition-colors)}#search .result-id a:is(:visited,:active){color:var(--textHeaders)}#search .result-id a:is(:hover,:focus){color:var(--main)}#search :is(.result-id,.result-elem) em{font-style:normal;color:var(--main)}#search .result-id small{font-weight:400}@keyframes keyboard-shortcuts-show{0%{opacity:0}to{opacity:1}}.modal{animation-duration:.15s;animation-name:keyboard-shortcuts-show;animation-iteration-count:1;animation-timing-function:ease-in-out;display:none;background-color:#000000bf;position:fixed;inset:0;z-index:300}.modal.shown{display:block}.modal .modal-contents{margin:75px auto 0;max-width:500px;background-color:var(--modalBackground);border-radius:var(--borderRadius-sm);box-shadow:2px 2px 8px #0003;padding:25px 35px 35px}@media screen and (max-width: 768px){.modal .modal-contents{padding:20px}}.modal .modal-header{display:flex;align-items:start}.modal .modal-title{display:inline-block;flex-grow:1;font-size:1.2rem;font-weight:700;margin-bottom:20px}.modal .modal-title button{border:none;background-color:transparent;color:var(--textHeaders);font-weight:700;margin-right:30px;padding-left:0;text-align:left;transition:var(--transition-colors)}.modal .modal-title button:hover{color:var(--main);cursor:pointer}.modal .modal-title button.active{color:var(--main)}.modal .modal-close{cursor:pointer;display:block;font-size:1.5rem;margin:-8px -8px 0 0;padding:8px;opacity:.7;background-color:transparent;color:var(--textHeaders);border:none;transition:var(--transition-opacity)}.modal .modal-close:hover{opacity:1}#keyboard-shortcuts-content dl.shortcut-row{display:flex;align-items:center;justify-content:space-between;margin:0;padding:6px 0 8px;border-bottom:1px solid var(--settingsSectionBorder)}#keyboard-shortcuts-content dl.shortcut-row:last-of-type{border-bottom-style:none}#keyboard-shortcuts-content dl.shortcut-row:first-child{padding-top:0}#keyboard-shortcuts-content :is(.shortcut-keys,.shortcut-description){display:inline-block}#keyboard-shortcuts-content kbd>kbd{background-color:var(--settingsInputBorder);color:var(--contrast);border-radius:var(--borderRadius-sm);font-family:inherit;font-weight:700;display:inline-block;line-height:1;padding:4px 7px 6px;min-width:26px;text-align:center;font-size:var(--text-sm)}#keyboard-shortcuts-content :is(.shortcut-keys,.shortcut-description){margin:0}#quick-switch-modal-body{width:100%;position:relative}#quick-switch-modal-body .ri-search-2-line{position:absolute;left:0;top:0;padding:4px 10px;color:var(--quickSwitchContour);font-weight:700}#quick-switch-modal-body #quick-switch-input{width:100%;padding:8px 6px 8px 38px;border:none;color:var(--quickSwitchInput);background-color:transparent;border-bottom:1px solid var(--quickSwitchContour);box-sizing:border-box;transition:all .12s ease-out}#quick-switch-modal-body #quick-switch-results{margin:0}#quick-switch-modal-body .quick-switch-result{padding:2px 5px;border-bottom:1px dotted var(--quickSwitchContour);transition:all .12s ease-out}#quick-switch-modal-body .quick-switch-result:last-child{border-bottom:none}#quick-switch-modal-body .quick-switch-result:hover{cursor:pointer}#quick-switch-modal-body .quick-switch-result:is(:hover,.selected){border-left:4px solid var(--main);background-color:var(--codeBackground)}.autocomplete{display:none;position:absolute;width:calc(100% - 32px);top:55px}.autocomplete .triangle{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-bottom:12px solid var(--autocompleteBackground);position:absolute;top:8px;left:26px;transform:translate(-50%);z-index:100;background-color:transparent}.autocomplete-results{margin:0;padding:15px 20px;display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px;color:var(--autocompleteResults);font-family:var(--sansFontFamily);font-weight:300;font-size:.9rem;font-style:italic}.autocomplete-results .query{margin-right:auto}.autocomplete-results .bold{color:var(--autocompleteResultsBold);font-weight:400}.autocomplete.shown{display:block}.autocomplete-container{position:absolute;top:5px;width:100%;z-index:200}.autocomplete-suggestions{background-color:var(--autocompleteBackground);border-radius:var(--borderRadius-base);box-shadow:0 4px 12px #0003;overflow-y:auto;max-height:450px;white-space:normal;overflow-x:hidden;overscroll-behavior-y:contain;scrollbar-width:thin}.autocomplete-suggestion{color:var(--textHeaders)!important;display:block;padding:12px 20px;text-decoration:none!important;transition:var(--transition-colors);border-top:1px solid var(--suggestionBorder);font-size:.9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-suggestion.selected{background-color:var(--autocompleteSelected)}.autocomplete-suggestion:hover{background-color:var(--autocompleteHover)}.autocomplete-suggestion em{font-style:normal;font-weight:700}.autocomplete-suggestion .separator{opacity:.4;margin:0 2px}.autocomplete-suggestion .description{opacity:.6}.autocomplete-suggestion .label{background-color:var(--autocompleteLabelBack);opacity:.6;color:var(--autocompleteLabelFont);padding:4px 8px;border-radius:4px;margin-left:5px;text-transform:uppercase;font-family:var(--sansFontFamily);font-size:.7rem}@media screen and (hover: none){.autocomplete-results .press-return{display:none!important}}.tooltip{box-shadow:0 0 10px var(--black-opacity-10);max-height:300px;max-width:500px;padding:0;position:absolute;pointer-events:none;margin:0;z-index:99;top:0;left:0;visibility:hidden;transform:translateY(20px);opacity:0;transition:.2s visibility ease-out,.2s transform ease-out,.2s opacity ease-out}.tooltip.tooltip-shown{visibility:visible;transform:translateY(0);opacity:1}.tooltip .tooltip-body{border:1px solid var(--codeBorder);border-radius:var(--borderRadius-sm);overflow:auto}.tooltip .tooltip-body .signature{min-width:320px;width:100%;line-height:1em}.tooltip .tooltip-body .detail-header{border-left:0;margin-bottom:0;margin-top:0}.tooltip .tooltip-body .docstring{background-color:var(--background);padding:1.2em;margin:0;width:498px}.tooltip .tooltip-body .docstring-plain{max-width:498px;width:auto}.tooltip .tooltip-body .version-info{float:right;font-family:var(--monoFontFamily);font-weight:400;opacity:.3;padding-left:.3em}pre{position:relative}pre:hover .copy-button,pre .copy-button:focus{opacity:1}.copy-button{display:flex;opacity:0;position:absolute;top:7px;right:8px;padding:8px;background-color:transparent;backdrop-filter:blur(8px);border-radius:var(--borderRadius-sm);border:1px solid var(--codeBorder);cursor:pointer;transition:var(--transition-all);font-size:var(--text-sm);line-height:24px;color:currentColor;& svg[aria-live=polite]{display:none}}.copy-button svg{opacity:.5;transition:var(--transition-all)}pre .copy-button:hover svg,pre .copy-button:focus-visible svg{opacity:1}.copy-button svg{width:20px}.copy-button.clicked{opacity:1;color:var(--success);& svg[aria-live=polite]{display:block}}.copy-button.clicked svg{display:none;color:currentColor}#settings-modal-content{margin-top:10px}#settings-modal-content .hidden{display:none}#settings-modal-content .input{box-sizing:border-box;width:80%;padding:8px;font-size:var(--text-sm);background-color:var(--settingsInputBackground);color:var(--settingsInput);border:1px solid var(--settingsInputBorder);border-radius:var(--borderRadius-base);transition:var(--transition-all)}#settings-modal-content .input:focus{border-color:var(--main)}#settings-modal-content .input::placeholder{color:var(--gray400)}#settings-modal-content .switch-button-container{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--settingsSectionBorder);padding:10px 0}#settings-modal-content .switch-button-container:first-of-type{border-top-style:none;padding-top:0}#settings-modal-content .switch-button-container>div>span{font-size:var(--text-md)}#settings-modal-content .switch-button-container>div>p{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--text-sm);line-height:1.4;margin:0;padding-bottom:6px;padding-right:10px}#settings-modal-content .switch-button{position:relative;display:inline-block;flex-shrink:0;width:40px;height:20px;user-select:none;transition:var(--transition-all)}#settings-modal-content .switch-button__checkbox{appearance:none;position:absolute;display:block;width:20px;height:20px;border-radius:1000px;background-color:#91a4b7;border:3px solid #e5edf5;cursor:pointer;transition:var(--transition-all)}#settings-modal-content .switch-button__bg{display:block;width:100%;height:100%;border-radius:1000px;background-color:#e5edf5;cursor:pointer;transition:var(--transition-all)}#settings-modal-content .switch-button__checkbox:checked{background-color:#fff;border-color:var(--main);transform:translate(100%)}#settings-modal-content .switch-button__checkbox:checked+.switch-button__bg{background-color:var(--main)}#settings-modal-content .switch-button__checkbox:focus{outline:0}#settings-modal-content .switch-button__checkbox:focus+.switch-button__bg{outline:2px solid var(--main);outline-offset:2px}#settings-modal-content .switch-button__checkbox:focus:not(:focus-visible)+.switch-button__bg{outline:0}#settings-modal-content .settings-select{cursor:pointer;position:relative;border:none;background-color:transparent;color:var(--textBody)}#settings-modal-content .settings-select option{color:initial}#toast{visibility:hidden;opacity:0;position:fixed;z-index:1;left:50%;bottom:1rem;min-width:3rem;margin:0 -1.2rem;padding:.7rem 1.2rem;text-align:center;font-weight:700;border-radius:var(--borderRadius-base);border:1px solid var(--codeBorder);background-color:var(--codeBackground);color:var(--textBody);transition:opacity .4s ease-in-out,transform .3s ease-out;cursor:default}#toast.show{visibility:visible;opacity:1;transform:translateY(-.75rem)}@media (prefers-reduced-motion: reduce){#toast{transition:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0;user-select:none}@media print{.body-wrapper{display:block}.sidebar,.sidebar-button,.top-search{display:none}.content{padding-left:0;overflow:visible;left:0;width:100%}.summary-row{break-inside:avoid}#toast{display:none}.content-inner{padding:0}.content-inner .section-heading a.hover-link,.content-inner button.icon-action,.content-inner a.icon-action,.content-inner .bottom-actions{display:none}.footer p:first-of-type{display:none}.content-inner pre code.makeup{white-space:break-spaces;break-inside:avoid}}@media print{.page-cheatmd .content-inner *{background-color:transparent!important;border-color:var(--gray400)!important}.page-cheatmd .content-inner{max-width:100%;width:100%;padding:0;font-size:.7em}.page-cheatmd .content-inner section:is(.col-2,.col-2-left,.col-3){column-gap:30px}.page-cheatmd .content-inner section.col-2{column-count:2}.page-cheatmd .content-inner section.col-2-left{display:grid}.page-cheatmd .content-inner section.col-3{column-count:3}.page-cheatmd .content-inner h1{margin-top:0;margin-bottom:.5em}.page-cheatmd .content-inner h2.section-heading{font-weight:700;margin-top:1em;column-span:all}.page-cheatmd .content-inner section.h2{break-inside:avoid}.page-cheatmd .content-inner h3{font-weight:700;color:var(--mainDark)}.page-cheatmd .content-inner h3:after{height:2px;background-color:var(--gray400)}.page-cheatmd .content-inner section.h3{min-width:300px;break-inside:avoid}.page-cheatmd .content-inner h4{padding:.5em 0;border:none;font-weight:700;color:#000}.page-cheatmd .content-inner .h2 p{padding-left:0;padding-right:0;border:none!important}.page-cheatmd .content-inner code{line-height:1.5em}.page-cheatmd .content-inner .h2 table{font-variant-numeric:tabular-nums;break-inside:avoid}.page-cheatmd .content-inner .h2 :is(th,td){vertical-align:top;padding-left:0;padding-right:0}.page-cheatmd .content-inner .h2 thead{border-style:solid none;border-width:1px}.page-cheatmd .content-inner .h2 tr{border-bottom:none}.page-cheatmd .content-inner .h2 th{font-weight:700}.page-cheatmd .content-inner .h2 li{padding-left:0;padding-right:0;vertical-align:middle;border-bottom:none}.page-cheatmd .content-inner pre:hover button.copy-button,.page-cheatmd .content-inner div.tooltip{display:none}.page-cheatmd .content-inner footer p:not(.built-using){display:none}}code.makeup .unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.makeup .hll{background-color:#ffc}.makeup .bp{color:#3465a4}.makeup .c,.makeup .c1,.makeup .ch,.makeup .cm,.makeup .cp,.makeup .cpf,.makeup .cs{color:#4d4d4d}.makeup .dl{color:#408200}.makeup .err{color:#a40000;border:#ef2929}.makeup .fm,.makeup .g{color:#4d4d4c}.makeup .gd{color:#a40000}.makeup .ge{color:#4d4d4c;font-style:italic}.makeup .gh{color:navy;font-weight:700}.makeup .gi{color:#00a000}.makeup .go{color:#4d4d4c;font-style:italic}.makeup .gp{color:#4d4d4d}.makeup .gr{color:#ef2929}.makeup .gs{color:#4d4d4c;font-weight:700}.makeup .gt{color:#a40000;font-weight:700}.makeup .gu{color:purple;font-weight:700}.makeup .il{color:#0000cf;font-weight:700}.makeup .k,.makeup .kc,.makeup .kd,.makeup .kn,.makeup .kp,.makeup .kr,.makeup .kt{color:#204a87}.makeup .l{color:#4d4d4c}.makeup .ld{color:#c00}.makeup .m,.makeup .mb,.makeup .mf,.makeup .mh,.makeup .mi,.makeup .mo{color:#2937ab}.makeup .n{color:#4d4d4c}.makeup .na{color:#8a7000}.makeup .nb{color:#204a87}.makeup .nc{color:#0000cf}.makeup .nd{color:#5c35cc;font-weight:700}.makeup .ne{color:#c00;font-weight:700}.makeup .nf{color:#b65800}.makeup .ni{color:#bc5400}.makeup .nl{color:#b65800}.makeup .nn{color:#4d4d4c}.makeup .no{color:#a06600}.makeup .nt{color:#204a87;font-weight:700}.makeup .nv,.makeup .nx{color:#4d4d4c}.makeup .o{color:#bc5400}.makeup .ow{color:#204a87}.makeup .p,.makeup .py{color:#4d4d4c}.makeup .s,.makeup .s1,.makeup .s2,.makeup .sa,.makeup .sb,.makeup .sc{color:#408200}.makeup .sd{color:#8f5902;font-style:italic}.makeup .se{color:#204a87}.makeup .sh{color:#408200}.makeup .si{color:#204a87}.makeup .sr{color:#c00}.makeup .ss{color:#a06600}.makeup .sx{color:#408200}.makeup .vc,.makeup .vg,.makeup .vi,.makeup .vm,.makeup .x{color:#4d4d4c}.dark .makeup{color:#dce1e6}.dark .makeup .hll{background-color:#49483e}.dark .makeup .bp{color:#dce1e6}.dark .makeup .c,.dark .makeup .c1,.dark .makeup .ch,.dark .makeup .cm,.dark .makeup .cp,.dark .makeup .cpf,.dark .makeup .cs{color:#969386}.dark .makeup .dl{color:#e6db74}.dark .makeup .err{color:#960050;background-color:#1e0010}.dark .makeup .fm{color:#a6e22e}.dark .makeup .gd{color:#ff5385}.dark .makeup .ge{font-style:italic}.dark .makeup .gi{color:#a6e22e}.dark .makeup .gp{color:#969386}.dark .makeup .gs{font-weight:700}.dark .makeup .gu{color:#969386}.dark .makeup .gt{color:#ff5385;font-weight:700}.dark .makeup .il{color:#ae81ff}.dark .makeup .k,.dark .makeup .kc,.dark .makeup .kd{color:#66d9ef}.dark .makeup .kn{color:#ff5385}.dark .makeup .kp,.dark .makeup .kr,.dark .makeup .kt{color:#66d9ef}.dark .makeup .l,.dark .makeup .ld,.dark .makeup .m,.dark .makeup .mb,.dark .makeup .mf,.dark .makeup .mh,.dark .makeup .mi,.dark .makeup .mo{color:#ae81ff}.dark .makeup .n{color:#dce1e6}.dark .makeup .na{color:#a6e22e}.dark .makeup .nb{color:#dce1e6}.dark .makeup .nc,.dark .makeup .nd,.dark .makeup .ne,.dark .makeup .nf{color:#a6e22e}.dark .makeup .ni,.dark .makeup .nl,.dark .makeup .nn{color:#dce1e6}.dark .makeup .no{color:#66d9ef}.dark .makeup .nt{color:#ff5385}.dark .makeup .nv{color:#dce1e6}.dark .makeup .nx{color:#a6e22e}.dark .makeup .o,.dark .makeup .ow{color:#ff5385}.dark .makeup .p,.dark .makeup .py{color:#dce1e6}.dark .makeup .s,.dark .makeup .s1,.dark .makeup .s2,.dark .makeup .sa,.dark .makeup .sb,.dark .makeup .sc,.dark .makeup .sd{color:#e6db74}.dark .makeup .se{color:#ae81ff}.dark .makeup .sh,.dark .makeup .si,.dark .makeup .sr,.dark .makeup .ss,.dark .makeup .sx{color:#e6db74}.dark .makeup .vc,.dark .makeup .vg,.dark .makeup .vi,.dark .makeup .vm{color:#dce1e6}.tabset{--borderWidth: 1px;--tabsetPadding: var(--baseLineHeight);margin:var(--baseLineHeight) 0;border:var(--borderWidth) solid var(--tabBorder);padding:0 var(--tabsetPadding);border-radius:var(--borderRadius-lg)}.tabset-tablist{display:flex;overflow:auto;scrollbar-width:thin;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--tabBorderTop)}.tabset-tab{padding:1.1rem var(--tabsetPadding);font-family:var(--sansFontFamily);color:var(--textColor);margin-right:calc(-1 * var(--borderWidth));background-color:transparent;border:0;box-shadow:none;cursor:pointer;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;transition:var(--transition-all)}:hover.tabset-tab{border-bottom-color:var(--tabBorderTop);color:var(--textHeaders)}.tabset-tab[aria-selected=true]{border-bottom-color:var(--mainLight);color:var(--textHeaders)}.tabset-tab[aria-selected=true]:focus-visible{background-color:var(--mainLight);border-color:var(--mainLight);color:var(--white)}@media screen and (max-width: 768px){.tabset{--tabsetPadding: calc(var(--baseLineHeight) / 2)}.tabset-panel{padding-top:calc(var(--tabsetPadding) / 2);padding-bottom:calc(var(--tabsetPadding) / 2)}.tabset-panel pre,.tabset-panel blockquote,.tabset-panel section.admonition{margin-left:calc(-1 * var(--tabsetPadding))!important;margin-right:calc(-1 * var(--tabsetPadding))!important}.tabset-panel>pre code{border-left-width:0;border-right-width:0}}@media screen and (max-width: 768px){.tabset-panel>:is(:first-child){&:is(table){margin:.5em 0}}}@media screen and (min-width: 769px){.tabset-panel>:is(:first-child){&:is(blockquote,.admonition){margin-top:1.5em}&:is(p:has(img)){margin-top:1.25em}&:is(table){margin-top:.75em}}.tabset-panel>:is(:last-child){&:is(blockquote,.admonition){margin-bottom:1.5em}&:is(p:not(:has(img)),ul,ol){margin-bottom:1.25em}&:is(table){margin-bottom:.75em}}}body:not(.dark) .content-inner img[src*="#gh-dark-mode-only"],body.dark .content-inner img[src*="#gh-light-mode-only"]{display:none} +/*! Bundled license information: + +modern-normalize/modern-normalize.css: + (*! modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize *) +*/ diff --git a/doc/dist/lato-latin-400-normal-W7754I4D.woff2 b/doc/dist/lato-latin-400-normal-W7754I4D.woff2 new file mode 100644 index 0000000..ff60934 Binary files /dev/null and b/doc/dist/lato-latin-400-normal-W7754I4D.woff2 differ diff --git a/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 b/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 new file mode 100644 index 0000000..11de83f Binary files /dev/null and b/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 differ diff --git a/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 b/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 new file mode 100644 index 0000000..edb9fa6 Binary files /dev/null and b/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 differ diff --git a/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 b/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 new file mode 100644 index 0000000..2c8aaa8 Binary files /dev/null and b/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 differ diff --git a/doc/dist/remixicon-QPNJX265.woff2 b/doc/dist/remixicon-QPNJX265.woff2 new file mode 100644 index 0000000..997d77c Binary files /dev/null and b/doc/dist/remixicon-QPNJX265.woff2 differ diff --git a/doc/dist/search_data-4AA356A9.js b/doc/dist/search_data-4AA356A9.js new file mode 100644 index 0000000..6e98aea --- /dev/null +++ b/doc/dist/search_data-4AA356A9.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","title":"triagebot_classifier","doc":"First agent in the triage pipeline. Reads the issue body and emits a\nclassification line.","ref":"triagebot_classifier.html"},{"type":"function","title":"triagebot_classifier.id/0","doc":"","ref":"triagebot_classifier.html#id/0"},{"type":"function","title":"triagebot_classifier.model/0","doc":"","ref":"triagebot_classifier.html#model/0"},{"type":"function","title":"triagebot_classifier.system_prompt/0","doc":"","ref":"triagebot_classifier.html#system_prompt/0"},{"type":"function","title":"triagebot_classifier.tools/0","doc":"","ref":"triagebot_classifier.html#tools/0"},{"type":"module","title":"triagebot_config","doc":"Runtime configuration for triagebot, sourced from env vars.\n\nReads everything from the environment at startup, stashes the resolved\nGitHub source_ref in `persistent_term` so the search tool (which runs\ninside a turn-worker process spawned by gakudan) can read it without a\nGenServer round-trip.\n\nRequired env vars:\n- TRIAGEBOT_WEBHOOK_SECRET GitHub webhook shared secret (HMAC)\n- TRIAGEBOT_REPO_OWNER e.g. \"Taure\"\n- TRIAGEBOT_REPO_NAME e.g. \"gakudan\"\n\nGitHub auth (one of):\n- TRIAGEBOT_GITHUB_TOKEN (PAT mode)\n- TRIAGEBOT_GITHUB_APP_ID + TRIAGEBOT_GITHUB_APP_PRIVATE_KEY_PEM\n + TRIAGEBOT_GITHUB_INSTALLATION_ID (App mode)\n\nLLM backend (one of):\n- ANTHROPIC_API_KEY\n- GEMINI_API_KEY\n\nOptional:\n- TRIAGEBOT_PORT Nova listen port (default 8080)\n- TRIAGEBOT_METRICS_PORT Prometheus /metrics port (default 9568,\n set to \"\" to disable)\n- TRIAGEBOT_AGENT_MODEL Override per-agent model (default\n claude-sonnet-4-6 for Anthropic,\n gemini-2.5-flash for Gemini)\n- TRIAGEBOT_POLICY_PATH Filesystem path to a triage-policy file\n read at startup and fed to every agent.\n Defaults to the bundled priv/TRIAGE.md so\n the policy ships with the release. Absent\n file is fine - agents fall back to their\n built-in defaults.","ref":"triagebot_config.html"},{"type":"function","title":"triagebot_config.agent_model/0","doc":"","ref":"triagebot_config.html#agent_model/0"},{"type":"function","title":"triagebot_config.github_source/0","doc":"","ref":"triagebot_config.html#github_source/0"},{"type":"function","title":"triagebot_config.llm_backend_spec/0","doc":"","ref":"triagebot_config.html#llm_backend_spec/0"},{"type":"function","title":"triagebot_config.metrics_port/0","doc":"","ref":"triagebot_config.html#metrics_port/0"},{"type":"function","title":"triagebot_config.port/0","doc":"","ref":"triagebot_config.html#port/0"},{"type":"function","title":"triagebot_config.refresh_repo_labels/0","doc":"Re-fetch the repo's labels from GitHub and update the cached value.\nUseful from a remote shell when the repo's label taxonomy changes\nbetween deploys.","ref":"triagebot_config.html#refresh_repo_labels/0"},{"type":"function","title":"triagebot_config.refresh_triage_policy/0","doc":"Re-fetch the triage-policy file from GitHub and update the cached value.\nUseful from a remote shell when the policy changes between deploys.","ref":"triagebot_config.html#refresh_triage_policy/0"},{"type":"function","title":"triagebot_config.repo_labels/0","doc":"Return the configured repo's labels (as fetched at startup). Each\nlabel is `#{name, description, color}`. Empty list if the fetch\nfailed - the agents fall back to their built-in vocabulary in that\ncase.","ref":"triagebot_config.html#repo_labels/0"},{"type":"function","title":"triagebot_config.setup/0","doc":"","ref":"triagebot_config.html#setup/0"},{"type":"function","title":"triagebot_config.triage_policy/0","doc":"Return the repo's triage-policy file contents (as fetched at startup),\nor an empty binary if no policy file was found. The policy is fed to\nevery triage agent via the run input.","ref":"triagebot_config.html#triage_policy/0"},{"type":"function","title":"triagebot_config.webhook_secret/0","doc":"","ref":"triagebot_config.html#webhook_secret/0"},{"type":"module","title":"triagebot_context","doc":"Builds the run input sent to the gakudan triage pipeline.\n\nThe input is a single message every agent reads: a shared\nrepository-context preamble (the triage policy + the repo's label\ntaxonomy) followed by the issue itself, enriched with the high-signal\nfields GitHub puts in the raw issue payload - contributor association,\nreactions, comment count, milestone, and assignees.\n\nKeeping the policy and label vocabulary here, in the shared input, means\nthey live in one place rather than being duplicated across every agent's\nsystem prompt.","ref":"triagebot_context.html"},{"type":"function","title":"triagebot_context.build_input/1","doc":"","ref":"triagebot_context.html#build_input/1"},{"type":"function","title":"triagebot_context.format_ticket/1","doc":"","ref":"triagebot_context.html#format_ticket/1"},{"type":"function","title":"triagebot_context.render_label_inventory/1","doc":"","ref":"triagebot_context.html#render_label_inventory/1"},{"type":"function","title":"triagebot_context.render_repo_context/2","doc":"","ref":"triagebot_context.html#render_repo_context/2"},{"type":"module","title":"triagebot_dashboard_auth","doc":"HTTP Basic auth gate for the triagebot live dashboard.\n\nCredentials come from `TRIAGEBOT_DASHBOARD_USER` / `TRIAGEBOT_DASHBOARD_PASSWORD`.\n\nClosed by default: if either is unset the dashboard denies everything (503), so\nit is never accidentally exposed. The username and password are compared in\nconstant time. Gates both the view routes and the HITL controls.","ref":"triagebot_dashboard_auth.html"},{"type":"function","title":"triagebot_dashboard_auth.check/1","doc":"","ref":"triagebot_dashboard_auth.html#check/1"},{"type":"module","title":"triagebot_dup_detector","doc":"Third agent. Uses the `search_issues` tool to look for likely duplicates\nof the current issue.","ref":"triagebot_dup_detector.html"},{"type":"function","title":"triagebot_dup_detector.id/0","doc":"","ref":"triagebot_dup_detector.html#id/0"},{"type":"function","title":"triagebot_dup_detector.model/0","doc":"","ref":"triagebot_dup_detector.html#model/0"},{"type":"function","title":"triagebot_dup_detector.system_prompt/0","doc":"","ref":"triagebot_dup_detector.html#system_prompt/0"},{"type":"function","title":"triagebot_dup_detector.tools/0","doc":"","ref":"triagebot_dup_detector.html#tools/0"},{"type":"module","title":"triagebot_label_proposer","doc":"Fourth agent. Reads the issue + all prior triage turns and proposes a\nset of labels, drawn from the repo's label taxonomy in the shared\nrepository triage context.","ref":"triagebot_label_proposer.html"},{"type":"function","title":"triagebot_label_proposer.id/0","doc":"","ref":"triagebot_label_proposer.html#id/0"},{"type":"function","title":"triagebot_label_proposer.model/0","doc":"","ref":"triagebot_label_proposer.html#model/0"},{"type":"function","title":"triagebot_label_proposer.system_prompt/0","doc":"","ref":"triagebot_label_proposer.html#system_prompt/0"},{"type":"function","title":"triagebot_label_proposer.tools/0","doc":"","ref":"triagebot_label_proposer.html#tools/0"},{"type":"module","title":"triagebot_repo_context_tool","doc":"gakudan tool that fetches a file from the configured GitHub repo,\ngiving the triage agents a way to ground themselves in repo-specific\ncontext (`CLAUDE.md`, `README.md`, `CONTRIBUTING.md`, the file an\nissue links to, etc.).\n\nThe active GitHub source_ref is read from `triagebot_config`\n(persistent_term) because tools run inside a turn-worker process with\nno parameter for per-run context.\n\nFile contents are truncated to `?MAX_BYTES` to keep prompt size\nbounded; the LLM sees a clear suffix when truncation happened.","ref":"triagebot_repo_context_tool.html"},{"type":"function","title":"triagebot_repo_context_tool.run/1","doc":"","ref":"triagebot_repo_context_tool.html#run/1"},{"type":"function","title":"triagebot_repo_context_tool.spec/0","doc":"","ref":"triagebot_repo_context_tool.html#spec/0"},{"type":"module","title":"triagebot_runner","doc":"Bridges a verified webhook event to a gakudan triage run.\n\n`dispatch/2` is invoked from the webhook controller. It spawns a\ndetached Erlang process so the controller can return 202 immediately\nwhile the LLM-bound work continues in the background.\n\nOnly `issue_opened` and `issue_labeled` events are processed. Other\nevents (closed, edited, etc.) are ignored at the runner level to keep\nLLM cost predictable and avoid re-triaging on every edit.\n\nIf the issue already carries the `triaged` label, we skip - this gives\nhuman maintainers a manual override (label, fix, push, no bot retriage)\nand protects against the bot looping on its own label updates.","ref":"triagebot_runner.html"},{"type":"function","title":"triagebot_runner.dispatch/2","doc":"","ref":"triagebot_runner.html#dispatch/2"},{"type":"function","title":"triagebot_runner.run_triage/1","doc":"","ref":"triagebot_runner.html#run_triage/1"},{"type":"module","title":"triagebot_scoper","doc":"Second agent. Reads the issue + classifier output and assesses severity\nand scope.","ref":"triagebot_scoper.html"},{"type":"function","title":"triagebot_scoper.id/0","doc":"","ref":"triagebot_scoper.html#id/0"},{"type":"function","title":"triagebot_scoper.model/0","doc":"","ref":"triagebot_scoper.html#model/0"},{"type":"function","title":"triagebot_scoper.system_prompt/0","doc":"","ref":"triagebot_scoper.html#system_prompt/0"},{"type":"function","title":"triagebot_scoper.tools/0","doc":"","ref":"triagebot_scoper.html#tools/0"},{"type":"module","title":"triagebot_search_tool","doc":"gakudan tool that searches the configured GitHub repo for issues\nmatching a query, returning a short text summary the LLM can read.\n\nThe active GitHub source_ref is read from `triagebot_config`\n(persistent_term) because gakudan tools run inside a turn-worker\nprocess spawned by the run state machine, with no parameter for\nper-run context.","ref":"triagebot_search_tool.html"},{"type":"function","title":"triagebot_search_tool.run/1","doc":"","ref":"triagebot_search_tool.html#run/1"},{"type":"function","title":"triagebot_search_tool.spec/0","doc":"","ref":"triagebot_search_tool.html#spec/0"},{"type":"module","title":"triagebot_summariser","doc":"Fifth and final agent. Reads everything above and produces the comment\nthat gets posted to the issue.","ref":"triagebot_summariser.html"},{"type":"function","title":"triagebot_summariser.id/0","doc":"","ref":"triagebot_summariser.html#id/0"},{"type":"function","title":"triagebot_summariser.model/0","doc":"","ref":"triagebot_summariser.html#model/0"},{"type":"function","title":"triagebot_summariser.system_prompt/0","doc":"","ref":"triagebot_summariser.html#system_prompt/0"},{"type":"function","title":"triagebot_summariser.tools/0","doc":"","ref":"triagebot_summariser.html#tools/0"},{"type":"module","title":"triagebot_webhook_controller","doc":"Nova controller for GitHub webhook deliveries.\n\nReads the raw body (needed for HMAC), verifies the signature against the\nconfigured shared secret, parses the event, and hands off to\n`triagebot_runner` for async processing.\n\nReturns:\n- 202 Accepted on a verified, supported event.\n- 200 OK on a verified-but-unsupported event (we won't process it but\n GitHub shouldn't retry).\n- 401 Unauthorized if the signature doesn't match.\n- 400 Bad Request on malformed payloads.\n\nNova's `handle_status` does not accept a trailing `Req` in 3-tuple form;\nthat slot is `ExtraHeaders :: map()`. We use the bare `{status, Code}`\nform to let Nova render with its own Req.","ref":"triagebot_webhook_controller.html"},{"type":"function","title":"triagebot_webhook_controller.github_event/1","doc":"","ref":"triagebot_webhook_controller.html#github_event/1"}],"proglang":"erlang","content_type":"text/markdown","producer":{"name":"ex_doc","version":"0.39.1"}} \ No newline at end of file diff --git a/doc/dist/sidebar_items-463C534A.js b/doc/dist/sidebar_items-463C534A.js new file mode 100644 index 0000000..1fe4729 --- /dev/null +++ b/doc/dist/sidebar_items-463C534A.js @@ -0,0 +1 @@ +sidebarNodes={"modules":[{"id":"triagebot_classifier","deprecated":false,"group":"","title":"triagebot_classifier","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"model/0","deprecated":false,"title":"model()","anchor":"model/0"},{"id":"system_prompt/0","deprecated":false,"title":"system_prompt()","anchor":"system_prompt/0"},{"id":"tools/0","deprecated":false,"title":"tools()","anchor":"tools/0"}],"key":"functions"}]},{"id":"triagebot_config","deprecated":false,"group":"","title":"triagebot_config","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_model/0","deprecated":false,"title":"agent_model()","anchor":"agent_model/0"},{"id":"github_source/0","deprecated":false,"title":"github_source()","anchor":"github_source/0"},{"id":"llm_backend_spec/0","deprecated":false,"title":"llm_backend_spec()","anchor":"llm_backend_spec/0"},{"id":"metrics_port/0","deprecated":false,"title":"metrics_port()","anchor":"metrics_port/0"},{"id":"port/0","deprecated":false,"title":"port()","anchor":"port/0"},{"id":"refresh_repo_labels/0","deprecated":false,"title":"refresh_repo_labels()","anchor":"refresh_repo_labels/0"},{"id":"refresh_triage_policy/0","deprecated":false,"title":"refresh_triage_policy()","anchor":"refresh_triage_policy/0"},{"id":"repo_labels/0","deprecated":false,"title":"repo_labels()","anchor":"repo_labels/0"},{"id":"setup/0","deprecated":false,"title":"setup()","anchor":"setup/0"},{"id":"triage_policy/0","deprecated":false,"title":"triage_policy()","anchor":"triage_policy/0"},{"id":"webhook_secret/0","deprecated":false,"title":"webhook_secret()","anchor":"webhook_secret/0"}],"key":"functions"}]},{"id":"triagebot_context","deprecated":false,"group":"","title":"triagebot_context","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_input/1","deprecated":false,"title":"build_input(Ticket)","anchor":"build_input/1"},{"id":"format_ticket/1","deprecated":false,"title":"format_ticket(Ticket)","anchor":"format_ticket/1"},{"id":"render_label_inventory/1","deprecated":false,"title":"render_label_inventory/1","anchor":"render_label_inventory/1"},{"id":"render_repo_context/2","deprecated":false,"title":"render_repo_context(Policy, Labels)","anchor":"render_repo_context/2"}],"key":"functions"}]},{"id":"triagebot_dashboard_auth","deprecated":false,"group":"","title":"triagebot_dashboard_auth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check/1","deprecated":false,"title":"check(Req)","anchor":"check/1"}],"key":"functions"}]},{"id":"triagebot_dup_detector","deprecated":false,"group":"","title":"triagebot_dup_detector","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"model/0","deprecated":false,"title":"model()","anchor":"model/0"},{"id":"system_prompt/0","deprecated":false,"title":"system_prompt()","anchor":"system_prompt/0"},{"id":"tools/0","deprecated":false,"title":"tools()","anchor":"tools/0"}],"key":"functions"}]},{"id":"triagebot_label_proposer","deprecated":false,"group":"","title":"triagebot_label_proposer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"model/0","deprecated":false,"title":"model()","anchor":"model/0"},{"id":"system_prompt/0","deprecated":false,"title":"system_prompt()","anchor":"system_prompt/0"},{"id":"tools/0","deprecated":false,"title":"tools()","anchor":"tools/0"}],"key":"functions"}]},{"id":"triagebot_repo_context_tool","deprecated":false,"group":"","title":"triagebot_repo_context_tool","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run/1","anchor":"run/1"},{"id":"spec/0","deprecated":false,"title":"spec()","anchor":"spec/0"}],"key":"functions"}]},{"id":"triagebot_runner","deprecated":false,"group":"","title":"triagebot_runner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dispatch/2","deprecated":false,"title":"dispatch/2","anchor":"dispatch/2"},{"id":"run_triage/1","deprecated":false,"title":"run_triage(Ticket)","anchor":"run_triage/1"}],"key":"functions"}]},{"id":"triagebot_scoper","deprecated":false,"group":"","title":"triagebot_scoper","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"model/0","deprecated":false,"title":"model()","anchor":"model/0"},{"id":"system_prompt/0","deprecated":false,"title":"system_prompt()","anchor":"system_prompt/0"},{"id":"tools/0","deprecated":false,"title":"tools()","anchor":"tools/0"}],"key":"functions"}]},{"id":"triagebot_search_tool","deprecated":false,"group":"","title":"triagebot_search_tool","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run/1","anchor":"run/1"},{"id":"spec/0","deprecated":false,"title":"spec()","anchor":"spec/0"}],"key":"functions"}]},{"id":"triagebot_summariser","deprecated":false,"group":"","title":"triagebot_summariser","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"model/0","deprecated":false,"title":"model()","anchor":"model/0"},{"id":"system_prompt/0","deprecated":false,"title":"system_prompt()","anchor":"system_prompt/0"},{"id":"tools/0","deprecated":false,"title":"tools()","anchor":"tools/0"}],"key":"functions"}]},{"id":"triagebot_webhook_controller","deprecated":false,"group":"","title":"triagebot_webhook_controller","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"github_event/1","deprecated":false,"title":"github_event(Req)","anchor":"github_event/1"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"}]}],"tasks":[]} \ No newline at end of file diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..6ef8294 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,10 @@ + + + + + triagebot v0.1.13 — Documentation + + + + + diff --git a/doc/search.html b/doc/search.html new file mode 100644 index 0000000..ac999ce --- /dev/null +++ b/doc/search.html @@ -0,0 +1,139 @@ + + + + + + + + + + + + + Search — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + + + + +
+
+
+ + + diff --git a/doc/triagebot.epub b/doc/triagebot.epub new file mode 100644 index 0000000..6aa97af Binary files /dev/null and b/doc/triagebot.epub differ diff --git a/doc/triagebot_classifier.html b/doc/triagebot_classifier.html new file mode 100644 index 0000000..7935757 --- /dev/null +++ b/doc/triagebot_classifier.html @@ -0,0 +1,281 @@ + + + + + + + + + + + triagebot_classifier — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_classifier + (triagebot v0.1.13) + +

+ +
+ + +
+

First agent in the triage pipeline. Reads the issue body and emits a +classification line.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ id() + +
+ +
+ +
+
+ model() + +
+ +
+ +
+ + +
+ +
+
+ tools() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

id()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

model()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

system_prompt()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

tools()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_config.html b/doc/triagebot_config.html new file mode 100644 index 0000000..d4ebe83 --- /dev/null +++ b/doc/triagebot_config.html @@ -0,0 +1,560 @@ + + + + + + + + + + + triagebot_config — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_config + (triagebot v0.1.13) + +

+ +
+ + +
+

Runtime configuration for triagebot, sourced from env vars.

Reads everything from the environment at startup, stashes the resolved +GitHub source_ref in persistent_term so the search tool (which runs +inside a turn-worker process spawned by gakudan) can read it without a +GenServer round-trip.

Required env vars:

  • TRIAGEBOT_WEBHOOK_SECRET GitHub webhook shared secret (HMAC)
  • TRIAGEBOT_REPO_OWNER e.g. "Taure"
  • TRIAGEBOT_REPO_NAME e.g. "gakudan"

GitHub auth (one of):

  • TRIAGEBOT_GITHUB_TOKEN (PAT mode)
  • TRIAGEBOT_GITHUB_APP_ID + TRIAGEBOT_GITHUB_APP_PRIVATE_KEY_PEM
    • TRIAGEBOT_GITHUB_INSTALLATION_ID (App mode)

LLM backend (one of):

  • ANTHROPIC_API_KEY
  • GEMINI_API_KEY

Optional:

  • TRIAGEBOT_PORT Nova listen port (default 8080)
  • TRIAGEBOT_METRICS_PORT Prometheus /metrics port (default 9568,
                            set to "" to disable)
  • TRIAGEBOT_AGENT_MODEL Override per-agent model (default
                            claude-sonnet-4-6 for Anthropic,
    +                        gemini-2.5-flash for Gemini)
  • TRIAGEBOT_POLICY_PATH Filesystem path to a triage-policy file
                            read at startup and fed to every agent.
    +                        Defaults to the bundled priv/TRIAGE.md so
    +                        the policy ships with the release. Absent
    +                        file is fine - agents fall back to their
    +                        built-in defaults.
+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ port() + +
+ +
+ +
+ + +

Re-fetch the repo's labels from GitHub and update the cached value. +Useful from a remote shell when the repo's label taxonomy changes +between deploys.

+ +
+ +
+ + +

Re-fetch the triage-policy file from GitHub and update the cached value. +Useful from a remote shell when the policy changes between deploys.

+ +
+ +
+ + +

Return the configured repo's labels (as fetched at startup). Each +label is #{name, description, color}. Empty list if the fetch +failed - the agents fall back to their built-in vocabulary in that +case.

+ +
+ +
+
+ setup() + +
+ +
+ +
+ + +

Return the repo's triage-policy file contents (as fetched at startup), +or an empty binary if no policy file was found. The policy is fed to +every triage agent via the run input.

+ +
+ +
+ + +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

agent_model()

+ + +
+
+ +
+ +
+ +
-spec agent_model() -> binary().
+ +
+ + +
+
+
+ +
+ + + +
+

github_source()

+ + +
+
+ +
+ +
+ +
-spec github_source() -> map().
+ +
+ + +
+
+
+ +
+ + + +
+

llm_backend_spec()

+ + +
+
+ +
+ +
+ +
-spec llm_backend_spec() -> {module(), map()}.
+ +
+ + +
+
+
+ +
+ + + +
+

metrics_port()

+ + +
+
+ +
+ +
+ +
-spec metrics_port() -> inet:port_number() | undefined.
+ +
+ + +
+
+
+ +
+ + + +
+

port()

+ + +
+
+ +
+ +
+ +
-spec port() -> inet:port_number().
+ +
+ + +
+
+
+ +
+ + + +
+

refresh_repo_labels()

+ + +
+
+ +
+ +
+ +
-spec refresh_repo_labels() -> ok | {error, term()}.
+ +
+ +

Re-fetch the repo's labels from GitHub and update the cached value. +Useful from a remote shell when the repo's label taxonomy changes +between deploys.

+
+
+
+ +
+ + + +
+

refresh_triage_policy()

+ + +
+
+ +
+ +
+ +
-spec refresh_triage_policy() -> ok | {error, term()}.
+ +
+ +

Re-fetch the triage-policy file from GitHub and update the cached value. +Useful from a remote shell when the policy changes between deploys.

+
+
+
+ +
+ + + +
+

repo_labels()

+ + +
+
+ +
+ +
+ +
-spec repo_labels() -> [#{name := binary(), description := binary(), color := binary()}].
+ +
+ +

Return the configured repo's labels (as fetched at startup). Each +label is #{name, description, color}. Empty list if the fetch +failed - the agents fall back to their built-in vocabulary in that +case.

+
+
+
+ +
+ + + +
+

setup()

+ + +
+
+ +
+ +
+ +
-spec setup() -> ok.
+ +
+ + +
+
+
+ +
+ + + +
+

triage_policy()

+ + +
+
+ +
+ +
+ +
-spec triage_policy() -> binary().
+ +
+ +

Return the repo's triage-policy file contents (as fetched at startup), +or an empty binary if no policy file was found. The policy is fed to +every triage agent via the run input.

+
+
+
+ +
+ + + +
+

webhook_secret()

+ + +
+
+ +
+ +
+ +
-spec webhook_secret() -> binary().
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_context.html b/doc/triagebot_context.html new file mode 100644 index 0000000..5c070d2 --- /dev/null +++ b/doc/triagebot_context.html @@ -0,0 +1,304 @@ + + + + + + + + + + + triagebot_context — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_context + (triagebot v0.1.13) + +

+ +
+ + +
+

Builds the run input sent to the gakudan triage pipeline.

The input is a single message every agent reads: a shared +repository-context preamble (the triage policy + the repo's label +taxonomy) followed by the issue itself, enriched with the high-signal +fields GitHub puts in the raw issue payload - contributor association, +reactions, comment count, milestone, and assignees.

Keeping the policy and label vocabulary here, in the shared input, means +they live in one place rather than being duplicated across every agent's +system prompt.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+ + +
+ +
+ + +
+ + + + + +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

build_input(Ticket)

+ + +
+
+ +
+ +
+ +
-spec build_input(gakudan_tickets:ticket()) -> binary().
+ +
+ + +
+
+
+ +
+ + + +
+

format_ticket(Ticket)

+ + +
+
+ +
+ +
+ +
-spec format_ticket(gakudan_tickets:ticket()) -> binary().
+ +
+ + +
+
+
+ +
+ + + +
+

render_label_inventory/1

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

render_repo_context(Policy, Labels)

+ + +
+
+ +
+ +
+ +
-spec render_repo_context(binary(), [map()]) -> binary().
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_dashboard_auth.html b/doc/triagebot_dashboard_auth.html new file mode 100644 index 0000000..5aa939f --- /dev/null +++ b/doc/triagebot_dashboard_auth.html @@ -0,0 +1,210 @@ + + + + + + + + + + + triagebot_dashboard_auth — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_dashboard_auth + (triagebot v0.1.13) + +

+ +
+ + +
+

HTTP Basic auth gate for the triagebot live dashboard.

Credentials come from TRIAGEBOT_DASHBOARD_USER / TRIAGEBOT_DASHBOARD_PASSWORD.

Closed by default: if either is unset the dashboard denies everything (503), so +it is never accidentally exposed. The username and password are compared in +constant time. Gates both the view routes and the HITL controls.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ check(Req) + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

check(Req)

+ + +
+
+ +
+ +
+ +
-spec check(cowboy_req:req()) -> {true, map()} | {false, 401 | 503, map(), binary()}.
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_dup_detector.html b/doc/triagebot_dup_detector.html new file mode 100644 index 0000000..c054806 --- /dev/null +++ b/doc/triagebot_dup_detector.html @@ -0,0 +1,281 @@ + + + + + + + + + + + triagebot_dup_detector — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_dup_detector + (triagebot v0.1.13) + +

+ +
+ + +
+

Third agent. Uses the search_issues tool to look for likely duplicates +of the current issue.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ id() + +
+ +
+ +
+
+ model() + +
+ +
+ +
+ + +
+ +
+
+ tools() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

id()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

model()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

system_prompt()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

tools()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_label_proposer.html b/doc/triagebot_label_proposer.html new file mode 100644 index 0000000..ae801fd --- /dev/null +++ b/doc/triagebot_label_proposer.html @@ -0,0 +1,282 @@ + + + + + + + + + + + triagebot_label_proposer — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_label_proposer + (triagebot v0.1.13) + +

+ +
+ + +
+

Fourth agent. Reads the issue + all prior triage turns and proposes a +set of labels, drawn from the repo's label taxonomy in the shared +repository triage context.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ id() + +
+ +
+ +
+
+ model() + +
+ +
+ +
+ + +
+ +
+
+ tools() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

id()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

model()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

system_prompt()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

tools()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_repo_context_tool.html b/doc/triagebot_repo_context_tool.html new file mode 100644 index 0000000..548718a --- /dev/null +++ b/doc/triagebot_repo_context_tool.html @@ -0,0 +1,234 @@ + + + + + + + + + + + triagebot_repo_context_tool — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_repo_context_tool + (triagebot v0.1.13) + +

+ +
+ + +
+

gakudan tool that fetches a file from the configured GitHub repo, +giving the triage agents a way to ground themselves in repo-specific +context (CLAUDE.md, README.md, CONTRIBUTING.md, the file an +issue links to, etc.).

The active GitHub source_ref is read from triagebot_config +(persistent_term) because tools run inside a turn-worker process with +no parameter for per-run context.

File contents are truncated to ?MAX_BYTES to keep prompt size +bounded; the LLM sees a clear suffix when truncation happened.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ run/1 + +
+ +
+ +
+
+ spec() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

run/1

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

spec()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_runner.html b/doc/triagebot_runner.html new file mode 100644 index 0000000..01142b6 --- /dev/null +++ b/doc/triagebot_runner.html @@ -0,0 +1,246 @@ + + + + + + + + + + + triagebot_runner — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_runner + (triagebot v0.1.13) + +

+ +
+ + +
+

Bridges a verified webhook event to a gakudan triage run.

dispatch/2 is invoked from the webhook controller. It spawns a +detached Erlang process so the controller can return 202 immediately +while the LLM-bound work continues in the background.

Only issue_opened and issue_labeled events are processed. Other +events (closed, edited, etc.) are ignored at the runner level to keep +LLM cost predictable and avoid re-triaging on every edit.

If the issue already carries the triaged label, we skip - this gives +human maintainers a manual override (label, fix, push, no bot retriage) +and protects against the bot looping on its own label updates.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ dispatch/2 + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

dispatch/2

+ + +
+
+ +
+ +
+ +
-spec dispatch(atom(), gakudan_tickets:ticket()) -> ok.
+ +
+ + +
+
+
+ +
+ + + +
+

run_triage(Ticket)

+ + +
+
+ +
+ +
+ +
-spec run_triage(gakudan_tickets:ticket()) -> ok.
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_scoper.html b/doc/triagebot_scoper.html new file mode 100644 index 0000000..0ca6c72 --- /dev/null +++ b/doc/triagebot_scoper.html @@ -0,0 +1,281 @@ + + + + + + + + + + + triagebot_scoper — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_scoper + (triagebot v0.1.13) + +

+ +
+ + +
+

Second agent. Reads the issue + classifier output and assesses severity +and scope.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ id() + +
+ +
+ +
+
+ model() + +
+ +
+ +
+ + +
+ +
+
+ tools() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

id()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

model()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

system_prompt()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

tools()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_search_tool.html b/doc/triagebot_search_tool.html new file mode 100644 index 0000000..55400fe --- /dev/null +++ b/doc/triagebot_search_tool.html @@ -0,0 +1,232 @@ + + + + + + + + + + + triagebot_search_tool — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_search_tool + (triagebot v0.1.13) + +

+ +
+ + +
+

gakudan tool that searches the configured GitHub repo for issues +matching a query, returning a short text summary the LLM can read.

The active GitHub source_ref is read from triagebot_config +(persistent_term) because gakudan tools run inside a turn-worker +process spawned by the run state machine, with no parameter for +per-run context.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ run/1 + +
+ +
+ +
+
+ spec() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

run/1

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

spec()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_summariser.html b/doc/triagebot_summariser.html new file mode 100644 index 0000000..4cbabd4 --- /dev/null +++ b/doc/triagebot_summariser.html @@ -0,0 +1,281 @@ + + + + + + + + + + + triagebot_summariser — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_summariser + (triagebot v0.1.13) + +

+ +
+ + +
+

Fifth and final agent. Reads everything above and produces the comment +that gets posted to the issue.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+
+ id() + +
+ +
+ +
+
+ model() + +
+ +
+ +
+ + +
+ +
+
+ tools() + +
+ +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

id()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

model()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

system_prompt()

+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+

tools()

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/doc/triagebot_webhook_controller.html b/doc/triagebot_webhook_controller.html new file mode 100644 index 0000000..bb2f017 --- /dev/null +++ b/doc/triagebot_webhook_controller.html @@ -0,0 +1,207 @@ + + + + + + + + + + + triagebot_webhook_controller — triagebot v0.1.13 + + + + + + + + + + + +
+ + + + + + + +
+
+ + +
+
+

+ triagebot_webhook_controller + (triagebot v0.1.13) + +

+ +
+ + +
+

Nova controller for GitHub webhook deliveries.

Reads the raw body (needed for HMAC), verifies the signature against the +configured shared secret, parses the event, and hands off to +triagebot_runner for async processing.

Returns:

  • 202 Accepted on a verified, supported event.
  • 200 OK on a verified-but-unsupported event (we won't process it but +GitHub shouldn't retry).
  • 401 Unauthorized if the signature doesn't match.
  • 400 Bad Request on malformed payloads.

Nova's handle_status does not accept a trailing Req in 3-tuple form; +that slot is ExtraHeaders :: map(). We use the bare {status, Code} +form to let Nova render with its own Req.

+
+ +
+ +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+ + +
+ +
+ +
+ + +
+

+ + + + Functions +

+ +
+
+ +
+ + + +
+

github_event(Req)

+ + +
+
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + diff --git a/priv/TRIAGE.md b/priv/TRIAGE.md new file mode 100644 index 0000000..252e68f --- /dev/null +++ b/priv/TRIAGE.md @@ -0,0 +1,69 @@ +# Triage policy - gakudan + +This file ships in triagebot's release (`priv/TRIAGE.md`) and is fed to +every triage agent as authoritative context. It is tuned for +[Taure/gakudan](https://github.com/Taure/gakudan): multi-agent +collaboration primitives for the BEAM (Erlang/OTP, single-node). + +Edit it to change how the bot triages, then redeploy (or call +`triagebot_config:refresh_triage_policy/0` from a remote shell). Agents +follow this policy wherever it conflicts with their built-in defaults. + +## Classification + +- `bug`: behaviour contrary to documented intent (a crash, a wrong + result, a leak, a supervision-tree fault). +- `feature`: a net-new primitive, behaviour, LLM/MCP backend, or API. +- `docs`: documentation, README, or ADR text only - no code behaviour + change. +- `question`: a usage question with a concrete answer. +- `discussion`: open-ended design conversation with no single clear ask. +- `duplicate-suspect`: strongly resembles an existing issue. + +## Severity + +- `blocker`: crash, data loss, security, or a broken public behaviour + contract (a `gakudan_agent`/`router`/`tool`/`llm`/`checkpointer` + callback, telemetry event, or the MCP wire format - all semver-locked). +- `major`: breaks core orchestration (run lifecycle, fanout, resume, + streaming) or affects many consumers. +- `minor`: small impact, easy to work around. +- `cosmetic`: typos, formatting, log wording. + +Treat anything mentioning credentials, API keys, prompt-injection, or +data leakage as at least `major` and label it `security`. + +## Scope + +- `self-contained`: one module or one obvious function. +- `cross-cutting`: changes a public behaviour callback (ripples through + every implementer), a telemetry event (requires a `gakudan_metrics` + lockstep update), or the MCP/stream message shapes. These are + semver-relevant and usually need an ADR (`docs/adr/`, Nygard format). +- `unclear`: not enough information to tell. + +## Labels + +- `needs-info`: the body lacks a reproducer, OTP version, or enough + detail to act on. Prefer this over guessing. +- `good-first-issue`: `self-contained` + `minor` + well-described. +- `claude-try`: apply only when the issue is `bug` + (`minor` or + `major`) + `self-contained` AND has a clear reproducer. This is the + signal for the claude-code-action workflow to attempt an auto-fix. + Do NOT apply it to anything touching a public behaviour, telemetry, + the MCP wire format, or anything that needs an ADR first. + +## Scope guardrails (out of scope by design) + +gakudan is **single-node by design**. Requests for multi-node +distribution, clustering, or distributed-Erlang fanout are out of scope: +classify as `discussion`, keep severity at most `minor`, and say so +plainly rather than proposing an implementation. + +## Contributor signal + +First-time contributors (`FIRST_TIME_CONTRIBUTOR`) get a friendlier tone +and an explicit pointer to what extra detail would help (a reproducer, +the OTP version, the backend in use). Issues filed by maintainers +(`MEMBER`, `OWNER`) usually already carry intentional labels - respect +them. diff --git a/src/agents/triagebot_classifier.erl b/src/agents/triagebot_classifier.erl index e496918..03d9d3b 100644 --- a/src/agents/triagebot_classifier.erl +++ b/src/agents/triagebot_classifier.erl @@ -13,8 +13,10 @@ id() -> classifier. system_prompt() -> ~""" You are the classifier in a GitHub issue triage pipeline. Read the - issue above (title, body, existing labels) and produce a single - structured response. + issue above (title, body, existing labels, contributor association) + and produce a single structured response. A repository triage + context precedes the issue - follow its triage policy where it + defines what the categories mean for this project. Before you classify, ground yourself in the repo: if you are not sure what the project is or what kinds of issues are in-scope, call diff --git a/src/agents/triagebot_label_proposer.erl b/src/agents/triagebot_label_proposer.erl index 237d618..743410c 100644 --- a/src/agents/triagebot_label_proposer.erl +++ b/src/agents/triagebot_label_proposer.erl @@ -1,7 +1,8 @@ -module(triagebot_label_proposer). -moduledoc """ Fourth agent. Reads the issue + all prior triage turns and proposes a -set of labels. +set of labels, drawn from the repo's label taxonomy in the shared +repository triage context. """. -behaviour(gakudan_agent). @@ -11,64 +12,34 @@ set of labels. id() -> label_proposer. system_prompt() -> - iolist_to_binary([ - ~""" - You are the label proposer. The previous turns classified the - issue, scoped its severity, and checked for duplicates. Now - propose labels for the maintainers to apply. - - Output exactly ONE line: + ~""" + You are the label proposer. The previous turns classified the + issue, scoped its severity, and checked for duplicates. Now propose + labels for the maintainers to apply. - Labels: