@snagset/server 0.1.16 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +9 -10
- package/dist/app.js +51 -47
- package/dist/app.js.map +1 -1
- package/dist/bin.js +31 -32
- package/dist/bin.js.map +1 -1
- package/dist/boot.js +21 -21
- package/dist/boot.js.map +1 -1
- package/dist/config.generated.js +5 -8
- package/dist/config.generated.js.map +1 -1
- package/dist/config.js +14 -14
- package/dist/config.js.map +1 -1
- package/dist/crypto.js +1 -1
- package/dist/crypto.js.map +1 -1
- package/dist/db/connect.js +1 -1
- package/dist/db/migrate.js +11 -11
- package/dist/db/rls.js +3 -3
- package/dist/db/rls.js.map +1 -1
- package/dist/domain.js +73 -5
- package/dist/domain.js.map +1 -1
- package/dist/explain.js +1 -1
- package/dist/instance/address.js +3 -3
- package/dist/instance/address.js.map +1 -1
- package/dist/instance/settings.js +1 -1
- package/dist/integrations/github.js +3 -3
- package/dist/integrations/github.js.map +1 -1
- package/dist/integrations/inbound.js +3 -3
- package/dist/integrations/inbound.js.map +1 -1
- package/dist/integrations/linear.js +1 -1
- package/dist/integrations/linear.js.map +1 -1
- package/dist/integrations/outbox.js +4 -4
- package/dist/integrations/outbox.js.map +1 -1
- package/dist/integrations/slack.js +2 -2
- package/dist/integrations/slack.js.map +1 -1
- package/dist/jobs/index.js +3 -3
- package/dist/jobs/reaper.js +11 -11
- package/dist/jobs/reaper.js.map +1 -1
- package/dist/jobs/set.js +3 -3
- package/dist/jobs/set.js.map +1 -1
- package/dist/jobs/soon.js +3 -3
- package/dist/keys.js +3 -3
- package/dist/keys.js.map +1 -1
- package/dist/listen.js +3 -3
- package/dist/listen.js.map +1 -1
- package/dist/mail/assigned.js +10 -10
- package/dist/mail/assigned.js.map +1 -1
- package/dist/mail/digest.js +3 -3
- package/dist/mail/digest.js.map +1 -1
- package/dist/mail/index.js +2 -2
- package/dist/mail/links.js +5 -5
- package/dist/mail/mailer.js +2 -2
- package/dist/mail/notify.js +22 -22
- package/dist/mail/notify.js.map +1 -1
- package/dist/mail/resend.js +1 -1
- package/dist/mail/resolve.js +1 -1
- package/dist/mail/resolve.js.map +1 -1
- package/dist/mail/smtp.js +1 -1
- package/dist/mail/unsubscribe.js +1 -1
- package/dist/net/publicFetch.js +1 -1
- package/dist/orgs.js +5 -5
- package/dist/orgs.js.map +1 -1
- package/dist/plan.js +1 -1
- package/dist/projects.js +4 -4
- package/dist/projects.js.map +1 -1
- package/dist/routes/account.js +1 -1
- package/dist/routes/account.js.map +1 -1
- package/dist/routes/activity.js +1 -1
- package/dist/routes/anchorReports.js +9 -9
- package/dist/routes/anchorReports.js.map +1 -1
- package/dist/routes/assignees.js +4 -4
- package/dist/routes/assignees.js.map +1 -1
- package/dist/routes/attachments.js +6 -6
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/auth.js +4 -4
- package/dist/routes/bodyLimit.js +5 -5
- package/dist/routes/bodyLimit.js.map +1 -1
- package/dist/routes/commentEdit.js +5 -5
- package/dist/routes/commentEdit.js.map +1 -1
- package/dist/routes/comments.js +24 -24
- package/dist/routes/comments.js.map +1 -1
- package/dist/routes/cors.js +33 -15
- package/dist/routes/cors.js.map +1 -1
- package/dist/routes/instance.js +3 -3
- package/dist/routes/instance.js.map +1 -1
- package/dist/routes/integrations.js +14 -11
- package/dist/routes/integrations.js.map +1 -1
- package/dist/routes/invites.js +7 -7
- package/dist/routes/invites.js.map +1 -1
- package/dist/routes/mcpAuth.js +13 -13
- package/dist/routes/mcpAuth.js.map +1 -1
- package/dist/routes/mcpToken.js +4 -4
- package/dist/routes/mcpToken.js.map +1 -1
- package/dist/routes/mcpTokens.js +27 -14
- package/dist/routes/mcpTokens.js.map +1 -1
- package/dist/routes/members.js +9 -5
- package/dist/routes/members.js.map +1 -1
- package/dist/routes/owner.js +13 -13
- package/dist/routes/owner.js.map +1 -1
- package/dist/routes/reviewLinks.js +4 -4
- package/dist/routes/reviewLinks.js.map +1 -1
- package/dist/routes/rounds.js +3 -3
- package/dist/routes/rounds.js.map +1 -1
- package/dist/routes/sessions.js +186 -71
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/sites.js +9 -9
- package/dist/routes/sites.js.map +1 -1
- package/dist/routes/threads.js +95 -95
- package/dist/routes/threads.js.map +1 -1
- package/dist/routes/widget.js +5 -5
- package/dist/routes/widget.js.map +1 -1
- package/dist/serverless.js +4 -4
- package/dist/serverless.js.map +1 -1
- package/dist/session.js +8 -8
- package/dist/session.js.map +1 -1
- package/dist/storage/bucket.js +4 -4
- package/dist/storage/bucket.js.map +1 -1
- package/dist/storage/settings.js +4 -4
- package/dist/storage/settings.js.map +1 -1
- package/dist/studioReviewers.js +4 -4
- package/dist/vendor/adapters/outbound/fence.js +2 -2
- package/dist/vendor/adapters/outbound/sanitise.js +14 -14
- package/dist/vendor/mcp/bin.js +4 -4
- package/dist/vendor/mcp/client.js +3 -3
- package/dist/vendor/mcp/server.js +3 -3
- package/dist/vendor/mcp/source.js +13 -13
- package/dist/vendor/mcp/view.js +15 -15
- package/dist/vendor/types/brief.js +2 -2
- package/dist/vendor/types/index.js +1 -1
- package/dist/vendor/types/names.js +20 -18
- package/dist/vendor/widget/object.js +3 -3
- package/dist/vendor/widget/predicates.js +38 -39
- package/package.json +1 -5
- package/static/dashboard/assets/{CompositeItem-DP7FLsIz.js → CompositeItem-D1SCvKo_.js} +1 -1
- package/static/dashboard/assets/{ConfirmDialog-B-mNmk6U.js → ConfirmDialog-DdUOWt96.js} +1 -1
- package/static/dashboard/assets/{CopyButton-bsaLPvqU.js → CopyButton-DX7vax3M.js} +1 -1
- package/static/dashboard/assets/{FieldItemContext-Cz9anwiZ.js → FieldItemContext-CMpCHNX8.js} +1 -1
- package/static/dashboard/assets/{InstallTag-DDMHFPFi.js → InstallTag-DkYPsEI0.js} +1 -1
- package/static/dashboard/assets/{SaveState-rgq6rRHH.js → SaveState-D0Hl8cny.js} +1 -1
- package/static/dashboard/assets/{_app-C5aeP_jI.js → _app-CcUZ9WT2.js} +1 -1
- package/static/dashboard/assets/{_app-B--Q2p1D.js → _app-CnG-wKIX.js} +1 -1
- package/static/dashboard/assets/{activity-CmpMwfWp.js → activity-DnvsedIb.js} +1 -1
- package/static/dashboard/assets/{arrow-left-BN3lUG8m.js → arrow-left-4jbTF1bA.js} +1 -1
- package/static/dashboard/assets/{avatar-4OkpxHzf.js → avatar-BKSc7tnv.js} +1 -1
- package/static/dashboard/assets/{badge-BGUQxxes.js → badge-aWVtPffe.js} +1 -1
- package/static/dashboard/assets/{card-BX32udhB.js → card-Bz0VdsxC.js} +1 -1
- package/static/dashboard/assets/{check-DjkY9Lhe.js → check-Ti2IOlgc.js} +1 -1
- package/static/dashboard/assets/{chevron-right-w26JMtvi.js → chevron-right-g-zbIopD.js} +1 -1
- package/static/dashboard/assets/{copy-BtOpNPn3.js → copy-BwBuD0FO.js} +1 -1
- package/static/dashboard/assets/{dialog-Ca351GqX.js → dialog-DdpHZobU.js} +1 -1
- package/static/dashboard/assets/{dropdown-menu-BdM8D0_i.js → dropdown-menu-CB2L3nig.js} +1 -1
- package/static/dashboard/assets/{image-off-DBc5pfc8.js → image-off-w_ej9pIJ.js} +1 -1
- package/static/dashboard/assets/{index-Bvmz5Xph.js → index-DtF8YHqn.js} +3 -3
- package/static/dashboard/assets/{invite-b1vVPR4n.js → invite-Dy3iQjzf.js} +1 -1
- package/static/dashboard/assets/{label-CeHVAC98.js → label-Dj8L94iS.js} +1 -1
- package/static/dashboard/assets/{layout-grid-BJUJgcuD.js → layout-grid-DuweH0Vl.js} +1 -1
- package/static/dashboard/assets/me-7-r9OeMR.js +1 -0
- package/static/dashboard/assets/{parts-BU_5BLga.js → parts-CA4cbfy3.js} +1 -1
- package/static/dashboard/assets/{plus-DW3meZh8.js → plus-CEWgXDLj.js} +1 -1
- package/static/dashboard/assets/s._site-D69M50OI.js +1 -0
- package/static/dashboard/assets/{s._site.comments-CyIqVrl3.js → s._site.comments-DNJ2SE5c.js} +1 -1
- package/static/dashboard/assets/{s._site.reviewers-muaVzTtT.js → s._site.reviewers-B07NzSWj.js} +1 -1
- package/static/dashboard/assets/{s._site.settings-Bow6VdXW.js → s._site.settings-B577G5iG.js} +1 -1
- package/static/dashboard/assets/{setup-B5fdtoM-.js → setup-DcjjtB3g.js} +1 -1
- package/static/dashboard/assets/{sign-in-D9Bhw619.js → sign-in-gfvOs6Jw.js} +1 -1
- package/static/dashboard/assets/{sign-up-CK-LWLzn.js → sign-up-CFJt7ibH.js} +1 -1
- package/static/dashboard/assets/{sites-CLB6RzU6.js → sites-DbB5cjz5.js} +1 -1
- package/static/dashboard/assets/studio-BO-MHFqc.js +1 -0
- package/static/dashboard/assets/{studio-CVFUbJQb.js → studio-D9GxJaSF.js} +1 -1
- package/static/dashboard/assets/{studio.index-CUtMjh5_.js → studio.index-DktAxIPT.js} +1 -1
- package/static/dashboard/assets/studio.integrations-CbLyqPLX.js +1 -0
- package/static/dashboard/assets/{studio.members-BcVrAT7r.js → studio.members-DFtIL3JS.js} +1 -1
- package/static/dashboard/assets/{sun-BzCBfLxA.js → sun-Bg7U-6Y0.js} +1 -1
- package/static/dashboard/assets/{switch-Djsy8JA6.js → switch-CTN6hIca.js} +1 -1
- package/static/dashboard/assets/{table-Cnpowiv-.js → table-zQ3pj50_.js} +1 -1
- package/static/dashboard/assets/{useAriaLabelledBy-D35XdVIh.js → useAriaLabelledBy-BsNncGbx.js} +1 -1
- package/static/dashboard/assets/{useBaseQuery-DztMyAqa.js → useBaseQuery-DSqwWD_O.js} +1 -1
- package/static/dashboard/assets/useQuery-OgrKuHbc.js +1 -0
- package/static/dashboard/assets/useRender-DOFVvGfR.js +1 -0
- package/static/dashboard/assets/{useValueChanged-DY7n1sYE.js → useValueChanged-B9k7l-mp.js} +1 -1
- package/static/dashboard/assets/{users-CR2o4PsB.js → users-CRiOyD0f.js} +1 -1
- package/static/dashboard/assets/{welcome-DJ_8xHTE.js → welcome-DT2DB4jN.js} +1 -1
- package/static/dashboard/assets/{widget-signin-BOulktuR.js → widget-signin-CC9owVvs.js} +1 -1
- package/static/dashboard/assets/{you-DJGezimL.js → you-CtcXklc_.js} +1 -1
- package/static/dashboard/assets/{zod-4RphBaVj.js → zod-CLxHj89d.js} +1 -1
- package/static/dashboard/index.html +1 -1
- package/static/widget/snag.capture.js +1 -1
- package/static/widget/snag.runtime.js +2 -2
- package/static/dashboard/assets/me-zNn3-t75.js +0 -1
- package/static/dashboard/assets/s._site-DP3hLlXp.js +0 -1
- package/static/dashboard/assets/studio-CuiXjnSt.js +0 -1
- package/static/dashboard/assets/studio.integrations-CiQ83f7Q.js +0 -1
- package/static/dashboard/assets/useQuery-DCEPkmeo.js +0 -1
- package/static/dashboard/assets/useRender-C2NyqaXd.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
2
|
-
`),Bo=` :host{all:initial}[hidden]{display:none!important}:host{display:block;font:400 14px/1.45 ${k.font};color:${k.fg};${P.font}:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;${P.accent}:#2a51b8;${P.bg}:#fefdfc;${P.fg}:#181716;${P.muted}:#666564;${P.border}:#e4e3e0;${P.radius}:8px;${P.shadow}:0 6px 24px -4px rgb(0 0 0 / .18);${P.z}:2147483647;${P.motion}:160ms;${P.surface}:color-mix(in srgb,${k.fg} 6%,${k.bg});${P.sunken}:color-mix(in srgb,${k.fg} 3%,${k.bg});${P.hover}:color-mix(in srgb,${k.fg} 8%,${k.bg});${P.onAccent}:#fff;${P.focus}:color-mix(in srgb,${k.accent} 62%,${k.fg});${P.disabled}:color-mix(in srgb,${k.muted} 52%,${k.bg});${Fo} ${P.anchorOrphan}:#DC2626;}:host([${mn}="dark"]){${P.accent}:#8aafff;${P.onAccent}:#1d1c1a;${P.bg}:#1d1c1a;${P.fg}:#f0eeec;${P.muted}:#9a9997;${P.border}:#2d2c2b;${P.shadow}:0 6px 24px -4px rgb(0 0 0 / .6);}@media (prefers-reduced-motion:reduce){:host{${P.motion}:0ms}}@media (forced-colors:active){:host{${P.bg}:Canvas;${P.fg}:CanvasText;${P.muted}:CanvasText;${P.border}:CanvasText;${P.accent}:Highlight;${P.onAccent}:HighlightText;${P.surface}:Canvas;${P.sunken}:Canvas;${P.hover}:Canvas;${P.focus}:Highlight;${P.disabled}:GrayText;${P.shadow}:none;${P.anchorOrphan}:CanvasText;}.snag-pin{border-color:CanvasText!important;color:CanvasText!important;forced-color-adjust:none}}`,Ve={shield:1,pins:3,dock:5,notice:6,toolbar:7},Tn=new WeakMap;function nt(e,t,n){let o=Tn.get(e);if(o||Tn.set(e,o=new Set),o.has(t))return;o.add(t);try{const u=new CSSStyleSheet;u.replaceSync(n),e.adoptedStyleSheets=[...e.adoptedStyleSheets,u];return}catch{}const c=(e.ownerDocument??document).createElement("style");c.setAttribute(`data-snag-${t}`,""),c.textContent=n,e.appendChild(c)}function Uo(e){return e==="light"||e==="dark"?e:"auto"}function jo(e,t){const n=mn;if(t!=="auto")return e.setAttribute(n,t),()=>e.removeAttribute(n);const o=e.ownerDocument?.defaultView?.matchMedia?.("(prefers-color-scheme: dark)");if(!o)return e.setAttribute(n,"light"),()=>e.removeAttribute(n);const r=()=>e.setAttribute(n,o.matches?"dark":"light");return r(),o.addEventListener("change",r),()=>{o.removeEventListener("change",r),e.removeAttribute(n)}}function Nt(e){return e.getBoundingClientRect()}function wt(e){if(e.closest('[inert],[aria-hidden="true"]'))return!1;const t=e.checkVisibility;if(typeof t=="function")return t.call(e,{contentVisibilityAuto:!0,opacityProperty:!1,visibilityProperty:!0});const n=Nt(e);if(!(n.width>0||n.height>0||e.getClientRects().length>0))return!1;const r=e.ownerDocument?.defaultView;return r?r.getComputedStyle(e).visibility!=="hidden":!0}const Zo="button,a[href],[role=button],[role=link],[role=tab],[role=menuitem],label,input,select,textarea,summary",Vo=3,Rn=8,Yo=new Set(["img","picture","canvas","video","audio","iframe","embed","object","svg","math","input","select","textarea","button","progress","meter"]);function Xo(e,t){return Yo.has(e.tagName.toLowerCase())?!1:t.getComputedStyle(e).display==="inline"}function _n(e){const t=e.ownerDocument?.defaultView;if(!t)return e;let n=e;for(let r=e;r;r=r.parentElement){const c=Nt(r);if(c.width>=Rn&&c.height>=Rn&&!Xo(r,t)){n=r;break}n=r}let o=0;for(let r=n;r&&o<=Vo;r=r.parentElement){if(r.matches(Zo))return r;o++}return n}const Ko=10,Ht=[["click",!1],["auxclick",!1],["dblclick",!1],["pointerdown",!1],["pointerup",!1],["mousedown",!1],["mouseup",!1],["contextmenu",!1],["dragstart",!1],["wheel",!1],["touchstart",!0],["touchmove",!0],["touchend",!0],["selectstart",!0],["keydown",!1],["keyup",!1]];function Jo(e,t,n){let o=e;for(;o&&o!==o.ownerDocument.documentElement&&o!==o.ownerDocument.body;){const r=getComputedStyle(o),c=(r.overflowY==="auto"||r.overflowY==="scroll")&&o.scrollHeight>o.clientHeight&&(t>0&&o.scrollTop+o.clientHeight<o.scrollHeight-1||t<0&&o.scrollTop>0),u=(r.overflowX==="auto"||r.overflowX==="scroll")&&o.scrollWidth>o.clientWidth&&(n>0&&o.scrollLeft+o.clientWidth<o.scrollWidth-1||n<0&&o.scrollLeft>0);if(c||u)return o;o=o.parentElement}return null}function In(e,t){const n=t==="y"?e.deltaY:e.deltaX;return e.deltaMode===1?n*16:e.deltaMode===2?n*(t==="y"?innerHeight:innerWidth):n}const qo=["position:fixed","inset:0",`z-index:${Ve.shield}`,"touch-action:pan-x pan-y pinch-zoom","background:transparent"].join(";");function Qo(e,t={}){const n=t.doc??e.ownerDocument??document,o=n.defaultView??window;let r=t.coarsePointer??o.matchMedia?.("(pointer: coarse)").matches??!1;const c=l=>{const _=l.pointerType,S=_==="touch"?!0:_==="mouse"||_==="pen"?!1:r;S!==r&&(r=S,d())},u=n.createElement("div");u.className="snag-shield",u.style.cssText=qo;let a="browse";const d=()=>{u.style.pointerEvents=r?"none":"auto",u.style.cursor="crosshair"};d();const y=l=>{const _=l;return!_||typeof _.closest!="function"?!1:e.contains(_)?!0:!!_.closest(`[${Mt("root")}]`)};function w(l,_,S){let I=S,M=0;for(;I.shadowRoot&&M++<Ko;){const N=T(I.shadowRoot,l,_);if(!N||N===I)break;I=N}return I}function T(l,_,S){const I=l.elementsFromPoint;if(typeof I=="function"){for(const N of I.call(l,_,S))if(N.getRootNode()===l)return N;return null}const M=l.elementFromPoint(_,S);return M&&M.getRootNode()===l?M:null}function m(l,_){const S=[];for(const I of n.elementsFromPoint(l,_)){if(y(I))continue;if(I===n.documentElement||I===n.body){S.push(I);continue}const M=w(l,_,I);S.push(y(M)?I:M)}return S}let f=null;const g=(l,_)=>{const[S]=m(l,_);S&&t.onPick?.(_n(S),{x:l,y:_})};let p=!1;const $=()=>{const l=n.getSelection?.();if(!l||l.isCollapsed||l.rangeCount===0||!l.toString().trim())return!1;const _=l.anchorNode;if(!_||e.contains(_))return!1;const S=_.nodeType===1?_:_.parentElement;return!y(S)},D=l=>{const _=l.composedPath()[0];if(_&&y(_)){p=!1;return}if(l.type==="selectstart"){t.onSelectStart?.();return}const S=l.type;if(S.endsWith("down")||S.endsWith("start")){p=!1;return}if(S.endsWith("up")||S.endsWith("end")){p=$();return}if(S==="click"||S==="auxclick"){if(!p)return;p=!1,l.preventDefault(),l.stopImmediatePropagation()}},O=l=>{if(l.type==="pointerdown"&&c(l),a==="comments"){D(l);return}if(a!=="add")return;if(l.type==="keydown"||l.type==="keyup"){Ee(l);return}const _=l.composedPath()[0];if(_&&_!==u&&y(_))return;const S=Ht.find(([I])=>I===l.type)?.[1]??!1;if(l.stopImmediatePropagation(),!S){if(r&&l.type==="pointerdown"){const I=l;f={x:I.clientX,y:I.clientY,t:performance.now()},pe(I.clientX,I.clientY)}if(r&&l.type==="pointerup"&&f){const I=l,M=f;f=null,Math.hypot(I.clientX-M.x,I.clientY-M.y)<=8&&performance.now()-M.t<=700&&g(I.clientX,I.clientY);return}if(l.type==="click"||l.type==="auxclick"||l.type==="dblclick"){l.preventDefault();const I=l;g(I.clientX,I.clientY);return}if(l.type==="wheel"){const I=l,M=In(I,"y"),N=In(I,"x"),[j]=m(I.clientX,I.clientY),G=Jo(j??null,M,N);G&&(G.scrollTop+=M,G.scrollLeft+=N,l.preventDefault());return}if(l.type==="dragstart"||l.type==="contextmenu"){l.preventDefault();return}(l.type==="pointerdown"||l.type==="mousedown")&&!r&&l.preventDefault()}},V=new Set(["Tab","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"," ","Spacebar","PageUp","PageDown","Home","End"]),re=/^[a-z0-9/?]$/;function Y(l){for(const _ of l.composedPath()){const S=_;if(!(!S||S.nodeType!==1||typeof S.matches!="function")&&S.matches('input:not([type=button]):not([type=submit]):not([type=checkbox]):not([type=radio]),textarea,select,[contenteditable=""],[contenteditable=true],[role=textbox],[role=searchbox],[role=combobox]'))return!0}return!1}function Ee(l){V.has(l.key)||l.metaKey||l.ctrlKey||l.altKey||/^F\d{1,2}$/.test(l.key)||l.key!=="Escape"&&l.key.length===1&&re.test(l.key.toLowerCase())&&!Y(l)&&(l.preventDefault(),l.stopImmediatePropagation())}for(const[l,_]of Ht)o.addEventListener(l,O,{capture:!0,passive:_});let ee=0,te=null;function Me(){if(ee=0,a!=="add"||!te)return;const[l]=m(te.x,te.y);t.onHover?.(l?_n(l):null)}function pe(l,_){a==="add"&&(te={x:l,y:_},!ee&&(ee=o.requestAnimationFrame(Me)))}return u.addEventListener("pointermove",l=>pe(l.clientX,l.clientY)),u.addEventListener("pointerleave",()=>{te=null,t.onHover?.(null)}),{shield:u,getMode:()=>a,setMode(l){a=l,p=!1,d(),l==="add"?e.appendChild(u):u.remove(),l!=="add"&&(te=null,t.onHover?.(null))},hitTest:m,destroy(){ee&&o.cancelAnimationFrame(ee);for(const[l]of Ht)o.removeEventListener(l,O,{capture:!0});u.remove()}}}const Go=/[\u200B-\u200D\u2060\uFEFF]/gu,er=/[\s\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+/gu,tr=[[/[\u2018\u2019\u201A\u201B]/gu,"'"],[/[\u201C\u201D\u201E\u201F]/gu,'"'],[/[\u2010-\u2015\u2212]/gu,"-"],[/\u2026/gu,"..."],[/\u2044/gu,"/"]];function nr(e){let t=e.normalize("NFC").replace(Go,"");for(const[n,o]of tr)t=t.replace(n,o);return t.replace(er," ").trim()}const or={testid:1,domid:1,css:.9,aria:.75,"text-exact":.8,"text-fuzzy":.78,"path-rect":.35,none:0,manual:1},Pn={anchored:.75,approximate:.35};function rr(e,t){const n=or[e];return t===1?n:n/(1+Math.log2(t))}function Mn(e){return e>=Pn.anchored?"anchored":e>=Pn.approximate?"approximate":"orphaned"}const sr=[_o("anchor"),"data-testid","data-test-id","data-test","data-cy","data-qa","data-pw","data-automation-id"],zn=e=>typeof CSS<"u"&&CSS.escape?CSS.escape(e):e.replace(/["\\]/g,"\\$&"),ar=[{strategy:"testid",applicable:e=>!!e.testid,find:(e,t)=>Wt(t,sr.map(n=>`[${n}="${zn(e.testid)}"]`).join(","))},{strategy:"domid",applicable:e=>!!e.domid,find:(e,t)=>Wt(t,`#${zn(e.domid)}`)},{strategy:"css",applicable:e=>!!e.css,find:(e,t)=>{try{return Wt(t,e.css)}catch{return[]}}}];function Wt(e,t){return[...e.querySelectorAll(t)].filter(ir)}function ir(e){return!e.closest(`[${Mt("root")}]`)}function cr(e,t){const n=t.text?.exact;if(!n)return!0;const o=nr(e.textContent??"");return o?o===n||o.includes(n)||n.includes(o):!0}function On(e,t,n,o){wt(e)||o.push("hidden"),t.hostPath?.length&&o.push("shadow-boundary");const r=!cr(e,t);r&&o.push("text-drift");let c=o.includes("hidden")?Math.min(n,.7):n;return r&&(c=Math.min(c,.5)),c}const lr={element:null,strategy:"none",score:0,state:"orphaned",reasons:["not-found"],candidates:0};function Ft(e,t=document,n={}){const o=[];for(const r of ar){if(!r.applicable(e))continue;const c=r.find(e,t);if(c.length===0)continue;const u=rr(r.strategy,c.length),a=c[0];c.length>1&&o.push("ambiguous");const d=On(a,e,u,o),y={element:a,strategy:r.strategy,score:d,state:Mn(d),reasons:o.length?o:["exact"],candidates:c.length};if(y.reasons.includes("text-drift")&&n.extended){const w=n.extended(e,t,{...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.passCaches?{caches:n.passCaches}:{}});if(w&&w.score>y.score)return w}return y}return n.extended?.(e,t,{...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.passCaches?{caches:n.passCaches}:{}})??lr}const dr={"toolbar.aria":"{product} review toolbar","toolbar.group":"What you see","toolbar.browse":"Browse","toolbar.comments":"Comment","toolbar.comments.unresolved":"Comment, {n} unresolved","toolbar.add":"Add a comment","toolbar.add.draft":"Add a comment \u2014 one is unfinished","toolbar.panel":"All comments","pin.aria":"Comment {key} on {target}. {status}, {replies} replies. Press Enter.","pin.aria.one":"Comment {key} on {target}. {status}, 1 reply. Press Enter.","pin.aria.none":"Comment {key} on {target}. {status}. Press Enter.","pin.aria.moved":"Comment {key} on {target}. {status}. {where}. Press Enter.","pin.target":"{role} \u201C{name}\u201D","cluster.aria":"{n} comments here: {list}","nav.announce":"Comment {n} on {label}, {i} of {total}","action.retry":"Retry","action.dismiss":"Dismiss","action.export":"Export","action.exportclear":"Export & clear","error.quota":"Storage is full \u2014 this {item} is on screen but not saved. Export to keep them.","error.nostorage":"Comments won't be saved in this browser. Export before you leave to keep them.","error.linkrevoked":"This review link was turned off. Ask whoever sent it for a new one.","error.sessionended":"This review session has ended. Open your review link again to carry on.","error.sendfailed":"That {item} couldn't be sent, so it wasn't kept. Check your connection and try again.","error.origin":"{product} is not enabled for {origin}. Add that address to the site's allowed origins.","error.panels":"{product} loaded, but its comment UI didn't. You can still see the comments on the page.","error.panels.add":"Adding comments is unavailable until the comment UI loads.","error.capture":"{product} can't take new comments \u2014 the part that records the page didn't load. Everything already here still works.","paused.dialog":"Review paused \u2014 a dialog is open on this page. Close it to carry on commenting. Commenting inside a native dialog isn't supported yet.","paused.close":"Close","announce.created":"Comment {key} added.","permalink.unknown":"That comment isn't on this page any more"},ur={...Sn,...dr},B=xn(ur);function fr(e,t){const n=new Array(e.length),o=[],r=new Map,c=[];let u=0;for(let a=0;a<e.length;a++){u++;const d=e[a],y=Math.floor(d.x/t),w=Math.floor(d.y/t);let T=-1;e:for(let m=-1;m<=1;m++)for(let f=-1;f<=1;f++)for(const g of r.get(`${y+m},${w+f}`)??[]){const p=c[g],$=d.x-p.x,D=d.y-p.y;if($*$+D*D<=t*t){T=g;break e}}if(T===-1){T=o.length,o.push([]),c.push(d);const m=`${y},${w}`,f=r.get(m);f?f.push(T):r.set(m,[T])}n[a]=T,o[T].push(a)}return{group:n,members:o,visits:u}}const hr=`position:absolute;top:0;left:0;width:0;height:0;pointer-events:none;z-index:${Ve.pins}`,pr=' .snag-pp{animation:snag-pp .5s ease-out 2}@keyframes snag-pp{50%{transform:scale(1.45)}}@media (prefers-reduced-motion: reduce){.snag-pp{animation:none}}.snag-pin{width:28px;height:28px;margin:-14px 0 0 -14px}.snag-pin::after{content:"";position:absolute;inset:-8px}@media (pointer:coarse){.snag-pin{width:34px;height:34px;margin:-17px 0 0 -17px}}',mr=`position:fixed;inset:0;width:0;height:0;pointer-events:none;z-index:${Ve.pins}`,ot=["position:absolute",`color:${k.onAccent}`,`font:600 12px/1 ${k.font}`,"display:flex","align-items:center","justify-content:center","box-shadow:0 1px 4px rgb(0 0 0 / .35)","pointer-events:auto","cursor:pointer","box-sizing:border-box"].join(";"),xt="border-radius:50% 50% 50% 2px",Ln=e=>k[`status${e[0].toUpperCase()}${e.slice(1)}`]??k.muted;function Dn(e,t){const n=$n(t.status),o=`background:${Ln(t.status)};color:${n}`,r="0 1px 4px rgb(0 0 0 / .35)";return e==="anchored"?`${ot};${xt};${o};border:2px solid ${n};box-shadow:${r}`:e==="approximate"?`${ot};${xt};${o};border:2px dashed ${n};box-shadow:${r}`:`${ot};${xt};${o};border:2px solid ${n};box-shadow:inset 0 0 0 2px ${n},${r}`}function gr(e,t){const n=[];let o="static",r=!1;for(let c=e;c&&c!==e.ownerDocument.documentElement;c=c.parentElement){const u=t.getComputedStyle(c),a=c!==e.ownerDocument.body&&/auto|scroll|hidden|overlay/.test(u.overflowY+u.overflowX);a&&!r&&n.push(c),u.position==="fixed"?(o="dynamic",r=!0):u.transform!=="none"||u.filter!=="none"||u.perspective!=="none"?(o="dynamic",r=!1):(u.position==="sticky"||u.willChange.includes("transform")||u.contain.includes("layout")||a&&(c.scrollHeight>c.clientHeight||c.scrollWidth>c.clientWidth))&&(o="dynamic")}return{tier:o,clips:n}}function yr(e,t,n,o){const r=e.ownerDocument??document,c=r.defaultView??window;nt(e,"pins",pr);const u=r.createElement("div");u.className="snag-pins",u.style.cssText=hr,e.appendChild(u);const a=r.createElement("div");a.className="snag-pins-dyn",a.style.cssText=mr,e.appendChild(a);let d=[],y=[];const w=new Map;let T=new Map,m=null;const f=new Map;let g=new Map;const p=c.matchMedia?.("(pointer: coarse)").matches??!1,$=p?32:24,D=p?34:28;let O=[],V=null,re=null,Y={x:0,y:0};function Ee(){const A=r.defaultView,E=u.getBoundingClientRect();Y={x:E.left+(A?.scrollX??0),y:E.top+(A?.scrollY??0)}}let ee=[];const te=new Map,Me=1e4,pe=5,l=new Map,_=new Set(["testid","domid"]);function S(A){const E=l.get(A.id),b=E?.ref.deref();if(!b||!b.isConnected)return null;if(_.has(E.strategy))return b;if(A.anchor.css)try{if(!b.matches(A.anchor.css))return null}catch{return null}return b}function I(A,E){const b=[],H=On(E,A.anchor,1,b);return{element:E,strategy:l.get(A.id).strategy,score:H,state:Mn(H),reasons:b.length?b:["exact"],candidates:1}}function M(A,E="authoritative"){w.clear(),ee=[];const b=Date.now(),H=n?.newPass?.();return A.map(v=>{const z=S(v),C=n?.get();let x=z?I(v,z):Ft(v.anchor,r,{viewportWidth:r.defaultView?.innerWidth??0,...C?{extended:C}:{},...H?{passCaches:H}:{}});if(z&&x.reasons.includes("text-drift")){const W=Ft(v.anchor,r,{viewportWidth:r.defaultView?.innerWidth??0,...C?{extended:C}:{},...H?{passCaches:H}:{}});W.score>x.score&&(x=W)}if(n&&(!x.element||x.reasons.includes("text-drift"))&&n.want(v.anchor),!x.element&&n){const W=n.fuzzyHit?.(v.id);W?x=W:n.wantFuzzy?.(v.id,v.anchor)}const ne=x.element&&v.anchor.text?.exact&&(x.reasons.includes("text-drift")||x.strategy==="path-rect"&&x.score<.5);if(n&&ne){const W=n.fuzzyHit?.(v.id);W&&W.score>x.score?x=W:W||n.wantFuzzy?.(v.id,v.anchor)}x.element?l.set(v.id,{ref:new WeakRef(x.element),strategy:x.strategy}):l.delete(v.id),x.element&&w.set(v.id,x.element);let X=!1;if(x.state==="orphaned"){const W=te.get(v.id)??{firstSeenAt:b,tries:0,best:x};W.tries++,x.score>=W.best.score&&(W.best=x),te.set(v.id,W);const K=n?.unavailable?.()??!1,J=K?2:pe,ce=b-W.firstSeenAt<Me;E==="optimistic"||ce&&(E==="navigating"||W.tries<J)?X=!0:(x=W.best,K&&!x.reasons.includes("budget-exceeded")&&(x={...x,reasons:[...x.reasons,"budget-exceeded"]}),te.delete(v.id))}else te.delete(v.id);X||ee.push({id:v.id,state:x.state,strategy:x.strategy,confidence:x.score});const L=x.element?Nt(x.element):void 0;if(L&&(L.width>0||L.height>0)){const W=r.defaultView;v.anchor.rect={x:L.left+(W?.scrollX??0),y:L.top+(W?.scrollY??0),w:L.width,h:L.height}}return{...v,anchorState:X?v.anchorState:x.state,anchorPending:X,anchorReasons:x.reasons}})}function N(){const A=r.documentElement;return{w:A.scrollWidth,h:A.scrollHeight}}function j(A,E,b){return{x:Math.min(Math.max(A,14),Math.max(b.w,28)-14),y:Math.min(Math.max(E,14),Math.max(b.h,28)-14)}}function G(A,E){Ee(),u.textContent="",a.textContent="",d=[],y=[],T=new Map,g=new Map,f.clear(),O=[],re=null,A.forEach((b,H)=>{const v=b.anchor.rect;if(!v)return;const z=b.anchor.offset??{fx:.5,fy:.5},C=r.createElement("div");C.className="snag-pin",C.setAttribute("data-state",b.anchorPending?"pending":b.anchorState),C.setAttribute("data-key",b.key),C.style.cssText=b.anchorPending?`${Dn("approximate",b)};opacity:.55`:Dn(b.anchorState,b);const x=w.get(b.id),{tier:ne,clips:X}=x?gr(x,c):{tier:"static",clips:[]};if(ne==="dynamic"&&x){const q=x.getBoundingClientRect(),me=Fe();C.style.left=`${q.left-me.left+q.width*z.fx}px`,C.style.top=`${q.top-me.top+q.height*z.fy}px`,f.set(C,{x:q.left+q.width*z.fx+c.scrollX-Y.x,y:q.top+q.height*z.fy+c.scrollY-Y.y});const Le={node:C,el:x,fx:z.fx,fy:z.fy,clips:X};d.push(Le),C.hidden=!wt(x),C.hidden||Be(Le,q,new Map(X.map(lt=>[lt,lt.getBoundingClientRect()])))}else{const q=j(v.x+v.w*z.fx-Y.x,v.y+v.h*z.fy-Y.y,N());C.style.left=`${q.x}px`,C.style.top=`${q.y}px`,f.set(C,q),x&&(y.push({node:C,el:x,fx:z.fx,fy:z.fy,clips:[]}),C.hidden=!wt(x))}C.textContent=String(H+1);const L=Wo(b),W=b.anchor.role?B("pin.target",{role:b.anchor.role,name:b.anchor.accessibleName??b.anchor.label}):b.anchor.label,K=b.comments.length-1,J=b.anchorState==="approximate"?`~ ${b.key}`:b.key;C.setAttribute("role","button"),C.setAttribute("tabindex","0");const ce=b.anchorState==="anchored"?B(K===0?"pin.aria.none":K===1?"pin.aria.one":"pin.aria",{key:J,target:W,status:En(b.status),replies:K}):B("pin.aria.moved",{key:J,target:W,status:En(b.status),where:L});C.title=ce,C.setAttribute("aria-label",ce),t&&xe(C,()=>t(b)),E?.has(b.id)&&(C.hidden=!0,C.setAttribute("data-fo","")),T.set(b.id,C),g.set(C,{snag:b,ordinal:H+1}),(ne==="dynamic"?a:u).appendChild(C)}),Ke(),m&&Ue(m),Oe(),ie="",ue(r.visibilityState==="visible"&&T.size>0)}const Fe=()=>a.getBoundingClientRect();let we=!1;function Be(A,E,b){for(const H of A.clips){const v=b.get(H);if(v&&(E.right<=v.left||E.left>=v.right||E.bottom<=v.top||E.top>=v.bottom)){A.node.hidden=!0;return}}A.node.hidden=!1}function $t(A){const E=new Map;for(const b of A)for(const H of b.clips)E.has(H)||E.set(H,H.getBoundingClientRect());return E}const Ce=["open","progress","review","resolved"];function xe(A,E){A.addEventListener("click",E),A.addEventListener("keydown",b=>{b.key!=="Enter"&&b.key!==" "||(b.preventDefault(),E())})}function ze(A,E,b,H,v){const z=Ce.find(x=>A.some(ne=>ne.snag.status===x))??"open",C=r.createElement("div");C.className="snag-pin snag-cluster",C.style.cssText=`${ot};border-radius:50%;background:${Ln(z)};color:${$n(z)};border:2px solid ${k.onAccent}`,C.style.left=`${E}px`,C.style.top=`${b}px`,C.textContent=String(A.length),C.setAttribute("data-count",String(A.length)),C.setAttribute("data-state",z),C.setAttribute("role","button"),C.setAttribute("tabindex","0"),v&&C.setAttribute("aria-expanded","true"),C.setAttribute("aria-label",B("cluster.aria",{n:A.length,list:A.map(x=>x.ordinal).join(", ")})),xe(C,()=>{if(v)V=null;else if(A.length<=6)V=H;else{o?.(A.map(x=>x.snag.id));return}Ke()}),u.appendChild(C),O.push(C)}function de(A,E,b,H){ze(A,E,b,H,!0),A.forEach((v,z)=>{const C=E,x=b+(z+1)*(D+12),ne=v.x-C,X=v.y-x,L=Math.hypot(ne,X);if(L>4){const K=r.createElement("div");K.className="snag-leader",K.setAttribute("aria-hidden","true"),K.style.cssText=`position:absolute;left:${C}px;top:${x}px;width:${L}px;height:0;border-top:1px solid ${k.onAccent};transform-origin:0 0;transform:rotate(${Math.atan2(X,ne)}rad)`,u.appendChild(K),O.push(K)}const W=v.dot.cloneNode(!0);W.style.visibility="",W.style.left=`${C}px`,W.style.top=`${x}px`,xe(W,()=>t?.(v.snag)),u.appendChild(W),O.push(W)})}function Ke(){for(const v of O)v.remove();O=[];const A=[];for(const[v,z]of g){if(v.hidden){v.style.visibility="";continue}const C=f.get(v);C&&A.push({dot:v,snag:z.snag,ordinal:z.ordinal,x:C.x,y:C.y})}const{members:E,visits:b}=fr(A,$);u.setAttribute("data-cv",String(b)),u.setAttribute("data-cp",String(A.length));let H=!1;for(const v of E){if(v.length<2){A[v[0]].dot.style.visibility="";continue}const z=v.map(X=>A[X]),C=z.map(X=>X.snag.id).sort().join("|");for(const X of z)X.dot.style.visibility="hidden";const x=z.reduce((X,L)=>X+L.x,0)/z.length,ne=z.reduce((X,L)=>X+L.y,0)/z.length;V===C&&z.length<=6?(H=!0,de(z,x,ne,C)):ze(z,x,ne,C,!1)}V&&!H&&(V=null)}function Je(A){re?.remove(),re=null;const E=A.anchor.rect;if(!E)return;const b=A.anchor.offset??{fx:.5,fy:.5},H=r.createElement("div");H.className="snag-pin snag-ghost",H.style.cssText=`${ot};${xt};background:transparent;border:2px dashed ${k.anchorOrphan};color:${k.anchorOrphan};box-shadow:none;pointer-events:none`;const v=j(E.x+E.w*b.fx-Y.x,E.y+E.h*b.fy-Y.y,N());H.style.left=`${v.x}px`,H.style.top=`${v.y}px`,H.setAttribute("aria-hidden","true"),u.appendChild(H),re=H}function Oe(A=!1){const E=A?[...d,...y]:d;we||E.length===0||(we=!0,c.requestAnimationFrame(()=>{we=!1;const b=performance.now(),H=c.scrollX,v=c.scrollY,z=Fe(),C=E.map(L=>L.el.isConnected?L.el.getBoundingClientRect():null),x=E.map(L=>L.el.isConnected&&wt(L.el)),ne=$t(E),X=N();E.forEach((L,W)=>{const K=C[W];if(!K)return;if(L.node.hasAttribute("data-fo")){L.node.hidden=!0;return}if(!x[W]){L.node.hidden=!0;return}L.node.hidden=!1;const J=K.left+K.width*L.fx,ce=K.top+K.height*L.fy;if(L.node.parentElement===a)L.node.style.left=`${J-z.left}px`,L.node.style.top=`${ce-z.top}px`,Be(L,K,ne),f.set(L.node,{x:J+H-Y.x,y:ce+v-Y.y});else{const q=j(J+H-Y.x,ce+v-Y.y,X);L.node.style.left=`${q.x}px`,L.node.style.top=`${q.y}px`,f.set(L.node,q)}}),Ke(),u.setAttribute("data-ms",(performance.now()-b).toFixed(2))}))}const Se=()=>Oe();r.addEventListener("scroll",Se,{capture:!0,passive:!0});const it=typeof c.ResizeObserver=="function"?new c.ResizeObserver(()=>Oe(!0)):null;it?.observe(r.documentElement);let Ae=null,ie="";function Et(){let A="";for(const E of[...y,...d]){if(!E.el.isConnected)continue;const b=E.el.getBoundingClientRect();A+=`${Math.round(b.left)},${Math.round(b.top)},${Math.round(b.width)};`}!A||A===ie||(ie=A,Oe(!0))}function ue(A){if(Ae&&clearTimeout(Ae),Ae=null,!A)return;const E=()=>{Et(),Ae=setTimeout(E,500)};Ae=setTimeout(E,500)}const ct=()=>ue(r.visibilityState==="visible"&&T.size>0);r.addEventListener("visibilitychange",ct);function se(A){const E=T.get(A);E&&(E.classList.remove("snag-pp"),c.requestAnimationFrame(()=>E.classList.add("snag-pp")),c.setTimeout(()=>E.classList.remove("snag-pp"),1400))}function Ue(A){const E=m?T.get(m):void 0;E&&(E.style.transform="",E.style.zIndex=""),m=A;const b=A?T.get(A):void 0;b&&(b.style.transform="scale(1.4)",b.style.zIndex="1")}return{el:u,render:G,showGhost:Je,pulse:se,reanchor:M,settled:()=>ee,hasPending:()=>te.size>0,highlight:Ue,destroy(){r.removeEventListener("scroll",Se,{capture:!0}),r.removeEventListener("visibilitychange",ct),it?.disconnect(),ue(!1),u.remove(),a.remove()}}}const br=` .snag-notice{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(24px + var(${P.tbH},56px));z-index:${Ve.notice};max-width:min(420px,calc(100vw - 24px));background:${k.bg};color:${k.fg};border:1px solid ${k.border};border-inline-start:3px solid ${k.anchorOrphan};border-radius:${k.radius};box-shadow:${k.shadow};padding:12px 14px;pointer-events:auto;font:400 13px/1.45 ${k.font};display:flex;flex-direction:column;gap:10px}@media (pointer:coarse){.snag-notice{bottom:calc(12px + var(${P.tbH},64px))}}.snag-notice p{margin:0}.snag-notice-actions{display:flex;gap:6px;justify-content:flex-end}.snag-notice button{appearance:none;font:inherit;cursor:pointer;border-radius:calc(${k.radius} - 2px);padding:6px 12px;min-height:30px;border:0;transition:background ${k.motion}}.snag-notice-retry{background:${k.accent};color:${k.onAccent};font-weight:600}.snag-notice-dismiss{background:transparent;color:${k.muted}}.snag-notice-dismiss:hover{background:${k.hover};color:inherit}.snag-notice button:focus-visible{outline:2px solid ${k.focus};outline-offset:2px}`;function vr(e,t){const n=e.ownerDocument??document,o=n.defaultView??window;nt(e,"notice",br);const r=n.createElement("div");r.className="snag-notice",r.setAttribute("role","alert"),r.hidden=!0;const c=n.createElement("p"),u=n.createElement("div");u.className="snag-notice-actions";const a=n.createElement("button");a.type="button",a.className="snag-notice-dismiss",a.textContent=B("action.dismiss"),a.addEventListener("click",()=>T());const d=n.createElement("button");d.type="button",d.className="snag-notice-retry",u.append(a,d),r.append(c,u);let y;d.addEventListener("click",()=>{T(),y?.run()});let w=0;function T(){w&&o.cancelAnimationFrame(w),w=0,r.hidden=!0,r.remove()}return{show(m,f,g){y=f,d.hidden=!f,f&&(d.textContent=B(f.label)),r.hidden=!1,c.textContent="",(t??e).appendChild(r);const p=B(m,g);w&&o.cancelAnimationFrame(w),w=o.requestAnimationFrame(()=>{w=0,c.textContent=p})},hide:T,visible:()=>r.isConnected&&!r.hidden,destroy(){r.remove()}}}const wr=` .snag-paused{border:0;padding:0;background:transparent;pointer-events:auto;max-width:min(420px,calc(100vw - 32px))}.snag-paused::backdrop{background:rgb(0 0 0 / .28)}.snag-paused-box{background:${k.bg};color:${k.fg};border:1px solid ${k.border};border-inline-start:3px solid ${k.accent};border-radius:${k.radius};box-shadow:${k.shadow};padding:14px 16px;font:400 13px/1.45 ${k.font};display:flex;flex-direction:column;gap:12px}.snag-paused p{margin:0}.snag-paused-actions{display:flex;justify-content:flex-end}.snag-paused button{appearance:none;font:inherit;cursor:pointer;border:0;font-weight:600;border-radius:calc(${k.radius} - 2px);padding:6px 14px;min-height:30px;background:${k.accent};color:${k.onAccent}}.snag-paused button:focus-visible{outline:2px solid ${k.focus};outline-offset:2px}`;function xr(e,t){const n=e.ownerDocument??document;nt(e,"paused",wr);const o=n.createElement("dialog");o.className="snag-paused",o.setAttribute("aria-label",B("paused.dialog"));const r=n.createElement("div");r.className="snag-paused-box",r.setAttribute("role","status");const c=n.createElement("p");c.textContent=B("paused.dialog");const u=n.createElement("div");u.className="snag-paused-actions";const a=n.createElement("button");a.type="button",a.textContent=B("paused.close"),a.addEventListener("click",()=>w()),u.append(a),r.append(c,u),o.append(r);let d=!1;function y(){if(!d){(t??e).appendChild(o);try{o.showModal(),d=!0}catch{o.setAttribute("open",""),d=!0}}}function w(){if(d){d=!1;try{o.close()}catch{o.removeAttribute("open")}o.remove()}}return o.addEventListener("close",()=>{d=!1,o.remove()}),{show:y,hide:w,destroy(){w(),o.remove()}}}const Sr=Symbol.for(gn.original),Nn=Symbol.for(gn.wrapped),rt=()=>{};function Ar(e,t,n){let o;try{o=e[t]}catch{return rt}if(typeof o!="function"||o[Nn])return rt;const r=o,c=n(r);let u=!1;const a=function(...d){return u?r.apply(this,d):c.apply(this,d)};try{const d=a;d[Nn]=!0,d[Sr]=r,Object.defineProperty(a,"name",{value:r.name,configurable:!0}),Object.defineProperty(a,"length",{value:r.length,configurable:!0})}catch{}try{e[t]=a}catch{return rt}return e[t]!==a?rt:()=>{let d;try{d=e[t]}catch{d=void 0}if(d===a)try{e[t]=r;return}catch{}u=!0}}function kr(e,t){const n=[];let o=0;const r=()=>{o||(o=e.requestAnimationFrame(()=>{o=0,t.onResize()}))};e.addEventListener("resize",r),n.push(()=>{o&&e.cancelAnimationFrame(o),e.removeEventListener("resize",r)}),e.visualViewport?.addEventListener("resize",r),n.push(()=>e.visualViewport?.removeEventListener("resize",r));const c=()=>void e.setTimeout(t.onResize,250);e.addEventListener("orientationchange",c),n.push(()=>e.removeEventListener("orientationchange",c));let u=e.location.pathname;const a=()=>{const $=e.location.pathname;$!==u&&(u=$,t.onRoute())},d=e.navigation;if(d){const $=()=>void e.setTimeout(a,0);d.addEventListener("navigatesuccess",$),n.push(()=>d.removeEventListener("navigatesuccess",$))}else for(const $ of["pushState","replaceState"])n.push(Ar(e.history,$,D=>function(...O){const V=D.apply(this,O);return e.setTimeout(a,0),V}));const y=e.document;let w=!0;try{y.documentElement.matches(":modal")}catch{w=!1}const T=()=>{const $=y.querySelectorAll("dialog[open]");if(!w)return $.length>0;for(const D of $)if(D.matches(":modal"))return!0;return!1};let m=!1;const f=()=>{const $=T();$!==m&&(m=$,t.onModal($))};y.addEventListener("toggle",f,!0),n.push(()=>y.removeEventListener("toggle",f,!0));const g=new MutationObserver(f);g.observe(y.documentElement,{subtree:!0,attributes:!0,attributeFilter:["open"]}),n.push(()=>g.disconnect());const p=()=>void e.setTimeout(a,0);return e.addEventListener("popstate",p),n.push(()=>e.removeEventListener("popstate",p)),{destroy(){for(const $ of n)$();n.length=0}}}function $r(e,t){try{e.sessionStorage.setItem(le.handoff,JSON.stringify({openThreadId:t}))}catch{}}function Er(e){try{const t=e.sessionStorage.getItem(le.handoff);if(t===null)return null;e.sessionStorage.removeItem(le.handoff);const n=JSON.parse(t);return typeof n.openThreadId=="string"?n.openThreadId:null}catch{return null}}function Cr(){return{statuses:[],read:"all",pageOnly:!1,newOnly:!1,sort:"page"}}const Tr=["open","progress","review","resolved"];function Rr(e,t,n){if(t.statuses.length>0&&Tr.includes(e.status)&&!t.statuses.includes(e.status)||t.by&&e.createdBy.id!==t.by||t.page&&e.route!==t.page)return!1;if(t.read!=="all"&&n){const o=_r(e,n);if(t.read==="unread"&&!o||t.read==="read"&&o)return!1}return!0}function _r(e,t){const n=t.get(e.id)??0;return Date.parse(e.updatedAt)>n}function Ir(e,t,n){const o=e.visualViewport;let r=0;const c=()=>{if(r=0,!o)return;const a=o.offsetLeft,d=o.offsetTop;t.style.translate=a||d?`${a}px ${d}px`:"",t.style.width=`${o.width}px`,t.style.height=`${o.height}px`,n?.(o.scale)},u=()=>{r||(r=e.requestAnimationFrame(c))};return o?.addEventListener("resize",u,{passive:!0}),o?.addEventListener("scroll",u,{passive:!0}),u(),()=>{r&&e.cancelAnimationFrame(r),o?.removeEventListener("resize",u),o?.removeEventListener("scroll",u)}}const Pr=/^eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}/,Mr=/^[a-f0-9]{32,}$/i,zr=/^(?=[A-Za-z0-9_-]{24,}$)(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9_-]+$/,Or="[redacted]";function Hn(e){return e.includes("/")?e.split("/").map(t=>Pr.test(t)||Mr.test(t)||zr.test(t)?Or:t).join("/"):e}const Lr=/\/index\.(html?|php)$/i;function Dr(e){if(!e.startsWith("/"))return e;let t=e.replace(Lr,"/");return t.length>1&&t.endsWith("/")&&(t=t.slice(0,-1)),t.toLowerCase()}function Nr(e){try{const t=e.querySelector(`meta[name="${zo.route}"]`)?.getAttribute("content")?.trim();return!t||t.length>512||!t.startsWith("/")?null:t}catch{return null}}function Hr(e,t){const n=t??Nr(e);return Dr(n??Hn(e.location.pathname))}const Wr=[/^utm_/,/^(gclid|gbraid|wbraid|fbclid|msclkid|ttclid|twclid|igshid|yclid|li_fat_id)$/,/^(mc_cid|mc_eid|_hsenc|_hsmi|vero_id|oly_enc_id|oly_anon_id)$/,/^_vercel_/,/^__vercel_/,/^_rsc$/],Fr=[...bt.query,...bt.fragment];function Br(e,t=[]){return Fr.includes(e)||t.includes(e)?!0:Wr.some(n=>n.test(e))}function Ur(e,t={}){const n=t.significantQueryParams??[];if(n!=="*"&&n.length===0)return;let o;try{o=new URLSearchParams(e)}catch{return}const r={};for(const[c,u]of o)Br(c,t.ignoredQueryParams??[])||n!=="*"&&!n.includes(c)||(r[c]=u);return Object.keys(r).length>0?r:void 0}function jr(e,t,n={}){const o=n.significantQueryParams??[];if(o==="*"){const r=e??{},c=t??{},u=new Set([...Object.keys(r),...Object.keys(c)]);for(const a of u)if(r[a]!==c[a])return!1;return!0}for(const r of o)if((e?.[r]??void 0)!==(t?.[r]??void 0))return!1;return!0}const Zr=120,Vr=1e3,Yr=200,Xr=1e4;function Kr(e,t,n){const o=t.MutationObserver;if(typeof o!="function")return{destroy:()=>{}};let r=!1,c=null,u=!1,a=!1,d=0,y=T(),w=0;function T(){return t.performance?.now?.()??0}const m=new o(()=>{r=!0,d++,g()});function f(){const $=T();return $-y>=1e3&&(d>Yr&&(w=$+Xr),d=0,y=$),$<w?Vr:Zr}function g(){c||(c=setTimeout(p,f()))}function p(){if(c=null,!!r){if(u){a=!0;return}r=!1,u=!0;try{n()}finally{u=!1,a&&(a=!1,r=!0,g())}}}return m.observe(e.documentElement,{childList:!0,subtree:!0}),{destroy(){m.disconnect(),c&&clearTimeout(c),c=null}}}const Jr="0.0.0",qr={capture:_e.capture,"anchor-ext":_e.anchorExt,"anchor-fuzzy":_e.anchorFuzzy,crumbs:_e.crumbs,screenshot:_e.screenshot,dock:_e.dock,text:_e.text},Wn=new Map,Bt=new Map,Fn=new Map;function Qr(e,t,n){const o=new URL(t,n.location.href).href,r=new URL(qr[e],o);r.searchParams.set("cv",Jr);const c=Fn.get(e)??0;return c>0&&r.searchParams.set("r",String(c)),Fn.set(e,c+1),r.href}async function Ie(e,t,n=document){const o=Wn.get(e);if(o)return{ok:!0,mod:o};const r=Bt.get(e);if(r)return r;const c=(async()=>{for(let u=0;u<2;u++)try{const a=await import(Qr(e,t,n));return Wn.set(e,a),{ok:!0,mod:a}}catch{}return{ok:!1,reason:"unavailable"}})();Bt.set(e,c);try{return await c}finally{Bt.delete(e)}}const Gr="composer",Ut=e=>le.draft(e,Gr),es=le.draft("\0","").split("\0")[0];function ts(e){try{return e.body.trim()?(localStorage.setItem(Ut(e.route),JSON.stringify(e)),!0):(Bn(e.route),!0)}catch{return!1}}function ns(e){try{const t=localStorage.getItem(Ut(e));if(!t)return null;const n=JSON.parse(t);return!n||typeof n.body!="string"||!n.anchor||n.route!==e?null:n}catch{return null}}function Bn(e){try{localStorage.removeItem(Ut(e))}catch{}}function jt(){try{for(let e=0;e<localStorage.length;e++){const t=localStorage.key(e);if(t&&t.startsWith(es))return!0}return!1}catch{return!1}}const os="http://www.w3.org/2000/svg";function Pe(e,t,n,o=[]){const r=e.createElementNS(os,t);for(const c in n)r.setAttribute(c,n[c]);for(const c of o)r.appendChild(c);return r}const Zt=(e,t="16",n="16",o="0 0 16 16")=>({width:t,height:n,viewBox:o,fill:"none","aria-hidden":"true"}),rs=e=>Pe(e,"svg",Zt(),[Pe(e,"path",{d:"M8 3v10M3 8h10",stroke:"currentColor","stroke-width":"1.75","stroke-linecap":"round"})]),ss=e=>Pe(e,"svg",Zt(),[Pe(e,"rect",{x:"2.25",y:"3.25",width:"11.5",height:"9.5",rx:"1.75",stroke:"currentColor","stroke-width":"1.5"}),Pe(e,"path",{d:"M9.5 3.5v9",stroke:"currentColor","stroke-width":"1.5"})]),as=e=>Pe(e,"svg",{...Zt(e,"10","16","0 0 10 16"),fill:"currentColor"},[Pe(e,"g",{fill:"currentColor"},[4,8,12].flatMap(t=>[3,7].map(n=>Pe(e,"circle",{cx:String(n),cy:String(t),r:"1"}))))]),is=` .snag-tb{position:fixed;z-index:${Ve.toolbar};display:flex;align-items:center;gap:2px;padding:4px;border-radius:calc(${k.radius} + 4px);background:${k.bg};color:${k.fg};box-shadow:${k.shadow};font:500 13px/1 ${k.font};pointer-events:auto;user-select:none;border:1px solid ${k.border}}.snag-tb{transition:inset-inline-end ${k.motion}}.snag-tb--fine{inset-inline-end:calc(20px + env(safe-area-inset-right) + var(${P.dockW},0px));inset-block-end:calc(20px + env(safe-area-inset-bottom));transition:inset-inline-end ${k.motion}}.snag-tb--coarse{inset-inline:0;inset-block-end:0;border-radius:14px 14px 0 0;padding:6px 10px calc(6px + env(safe-area-inset-bottom));justify-content:center;gap:4px;flex-direction:column}.snag-grabber{width:36px;height:4px;border-radius:2px;background:${k.muted};margin:2px auto 6px}.snag-row{display:flex;align-items:center;gap:2px}.snag-grip{display:flex;align-items:center;padding:0 4px;color:${k.muted};cursor:grab;touch-action:none}.snag-grip:active{cursor:grabbing}.snag-seg{display:flex;background:${k.surface};border-radius:${k.radius};padding:2px;position:relative}.snag-seg::before{content:"";position:absolute;inset-block:2px;inset-inline-start:var(${P.thumbX},0);width:var(${P.thumbW},0);background:${k.accent};border-radius:calc(${k.radius} - 2px);pointer-events:none;transition:inset-inline-start ${k.motion},width ${k.motion}}.snag-seg>.snag-b[aria-pressed="true"]{background:transparent;color:${k.onAccent}}.snag-seg>.snag-b{z-index:1}.snag-b{appearance:none;border:0;background:transparent;color:inherit;font:inherit;padding:6px 11px;border-radius:calc(${k.radius} - 2px);cursor:pointer;display:flex;align-items:center;gap:6px;position:relative;min-height:32px;transition:background ${k.motion}}.snag-b:hover:not(:disabled){background:color-mix(in srgb,currentColor 12%,transparent)}.snag-b:disabled{opacity:.4;cursor:not-allowed}.snag-b[aria-pressed="true"]{background:${k.accent};color:${k.onAccent}}.snag-b:focus-visible{outline:2px solid ${k.focus};outline-offset:2px}.snag-icon{padding:6px 9px}@media (pointer:coarse){.snag-b{min-height:44px;min-width:44px;padding:6px 14px}.snag-icon{padding:6px 14px}}.snag-puck .snag-row>:not([aria-expanded]){display:none}.snag-puck{padding:4px;border-radius:50%}.snag-puck [aria-expanded]{min-width:44px;min-height:44px;border-radius:50%}`;function cs(e,t){const n=e.ownerDocument??document,o=t.coarsePointer??n.defaultView?.matchMedia?.("(pointer: coarse)").matches??!1;nt(e,"toolbar",is);const r=n.createElement("div");r.className=`snag-tb ${o?"snag-tb--coarse":"snag-tb--fine"}`,r.setAttribute("role","toolbar"),r.setAttribute("aria-label",B("toolbar.aria"));const c=n.createElement("div");c.className="snag-grabber",c.setAttribute("aria-hidden","true");const u=n.createElement("div");u.className="snag-row";const a=n.createElement("span");a.className="snag-grip",a.setAttribute("aria-hidden","true"),a.appendChild(as(n));const d=n.createElement("div");d.className="snag-seg",d.setAttribute("role","group"),d.setAttribute("aria-label",B("toolbar.group"));const y=(l,_,S)=>{const I=n.createElement("button");return I.type="button",I.className=`snag-b ${l}`,I.setAttribute("aria-label",_),typeof S=="string"?I.textContent=S:I.appendChild(S),I},w=y("",B("toolbar.browse"),B("toolbar.browse")),T=y("",B("toolbar.comments"),B("toolbar.comments")),m=y("snag-icon",B("toolbar.add"),rs(n)),f=y("snag-icon",B("toolbar.panel"),ss(n));f.setAttribute("aria-expanded","false"),d.append(w,T),o||u.appendChild(a),u.append(d,m,f),o&&r.appendChild(c),r.appendChild(u),(t.parent??e).appendChild(r);const g=()=>{e.host.style.setProperty(P.tbH,`${r.offsetHeight}px`)};g();let p=null;function $(l,_){const S=n.defaultView,I=r.offsetWidth,M=r.offsetHeight,N=Un(l,8,Math.max(8,S.innerWidth-I-8)),j=Un(_,8,Math.max(8,S.innerHeight-M-8));p={left:N,top:j},r.style.left=`${N}px`,r.style.top=`${j}px`,r.style.right="auto",r.style.bottom="auto"}const D=()=>{g(),p&&$(p.left,p.top)},O=n.defaultView;if(O?.addEventListener("resize",D),w.addEventListener("click",()=>t.onState("browse")),T.addEventListener("click",()=>t.onState("comments")),m.addEventListener("click",()=>t.onState(V==="add"?"comments":"add")),f.addEventListener("click",()=>t.onPanel()),!o){let l=null;a.addEventListener("pointerdown",S=>{l={x:S.clientX,y:S.clientY,r:r.getBoundingClientRect()},a.setPointerCapture(S.pointerId),S.preventDefault()}),a.addEventListener("pointermove",S=>{l&&$(l.r.left+(S.clientX-l.x),l.r.top+(S.clientY-l.y))});const _=S=>{l=null,a.hasPointerCapture(S.pointerId)&&a.releasePointerCapture(S.pointerId)};a.addEventListener("pointerup",_),a.addEventListener("pointercancel",_)}let V="browse";function re(l){V=l,w.setAttribute("aria-pressed",String(l==="browse")),T.setAttribute("aria-pressed",String(l!=="browse")),m.setAttribute("aria-pressed",String(l==="add")),Y()}function Y(){const l=d.querySelector('.snag-b[aria-pressed="true"]'),_=d.getBoundingClientRect(),S=l?.getBoundingClientRect();if(!l||!S?.width){d.style.setProperty(P.thumbW,"0px");return}const I=n.defaultView?.getComputedStyle(d),M=I?.direction==="rtl",N=parseFloat((M?I?.paddingRight:I?.paddingLeft)??"0")||0,j=(M?_.right-S.right:S.left-_.left)-N;d.style.setProperty(P.thumbW,`${Math.round(S.width)}px`),d.style.setProperty(P.thumbX,`${Math.max(0,Math.round(j))}px`)}function Ee(l){m.disabled=l,l?m.title=B("error.panels.add"):m.removeAttribute("title")}function ee(l){m.setAttribute("aria-label",B(l?"toolbar.add.draft":"toolbar.add"))}function te(l){T.setAttribute("aria-label",l!==null&&l>0?B("toolbar.comments.unresolved",{n:Ho(l)}):B("toolbar.comments"))}re("browse"),te(0);function Me(l){r.classList.toggle("snag-puck",l),l||Y()}function pe(l){r.hidden=l,l||Y(),g()}return{el:r,setState:re,setCount:te,setDegraded:Ee,setDraft:ee,setPuck:Me,setConcealed:pe,destroy(){O?.removeEventListener("resize",D),e.host.style.removeProperty(P.tbH),r.remove()}}}const Un=(e,t,n)=>e<t?t:e>n?n:e,jn=24;function ls(e,t){const n=e.innerHeight,o=t.querySelector(".snag-dk");if(!o)return{top:0,bottom:n};const r=o.getBoundingClientRect();return r.height>=n-1?{top:0,bottom:n}:{top:0,bottom:Math.max(0,r.top)}}function ds(e,t,n){const o=n.anchor.rect;if(!o)return;const r=n.anchor.offset??{fy:.5},c=o.y+o.h*r.fy,u=ls(e,t),a=c-e.scrollY;if(a>=u.top+jn&&a<=u.bottom-jn)return;const d=e.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;e.scrollTo({top:Math.max(0,c-(u.top+u.bottom)/2),behavior:d?"auto":"smooth"})}function Vt(){const e=new Uint8Array(16);crypto.getRandomValues(e);const t=Date.now();e[0]=Math.floor(t/2**40)&255,e[1]=Math.floor(t/2**32)&255,e[2]=Math.floor(t/2**24)&255,e[3]=Math.floor(t/2**16)&255,e[4]=Math.floor(t/2**8)&255,e[5]=t&255,e[6]=e[6]&15|112,e[8]=e[8]&63|128;const n=Array.from(e,o=>o.toString(16).padStart(2,"0")).join("");return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}const us=()=>vt.thread+Vt(),Zn=()=>vt.comment+Vt(),fs=()=>vt.attachment+Vt(),hs={attachments:"direct",realtime:"none",anchorReports:!1,identity:["guest"],export:["json","md"],serverSideSearch:!1,privateThreads:!1,assignees:!1};function ps(){const e=le.threads("probe","probe");try{return localStorage.setItem(e,"1"),localStorage.removeItem(e),!0}catch(t){return Vn(t)}}function ms(e,t,n){const o=le.threads(e,t);function r(){let a=null;try{a=localStorage.getItem(o)}catch{return[]}if(!a)return[];try{const d=JSON.parse(a);return Array.isArray(d)?d.filter(ys):[]}catch{return[]}}function c(a){try{localStorage.setItem(o,JSON.stringify(a))}catch(d){if(!Vn(d))return;throw new Dt("local_quota_exceeded")}}const u=a=>({...a,updatedAt:new Date().toISOString()});return{kind:"local",capabilities:hs,async init(a){return{uid:a.uid,env:a.env,features:{screenshots:!0,uploads:!1}}},async listThreads(a={}){let d=r();return a.route!==void 0&&(d=d.filter(y=>y.route===a.route)),a.status?.length&&(d=d.filter(y=>a.status.includes(y.status))),{data:d,serverTime:new Date().toISOString()}},async getThread(a){return r().find(d=>d.id===a)??null},async createThread(a){const d=Cn(a);return c([...r(),d]),d},async patchThread(a,d){const y=r(),w=y.findIndex(g=>g.id===a);if(w<0)return null;const{assignee:T,...m}=d,f=u({...y[w],...gs(m)});return y[w]=f,c(y),f},async deleteThread(a){const d=r(),y=d.find(T=>T.id===a),w=d.filter(T=>T.id!==a);w.length!==d.length&&c(w);for(const T of y?.attachments??[])n?.del(T.id).catch(()=>{})},async uploadAttachment(a,d){if(!n)throw new Dt("attachments_unsupported");const y=fs();return await n.put(y,{blob:a,uid:e,env:t,kind:d.kind,...d.width!==void 0?{width:d.width}:{},...d.height!==void 0?{height:d.height}:{},createdAt:Date.now()}),{id:y,kind:d.kind,url:"",...d.width!==void 0?{width:d.width}:{},...d.height!==void 0?{height:d.height}:{},bytes:a.size,contentType:a.type}},async createComment(a,d){const y=r(),w=y.findIndex(m=>m.id===a);if(w<0)return null;const T={id:d.id,snagId:a,body:d.body,author:d.author,createdAt:new Date().toISOString()};return y[w]=u({...y[w],comments:[...y[w].comments,T]}),c(y),T},async patchComment(a,d){const y=r();for(let w=0;w<y.length;w++){const T=y[w].comments.find(f=>f.id===a);if(!T)continue;const m={...T,body:d};return y[w]=u({...y[w],comments:y[w].comments.map(f=>f.id===a?m:f)}),c(y),m}return null},async deleteComment(a){const d=r(),y=d.findIndex(w=>w.comments.some(T=>T.id===a));y<0||(d[y]=u({...d[y],comments:d[y].comments.filter(w=>w.id!==a)}),c(d))}}}function gs(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Vn(e){return e instanceof Error?e.name==="QuotaExceededError"||e.name==="NS_ERROR_DOM_QUOTA_REACHED"||e.code===22||e.code===1014:!1}function ys(e){if(typeof e!="object"||e===null)return!1;const t=e;return typeof t.id=="string"&&typeof t.key=="string"&&typeof t.route=="string"&&typeof t.anchor=="object"&&t.anchor!==null&&typeof t.anchor.label=="string"&&Array.isArray(t.comments)}function bs(e,t,n=()=>Date.now()){const o=le.seen(e,t);let r=null;function c(){if(r)return r;try{const a=localStorage.getItem(o),d=a?JSON.parse(a):{};return r=typeof d=="object"&&d!==null&&!Array.isArray(d)?d:{}}catch{return r={}}}function u(a){r=a;try{localStorage.setItem(o,JSON.stringify(a))}catch{}}return{map:()=>new Map(Object.entries(c())),mark(a){u({...c(),[a]:n()})},markAll(a){const d=n(),y={...c()};for(const w of a)y[w.id]=d;u(y)}}}function st(){let e=null;try{e=localStorage.getItem(zt)}catch{return{}}if(!e)return{};if(e[0]!=="{")return{name:e};try{const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Yn(e){try{localStorage.setItem(zt,JSON.stringify(e))}catch{}}function Yt(){const e=st();return{name:typeof e.name=="string"?e.name:"",...e.email?{email:e.email}:{}}}function Xn(e){return st().projects?.[e]?.holderId}function vs(e){const t=st().projects?.[e]?.holderSecret;return t&&/^[\w-]{43}$/.test(t)?t:void 0}function ws(e,t,n){const o=st();Yn({...o,projects:{...o.projects,[e]:{holderId:t,holderSecret:n}}})}function xs(e,t){const n=st(),o=n.projects?.[e];o&&Yn({...n,projects:{...n.projects,[e]:{...o,holderId:t}}})}const We=e=>le.session(e);function Kn(e){if(!e)return null;const t=JSON.parse(e);return typeof t?.token=="string"&&typeof t?.refreshableUntil=="number"?t:null}function Ye(e){try{const t=Kn(sessionStorage.getItem(We(e)));if(t)return t;const n=Kn(localStorage.getItem(We(e)));return n?.member?n:null}catch{return null}}function Xt(e,t){try{t.member?(localStorage.setItem(We(e),JSON.stringify(t)),sessionStorage.removeItem(We(e))):sessionStorage.setItem(We(e),JSON.stringify(t))}catch{}}function at(e){try{sessionStorage.removeItem(We(e)),localStorage.removeItem(We(e))}catch{}}const Ss=(e,t=Date.now())=>t>e.expiresAt-3e4,Kt=(e,t=Date.now())=>t>=e.refreshableUntil;class Xe extends Error{code;status;constructor(t,n,o){super(o),this.name="HttpAdapterError",this.status=t,this.code=n}}function As(e){const{offset:t,testId:n,domId:o,page:r,schemaVersion:c,...u}=e;return{...u,...n?{testid:n}:{},...o?{domid:o}:{},...t?{offset:{fx:t.x,fy:t.y}}:{}}}function ks(e,t){const n=e.url??"",o=/^https?:/i.test(n)?n:n?`${t}${n.startsWith("/")?"":"/"}${n}`:`${t}/api/v1/attachments/${encodeURIComponent(e.id)}/blob`;return{...e,url:o}}function St(e,t,n){return{id:e.id,route:e.anchor?.page?.route??"",key:e.key,status:e.status,anchor:As(e.anchor),anchorState:e.anchorState,context:e.context,comments:e.comments??[],createdBy:e.createdBy,assignee:e.assignee??null,createdAt:e.createdAt,updatedAt:e.updatedAt,...e.resolvedAt?{resolvedAt:e.resolvedAt}:{},...e.attachments?.length?{attachments:e.attachments.map(o=>ks(o,n))}:{},...t?{scope:{environment:t}}:{}}}function $s(e,t){const{offset:n,testid:o,domid:r,...c}=e;return{...c,schemaVersion:pn,...o?{testId:o}:{},...r?{domId:r}:{},offset:n?{x:n.fx,y:n.fy}:{x:.5,y:.5},page:{route:t,pathname:location.pathname,origin:location.origin}}}function Es(e,t,n,o={}){const r=e.replace(/\/+$/,""),c=`${r}/api/v1/projects/${encodeURIComponent(t)}`;let u=o.reviewToken,a=Ye(t);async function d(f=!1){const g=a&&!Kt(a)?a.token:null,p=!!g&&!u&&!f,$=p?void 0:u?{kind:"link",token:u,name:Yt().name||void 0}:{kind:"guest",name:Yt().name||"Anonymous",holderId:Xn(t),holderSecret:vs(t)};let D;try{D=await fetch(`${c}/sessions`,{method:"POST",credentials:"omit",headers:{"content-type":"application/json",...g?{Authorization:`Bearer ${g}`}:{}},body:JSON.stringify({...n?{environment:n}:{},...$?{identity:$}:{},client:{widget:ko,schema:pn}})})}catch(re){throw new Xe(0,"network_error",re.message)}finally{u=void 0}if(!D.ok){const Y=(await D.json().catch(()=>null))?.error?.code??"unauthorized";throw at(t),a=null,Y==="session_revoked"||Y==="token_revoked"?o.onSessionEnded?.("revoked"):D.status===401&&o.onSessionEnded?.("expired"),new Xe(D.status,Y,"This review session is not valid.")}const O=await D.json();O.holderSecret&&O.reviewer?ws(t,O.reviewer.id,O.holderSecret):O.reviewer&&xs(t,O.reviewer.id);const V=O.round?.number??(p?a?.round:void 0);return a={token:O.sessionToken,expiresAt:Date.parse(O.expiresAt),refreshableUntil:Date.parse(O.refreshableUntil),reviewerId:O.reviewer?.id??a?.reviewerId??"",permissions:O.permissions??a?.permissions??[],...V!==void 0?{round:V}:{},...p&&a?.member?{member:a.member}:{},...p&&a?.member&&a.moderator?{moderator:!0}:{}},Xt(t,a),$&&(w=$.name??null),o.onSessionStarted?.(),a}async function y(){if(a){if(Kt(a)){at(t),a=null,o.onSessionEnded?.("expired");return}await d().catch(()=>{})}}let w=null;async function T(){if(a&&Kt(a))return at(t),a=null,w=null,o.onSessionEnded?.("expired"),null;const f=Yt().name||null,g=a!==null&&!a.member&&f!==null&&f!==w;if(!a||Ss(a)||u||g)try{await d(g)}catch(p){if(!(p instanceof Xe)||p.status===0)throw p;return null}return a?.token??null}async function m(f,g,p=!1){const $=await T();let D;try{D=await fetch(c+f,{...g,headers:{"content-type":"application/json",...$?{Authorization:`Bearer ${$}`}:{},...g?.headers??{}},credentials:"omit"})}catch(O){throw new Xe(0,"network_error",O.message)}if(!D.ok){const O=await D.json().catch(()=>null),V=O?.error?.code??"http_error";if(D.status===401&&!p&&V!=="session_revoked")return at(t),a=null,m(f,g,!0);throw new Xe(D.status,V,O?.error?.message??`The server answered ${D.status}.`)}return await D.json()}return{kind:"http",capabilities:{attachments:"none",realtime:"none",anchorReports:!0,identity:["guest"],export:[],serverSideSearch:!1,privateThreads:!1,assignees:!0},async init(f){const g=await m("/config");return this.capabilities.attachments=g.features.screenshots?"direct":"none",{uid:f.uid,env:f.env,features:g.features,...g.rounds?{rounds:g.rounds}:{},...g.writable===void 0?{}:{writable:g.writable},...g.reason===void 0?{}:{reason:g.reason}}},async reportAnchors(f){if(f.length!==0)for(let g=0;g<f.length;g+=50)try{await m("/anchor-reports",{method:"POST",body:JSON.stringify({reports:f.slice(g,g+50)})})}catch{return}},revalidate:y,member:()=>a?.member??null,adoptSession(f){a={token:f.sessionToken,expiresAt:Date.parse(f.expiresAt),refreshableUntil:Date.parse(f.refreshableUntil),reviewerId:f.reviewer.id,permissions:f.permissions,member:f.reviewer.name,...f.moderator?{moderator:!0}:{}},Xt(t,a),o.onSessionStarted?.()},signOut(){at(t),a=null,w=null},getRound(){return a?.round??Ye(t)?.round??null},setRound(f){a&&(a={...a,round:f});const g=Ye(t);g&&Xt(t,{...g,round:f})},async fetchForeignImage(f){try{const g=await T(),p=await fetch(`${c}/image?src=${encodeURIComponent(f)}`,{credentials:"omit",...g?{headers:{Authorization:`Bearer ${g}`}}:{}});if(!p.ok)return null;const $=await p.blob();return $.type.startsWith("image/")?$:null}catch{return null}},async uploadAttachment(f,g){const p=await T(),$=await fetch(`${c}/attachments`,{method:"POST",credentials:"omit",headers:{"content-type":f.type||"image/webp",[Ot.attachmentKind]:g.kind,...g.width?{[Ot.attachmentWidth]:String(g.width)}:{},...g.height?{[Ot.attachmentHeight]:String(g.height)}:{},...p?{Authorization:`Bearer ${p}`}:{}},body:f});if(!$.ok){const O=await $.json().catch(()=>null);throw new Xe($.status,O?.error?.code??"upload_failed",O?.error?.message??"Upload failed.")}const D=await $.json();return{id:D.id,kind:g.kind,contentType:D.contentType,byteSize:D.byteSize,...g.width?{width:g.width}:{},...g.height?{height:g.height}:{},url:`${r}/api/v1/attachments/${D.id}/blob`}},async listThreads(f){await T();const g=new URLSearchParams;n&&g.set("env",n),f?.route&&g.set("route",f.route),a?.round&&g.set("round",String(a.round));const p=await m(`/threads?${g}`);return{data:p.data.map($=>St($,n,r)),...p.nextCursor?{nextCursor:p.nextCursor}:{},deleted:[],serverTime:p.serverTime}},async getThread(f){return(await this.listThreads()).data.find(p=>p.id===f)??null},async getThreadByKey(f){const g=new URLSearchParams({key:f});n&&g.set("env",n);const $=(await m(`/threads?${g}`)).data[0];return $?St($,n,r):null},async createThread(f){const g=await m("/threads",{method:"POST",body:JSON.stringify({id:f.id,anchor:$s(f.anchor,f.route),anchorState:f.anchorState,context:f.context,...n?{scope:{environment:n}}:{},createdBy:{name:f.createdBy.name},...f.comment?{comment:{id:f.comment.id,body:f.comment.body}}:{},...f.attachments?.length?{attachments:f.attachments.map(p=>p.id)}:{}})});return St(g,n,r)},async patchThread(f,g){const p="assignee"in g;if(!g.status&&!p)return null;const $=await m(`/threads/${encodeURIComponent(f)}`,{method:"PATCH",body:JSON.stringify({...g.status?{status:g.status}:{},...p?{assignee:g.assignee??null}:{}})});return St($,n,r)},async listAssignees(f){return(await m(`/assignees${f?`?q=${encodeURIComponent(f)}`:""}`)).data??[]},async deleteThread(f){await m(`/threads/${encodeURIComponent(f)}`,{method:"DELETE"})},isMine(f){return f.id?f.id===(a??Ye(t))?.reviewerId||f.id===Xn(t):!1},canModerate(){const f=a??Ye(t);return!!f?.member&&!!f.moderator},can(f){return(a??Ye(t))?.permissions.includes(f)??!1},async createComment(f,g){const p=await m(`/threads/${encodeURIComponent(f)}/comments`,{method:"POST",body:JSON.stringify({id:g.id,body:g.body})});return{id:p.id,snagId:f,body:p.body,author:p.author,createdAt:p.createdAt}},async patchComment(f,g){return await m(`/comments/${encodeURIComponent(f)}`,{method:"PATCH",body:JSON.stringify({body:g})}),null},async deleteComment(f){await m(`/comments/${encodeURIComponent(f)}`,{method:"DELETE"})}}}async function Cs(e,t){if(e.url&&/^https?:/i.test(e.url))try{const n=await fetch(e.url,{credentials:"omit"});if(!n.ok)return null;const o=await n.blob();return o.type&&!o.type.startsWith("image/")?null:o}catch{return null}return t(e.id)}const Ts=64,Rs=4096,_s=e=>le.counts(e),Is=e=>e.filter(t=>t.status!=="resolved").length;function Ps(e,t,n){const o=new Map;for(const a of t){const d=o.get(a.route)??{n:0,seen:""};a.status!=="resolved"&&d.n++,a.updatedAt>d.seen&&(d.seen=a.updatedAt),o.set(a.route,d)}o.has(n)||o.set(n,{n:0,seen:new Date().toISOString()});const c=[...o.entries()].sort((a,d)=>d[1].seen.localeCompare(a[1].seen)).slice(0,Ts);c.some(([a])=>a===n)||(c[c.length-1]=[n,o.get(n)]);let u={v:1,p:Is(t),r:Object.fromEntries(c.map(([a,d])=>[a,d.n])),t:new Date().toISOString()};JSON.stringify(u).length>Rs&&(u={...u,r:{}});try{localStorage.setItem(_s(e),JSON.stringify(u))}catch{return null}return u}function Ms(e,t){return e?.r[t]??0}const zs="pass(?:word|wd)?|pwd|secret|token|api[_-]?key|apikey|auth(?:orization)?|credential|session|sid|cookie|jwt|bearer|otp|mfa|totp|cvv|cvc|ssn|nino|iban|card(?:[_-]?number)?|account[_-]?number|private[_-]?key|signature|client[_-]?secret|refresh[_-]?token|access[_-]?token",Os=new RegExp(`(["'\`]?)(?<![A-Za-z0-9])(?:${zs})[\\w-]*\\b\\1?\\s*[:=]\\s*(?:(["'\`])((?:\\\\.|(?!\\2)[^\\\\])*)\\2|([^\\s,;&}\\])]{3,}))`,"gi"),Ls=/^(?:Bearer|Basic|Digest|Negotiate|Token)$/i,Ds=(e,t,n,o,r,c,u)=>{if(!n&&Ls.test(r)&&u.slice(c+e.length).startsWith(" [redacted]")||(n?o:r).startsWith("[redacted"))return e;const a=n?`${n}${o}${n}`:r;return e.slice(0,e.length-a.length)+(n?`${n}[redacted]${n}`:"[redacted]")},Jn=/data:[a-z0-9.+-]*\/?[a-z0-9.+-]*;base64,[A-Za-z0-9+/=]{16,}/gi,qn=/\beyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{0,}/g,Qn=/\b(sk-[A-Za-z0-9]+-[A-Za-z0-9_-]{20,}|sk-ant-[A-Za-z0-9_-]{20,}|sk-[A-Za-z0-9]{20,}|(sk|pk|rk)_(live|test)_[A-Za-z0-9]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[baprs]-[A-Za-z0-9-]{10,}|xapp-[A-Za-z0-9-]{10,}|AKIA[0-9A-Z]{16}|ASIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}|ya29\.[A-Za-z0-9_-]{20,}|SG\.[A-Za-z0-9_-]{20,}|npm_[A-Za-z0-9]{30,}|dop_v1_[a-f0-9]{40,}|shpat_[a-f0-9]{30,}|sbp_[a-f0-9]{30,}|hf_[A-Za-z0-9]{30,}|nvapi-[A-Za-z0-9_-]{20,})\b/g,Ns=/\b(Bearer|Basic|Digest|Negotiate|Token)\s+[A-Za-z0-9._~+/=-]{8,}/gi,Gn=/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z]{2,24})+\b/g,Jt=/\b(?:\d[ -]?){12,18}\d\b/g,eo=/\b(?=[A-Za-z0-9+/]*[a-z])(?=[A-Za-z0-9+/]*[A-Z])(?=[A-Za-z0-9+/]*\d)[A-Za-z0-9+/]{40,}={0,2}\b/g,to=/\b[0-9a-f]{32,}\b/gi,no=/\b(?=[A-Za-z0-9_-]*[a-z])(?=[A-Za-z0-9_-]*[A-Z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]{40,}\b/g,oo=/\b[a-z][a-z0-9]{1,15}(?:_[a-z0-9]{1,15}){0,2}_(?=[A-Za-z0-9_-]*[A-Z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]{24,}\b/g,ro=/\b[a-z][a-z0-9+.-]*:\/\/[^\s/:@]+:[^\s/@]+@/gi,Hs=/^(?=[A-Za-z0-9_~.+/=-]*[a-z])(?=[A-Za-z0-9_~.+/=-]*[A-Z])(?=[A-Za-z0-9_~.+/=-]*\d)[A-Za-z0-9_~.+/=-]{24,}$/;function $e(e,t){e.lastIndex=0;const n=e.test(t);return e.lastIndex=0,n}function so(e){const t=e.replace(/[ -]/g,"");if(t.length<13||t.length>19)return!1;let n=0,o=!1;for(let r=t.length-1;r>=0;r--){let c=t.charCodeAt(r)-48;o&&(c*=2,c>9&&(c-=9)),n+=c,o=!o}return n%10===0}function Ws(e){Jt.lastIndex=0;for(const t of e.matchAll(Jt))if(so(t[0]))return!0;return!1}function At(e){let t=e;return t=t.replace(Jn,"data:[redacted]"),t=t.replace(Ns,"$1 [redacted]"),t=t.replace(Os,Ds),t=t.replace(qn,"[redacted:jwt]"),t=t.replace(Qn,"[redacted:key]"),t=t.replace(oo,"[redacted:key]"),t=t.replace(ro,"[redacted:url-cred]@"),t=t.replace(Gn,"[redacted:email]"),t=t.replace(Jt,n=>so(n)?"[redacted:card]":n),t=t.replace(no,n=>`[redacted:b64:${n.length}]`),t=t.replace(eo,n=>`[redacted:b64:${n.length}]`),t=t.replace(to,n=>`[redacted:hex:${n.length}]`),t}const Fs=bt.query,Bs=bt.fragment;function Us(e,t=[]){let n;try{const o=globalThis.location?.href;n=new URL(e,o)}catch{return At(e)}n.username="",n.password="";for(const o of[...n.searchParams.keys()]){if(Bs.includes(o)){n.searchParams.set(o,"[redacted]");continue}if(Fs.includes(o))continue;if(!t.includes(o)){n.searchParams.set(o,"[redacted]");continue}const r=n.searchParams.get(o)??"";At(r)!==r&&n.searchParams.set(o,"[redacted]")}return n.hash&&n.hash.length>1&&(n.hash=t.includes("#")?n.hash:"#[redacted]"),At(n.toString().replace(/%5Bredacted%5D/gi,"[redacted]"))}function js(e){return e.length>120?!0:$e(Gn,e)||$e(qn,e)||$e(Qn,e)||$e(to,e)||$e(eo,e)||$e(Jn,e)||$e(no,e)||$e(oo,e)||$e(ro,e)||Hs.test(e)||Ws(e)}const kt={id:"rev_local",name:B("author.unknown"),kind:"guest"},Zs="0.0.0";function ao(e,t){if(e)return{...kt,name:e,...t?{email:t}:{}};try{const n=localStorage.getItem(le.identity);if(n)return{...kt,name:n[0]==="{"?JSON.parse(n).name??kt.name:n}}catch{}return kt}function Vs(e){return`SN-${e.reduce((n,o)=>{const r=Number(o.key.split("-")[1]??0);return Number.isFinite(r)&&r>n?r:n},0)+1}`}let qt=null;const ve=e=>Hr(e,qt);function Ys(e,t){const n=vn(),o=n.ownerDocument??document,r=o.defaultView??window,c=t?.config?.site??"local",u=t?.emit??(()=>{}),a=t?.assetBase??"./",d=t?.config?.env??"default";nt(n,"tokens",Bo);const y=jo(n.host,Uo(t?.config?.theme)),w={},T=t?.config?.storage==="local"?void 0:t?.config?.host,m=T&&c!=="local"?Es(T,c,t?.config?.env,{reviewToken:t?.reviewToken,onSessionEnded:s=>{se.show(s==="revoked"?"error.linkrevoked":"error.sessionended")},onSessionStarted:()=>se.hide()}):ms(c,d,{put:(s,i)=>w.put(s,i),del:s=>w.del(s)}),f=bs(c,d);let g=null;m.init({uid:c,env:d}).then(s=>{g=s.rounds??null,j?.update(x()),s.writable===!1&&s.reason==="origin_not_allowed"&&se.show("error.origin",void 0,{origin:location.origin})}).catch(()=>{});let p=[],$=[];const D=ps();let O=null,V=null,re=!1,Y=!1,Ee=!1,ee=null,te=!1;const Me={get:()=>O,unavailable:()=>Y||Ee,newPass:()=>V?.createPassCaches(),fuzzyHit:s=>ee?.hit(s)??null,wantFuzzy:(s,i)=>{if(ee){ee.enqueue(s,i,()=>Q());return}te||!V||!i.text?.exact||i.text.exact.length<8||(te=!0,Ie("anchor-fuzzy",a,o).then(h=>{if(!h.ok||!V){Ee=!0,Q();return}ee=h.mod.createFuzzyEngine(o,V.fuzzyDeps),Te()}))},want:s=>{re||!(s.role&&s.accessibleName)&&!s.text?.exact&&!s.path?.length||(re=!0,Ie("anchor-ext",a,o).then(i=>{if(!i.ok){Y=!0,Q();return}V=i.mod,O=i.mod.resolveExtended,Te()}))}};let pe=null,l=Cr();const _=()=>l.statuses.length>0||!!l.by||!!l.page||l.read!=="all",S=yr(n,s=>{if(M==="add"){if(N?.hasText()){N.pulse();return}N?.close(),N=null,fe("comments")}v(s.id)},Me,s=>{pe=s,j?j.update(x()):v()});let M=(()=>{try{return sessionStorage.getItem(le.mode)==="comments"?"comments":"browse"}catch{return"browse"}})(),N=null,j=null,G=null,Fe=!1,we=null,Be=!1,$t=null,Ce=null,xe=null,ze=!1;function de(){return xe?Promise.resolve(xe):ze?Promise.resolve(null):Ie("capture",a,o).then(i=>i.ok?(w.put=i.mod.putBlob,w.del=i.mod.deleteBlob,xe=i.mod):(Ke(new Error("chunk unavailable")),null))}function Ke(s){ze||(ze=!0,M==="add"&&fe("comments"),J.setDegraded(!0),se.show("error.capture",{label:"action.retry",run:()=>{ze=!1,J.setDegraded(!1),de()}}),console.warn(`[${be}] the capture chunk failed to load`,s))}let Je=0;function Oe(){const s=new URL(a,o.location.href).href,i=new URL(_e.panels,s);return i.searchParams.set("cv",Zs),Je>0&&i.searchParams.set("r",String(Je)),Je++,import(i.href)}async function Se(){if(Be)return null;if(we)return we.catch(()=>null);we=Oe().catch(async()=>(await new Promise(s=>setTimeout(s,1e3)),Oe()));try{return $t=await we}catch(s){return we=null,it(s),null}}function it(s){Be=!0,M==="add"&&fe("comments"),J.setDegraded(!0),se.show("error.panels",{label:"action.retry",run:()=>{Be=!1,J.setDegraded(!1),v(G)}}),console.warn(`[${be}] the panels chunk failed to load`,s)}const Ae=o.defaultView?.matchMedia?.("(pointer: coarse)").matches??!1;let ie=null;async function Et(){if(ie)return;const s=await de();!s||ie||(ie=s.createAddChrome(n,Ae,{pick:(i,h)=>void E(i,h),announce:Qe}),ie.setActive(M==="add"))}const ue=o.createElement("div");ue.style.cssText=`position:fixed;left:0;top:0;pointer-events:none;z-index:${Ve.dock}`,n.appendChild(ue);const ct=Ir(r,ue,s=>J.setPuck(s>1.2)),se=vr(n,ue),Ue=xr(n,ue),A=Qo(n,{onPick:(s,i)=>void E(s,i),onHover:s=>s?ie?.show(s):ie?.clear(),onSelectStart:()=>{Ae||nn()}});async function E(s,i){if(N?.hasText()){N.pulse();return}N?.close();const[h,R]=await Promise.all([Se(),de()]);if(!h||!R)return;const F=R.captureContext({page:R.derivePageRef(o.location,ht()),...mt()});hn(s);const Z=R.deriveAnchorLabel(s);b(h,s,i,F,Z,R)}function b(s,i,h,R,F,Z,U,He){let ge=i;pt=!1;const he=ve(o);_t=!1;const gt=()=>{N=null,Bn(he),J.setDraft(jt()),fe("comments")},tt=()=>{et?.abort(),Ne=et=null,gt()},ye={at:h,label:F,...U?{initialBody:U.body,initialName:U.author,...U.email?{initialEmail:U.email}:{}}:{},onDraft:(oe,ae,yt)=>{const Ao=ts({route:he,body:oe,author:ae,...yt?{email:yt}:{},label:F,anchor:He??Z.createElementAnchor(i,{point:h,viewportWidth:r.innerWidth,label:F,...Z.describeElement(i)}),at:{x:h.x+r.scrollX,y:h.y+r.scrollY},savedAt:new Date().toISOString()});J.setDraft(jt()),!Ao&&!_t&&(_t=!0,an())},onSend:(oe,ae,yt)=>{gt(),cn(ge,h,R,oe,ae,yt,He)},onRetarget:oe=>{const ae=oe==="up"?Z.widen(ge):Z.narrow(ge);ae&&(ge=ae,ie?.show(ae),N?.setLabel(Z.deriveAnchorLabel(ae)))},...ce&&Ge!==!1?{onShotOptIn:oe=>pt=oe}:{},onCancel:tt,crumbsOn:fn!==!1,shotsOn:Ge!==!1,...T&&c!=="local"?{serverHost:new URL(T).host}:{},...T&&m.adoptSession?{studio:{host:T,uid:c,env:t?.config?.env,member:m.member(),adopt:oe=>m.adoptSession(oe),signOut:()=>m.signOut()}}:{},...He?.text?.exact?{quote:He.text.exact}:{}};N=s.openComposer(n,ye,ue),q()}async function H(){const s=ve(o),i=ns(s);if(J.setDraft(jt()),!i||N)return;const[h,R]=await Promise.all([Se(),de()]);if(!h||!R)return;const F=Ft(i.anchor,o,{viewportWidth:r.innerWidth,...O?{extended:O}:{}});if(!F.element)return;const Z=F.element.getBoundingClientRect();if(Z.width===0&&Z.height===0)return;const U={x:i.at.x-r.scrollX,y:i.at.y-r.scrollY};fe("add"),b(h,F.element,U,R.captureContext({page:R.derivePageRef(o.location,ht()),...mt()}),i.label,R,{body:i.body,author:i.author,...i.email?{email:i.email}:{}})}async function v(s=null){if(s&&s!==G&&u("thread:open",{threadId:s}),s&&f.mark(s),G=s,Fe=!0,M==="browse"&&fe("comments"),j){j.update(x());return}if(!await Se())return;const h=await Ie("dock",a,o);if(!h.ok){se.show("error.panels",{label:"action.retry",run:()=>void v(G)});return}!Fe||j||(Ce=h.mod,j=h.mod.openDock(n,x(),ue),q())}function z(){f.markAll(p),l.newOnly&&(l={...l,newOnly:!1}),Fe=!1,j?.close(),j=null,G=null,S.highlight(null),q(),_()&&Q()}function C(s){const i=s?p.find(h=>h.id===s):void 0;if(i&&i.route!==ve(o)){$r(r,i.id),r.location.assign(i.route);return}s&&f.mark(s),G=s,S.highlight(null),_()?Q():j?.update(x()),i&&Ce?.scrollToSnag(r,n,i)}function x(){return{snags:p,route:ve(o),openId:G,seenAt:f.map(),onOpen:C,onStatus:(s,i)=>void uo(s,i),onReply:(s,i,h)=>void ho(s,i,h),onEdit:(s,i)=>void X(s,i),onDeleteComment:s=>void L(s),onDeleteThread:s=>void W(s),...m.isMine?{isMine:s=>m.isMine(s)}:{},...T&&m.adoptSession?{studio:{host:T,uid:c,env:t?.config?.env,member:m.member(),adopt:s=>m.adoptSession(s),signOut:()=>m.signOut()}}:{},canDeleteOwnThread:m.can?m.can("thread:delete:own"):!0,canModerate:m.canModerate?.()??!1,...m.listAssignees&&m.can?.("thread:assign")?{assignees:()=>m.listAssignees(),onAssign:(s,i)=>void fo(s,i)}:{},onClearAll:()=>void K(),onClose:z,onExport:Rt,onHover:s=>S.highlight(s),...g&&g.length>1&&m.setRound?{rounds:g,activeRound:m.getRound?.()??g.find(s=>!s.closed)?.number??g[0].number,onRound:s=>{m.setRound(s),Te()}}:{},onAnnounce:Qe,loadShot:s=>Cs(s,async i=>{const h=await de();return h?(await h.getBlob(i))?.blob??null:null}),filter:l,onFilter:s=>{const i=s.statuses.join()!==l.statuses.join()||s.by!==l.by||s.page!==l.page||s.read!==l.read;l=s,i?Q():j?.update(x())},...pe?{clusterFilter:pe}:{},onClusterClear:()=>{pe=null,j?.update(x())},onShowAnyway:s=>{S.showGhost(s),Ce?.scrollToSnag(r,n,s)}}}async function ne(s,i){const h=p;p=s,Q();try{await Re(i)}catch{p=h,Q(),se.show("error.sendfailed",void 0,{item:"change"})}}async function X(s,i){await ne(p.map(h=>({...h,comments:h.comments.map(R=>R.id===s?{...R,body:i}:R)})),()=>m.patchComment(s,i))}async function L(s){await ne(p.map(i=>({...i,comments:i.comments.filter(h=>h.id!==s)})),()=>m.deleteComment(s))}async function W(s){const i=G;G===s&&(G=null),await ne(p.filter(h=>h.id!==s),()=>m.deleteThread(s)),p.some(h=>h.id===s)&&(G=i)}async function K(){const s=p.map(i=>i.id);p=[],G=null,Q(),await Promise.all(s.map(i=>Re(()=>m.deleteThread(i))))}const J=cs(n,{onState:s=>fe(s),onPanel:()=>j?z():void v(),onNav:s=>en(s),parent:ue}),ce=r.matchMedia?.("(pointer: coarse)").matches??!1,q=()=>{ce&&J.setConcealed(!!N||!!j)};let me=null,Le=[];function lt(s){let i=!1;const h=()=>{i||(i=!0,r.removeEventListener("scrollend",h),s())};r.addEventListener("scrollend",h,{once:!0}),r.setTimeout(h,600)}const qe=o.createElement("div");qe.setAttribute("aria-live","polite"),qe.setAttribute("role","status");const Qt="position:absolute;width:1px;height:1px;overflow:hidden";qe.style.cssText=Qt;const Ct=o.createElement("div");Ct.setAttribute("aria-live","assertive"),Ct.style.cssText=Qt,n.append(qe,Ct);let Gt=0;function Qe(s){r.clearTimeout(Gt),Gt=r.setTimeout(()=>{qe.textContent=s},400)}function en(s){const i=Le.length;if(i===0)return;me=me===null?s===1?0:i-1:(me+s+i)%i;const h=Le[me];ds(r,n,h);const R=me+1;lt(()=>{S.pulse(h.id),Qe(B("nav.announce",{n:R,label:h.anchor.label,i:R,total:i}))})}function tn(){if(M!=="comments"||Ae){ke?.disarm();return}nn().then(s=>{s&&M==="comments"&&s.arm()})}let ke=null,Tt=null;async function nn(){if(ke)return ke;const s=await Ie("text",a,o);return!s.ok||ke||(Tt=s.mod,ke=s.mod.createSelectionWatcher(n,{onQuote:(i,h)=>void io(i,h)})),ke}async function io(s,i){const h=xe??await de();if(!h||!Tt)return;const R=Tt.createTextAnchor(s,h,{viewportWidth:r.innerWidth,ourRoot:n});if(R.kind==="refused-form-control"){E(R.el,i);return}if(R.kind!=="text")return;const F=await Se();if(!F)return;const Z=h.captureContext({page:h.derivePageRef(o.location,ht()),...mt()});try{s.removeAllRanges()}catch{}b(F,R.el,R.point,Z,R.label,h,void 0,R.record)}function fe(s,i=!1){const h=M;M=s,s!=="add"&&N&&!i&&(N.close(),N=null),s==="add"&&j&&z(),s==="add"&&(Se(),de());try{sessionStorage.setItem(le.mode,s==="add"?"comments":s)}catch{}A.setMode(s),s!==h&&Qe(B(`toolbar.${s}`)),q(),s==="add"&&Et(),tn(),ie?.setActive(s==="add"),J.setState(s),Q(),s!==h&&u("modechange",{mode:s,previous:h})}let je=0,on=0;const rn=[300,800,1600,3200];function co(){if(je||!S.hasPending()){S.hasPending()||(on=0);return}const s=rn[Math.min(on++,rn.length-1)];je=r.setTimeout(()=>{je=0,Q()},s)}const lo=3e3;let sn=0;function Q(s){const i=s??(Date.now()<sn?"navigating":"authoritative");$=S.reanchor(p.filter(wo()),i),vo(),co();const h=new Map($.map(U=>[U.id,U]));p=p.map(U=>h.get(U.id)??U);const R=_()?new Set($.filter(U=>!Rr(U,l,f.map())&&U.id!==G).map(U=>U.id)):void 0;Le=R?$.filter(U=>!R.has(U.id)):$,S.render(M==="browse"?[]:$,R);const F=ve(o),Z=D?Ps(o.location.origin,p,F):null;J.setCount(Z?Ms(Z,F):D?$.filter(U=>U.status!=="resolved").length:null),me!==null&&me>=Le.length&&(me=null),j?.update(x())}async function Te(){const{data:s}=await m.listThreads();p=s,Q();const i=S.settled();for(const h of i)u("anchor:settled",{threadId:h.id,state:h.state,strategy:h.strategy,confidence:h.confidence});return m.capabilities.anchorReports&&m.reportAnchors&&i.length&&Re(()=>m.reportAnchors(i.map(h=>({threadId:h.id,state:h.state,confidence:h.confidence,strategy:h.strategy})))),m.capabilities.anchorReports||await Promise.all(s.flatMap(h=>{const R=p.find(F=>F.id===h.id);return!R||R.anchorState===h.anchorState?[]:[Re(()=>m.patchThread(R.id,{anchor:R.anchor,anchorState:R.anchorState}))]})),$}async function uo(s,i){p=p.map(h=>h.id===s?{...h,status:i}:h),Q(),u("thread:resolve",{threadId:s,status:i}),await Re(()=>m.patchThread(s,{status:i}))}async function fo(s,i){p=p.map(h=>h.id===s?{...h,assignee:i}:h),Q(),await Re(()=>m.patchThread(s,{assignee:i&&i.id}))}async function ho(s,i,h){const R={id:Zn(),body:i,author:ao(h)};p=p.map(F=>F.id===s?{...F,comments:[...F.comments,{...R,snagId:s,createdAt:new Date().toISOString()}]}:F),f.mark(s),Q(),u("comment:create",{threadId:s,comment:R}),await Re(()=>m.createComment(s,R))}function an(){se.show("error.quota",{label:"action.exportclear",run:()=>{Rt("json"),K()}}),console.warn(`[${be}] ${B("error.quota")}`)}async function Re(s){try{return await s()}catch(i){if(i instanceof Dt&&i.code==="local_quota_exceeded")return an(),null;throw i}}function Rt(s){de().then(async i=>{if(!i)return;const h=await i.resolveAttachmentUris(p).catch(()=>new Map);i.download(n,i.buildExport(s,p,{origin:o.location.origin,exportedAt:new Date().toISOString()},h),r)})}async function cn(s,i,h,R,F,Z,U){const He=ao(F,Z),ge=xe??await de();if(!ge)throw new Error(`[${be}] add() needs the capture chunk`);Ne||hn(s);const he=Ne?await Ne:null;Ne=et=null,ge.applyShotOutcome(h,he,Ge===!1,ce&&!pt);const gt=he?.blob&&m.uploadAttachment?m.uploadAttachment(he.blob,{kind:"screenshot",...he.width!==void 0?{width:he.width}:{},...he.height!==void 0?{height:he.height}:{}}).catch(()=>null):Promise.resolve(null),tt={id:us(),key:Vs(p),route:ve(o),anchor:U??ge.createElementAnchor(s,{point:i,viewportWidth:r.innerWidth,label:ge.deriveAnchorLabel(s),...ge.describeElement(s)}),anchorState:"anchored",scope:yo(),context:h,createdBy:He,createdAt:new Date().toISOString(),...R?{comment:{id:Zn(),body:R,author:He}}:{}},ye=Cn(tt);he?.blob&&(ye.screenshotBlob=he.blob),p=[...p,ye],f.mark(ye.id),Qe(B("announce.created",{key:ye.key})),u("thread:create",{thread:ye}),M==="browse"?fe("comments"):Q();try{const oe=await gt;oe&&(tt.attachments=[oe],p=p.map(ae=>ae.id===ye.id?{...ae,attachments:[oe]}:ae),Q()),await Re(()=>m.createThread(tt))}catch(oe){throw p=p.filter(ae=>ae.id!==ye.id),Q(),se.show("error.sendfailed",void 0,{item:Pt.toLowerCase()}),console.warn(`[${be}] ${B("error.sendfailed",{item:Pt.toLowerCase()})}`,oe),oe}return ye}function ln(s){if((s.key==="n"||s.key==="p")&&M==="comments"&&!N){if(s.metaKey||s.ctrlKey||s.altKey)return;const i=s.composedPath()[0]??s.target;if(i&&(i.closest?.("input,textarea,select,[contenteditable]")||i.isContentEditable))return;s.preventDefault(),s.stopPropagation(),en(s.key==="n"?1:-1);return}M==="add"&&s.key==="Escape"&&(N||(s.stopPropagation(),fe("comments")))}o.addEventListener("keydown",ln,!0);let dn=0;const un=()=>{if(o.hidden||!m.revalidate)return;const s=Date.now();s-dn<3e4||(dn=s,m.revalidate())};o.addEventListener("visibilitychange",un);const po=Lo(n),mo=Do(n,s=>{console.warn(`[${be}] the host page hid the widget from assistive technology ${s} times; leaving it alone.`)}),go=Oo(n,s=>{console.warn(`[${be}] the host page removed the widget ${s} times; leaving it alone. Reload to comment again.`)});function yo(){return{environment:d,...t?.config?.branch?{branch:t.config.branch}:{}}}let dt={route:ve(o),url:o.location.href},_t=!1,ut=null;function bo(s){if(s){if(M==="browse")return;ut=M,fe("browse",!0),Ue.show(),u("paused",{reason:"modal-dialog"})}else if(ut){const i=ut;ut=null,Ue.hide(),fe(i),u("resumed",{mode:i})}}Se();function vo(){$.length>0&&Ie("dock",a,o)}{const s=o.createElement("div");s.style.cssText="position:fixed;inset:0;pointer-events:none;visibility:hidden",n.appendChild(s);const i=s.getBoundingClientRect(),h=Math.abs(i.left)>1||Math.abs(i.top)>1||Math.abs(i.width-r.innerWidth)>1||Math.abs(i.height-r.innerHeight)>1;s.remove(),h&&(console.warn(`[${be}] fixed-trapped: <html> has transform/filter/contain, so our fixed layer follows it, not the viewport. Remove it, or expect drift.`),u("error",{code:"fixed-trapped"}))}let Ze=null;const ft=new Set,De=(()=>{const s=r[Co.config];return s&&typeof s=="object"?s:void 0})(),fn=De?.breadcrumbs,It=(()=>{const s=De?.significantQueryParams,i=De?.ignoredQueryParams,h={};return s==="*"?h.significantQueryParams="*":Array.isArray(s)&&(h.significantQueryParams=s.map(String)),Array.isArray(i)&&(h.ignoredQueryParams=i.map(String)),h})(),ht=()=>({routeOverride:qt,query:It,doc:o}),Ge=De?.screenshot===!1?!1:De?.screenshot&&typeof De.screenshot=="object"?De.screenshot:{};let pt=!1,Ne=null,et=null;function hn(s){if(Ge===!1||Ne||ce&&!pt)return;et=new AbortController;const i=et.signal;Ne=Ie("screenshot",a,o).then(h=>h.ok?h.mod.captureScreenshot({doc:o,target:s,signal:i,...Ge,...m.fetchForeignImage?{fetchForeignImage:R=>m.fetchForeignImage(R)}:{}}):{situation:"engine-load-failed",blindSpots:[],maskedCount:0})}function wo(){const s=ve(o),i=Hn(o.location.pathname),h=Ur(o.location.search,It);return R=>(R.route===s||R.context?.page?.pathname===i)&&jr(R.context?.page?.query,h,It)}{const s=fn;s!==!1&&Ie("crumbs",a,o).then(i=>{i.ok&&(Ze=i.mod.installTierC({win:r,...t?.early?{early:t.early}:{},...s&&typeof s=="object"?{config:s}:{},subscribeNav:h=>(ft.add(h),()=>ft.delete(h))}))})}const mt=()=>Ze?{breadcrumbs:{records:Ze.drain(),status:Ze.status()}}:{},xo=Kr(o,r,()=>{M!=="browse"&&$.length>0&&Q()}),So=kr(r,{onResize:()=>Q(),onRoute:()=>{const s={route:ve(o),url:o.location.href},i=s.route!==dt.route;if(i){u("navigate",{from:dt,to:s});for(const h of ft)h(dt.url,s.url)}if(dt=s,!i){Te();return}sn=Date.now()+lo,r.setTimeout(()=>{m.listThreads().then(({data:h})=>{p=h,Q("optimistic")})},100),r.setTimeout(()=>void Te(),600)},onModal:bo});return J.setState(M),A.setMode(M),tn(),D||se.show("error.nostorage",{label:"action.export",run:()=>Rt("md")}),Te().then(async s=>{const i=Er(r);if(!i){const R=new URLSearchParams(o.location.search).get(Po("t"));if(R){let F=s.find(Z=>Z.key===R);if(!F&&m.getThreadByKey){const Z=await m.getThreadByKey(R).catch(()=>null);Z&&(p=[...p.filter(U=>U.id!==Z.id),Z],Q(),F=p.find(U=>U.id===Z.id))}F?(await v(F.id),Ce?.scrollToSnag(r,n,F)):(se.show("permalink.unknown"),await v(null));return}await H();return}const h=s.find(R=>R.id===i);await v(h?i:null),h&&Ce?.scrollToSnag(r,n,h)}),{root:n,assetBase:t?.assetBase??"",snags:()=>$,async add(s,i,h,R){const F=R?null:await de(),Z=R??(F?F.captureContext({page:F.derivePageRef(o.location,ht()),...mt()}):void 0);if(!Z)throw new Error(`[${be}] add() needs the capture chunk, or an explicit context`);return cn(s,i,Z,h)},refresh:Te,setRoute(s){qt=s&&s.startsWith("/")?s:null,Te()},setState:fe,getState:()=>M,openPanel:v,async open(s){const i=s.startsWith(vt.thread)?p.find(h=>h.id===s):p.find(h=>h.key===s);return i?i.route!==ve(o)?{ok:!1,reason:"wrong-page",url:i.context?.url??i.route,route:i.route}:(await v(i.id),Ce?.scrollToSnag(r,n,i),{ok:!0,anchorState:i.anchorState}):{ok:!1,reason:"not-found"}},closePanel:z,hitTest:(s,i)=>A.hitTest(s,i),destroy(){N?.close(),z(),ie?.destroy(),se.destroy(),Ue.destroy(),ct(),go(),mo(),po(),So.destroy(),xo.destroy(),Ze?.destroy(),Ze=null,ft.clear(),ke?.destroy(),ke=null,ee?.destroy(),ee=null,je&&r.clearTimeout(je),je=0,o.removeEventListener("keydown",ln,!0),o.removeEventListener("visibilitychange",un),y(),A.destroy(),S.destroy(),J.destroy(),n.host.remove()}}}export{yn as HOST_CSS,vn as createHost,js as isSensitiveValue,Ys as mount,At as redactText,Us as redactUrl};
|
|
1
|
+
const we="Snagset",$o="snagset",pn="snagset.v1",Eo="Snagset",Pt="Snag",Co="Snags",To={config:"SnagsetConfig"},Ro={root:"data-snag-root"},Mt=e=>Ro[e],_o={anchor:"data-snag-anchor",ignore:"data-snag-ignore",mask:"data-snag-mask",nomask:"data-snag-nomask",src:"data-snag-src",component:"data-snag-component"},Io=e=>_o[e],P={font:"--snag-font",accent:"--snag-accent",onAccent:"--snag-onAccent",bg:"--snag-bg",fg:"--snag-fg",muted:"--snag-muted",border:"--snag-border",radius:"--snag-radius",shadow:"--snag-shadow",z:"--snag-z",motion:"--snag-motion",surface:"--snag-surface",sunken:"--snag-sunken",hover:"--snag-hover",focus:"--snag-focus",disabled:"--snag-disabled",statusOpen:"--snag-status-open",statusProgress:"--snag-status-progress",statusReview:"--snag-status-review",statusResolved:"--snag-status-resolved",anchorOrphan:"--snag-anchor-orphan",tbH:"--snag-tb-h",dockW:"--snag-dock-w",kb:"--snag-kb",thumbX:"--snag-thumb-x",thumbW:"--snag-thumb-w"},Po=e=>`var(${P[e]})`,Mo=e=>"snag_"+e,bt={query:["snag_t","snag_off","snag_debug","snag_theme"],fragment:["snag_k"]},zo="snag:disclosure:v1",zt="snag:identity",mn="data-snag-theme",de={session:e=>`snag:session:${e}`,silent:e=>`snag:silent:${e}`,identity:zt,threads:(e,t)=>`snag:threads:${e}:${t}`,seen:(e,t)=>`snag:seen:${e}:${t}`,counts:e=>`snag:counts:${e}`,draft:(e,t)=>`snag:draft:${e}:${t}`,outbox:e=>`snag:outbox:${e}`,mode:"snag:mode",handoff:"snag:handoff",seenCoach:"snag:seen-coach",disclosure:zo},Ie={panels:"snag.panels.js",crumbs:"snag.crumbs.js",capture:"snag.capture.js",screenshot:"snag.screenshot.js",anchorExt:"snag.anchor-ext.js",anchorFuzzy:"snag.anchor-fuzzy.js",dock:"snag.dock.js",text:"snag.text.js"},vt={thread:"thr_",comment:"cmt_",attachment:"att_"},Ot={attachmentKind:"x-snagset-attachment-kind",attachmentWidth:"x-snagset-attachment-width",attachmentHeight:"x-snagset-attachment-height"},Oo={route:"snagset:route"},gn={original:"snagset.original",wrapped:"snagset.wrapped"},yn="position:absolute!important;top:0!important;left:0!important;width:0!important;height:0!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important;z-index:2147483647;isolation:isolate;color-scheme:light dark;";function bn(e){const t=e.ownerDocument.defaultView?.getComputedStyle(e);return t?t.transform!=="none"&&t.transform!==""||t.filter!=="none"&&t.filter!==""||t.perspective!=="none"&&t.perspective!==""||/transform|filter|perspective|contain/.test(t.willChange)||/paint|layout|strict|content/.test(t.contain)||t.containerType!==void 0&&t.containerType!=="normal"&&t.containerType!=="":!1}function Dt(e){const t=e.documentElement,n=e.body;return t&&bn(t)?{parent:n??t,trapped:!0}:n&&bn(n)?{parent:t??n,trapped:!1}:{parent:n??t,trapped:!1}}function vn(e=document){const t=Mt("root"),n=e.querySelector(`[${t}]`);if(n?.shadowRoot)return n.shadowRoot;const o=e.createElement("div");return o.setAttribute(t,""),o.style.cssText=yn,Dt(e).parent.appendChild(o),o.attachShadow({mode:"open"})}function Do(e,t,n=5){const o=e.ownerDocument??document,r=e.host,l=Dt(o).parent;if(typeof MutationObserver!="function"||!l)return()=>{};let u=0;const a=new MutationObserver(()=>{if(!r.isConnected){if(u++,u>n){a.disconnect(),t(u);return}Dt(o).parent.appendChild(r)}});return a.observe(l,{childList:!0}),()=>a.disconnect()}const wn=[["pointerdown",!0],["mousedown",!0],["touchstart",!0],["pointerup",!0],["mouseup",!0],["touchend",!0],["click",!0],["dblclick",!0],["focusin",!0],["focusout",!0]];function Lo(e){const t=e.host,n=o=>o.stopPropagation();for(const[o,r]of wn)t.addEventListener(o,n,{passive:r});return()=>{for(const[o]of wn)t.removeEventListener(o,n)}}function No(e,t,n=20){const o=e.host;if(typeof MutationObserver!="function")return()=>{};let r=0;const l=()=>{let a=!1;return o.getAttribute("aria-hidden")==="true"&&(o.removeAttribute("aria-hidden"),a=!0),o.hasAttribute("inert")&&(o.removeAttribute("inert"),a=!0),a},u=new MutationObserver(()=>{l()&&++r>n&&(u.disconnect(),t(r))});return l(),u.observe(o,{attributes:!0,attributeFilter:["aria-hidden","inert"]}),()=>u.disconnect()}const Ho={product:we,set:Eo,item:Pt,items:Co};function xn(e){return(t,n)=>(e[t]??"").replace(/\{(\w+)\}/g,(o,r)=>{const l=n?.[r]??Ho[r];return l===void 0?o:String(l)})}const Wo=e=>new Intl.NumberFormat().format(e),Sn={"where.anchored":"{label}","where.approximate":"position approximate \u2014 the page changed","where.orphaned":"moved \u2014 the element is gone","status.open":"Active","status.progress":"In progress","status.review":"In review","status.resolved":"Resolved","author.unknown":"Someone","label.image":"an image","label.link":"a link","label.button":"a button","label.tag":"the {tag}"},An=xn(Sn),kn={open:{colour:"#4f6ef7"},progress:{colour:"#f59e0b"},review:{colour:"#8b5cf6"},resolved:{colour:"#10b981"}},$n=e=>e==="open"||e==="review"?"#fff":"#16161a",En=e=>e in kn?An(`status.${e}`):e,Uo=e=>An(`where.${e.anchorState}`,{label:e.anchor.label});class Lt extends Error{code;constructor(t,n){super(n??t),this.name="AdapterError",this.code=t}}function Cn(e){return{id:e.id,key:e.key,route:e.route,...e.scope?{scope:e.scope}:{},...e.attachments?.length?{attachments:e.attachments}:{},anchor:e.anchor,anchorState:e.anchorState,context:e.context,status:"open",comments:e.comment?[{id:e.comment.id,snagId:e.id,body:e.comment.body,author:e.comment.author,createdAt:e.createdAt}]:[],createdBy:e.createdBy,createdAt:e.createdAt,updatedAt:e.createdAt}}const k=Object.fromEntries(Object.keys(P).map(e=>[e,Po(e)])),jo=Object.entries(kn).map(([e,t])=>` ${P[`status${e[0].toUpperCase()}${e.slice(1)}`]}:${t.colour};`).join(`
|
|
2
|
+
`),Fo=` :host{all:initial}[hidden]{display:none!important}:host{display:block;font:400 14px/1.45 ${k.font};color:${k.fg};${P.font}:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;${P.accent}:#2a51b8;${P.bg}:#fefdfc;${P.fg}:#181716;${P.muted}:#666564;${P.border}:#e4e3e0;${P.radius}:8px;${P.shadow}:0 6px 24px -4px rgb(0 0 0 / .18);${P.z}:2147483647;${P.motion}:160ms;${P.surface}:color-mix(in srgb,${k.fg} 6%,${k.bg});${P.sunken}:color-mix(in srgb,${k.fg} 3%,${k.bg});${P.hover}:color-mix(in srgb,${k.fg} 8%,${k.bg});${P.onAccent}:#fff;${P.focus}:color-mix(in srgb,${k.accent} 62%,${k.fg});${P.disabled}:color-mix(in srgb,${k.muted} 52%,${k.bg});${jo} ${P.anchorOrphan}:#DC2626;}:host([${mn}="dark"]){${P.accent}:#8aafff;${P.onAccent}:#1d1c1a;${P.bg}:#1d1c1a;${P.fg}:#f0eeec;${P.muted}:#9a9997;${P.border}:#2d2c2b;${P.shadow}:0 6px 24px -4px rgb(0 0 0 / .6);}@media (prefers-reduced-motion:reduce){:host{${P.motion}:0ms}}@media (forced-colors:active){:host{${P.bg}:Canvas;${P.fg}:CanvasText;${P.muted}:CanvasText;${P.border}:CanvasText;${P.accent}:Highlight;${P.onAccent}:HighlightText;${P.surface}:Canvas;${P.sunken}:Canvas;${P.hover}:Canvas;${P.focus}:Highlight;${P.disabled}:GrayText;${P.shadow}:none;${P.anchorOrphan}:CanvasText;}.snag-pin{border-color:CanvasText!important;color:CanvasText!important;forced-color-adjust:none}}`,Ve={shield:1,pins:3,dock:5,notice:6,toolbar:7},Tn=new WeakMap;function nt(e,t,n){let o=Tn.get(e);if(o||Tn.set(e,o=new Set),o.has(t))return;o.add(t);try{const u=new CSSStyleSheet;u.replaceSync(n),e.adoptedStyleSheets=[...e.adoptedStyleSheets,u];return}catch{}const l=(e.ownerDocument??document).createElement("style");l.setAttribute(`data-snag-${t}`,""),l.textContent=n,e.appendChild(l)}function Bo(e){return e==="light"||e==="dark"?e:"auto"}function Zo(e,t){const n=mn;if(t!=="auto")return e.setAttribute(n,t),()=>e.removeAttribute(n);const o=e.ownerDocument?.defaultView?.matchMedia?.("(prefers-color-scheme: dark)");if(!o)return e.setAttribute(n,"light"),()=>e.removeAttribute(n);const r=()=>e.setAttribute(n,o.matches?"dark":"light");return r(),o.addEventListener("change",r),()=>{o.removeEventListener("change",r),e.removeAttribute(n)}}function Nt(e){return e.getBoundingClientRect()}function wt(e){if(e.closest('[inert],[aria-hidden="true"]'))return!1;const t=e.checkVisibility;if(typeof t=="function")return t.call(e,{contentVisibilityAuto:!0,opacityProperty:!1,visibilityProperty:!0});const n=Nt(e);if(!(n.width>0||n.height>0||e.getClientRects().length>0))return!1;const r=e.ownerDocument?.defaultView;return r?r.getComputedStyle(e).visibility!=="hidden":!0}const Vo="button,a[href],[role=button],[role=link],[role=tab],[role=menuitem],label,input,select,textarea,summary",Yo=3,Rn=8,Xo=new Set(["img","picture","canvas","video","audio","iframe","embed","object","svg","math","input","select","textarea","button","progress","meter"]);function Ko(e,t){return Xo.has(e.tagName.toLowerCase())?!1:t.getComputedStyle(e).display==="inline"}function _n(e){const t=e.ownerDocument?.defaultView;if(!t)return e;let n=e;for(let r=e;r;r=r.parentElement){const l=Nt(r);if(l.width>=Rn&&l.height>=Rn&&!Ko(r,t)){n=r;break}n=r}let o=0;for(let r=n;r&&o<=Yo;r=r.parentElement){if(r.matches(Vo))return r;o++}return n}const Jo=10,Ht=[["click",!1],["auxclick",!1],["dblclick",!1],["pointerdown",!1],["pointerup",!1],["mousedown",!1],["mouseup",!1],["contextmenu",!1],["dragstart",!1],["wheel",!1],["touchstart",!0],["touchmove",!0],["touchend",!0],["selectstart",!0],["keydown",!1],["keyup",!1]];function qo(e,t,n){let o=e;for(;o&&o!==o.ownerDocument.documentElement&&o!==o.ownerDocument.body;){const r=getComputedStyle(o),l=(r.overflowY==="auto"||r.overflowY==="scroll")&&o.scrollHeight>o.clientHeight&&(t>0&&o.scrollTop+o.clientHeight<o.scrollHeight-1||t<0&&o.scrollTop>0),u=(r.overflowX==="auto"||r.overflowX==="scroll")&&o.scrollWidth>o.clientWidth&&(n>0&&o.scrollLeft+o.clientWidth<o.scrollWidth-1||n<0&&o.scrollLeft>0);if(l||u)return o;o=o.parentElement}return null}function In(e,t){const n=t==="y"?e.deltaY:e.deltaX;return e.deltaMode===1?n*16:e.deltaMode===2?n*(t==="y"?innerHeight:innerWidth):n}const Qo=["position:fixed","inset:0",`z-index:${Ve.shield}`,"touch-action:pan-x pan-y pinch-zoom","background:transparent"].join(";");function Go(e,t={}){const n=t.doc??e.ownerDocument??document,o=n.defaultView??window;let r=t.coarsePointer??o.matchMedia?.("(pointer: coarse)").matches??!1;const l=c=>{const R=c.pointerType,w=R==="touch"?!0:R==="mouse"||R==="pen"?!1:r;w!==r&&(r=w,d())},u=n.createElement("div");u.className="snag-shield",u.style.cssText=Qo;let a="browse";const d=()=>{u.style.pointerEvents=r?"none":"auto",u.style.cursor="crosshair"};d();const g=c=>{const R=c;return!R||typeof R.closest!="function"?!1:e.contains(R)?!0:!!R.closest(`[${Mt("root")}]`)};function v(c,R,w){let I=w,O=0;for(;I.shadowRoot&&O++<Jo;){const W=C(I.shadowRoot,c,R);if(!W||W===I)break;I=W}return I}function C(c,R,w){const I=c.elementsFromPoint;if(typeof I=="function"){for(const W of I.call(c,R,w))if(W.getRootNode()===c)return W;return null}const O=c.elementFromPoint(R,w);return O&&O.getRootNode()===c?O:null}function p(c,R){const w=[];for(const I of n.elementsFromPoint(c,R)){if(g(I))continue;if(I===n.documentElement||I===n.body){w.push(I);continue}const O=v(c,R,I);w.push(g(O)?I:O)}return w}let _=null;const B=(c,R)=>{const[w]=p(c,R);w&&t.onPick?.(_n(w),{x:c,y:R})};let S=!1;const M=()=>{const c=n.getSelection?.();if(!c||c.isCollapsed||c.rangeCount===0||!c.toString().trim())return!1;const R=c.anchorNode;if(!R||e.contains(R))return!1;const w=R.nodeType===1?R:R.parentElement;return!g(w)},G=c=>{const R=c.composedPath()[0];if(R&&g(R)){S=!1;return}if(c.type==="selectstart"){t.onSelectStart?.();return}const w=c.type;if(w.endsWith("down")||w.endsWith("start")){S=!1;return}if(w.endsWith("up")||w.endsWith("end")){S=M();return}if(w==="click"||w==="auxclick"){if(!S)return;S=!1,c.preventDefault(),c.stopImmediatePropagation()}},q=c=>{if(c.type==="pointerdown"&&l(c),a==="comments"){G(c);return}if(a!=="add")return;if(c.type==="keydown"||c.type==="keyup"){z(c);return}const R=c.composedPath()[0];if(R&&R!==u&&g(R))return;const w=Ht.find(([I])=>I===c.type)?.[1]??!1;if(c.stopImmediatePropagation(),!w){if(r&&c.type==="pointerdown"){const I=c;_={x:I.clientX,y:I.clientY,t:performance.now()},ae(I.clientX,I.clientY)}if(r&&c.type==="pointerup"&&_){const I=c,O=_;_=null,Math.hypot(I.clientX-O.x,I.clientY-O.y)<=8&&performance.now()-O.t<=700&&B(I.clientX,I.clientY);return}if(c.type==="click"||c.type==="auxclick"||c.type==="dblclick"){c.preventDefault();const I=c;B(I.clientX,I.clientY);return}if(c.type==="wheel"){const I=c,O=In(I,"y"),W=In(I,"x"),[K]=p(I.clientX,I.clientY),re=qo(K??null,O,W);re&&(re.scrollTop+=O,re.scrollLeft+=W,c.preventDefault());return}if(c.type==="dragstart"||c.type==="contextmenu"){c.preventDefault();return}(c.type==="pointerdown"||c.type==="mousedown")&&!r&&c.preventDefault()}},Z=new Set(["Tab","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"," ","Spacebar","PageUp","PageDown","Home","End"]),h=/^[a-z0-9/?]$/;function m(c){for(const R of c.composedPath()){const w=R;if(!(!w||w.nodeType!==1||typeof w.matches!="function")&&w.matches('input:not([type=button]):not([type=submit]):not([type=checkbox]):not([type=radio]),textarea,select,[contenteditable=""],[contenteditable=true],[role=textbox],[role=searchbox],[role=combobox]'))return!0}return!1}function z(c){Z.has(c.key)||c.metaKey||c.ctrlKey||c.altKey||/^F\d{1,2}$/.test(c.key)||c.key!=="Escape"&&c.key.length===1&&h.test(c.key.toLowerCase())&&!m(c)&&(c.preventDefault(),c.stopImmediatePropagation())}for(const[c,R]of Ht)o.addEventListener(c,q,{capture:!0,passive:R});let L=0,N=null;function Y(){if(L=0,a!=="add"||!N)return;const[c]=p(N.x,N.y);t.onHover?.(c?_n(c):null)}function ae(c,R){a==="add"&&(N={x:c,y:R},!L&&(L=o.requestAnimationFrame(Y)))}return u.addEventListener("pointermove",c=>ae(c.clientX,c.clientY)),u.addEventListener("pointerleave",()=>{N=null,t.onHover?.(null)}),{shield:u,getMode:()=>a,setMode(c){a=c,S=!1,d(),c==="add"?e.appendChild(u):u.remove(),c!=="add"&&(N=null,t.onHover?.(null))},hitTest:p,destroy(){L&&o.cancelAnimationFrame(L);for(const[c]of Ht)o.removeEventListener(c,q,{capture:!0});u.remove()}}}const er=/[\u200B-\u200D\u2060\uFEFF]/gu,tr=/[\s\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+/gu,nr=[[/[\u2018\u2019\u201A\u201B]/gu,"'"],[/[\u201C\u201D\u201E\u201F]/gu,'"'],[/[\u2010-\u2015\u2212]/gu,"-"],[/\u2026/gu,"..."],[/\u2044/gu,"/"]];function or(e){let t=e.normalize("NFC").replace(er,"");for(const[n,o]of nr)t=t.replace(n,o);return t.replace(tr," ").trim()}const rr={testid:1,domid:1,css:.9,aria:.75,"text-exact":.8,"text-fuzzy":.78,"path-rect":.35,none:0,manual:1},Pn={anchored:.75,approximate:.35};function sr(e,t){const n=rr[e];return t===1?n:n/(1+Math.log2(t))}function Mn(e){return e>=Pn.anchored?"anchored":e>=Pn.approximate?"approximate":"orphaned"}const ar=[Io("anchor"),"data-testid","data-test-id","data-test","data-cy","data-qa","data-pw","data-automation-id"],zn=e=>typeof CSS<"u"&&CSS.escape?CSS.escape(e):e.replace(/["\\]/g,"\\$&"),ir=[{strategy:"testid",applicable:e=>!!e.testid,find:(e,t)=>Wt(t,ar.map(n=>`[${n}="${zn(e.testid)}"]`).join(","))},{strategy:"domid",applicable:e=>!!e.domid,find:(e,t)=>Wt(t,`#${zn(e.domid)}`)},{strategy:"css",applicable:e=>!!e.css,find:(e,t)=>{try{return Wt(t,e.css)}catch{return[]}}}];function Wt(e,t){return[...e.querySelectorAll(t)].filter(cr)}function cr(e){return!e.closest(`[${Mt("root")}]`)}function lr(e,t){const n=t.text?.exact;if(!n)return!0;const o=or(e.textContent??"");return o?o===n||o.includes(n)||n.includes(o):!0}function On(e,t,n,o){wt(e)||o.push("hidden"),t.hostPath?.length&&o.push("shadow-boundary");const r=!lr(e,t);r&&o.push("text-drift");let l=o.includes("hidden")?Math.min(n,.7):n;return r&&(l=Math.min(l,.5)),l}const dr={element:null,strategy:"none",score:0,state:"orphaned",reasons:["not-found"],candidates:0};function Ut(e,t=document,n={}){const o=[];for(const r of ir){if(!r.applicable(e))continue;const l=r.find(e,t);if(l.length===0)continue;const u=sr(r.strategy,l.length),a=l[0];l.length>1&&o.push("ambiguous");const d=On(a,e,u,o),g={element:a,strategy:r.strategy,score:d,state:Mn(d),reasons:o.length?o:["exact"],candidates:l.length};if(g.reasons.includes("text-drift")&&n.extended){const v=n.extended(e,t,{...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.passCaches?{caches:n.passCaches}:{}});if(v&&v.score>g.score)return v}return g}return n.extended?.(e,t,{...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.passCaches?{caches:n.passCaches}:{}})??dr}const ur={"toolbar.aria":"{product} review toolbar","toolbar.group":"What you see","toolbar.browse":"Browse","toolbar.comments":"Comment","toolbar.comments.unresolved":"Comment, {n} unresolved","toolbar.add":"Add a comment","toolbar.add.draft":"Add a comment \u2014 one is unfinished","toolbar.panel":"All comments","pin.aria":"Comment {key} on {target}. {status}, {replies} replies. Press Enter.","pin.aria.one":"Comment {key} on {target}. {status}, 1 reply. Press Enter.","pin.aria.none":"Comment {key} on {target}. {status}. Press Enter.","pin.aria.moved":"Comment {key} on {target}. {status}. {where}. Press Enter.","pin.target":"{role} \u201C{name}\u201D","cluster.aria":"{n} comments here: {list}","nav.announce":"Comment {n} on {label}, {i} of {total}","action.retry":"Retry","action.dismiss":"Dismiss","action.export":"Export","action.exportclear":"Export & clear","error.quota":"Storage is full \u2014 this {item} is on screen but not saved. Export to keep them.","error.nostorage":"Comments won't be saved in this browser. Export before you leave to keep them.","error.linkrevoked":"This review link was turned off. Ask whoever sent it for a new one.","error.sessionended":"This review session has ended. Open your review link again to carry on.","error.sendfailed":"That {item} couldn't be sent, so it wasn't kept. Check your connection and try again.","error.origin":"{product} is not enabled for {origin}. Add that address to the site's allowed origins.","error.panels":"{product} loaded, but its comment UI didn't. You can still see the comments on the page.","error.panels.add":"Adding comments is unavailable until the comment UI loads.","error.capture":"{product} can't take new comments \u2014 the part that records the page didn't load. Everything already here still works.","paused.dialog":"Review paused \u2014 a dialog is open on this page. Close it to carry on commenting. Commenting inside a native dialog isn't supported yet.","paused.close":"Close","announce.created":"Comment {key} added.","permalink.unknown":"That comment isn't on this page any more"},fr={...Sn,...ur},V=xn(fr);function hr(e,t){const n=new Array(e.length),o=[],r=new Map,l=[];let u=0;for(let a=0;a<e.length;a++){u++;const d=e[a],g=Math.floor(d.x/t),v=Math.floor(d.y/t);let C=-1;e:for(let p=-1;p<=1;p++)for(let _=-1;_<=1;_++)for(const B of r.get(`${g+p},${v+_}`)??[]){const S=l[B],M=d.x-S.x,G=d.y-S.y;if(M*M+G*G<=t*t){C=B;break e}}if(C===-1){C=o.length,o.push([]),l.push(d);const p=`${g},${v}`,_=r.get(p);_?_.push(C):r.set(p,[C])}n[a]=C,o[C].push(a)}return{group:n,members:o,visits:u}}const pr=`position:absolute;top:0;left:0;width:0;height:0;pointer-events:none;z-index:${Ve.pins}`,mr=' .snag-pp{animation:snag-pp .5s ease-out 2}@keyframes snag-pp{50%{transform:scale(1.45)}}@media (prefers-reduced-motion: reduce){.snag-pp{animation:none}}.snag-pin{width:28px;height:28px;margin:-14px 0 0 -14px}.snag-pin::after{content:"";position:absolute;inset:-8px}@media (pointer:coarse){.snag-pin{width:34px;height:34px;margin:-17px 0 0 -17px}}',gr=`position:fixed;inset:0;width:0;height:0;pointer-events:none;z-index:${Ve.pins}`,ot=["position:absolute",`color:${k.onAccent}`,`font:600 12px/1 ${k.font}`,"display:flex","align-items:center","justify-content:center","box-shadow:0 1px 4px rgb(0 0 0 / .35)","pointer-events:auto","cursor:pointer","box-sizing:border-box"].join(";"),xt="border-radius:50% 50% 50% 2px",Dn=e=>k[`status${e[0].toUpperCase()}${e.slice(1)}`]??k.muted;function Ln(e,t){const n=$n(t.status),o=`background:${Dn(t.status)};color:${n}`,r="0 1px 4px rgb(0 0 0 / .35)";return e==="anchored"?`${ot};${xt};${o};border:2px solid ${n};box-shadow:${r}`:e==="approximate"?`${ot};${xt};${o};border:2px dashed ${n};box-shadow:${r}`:`${ot};${xt};${o};border:2px solid ${n};box-shadow:inset 0 0 0 2px ${n},${r}`}function yr(e,t){const n=[];let o="static",r=!1;for(let l=e;l&&l!==e.ownerDocument.documentElement;l=l.parentElement){const u=t.getComputedStyle(l),a=l!==e.ownerDocument.body&&/auto|scroll|hidden|overlay/.test(u.overflowY+u.overflowX);a&&!r&&n.push(l),u.position==="fixed"?(o="dynamic",r=!0):u.transform!=="none"||u.filter!=="none"||u.perspective!=="none"?(o="dynamic",r=!1):(u.position==="sticky"||u.willChange.includes("transform")||u.contain.includes("layout")||a&&(l.scrollHeight>l.clientHeight||l.scrollWidth>l.clientWidth))&&(o="dynamic")}return{tier:o,clips:n}}function br(e,t,n,o){const r=e.ownerDocument??document,l=r.defaultView??window;nt(e,"pins",mr);const u=r.createElement("div");u.className="snag-pins",u.style.cssText=pr,e.appendChild(u);const a=r.createElement("div");a.className="snag-pins-dyn",a.style.cssText=gr,e.appendChild(a);let d=[],g=[];const v=new Map;let C=new Map,p=null;const _=new Map;let B=new Map;const S=l.matchMedia?.("(pointer: coarse)").matches??!1,M=S?32:24,G=S?34:28;let q=[],Z=null,h=null,m={x:0,y:0};function z(){const A=r.defaultView,$=u.getBoundingClientRect();m={x:$.left+(A?.scrollX??0),y:$.top+(A?.scrollY??0)}}let L=[];const N=new Map,Y=1e4,ae=5,c=new Map,R=new Set(["testid","domid"]);function w(A){const $=c.get(A.id),y=$?.ref.deref();if(!y||!y.isConnected)return null;if(R.has($.strategy))return y;if(A.anchor.css)try{if(!y.matches(A.anchor.css))return null}catch{return null}return y}function I(A,$){const y=[],U=On($,A.anchor,1,y);return{element:$,strategy:c.get(A.id).strategy,score:U,state:Mn(U),reasons:y.length?y:["exact"],candidates:1}}function O(A,$="authoritative"){v.clear(),L=[];const y=Date.now(),U=n?.newPass?.();return A.map(b=>{const D=w(b),E=n?.get();let x=D?I(b,D):Ut(b.anchor,r,{viewportWidth:r.defaultView?.innerWidth??0,...E?{extended:E}:{},...U?{passCaches:U}:{}});if(D&&x.reasons.includes("text-drift")){const j=Ut(b.anchor,r,{viewportWidth:r.defaultView?.innerWidth??0,...E?{extended:E}:{},...U?{passCaches:U}:{}});j.score>x.score&&(x=j)}if(n&&(!x.element||x.reasons.includes("text-drift"))&&n.want(b.anchor),!x.element&&n){const j=n.fuzzyHit?.(b.id);j?x=j:n.wantFuzzy?.(b.id,b.anchor)}const se=x.element&&b.anchor.text?.exact&&(x.reasons.includes("text-drift")||x.strategy==="path-rect"&&x.score<.5);if(n&&se){const j=n.fuzzyHit?.(b.id);j&&j.score>x.score?x=j:j||n.wantFuzzy?.(b.id,b.anchor)}x.element?c.set(b.id,{ref:new WeakRef(x.element),strategy:x.strategy}):c.delete(b.id),x.element&&v.set(b.id,x.element);let Q=!1;if(x.state==="orphaned"){const j=N.get(b.id)??{firstSeenAt:y,tries:0,best:x};j.tries++,x.score>=j.best.score&&(j.best=x),N.set(b.id,j);const ee=n?.unavailable?.()??!1,te=ee?2:ae,fe=y-j.firstSeenAt<Y;$==="optimistic"||fe&&($==="navigating"||j.tries<te)?Q=!0:(x=j.best,ee&&!x.reasons.includes("budget-exceeded")&&(x={...x,reasons:[...x.reasons,"budget-exceeded"]}),N.delete(b.id))}else N.delete(b.id);Q||L.push({id:b.id,state:x.state,strategy:x.strategy,confidence:x.score});const H=x.element?Nt(x.element):void 0;if(H&&(H.width>0||H.height>0)){const j=r.defaultView;b.anchor.rect={x:H.left+(j?.scrollX??0),y:H.top+(j?.scrollY??0),w:H.width,h:H.height}}return{...b,anchorState:Q?b.anchorState:x.state,anchorPending:Q,anchorReasons:x.reasons}})}function W(){const A=r.documentElement;return{w:A.scrollWidth,h:A.scrollHeight}}function K(A,$,y){return{x:Math.min(Math.max(A,14),Math.max(y.w,28)-14),y:Math.min(Math.max($,14),Math.max(y.h,28)-14)}}function re(A,$){z(),u.textContent="",a.textContent="",d=[],g=[],C=new Map,B=new Map,_.clear(),q=[],h=null,A.forEach((y,U)=>{const b=y.anchor.rect;if(!b)return;const D=y.anchor.offset??{fx:.5,fy:.5},E=r.createElement("div");E.className="snag-pin",E.setAttribute("data-state",y.anchorPending?"pending":y.anchorState),E.setAttribute("data-key",y.key),E.style.cssText=y.anchorPending?`${Ln("approximate",y)};opacity:.55`:Ln(y.anchorState,y);const x=v.get(y.id),{tier:se,clips:Q}=x?yr(x,l):{tier:"static",clips:[]};if(se==="dynamic"&&x){const ne=x.getBoundingClientRect(),ye=Ue();E.style.left=`${ne.left-ye.left+ne.width*D.fx}px`,E.style.top=`${ne.top-ye.top+ne.height*D.fy}px`,_.set(E,{x:ne.left+ne.width*D.fx+l.scrollX-m.x,y:ne.top+ne.height*D.fy+l.scrollY-m.y});const De={node:E,el:x,fx:D.fx,fy:D.fy,clips:Q};d.push(De),E.hidden=!wt(x),E.hidden||je(De,ne,new Map(Q.map(lt=>[lt,lt.getBoundingClientRect()])))}else{const ne=K(b.x+b.w*D.fx-m.x,b.y+b.h*D.fy-m.y,W());E.style.left=`${ne.x}px`,E.style.top=`${ne.y}px`,_.set(E,ne),x&&(g.push({node:E,el:x,fx:D.fx,fy:D.fy,clips:[]}),E.hidden=!wt(x))}E.textContent=String(U+1);const H=Uo(y),j=y.anchor.role?V("pin.target",{role:y.anchor.role,name:y.anchor.accessibleName??y.anchor.label}):y.anchor.label,ee=y.comments.length-1,te=y.anchorState==="approximate"?`~ ${y.key}`:y.key;E.setAttribute("role","button"),E.setAttribute("tabindex","0");const fe=y.anchorState==="anchored"?V(ee===0?"pin.aria.none":ee===1?"pin.aria.one":"pin.aria",{key:te,target:j,status:En(y.status),replies:ee}):V("pin.aria.moved",{key:te,target:j,status:En(y.status),where:H});E.title=fe,E.setAttribute("aria-label",fe),t&&Ae(E,()=>t(y)),$?.has(y.id)&&(E.hidden=!0,E.setAttribute("data-fo","")),C.set(y.id,E),B.set(E,{snag:y,ordinal:U+1}),(se==="dynamic"?a:u).appendChild(E)}),Ke(),p&&Fe(p),Oe(),ue="",pe(r.visibilityState==="visible"&&C.size>0)}const Ue=()=>a.getBoundingClientRect();let Se=!1;function je(A,$,y){for(const U of A.clips){const b=y.get(U);if(b&&($.right<=b.left||$.left>=b.right||$.bottom<=b.top||$.top>=b.bottom)){A.node.hidden=!0;return}}A.node.hidden=!1}function $t(A){const $=new Map;for(const y of A)for(const U of y.clips)$.has(U)||$.set(U,U.getBoundingClientRect());return $}const Te=["open","progress","review","resolved"];function Ae(A,$){A.addEventListener("click",$),A.addEventListener("keydown",y=>{y.key!=="Enter"&&y.key!==" "||(y.preventDefault(),$())})}function ze(A,$,y,U,b){const D=Te.find(x=>A.some(se=>se.snag.status===x))??"open",E=r.createElement("div");E.className="snag-pin snag-cluster",E.style.cssText=`${ot};border-radius:50%;background:${Dn(D)};color:${$n(D)};border:2px solid ${k.onAccent}`,E.style.left=`${$}px`,E.style.top=`${y}px`,E.textContent=String(A.length),E.setAttribute("data-count",String(A.length)),E.setAttribute("data-state",D),E.setAttribute("role","button"),E.setAttribute("tabindex","0"),b&&E.setAttribute("aria-expanded","true"),E.setAttribute("aria-label",V("cluster.aria",{n:A.length,list:A.map(x=>x.ordinal).join(", ")})),Ae(E,()=>{if(b)Z=null;else if(A.length<=6)Z=U;else{o?.(A.map(x=>x.snag.id));return}Ke()}),u.appendChild(E),q.push(E)}function he(A,$,y,U){ze(A,$,y,U,!0),A.forEach((b,D)=>{const E=$,x=y+(D+1)*(G+12),se=b.x-E,Q=b.y-x,H=Math.hypot(se,Q);if(H>4){const ee=r.createElement("div");ee.className="snag-leader",ee.setAttribute("aria-hidden","true"),ee.style.cssText=`position:absolute;left:${E}px;top:${x}px;width:${H}px;height:0;border-top:1px solid ${k.onAccent};transform-origin:0 0;transform:rotate(${Math.atan2(Q,se)}rad)`,u.appendChild(ee),q.push(ee)}const j=b.dot.cloneNode(!0);j.style.visibility="",j.style.left=`${E}px`,j.style.top=`${x}px`,Ae(j,()=>t?.(b.snag)),u.appendChild(j),q.push(j)})}function Ke(){for(const b of q)b.remove();q=[];const A=[];for(const[b,D]of B){if(b.hidden){b.style.visibility="";continue}const E=_.get(b);E&&A.push({dot:b,snag:D.snag,ordinal:D.ordinal,x:E.x,y:E.y})}const{members:$,visits:y}=hr(A,M);u.setAttribute("data-cv",String(y)),u.setAttribute("data-cp",String(A.length));let U=!1;for(const b of $){if(b.length<2){A[b[0]].dot.style.visibility="";continue}const D=b.map(Q=>A[Q]),E=D.map(Q=>Q.snag.id).sort().join("|");for(const Q of D)Q.dot.style.visibility="hidden";const x=D.reduce((Q,H)=>Q+H.x,0)/D.length,se=D.reduce((Q,H)=>Q+H.y,0)/D.length;Z===E&&D.length<=6?(U=!0,he(D,x,se,E)):ze(D,x,se,E,!1)}Z&&!U&&(Z=null)}function Je(A){h?.remove(),h=null;const $=A.anchor.rect;if(!$)return;const y=A.anchor.offset??{fx:.5,fy:.5},U=r.createElement("div");U.className="snag-pin snag-ghost",U.style.cssText=`${ot};${xt};background:transparent;border:2px dashed ${k.anchorOrphan};color:${k.anchorOrphan};box-shadow:none;pointer-events:none`;const b=K($.x+$.w*y.fx-m.x,$.y+$.h*y.fy-m.y,W());U.style.left=`${b.x}px`,U.style.top=`${b.y}px`,U.setAttribute("aria-hidden","true"),u.appendChild(U),h=U}function Oe(A=!1){const $=A?[...d,...g]:d;Se||$.length===0||(Se=!0,l.requestAnimationFrame(()=>{Se=!1;const y=performance.now(),U=l.scrollX,b=l.scrollY,D=Ue(),E=$.map(H=>H.el.isConnected?H.el.getBoundingClientRect():null),x=$.map(H=>H.el.isConnected&&wt(H.el)),se=$t($),Q=W();$.forEach((H,j)=>{const ee=E[j];if(!ee)return;if(H.node.hasAttribute("data-fo")){H.node.hidden=!0;return}if(!x[j]){H.node.hidden=!0;return}H.node.hidden=!1;const te=ee.left+ee.width*H.fx,fe=ee.top+ee.height*H.fy;if(H.node.parentElement===a)H.node.style.left=`${te-D.left}px`,H.node.style.top=`${fe-D.top}px`,je(H,ee,se),_.set(H.node,{x:te+U-m.x,y:fe+b-m.y});else{const ne=K(te+U-m.x,fe+b-m.y,Q);H.node.style.left=`${ne.x}px`,H.node.style.top=`${ne.y}px`,_.set(H.node,ne)}}),Ke(),u.setAttribute("data-ms",(performance.now()-y).toFixed(2))}))}const ke=()=>Oe();r.addEventListener("scroll",ke,{capture:!0,passive:!0});const it=typeof l.ResizeObserver=="function"?new l.ResizeObserver(()=>Oe(!0)):null;it?.observe(r.documentElement);let $e=null,ue="";function Et(){let A="";for(const $ of[...g,...d]){if(!$.el.isConnected)continue;const y=$.el.getBoundingClientRect();A+=`${Math.round(y.left)},${Math.round(y.top)},${Math.round(y.width)};`}!A||A===ue||(ue=A,Oe(!0))}function pe(A){if($e&&clearTimeout($e),$e=null,!A)return;const $=()=>{Et(),$e=setTimeout($,500)};$e=setTimeout($,500)}const ct=()=>pe(r.visibilityState==="visible"&&C.size>0);r.addEventListener("visibilitychange",ct);function ce(A){const $=C.get(A);$&&($.classList.remove("snag-pp"),l.requestAnimationFrame(()=>$.classList.add("snag-pp")),l.setTimeout(()=>$.classList.remove("snag-pp"),1400))}function Fe(A){const $=p?C.get(p):void 0;$&&($.style.transform="",$.style.zIndex=""),p=A;const y=A?C.get(A):void 0;y&&(y.style.transform="scale(1.4)",y.style.zIndex="1")}return{el:u,render:re,showGhost:Je,pulse:ce,reanchor:O,settled:()=>L,hasPending:()=>N.size>0,highlight:Fe,destroy(){r.removeEventListener("scroll",ke,{capture:!0}),r.removeEventListener("visibilitychange",ct),it?.disconnect(),pe(!1),u.remove(),a.remove()}}}const vr=` .snag-notice{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(24px + var(${P.tbH},56px));z-index:${Ve.notice};max-width:min(420px,calc(100vw - 24px));background:${k.bg};color:${k.fg};border:1px solid ${k.border};border-inline-start:3px solid ${k.anchorOrphan};border-radius:${k.radius};box-shadow:${k.shadow};padding:12px 14px;pointer-events:auto;font:400 13px/1.45 ${k.font};display:flex;flex-direction:column;gap:10px}@media (pointer:coarse){.snag-notice{bottom:calc(12px + var(${P.tbH},64px))}}.snag-notice p{margin:0}.snag-notice-actions{display:flex;gap:6px;justify-content:flex-end}.snag-notice button{appearance:none;font:inherit;cursor:pointer;border-radius:calc(${k.radius} - 2px);padding:6px 12px;min-height:30px;border:0;transition:background ${k.motion}}.snag-notice-retry{background:${k.accent};color:${k.onAccent};font-weight:600}.snag-notice-dismiss{background:transparent;color:${k.muted}}.snag-notice-dismiss:hover{background:${k.hover};color:inherit}.snag-notice button:focus-visible{outline:2px solid ${k.focus};outline-offset:2px}`;function wr(e,t){const n=e.ownerDocument??document,o=n.defaultView??window;nt(e,"notice",vr);const r=n.createElement("div");r.className="snag-notice",r.setAttribute("role","alert"),r.hidden=!0;const l=n.createElement("p"),u=n.createElement("div");u.className="snag-notice-actions";const a=n.createElement("button");a.type="button",a.className="snag-notice-dismiss",a.textContent=V("action.dismiss"),a.addEventListener("click",()=>C());const d=n.createElement("button");d.type="button",d.className="snag-notice-retry",u.append(a,d),r.append(l,u);let g;d.addEventListener("click",()=>{C(),g?.run()});let v=0;function C(){v&&o.cancelAnimationFrame(v),v=0,r.hidden=!0,r.remove()}return{show(p,_,B){g=_,d.hidden=!_,_&&(d.textContent=V(_.label)),r.hidden=!1,l.textContent="",(t??e).appendChild(r);const S=V(p,B);v&&o.cancelAnimationFrame(v),v=o.requestAnimationFrame(()=>{v=0,l.textContent=S})},hide:C,visible:()=>r.isConnected&&!r.hidden,destroy(){r.remove()}}}const xr=` .snag-paused{border:0;padding:0;background:transparent;pointer-events:auto;max-width:min(420px,calc(100vw - 32px))}.snag-paused::backdrop{background:rgb(0 0 0 / .28)}.snag-paused-box{background:${k.bg};color:${k.fg};border:1px solid ${k.border};border-inline-start:3px solid ${k.accent};border-radius:${k.radius};box-shadow:${k.shadow};padding:14px 16px;font:400 13px/1.45 ${k.font};display:flex;flex-direction:column;gap:12px}.snag-paused p{margin:0}.snag-paused-actions{display:flex;justify-content:flex-end}.snag-paused button{appearance:none;font:inherit;cursor:pointer;border:0;font-weight:600;border-radius:calc(${k.radius} - 2px);padding:6px 14px;min-height:30px;background:${k.accent};color:${k.onAccent}}.snag-paused button:focus-visible{outline:2px solid ${k.focus};outline-offset:2px}`;function Sr(e,t){const n=e.ownerDocument??document;nt(e,"paused",xr);const o=n.createElement("dialog");o.className="snag-paused",o.setAttribute("aria-label",V("paused.dialog"));const r=n.createElement("div");r.className="snag-paused-box",r.setAttribute("role","status");const l=n.createElement("p");l.textContent=V("paused.dialog");const u=n.createElement("div");u.className="snag-paused-actions";const a=n.createElement("button");a.type="button",a.textContent=V("paused.close"),a.addEventListener("click",()=>v()),u.append(a),r.append(l,u),o.append(r);let d=!1;function g(){if(!d){(t??e).appendChild(o);try{o.showModal(),d=!0}catch{o.setAttribute("open",""),d=!0}}}function v(){if(d){d=!1;try{o.close()}catch{o.removeAttribute("open")}o.remove()}}return o.addEventListener("close",()=>{d=!1,o.remove()}),{show:g,hide:v,destroy(){v(),o.remove()}}}const Ar=Symbol.for(gn.original),Nn=Symbol.for(gn.wrapped),rt=()=>{};function kr(e,t,n){let o;try{o=e[t]}catch{return rt}if(typeof o!="function"||o[Nn])return rt;const r=o,l=n(r);let u=!1;const a=function(...d){return u?r.apply(this,d):l.apply(this,d)};try{const d=a;d[Nn]=!0,d[Ar]=r,Object.defineProperty(a,"name",{value:r.name,configurable:!0}),Object.defineProperty(a,"length",{value:r.length,configurable:!0})}catch{}try{e[t]=a}catch{return rt}return e[t]!==a?rt:()=>{let d;try{d=e[t]}catch{d=void 0}if(d===a)try{e[t]=r;return}catch{}u=!0}}function $r(e,t){const n=[];let o=0;const r=()=>{o||(o=e.requestAnimationFrame(()=>{o=0,t.onResize()}))};e.addEventListener("resize",r),n.push(()=>{o&&e.cancelAnimationFrame(o),e.removeEventListener("resize",r)}),e.visualViewport?.addEventListener("resize",r),n.push(()=>e.visualViewport?.removeEventListener("resize",r));const l=()=>void e.setTimeout(t.onResize,250);e.addEventListener("orientationchange",l),n.push(()=>e.removeEventListener("orientationchange",l));let u=e.location.pathname;const a=()=>{const M=e.location.pathname;M!==u&&(u=M,t.onRoute())},d=e.navigation;if(d){const M=()=>void e.setTimeout(a,0);d.addEventListener("navigatesuccess",M),n.push(()=>d.removeEventListener("navigatesuccess",M))}else for(const M of["pushState","replaceState"])n.push(kr(e.history,M,G=>function(...q){const Z=G.apply(this,q);return e.setTimeout(a,0),Z}));const g=e.document;let v=!0;try{g.documentElement.matches(":modal")}catch{v=!1}const C=()=>{const M=g.querySelectorAll("dialog[open]");if(!v)return M.length>0;for(const G of M)if(G.matches(":modal"))return!0;return!1};let p=!1;const _=()=>{const M=C();M!==p&&(p=M,t.onModal(M))};g.addEventListener("toggle",_,!0),n.push(()=>g.removeEventListener("toggle",_,!0));const B=new MutationObserver(_);B.observe(g.documentElement,{subtree:!0,attributes:!0,attributeFilter:["open"]}),n.push(()=>B.disconnect());const S=()=>void e.setTimeout(a,0);return e.addEventListener("popstate",S),n.push(()=>e.removeEventListener("popstate",S)),{destroy(){for(const M of n)M();n.length=0}}}function Er(e,t){try{e.sessionStorage.setItem(de.handoff,JSON.stringify({openThreadId:t}))}catch{}}function Cr(e){try{const t=e.sessionStorage.getItem(de.handoff);if(t===null)return null;e.sessionStorage.removeItem(de.handoff);const n=JSON.parse(t);return typeof n.openThreadId=="string"?n.openThreadId:null}catch{return null}}function Tr(){return{statuses:[],read:"all",pageOnly:!1,newOnly:!1,sort:"page"}}const Rr=["open","progress","review","resolved"];function _r(e,t,n){if(t.statuses.length>0&&Rr.includes(e.status)&&!t.statuses.includes(e.status)||t.by&&e.createdBy.id!==t.by||t.page&&e.route!==t.page)return!1;if(t.read!=="all"&&n){const o=Ir(e,n);if(t.read==="unread"&&!o||t.read==="read"&&o)return!1}return!0}function Ir(e,t){const n=t.get(e.id)??0;return Date.parse(e.updatedAt)>n}function Pr(e,t,n){const o=e.visualViewport;let r=0;const l=()=>{if(r=0,!o)return;const a=o.offsetLeft,d=o.offsetTop;t.style.translate=a||d?`${a}px ${d}px`:"",t.style.width=`${o.width}px`,t.style.height=`${o.height}px`,n?.(o.scale)},u=()=>{r||(r=e.requestAnimationFrame(l))};return o?.addEventListener("resize",u,{passive:!0}),o?.addEventListener("scroll",u,{passive:!0}),u(),()=>{r&&e.cancelAnimationFrame(r),o?.removeEventListener("resize",u),o?.removeEventListener("scroll",u)}}const Mr=/^eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}/,zr=/^[a-f0-9]{32,}$/i,Or=/^(?=[A-Za-z0-9_-]{24,}$)(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9_-]+$/,Dr="[redacted]";function Hn(e){return e.includes("/")?e.split("/").map(t=>Mr.test(t)||zr.test(t)||Or.test(t)?Dr:t).join("/"):e}const Lr=/\/index\.(html?|php)$/i;function Nr(e){if(!e.startsWith("/"))return e;let t=e.replace(Lr,"/");return t.length>1&&t.endsWith("/")&&(t=t.slice(0,-1)),t.toLowerCase()}function Hr(e){try{const t=e.querySelector(`meta[name="${Oo.route}"]`)?.getAttribute("content")?.trim();return!t||t.length>512||!t.startsWith("/")?null:t}catch{return null}}function Wr(e,t){const n=t??Hr(e);return Nr(n??Hn(e.location.pathname))}const Ur=[/^utm_/,/^(gclid|gbraid|wbraid|fbclid|msclkid|ttclid|twclid|igshid|yclid|li_fat_id)$/,/^(mc_cid|mc_eid|_hsenc|_hsmi|vero_id|oly_enc_id|oly_anon_id)$/,/^_vercel_/,/^__vercel_/,/^_rsc$/],jr=[...bt.query,...bt.fragment];function Fr(e,t=[]){return jr.includes(e)||t.includes(e)?!0:Ur.some(n=>n.test(e))}function Br(e,t={}){const n=t.significantQueryParams??[];if(n!=="*"&&n.length===0)return;let o;try{o=new URLSearchParams(e)}catch{return}const r={};for(const[l,u]of o)Fr(l,t.ignoredQueryParams??[])||n!=="*"&&!n.includes(l)||(r[l]=u);return Object.keys(r).length>0?r:void 0}function Zr(e,t,n={}){const o=n.significantQueryParams??[];if(o==="*"){const r=e??{},l=t??{},u=new Set([...Object.keys(r),...Object.keys(l)]);for(const a of u)if(r[a]!==l[a])return!1;return!0}for(const r of o)if((e?.[r]??void 0)!==(t?.[r]??void 0))return!1;return!0}const Vr=120,Yr=1e3,Xr=200,Kr=1e4;function Jr(e,t,n){const o=t.MutationObserver;if(typeof o!="function")return{destroy:()=>{}};let r=!1,l=null,u=!1,a=!1,d=0,g=C(),v=0;function C(){return t.performance?.now?.()??0}const p=new o(()=>{r=!0,d++,B()});function _(){const M=C();return M-g>=1e3&&(d>Xr&&(v=M+Kr),d=0,g=M),M<v?Yr:Vr}function B(){l||(l=setTimeout(S,_()))}function S(){if(l=null,!!r){if(u){a=!0;return}r=!1,u=!0;try{n()}finally{u=!1,a&&(a=!1,r=!0,B())}}}return p.observe(e.documentElement,{childList:!0,subtree:!0}),{destroy(){p.disconnect(),l&&clearTimeout(l),l=null}}}const qr="0.0.0",Qr={capture:Ie.capture,"anchor-ext":Ie.anchorExt,"anchor-fuzzy":Ie.anchorFuzzy,crumbs:Ie.crumbs,screenshot:Ie.screenshot,dock:Ie.dock,text:Ie.text},Wn=new Map,jt=new Map,Un=new Map;function Gr(e,t,n){const o=new URL(t,n.location.href).href,r=new URL(Qr[e],o);r.searchParams.set("cv",qr);const l=Un.get(e)??0;return l>0&&r.searchParams.set("r",String(l)),Un.set(e,l+1),r.href}async function Pe(e,t,n=document){const o=Wn.get(e);if(o)return{ok:!0,mod:o};const r=jt.get(e);if(r)return r;const l=(async()=>{for(let u=0;u<2;u++)try{const a=await import(Gr(e,t,n));return Wn.set(e,a),{ok:!0,mod:a}}catch{}return{ok:!1,reason:"unavailable"}})();jt.set(e,l);try{return await l}finally{jt.delete(e)}}const es="composer",Ft=e=>de.draft(e,es),ts=de.draft("\0","").split("\0")[0];function ns(e){try{return e.body.trim()?(localStorage.setItem(Ft(e.route),JSON.stringify(e)),!0):(jn(e.route),!0)}catch{return!1}}function os(e){try{const t=localStorage.getItem(Ft(e));if(!t)return null;const n=JSON.parse(t);return!n||typeof n.body!="string"||!n.anchor||n.route!==e?null:n}catch{return null}}function jn(e){try{localStorage.removeItem(Ft(e))}catch{}}function Bt(){try{for(let e=0;e<localStorage.length;e++){const t=localStorage.key(e);if(t&&t.startsWith(ts))return!0}return!1}catch{return!1}}const rs="http://www.w3.org/2000/svg";function Me(e,t,n,o=[]){const r=e.createElementNS(rs,t);for(const l in n)r.setAttribute(l,n[l]);for(const l of o)r.appendChild(l);return r}const Zt=(e,t="16",n="16",o="0 0 16 16")=>({width:t,height:n,viewBox:o,fill:"none","aria-hidden":"true"}),ss=e=>Me(e,"svg",Zt(),[Me(e,"path",{d:"M8 3v10M3 8h10",stroke:"currentColor","stroke-width":"1.75","stroke-linecap":"round"})]),as=e=>Me(e,"svg",Zt(),[Me(e,"rect",{x:"2.25",y:"3.25",width:"11.5",height:"9.5",rx:"1.75",stroke:"currentColor","stroke-width":"1.5"}),Me(e,"path",{d:"M9.5 3.5v9",stroke:"currentColor","stroke-width":"1.5"})]),is=e=>Me(e,"svg",{...Zt(e,"10","16","0 0 10 16"),fill:"currentColor"},[Me(e,"g",{fill:"currentColor"},[4,8,12].flatMap(t=>[3,7].map(n=>Me(e,"circle",{cx:String(n),cy:String(t),r:"1"}))))]),cs=` .snag-tb{position:fixed;z-index:${Ve.toolbar};display:flex;align-items:center;gap:2px;padding:4px;border-radius:calc(${k.radius} + 4px);background:${k.bg};color:${k.fg};box-shadow:${k.shadow};font:500 13px/1 ${k.font};pointer-events:auto;user-select:none;border:1px solid ${k.border}}.snag-tb{transition:inset-inline-end ${k.motion}}.snag-tb--fine{inset-inline-end:calc(20px + env(safe-area-inset-right) + var(${P.dockW},0px));inset-block-end:calc(20px + env(safe-area-inset-bottom));transition:inset-inline-end ${k.motion}}.snag-tb--coarse{inset-inline:0;inset-block-end:0;border-radius:14px 14px 0 0;padding:6px 10px calc(6px + env(safe-area-inset-bottom));justify-content:center;gap:4px;flex-direction:column}.snag-grabber{width:36px;height:4px;border-radius:2px;background:${k.muted};margin:2px auto 6px}.snag-row{display:flex;align-items:center;gap:2px}.snag-grip{display:flex;align-items:center;padding:0 4px;color:${k.muted};cursor:grab;touch-action:none}.snag-grip:active{cursor:grabbing}.snag-seg{display:flex;background:${k.surface};border-radius:${k.radius};padding:2px;position:relative}.snag-seg::before{content:"";position:absolute;inset-block:2px;inset-inline-start:var(${P.thumbX},0);width:var(${P.thumbW},0);background:${k.accent};border-radius:calc(${k.radius} - 2px);pointer-events:none;transition:inset-inline-start ${k.motion},width ${k.motion}}.snag-seg>.snag-b[aria-pressed="true"]{background:transparent;color:${k.onAccent}}.snag-seg>.snag-b{z-index:1}.snag-b{appearance:none;border:0;background:transparent;color:inherit;font:inherit;padding:6px 11px;border-radius:calc(${k.radius} - 2px);cursor:pointer;display:flex;align-items:center;gap:6px;position:relative;min-height:32px;transition:background ${k.motion}}.snag-b:hover:not(:disabled){background:color-mix(in srgb,currentColor 12%,transparent)}.snag-b:disabled{opacity:.4;cursor:not-allowed}.snag-b[aria-pressed="true"]{background:${k.accent};color:${k.onAccent}}.snag-b:focus-visible{outline:2px solid ${k.focus};outline-offset:2px}.snag-icon{padding:6px 9px}@media (pointer:coarse){.snag-b{min-height:44px;min-width:44px;padding:6px 14px}.snag-icon{padding:6px 14px}}.snag-puck .snag-row>:not([aria-expanded]){display:none}.snag-puck{padding:4px;border-radius:50%}.snag-puck [aria-expanded]{min-width:44px;min-height:44px;border-radius:50%}`;function ls(e,t){const n=e.ownerDocument??document,o=t.coarsePointer??n.defaultView?.matchMedia?.("(pointer: coarse)").matches??!1;nt(e,"toolbar",cs);const r=n.createElement("div");r.className=`snag-tb ${o?"snag-tb--coarse":"snag-tb--fine"}`,r.setAttribute("role","toolbar"),r.setAttribute("aria-label",V("toolbar.aria"));const l=n.createElement("div");l.className="snag-grabber",l.setAttribute("aria-hidden","true");const u=n.createElement("div");u.className="snag-row";const a=n.createElement("span");a.className="snag-grip",a.setAttribute("aria-hidden","true"),a.appendChild(is(n));const d=n.createElement("div");d.className="snag-seg",d.setAttribute("role","group"),d.setAttribute("aria-label",V("toolbar.group"));const g=(c,R,w)=>{const I=n.createElement("button");return I.type="button",I.className=`snag-b ${c}`,I.setAttribute("aria-label",R),typeof w=="string"?I.textContent=w:I.appendChild(w),I},v=g("",V("toolbar.browse"),V("toolbar.browse")),C=g("",V("toolbar.comments"),V("toolbar.comments")),p=g("snag-icon",V("toolbar.add"),ss(n)),_=g("snag-icon",V("toolbar.panel"),as(n));_.setAttribute("aria-expanded","false"),d.append(v,C),o||u.appendChild(a),u.append(d,p,_),o&&r.appendChild(l),r.appendChild(u),(t.parent??e).appendChild(r);const B=()=>{e.host.style.setProperty(P.tbH,`${r.offsetHeight}px`)};B();let S=null;function M(c,R){const w=n.defaultView,I=r.offsetWidth,O=r.offsetHeight,W=Fn(c,8,Math.max(8,w.innerWidth-I-8)),K=Fn(R,8,Math.max(8,w.innerHeight-O-8));S={left:W,top:K},r.style.left=`${W}px`,r.style.top=`${K}px`,r.style.right="auto",r.style.bottom="auto"}const G=()=>{B(),S&&M(S.left,S.top)},q=n.defaultView;if(q?.addEventListener("resize",G),v.addEventListener("click",()=>t.onState("browse")),C.addEventListener("click",()=>t.onState("comments")),p.addEventListener("click",()=>t.onState(Z==="add"?"comments":"add")),_.addEventListener("click",()=>t.onPanel()),!o){let c=null;a.addEventListener("pointerdown",w=>{c={x:w.clientX,y:w.clientY,r:r.getBoundingClientRect()},a.setPointerCapture(w.pointerId),w.preventDefault()}),a.addEventListener("pointermove",w=>{c&&M(c.r.left+(w.clientX-c.x),c.r.top+(w.clientY-c.y))});const R=w=>{c=null,a.hasPointerCapture(w.pointerId)&&a.releasePointerCapture(w.pointerId)};a.addEventListener("pointerup",R),a.addEventListener("pointercancel",R)}let Z="browse";function h(c){Z=c,v.setAttribute("aria-pressed",String(c==="browse")),C.setAttribute("aria-pressed",String(c!=="browse")),p.setAttribute("aria-pressed",String(c==="add")),m()}function m(){const c=d.querySelector('.snag-b[aria-pressed="true"]'),R=d.getBoundingClientRect(),w=c?.getBoundingClientRect();if(!c||!w?.width){d.style.setProperty(P.thumbW,"0px");return}const I=n.defaultView?.getComputedStyle(d),O=I?.direction==="rtl",W=parseFloat((O?I?.paddingRight:I?.paddingLeft)??"0")||0,K=(O?R.right-w.right:w.left-R.left)-W;d.style.setProperty(P.thumbW,`${Math.round(w.width)}px`),d.style.setProperty(P.thumbX,`${Math.max(0,Math.round(K))}px`)}function z(c){p.disabled=c,c?p.title=V("error.panels.add"):p.removeAttribute("title")}function L(c){p.setAttribute("aria-label",V(c?"toolbar.add.draft":"toolbar.add"))}function N(c){C.setAttribute("aria-label",c!==null&&c>0?V("toolbar.comments.unresolved",{n:Wo(c)}):V("toolbar.comments"))}h("browse"),N(0);function Y(c){r.classList.toggle("snag-puck",c),c||m()}function ae(c){r.hidden=c,c||m(),B()}return{el:r,setState:h,setCount:N,setDegraded:z,setDraft:L,setPuck:Y,setConcealed:ae,destroy(){q?.removeEventListener("resize",G),e.host.style.removeProperty(P.tbH),r.remove()}}}const Fn=(e,t,n)=>e<t?t:e>n?n:e,Bn=24;function ds(e,t){const n=e.innerHeight,o=t.querySelector(".snag-dk");if(!o)return{top:0,bottom:n};const r=o.getBoundingClientRect();return r.height>=n-1?{top:0,bottom:n}:{top:0,bottom:Math.max(0,r.top)}}function us(e,t,n){const o=n.anchor.rect;if(!o)return;const r=n.anchor.offset??{fy:.5},l=o.y+o.h*r.fy,u=ds(e,t),a=l-e.scrollY;if(a>=u.top+Bn&&a<=u.bottom-Bn)return;const d=e.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;e.scrollTo({top:Math.max(0,l-(u.top+u.bottom)/2),behavior:d?"auto":"smooth"})}function Vt(){const e=new Uint8Array(16);crypto.getRandomValues(e);const t=Date.now();e[0]=Math.floor(t/2**40)&255,e[1]=Math.floor(t/2**32)&255,e[2]=Math.floor(t/2**24)&255,e[3]=Math.floor(t/2**16)&255,e[4]=Math.floor(t/2**8)&255,e[5]=t&255,e[6]=e[6]&15|112,e[8]=e[8]&63|128;const n=Array.from(e,o=>o.toString(16).padStart(2,"0")).join("");return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}const fs=()=>vt.thread+Vt(),Zn=()=>vt.comment+Vt(),hs=()=>vt.attachment+Vt(),ps={attachments:"direct",realtime:"none",anchorReports:!1,identity:["guest"],export:["json","md"],serverSideSearch:!1,privateThreads:!1,assignees:!1};function ms(){const e=de.threads("probe","probe");try{return localStorage.setItem(e,"1"),localStorage.removeItem(e),!0}catch(t){return Vn(t)}}function gs(e,t,n){const o=de.threads(e,t);function r(){let a=null;try{a=localStorage.getItem(o)}catch{return[]}if(!a)return[];try{const d=JSON.parse(a);return Array.isArray(d)?d.filter(bs):[]}catch{return[]}}function l(a){try{localStorage.setItem(o,JSON.stringify(a))}catch(d){if(!Vn(d))return;throw new Lt("local_quota_exceeded")}}const u=a=>({...a,updatedAt:new Date().toISOString()});return{kind:"local",capabilities:ps,async init(a){return{uid:a.uid,env:a.env,features:{screenshots:!0,uploads:!1}}},async listThreads(a={}){let d=r();return a.route!==void 0&&(d=d.filter(g=>g.route===a.route)),a.status?.length&&(d=d.filter(g=>a.status.includes(g.status))),{data:d,serverTime:new Date().toISOString()}},async getThread(a){return r().find(d=>d.id===a)??null},async createThread(a){const d=Cn(a);return l([...r(),d]),d},async patchThread(a,d){const g=r(),v=g.findIndex(B=>B.id===a);if(v<0)return null;const{assignee:C,...p}=d,_=u({...g[v],...ys(p)});return g[v]=_,l(g),_},async deleteThread(a){const d=r(),g=d.find(C=>C.id===a),v=d.filter(C=>C.id!==a);v.length!==d.length&&l(v);for(const C of g?.attachments??[])n?.del(C.id).catch(()=>{})},async uploadAttachment(a,d){if(!n)throw new Lt("attachments_unsupported");const g=hs();return await n.put(g,{blob:a,uid:e,env:t,kind:d.kind,...d.width!==void 0?{width:d.width}:{},...d.height!==void 0?{height:d.height}:{},createdAt:Date.now()}),{id:g,kind:d.kind,url:"",...d.width!==void 0?{width:d.width}:{},...d.height!==void 0?{height:d.height}:{},bytes:a.size,contentType:a.type}},async createComment(a,d){const g=r(),v=g.findIndex(p=>p.id===a);if(v<0)return null;const C={id:d.id,snagId:a,body:d.body,author:d.author,createdAt:new Date().toISOString()};return g[v]=u({...g[v],comments:[...g[v].comments,C]}),l(g),C},async patchComment(a,d){const g=r();for(let v=0;v<g.length;v++){const C=g[v].comments.find(_=>_.id===a);if(!C)continue;const p={...C,body:d};return g[v]=u({...g[v],comments:g[v].comments.map(_=>_.id===a?p:_)}),l(g),p}return null},async deleteComment(a){const d=r(),g=d.findIndex(v=>v.comments.some(C=>C.id===a));g<0||(d[g]=u({...d[g],comments:d[g].comments.filter(v=>v.id!==a)}),l(d))}}}function ys(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Vn(e){return e instanceof Error?e.name==="QuotaExceededError"||e.name==="NS_ERROR_DOM_QUOTA_REACHED"||e.code===22||e.code===1014:!1}function bs(e){if(typeof e!="object"||e===null)return!1;const t=e;return typeof t.id=="string"&&typeof t.key=="string"&&typeof t.route=="string"&&typeof t.anchor=="object"&&t.anchor!==null&&typeof t.anchor.label=="string"&&Array.isArray(t.comments)}function vs(e,t,n=()=>Date.now()){const o=de.seen(e,t);let r=null;function l(){if(r)return r;try{const a=localStorage.getItem(o),d=a?JSON.parse(a):{};return r=typeof d=="object"&&d!==null&&!Array.isArray(d)?d:{}}catch{return r={}}}function u(a){r=a;try{localStorage.setItem(o,JSON.stringify(a))}catch{}}return{map:()=>new Map(Object.entries(l())),mark(a){u({...l(),[a]:n()})},markAll(a){const d=n(),g={...l()};for(const v of a)g[v.id]=d;u(g)}}}function st(){let e=null;try{e=localStorage.getItem(zt)}catch{return{}}if(!e)return{};if(e[0]!=="{")return{name:e};try{const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Yn(e){try{localStorage.setItem(zt,JSON.stringify(e))}catch{}}function Yt(){const e=st();return{name:typeof e.name=="string"?e.name:"",...e.email?{email:e.email}:{}}}function Xn(e){return st().projects?.[e]?.holderId}function ws(e){const t=st().projects?.[e]?.holderSecret;return t&&/^[\w-]{43}$/.test(t)?t:void 0}function xs(e,t,n){const o=st();Yn({...o,projects:{...o.projects,[e]:{holderId:t,holderSecret:n}}})}function Ss(e,t){const n=st(),o=n.projects?.[e];o&&Yn({...n,projects:{...n.projects,[e]:{...o,holderId:t}}})}const We=e=>de.session(e);function Kn(e){if(!e)return null;const t=JSON.parse(e);return typeof t?.token=="string"&&typeof t?.refreshableUntil=="number"?t:null}function Ye(e){try{const t=Kn(sessionStorage.getItem(We(e)));if(t)return t;const n=Kn(localStorage.getItem(We(e)));return n?.member?n:null}catch{return null}}function Xt(e,t){try{t.member?(localStorage.setItem(We(e),JSON.stringify(t)),sessionStorage.removeItem(We(e))):sessionStorage.setItem(We(e),JSON.stringify(t))}catch{}}function at(e){try{sessionStorage.removeItem(We(e)),localStorage.removeItem(We(e))}catch{}}const As=(e,t=Date.now())=>t>e.expiresAt-3e4,Kt=(e,t=Date.now())=>t>=e.refreshableUntil;class Xe extends Error{code;status;constructor(t,n,o){super(o),this.name="HttpAdapterError",this.status=t,this.code=n}}function ks(e){const{offset:t,testId:n,domId:o,page:r,schemaVersion:l,...u}=e;return{...u,...n?{testid:n}:{},...o?{domid:o}:{},...t?{offset:{fx:t.x,fy:t.y}}:{}}}function $s(e,t){const n=e.url??"",o=/^https?:/i.test(n)?n:n?`${t}${n.startsWith("/")?"":"/"}${n}`:`${t}/api/v1/attachments/${encodeURIComponent(e.id)}/blob`;return{...e,url:o}}function St(e,t,n){return{id:e.id,route:e.anchor?.page?.route??"",key:e.key,status:e.status,anchor:ks(e.anchor),anchorState:e.anchorState,context:e.context,comments:e.comments??[],createdBy:e.createdBy,assignee:e.assignee??null,createdAt:e.createdAt,updatedAt:e.updatedAt,...e.resolvedAt?{resolvedAt:e.resolvedAt}:{},...e.attachments?.length?{attachments:e.attachments.map(o=>$s(o,n))}:{},...t?{scope:{environment:t}}:{}}}function Es(e,t){const{offset:n,testid:o,domid:r,...l}=e;return{...l,schemaVersion:pn,...o?{testId:o}:{},...r?{domId:r}:{},offset:n?{x:n.fx,y:n.fy}:{x:.5,y:.5},page:{route:t,pathname:location.pathname,origin:location.origin}}}function Cs(e,t){const n=o=>/^[\d.]+$|:/.test(o)?o:o.split(".").slice(-2).join(".");return n(e)===n(t)}const Jn=10*6e4;function Ts(e,t,n,o={}){const r=e.replace(/\/+$/,""),l=`${r}/api/v1/projects/${encodeURIComponent(t)}`;let u=o.reviewToken,a=Ye(t);const d=de.silent(t);let g=0,v=Promise.resolve(!1);function C(){if(u||Date.now()-g<Jn)return v;try{if(!Cs(location.hostname,new URL(r).hostname)||localStorage.getItem(d)||Date.now()-Number(sessionStorage.getItem(d))<Jn)return v}catch{}return g=Date.now(),v=(async()=>{try{const h=await fetch(`${l}/sessions/member/silent`,{method:"POST",credentials:"include",...n?{body:JSON.stringify({environment:n})}:{}});if(h.status===201)return _(await h.json()),g=0,!0}catch{}try{sessionStorage.setItem(d,String(Date.now()))}catch{}return!1})()}let p=null;function _(h){a={token:h.sessionToken,expiresAt:Date.parse(h.expiresAt),refreshableUntil:Date.parse(h.refreshableUntil),reviewerId:h.reviewer.id,permissions:h.permissions,member:h.reviewer.name,...h.moderator?{moderator:!0}:{}},Xt(t,a),o.onSessionStarted?.()}const B=()=>a;async function S(h=!1){const m=a&&!Kt(a)?a.token:null,z=!!m&&!u&&!h,L=z?void 0:u?{kind:"link",token:u,name:Yt().name||void 0}:{kind:"guest",name:Yt().name||"Anonymous",holderId:Xn(t),holderSecret:ws(t)};let N;try{N=await fetch(`${l}/sessions`,{method:"POST",credentials:"omit",headers:{"content-type":"application/json",...m?{Authorization:`Bearer ${m}`}:{}},body:JSON.stringify({...n?{environment:n}:{},...L?{identity:L}:{},client:{widget:$o,schema:pn}})})}catch(c){throw new Xe(0,"network_error",c.message)}finally{u=void 0}if(!N.ok){const R=(await N.json().catch(()=>null))?.error?.code??"unauthorized",w=z&&!!a?.member;if(at(t),a=null,w&&N.status===401&&await C())return B();throw R==="session_revoked"||R==="token_revoked"?o.onSessionEnded?.("revoked"):N.status===401&&o.onSessionEnded?.("expired"),new Xe(N.status,R,"This review session is not valid.")}const Y=await N.json();Y.holderSecret&&Y.reviewer?xs(t,Y.reviewer.id,Y.holderSecret):Y.reviewer&&Ss(t,Y.reviewer.id);const ae=Y.round?.number??(z?a?.round:void 0);return a={token:Y.sessionToken,expiresAt:Date.parse(Y.expiresAt),refreshableUntil:Date.parse(Y.refreshableUntil),reviewerId:Y.reviewer?.id??a?.reviewerId??"",permissions:Y.permissions??a?.permissions??[],...ae!==void 0?{round:ae}:{},...z&&a?.member?{member:a.member}:{},...z&&a?.member&&a.moderator?{moderator:!0}:{}},Xt(t,a),L&&(G=L.name??null),o.onSessionStarted?.(),a}async function M(){if(a){if(Kt(a)){at(t),a=null,await C()||o.onSessionEnded?.("expired");return}await S().catch(()=>{})}}let G=null;async function q(){if(await(p??=a?.member?Promise.resolve():C()),a&&Kt(a)&&(at(t),a=null,G=null,!await C()))return o.onSessionEnded?.("expired"),null;const h=Yt().name||null,m=a!==null&&!a.member&&h!==null&&h!==G;if(!a||As(a)||u||m)try{await S(m)}catch(z){if(!(z instanceof Xe)||z.status===0)throw z;return null}return a?.token??null}async function Z(h,m,z=!1){const L=await q();let N;try{N=await fetch(l+h,{...m,headers:{"content-type":"application/json",...L?{Authorization:`Bearer ${L}`}:{},...m?.headers??{}},credentials:"omit"})}catch(Y){throw new Xe(0,"network_error",Y.message)}if(!N.ok){const Y=await N.json().catch(()=>null),ae=Y?.error?.code??"http_error";if(N.status===401&&!z&&ae!=="session_revoked"){const c=!!a?.member;return at(t),a=null,c&&await C(),Z(h,m,!0)}throw new Xe(N.status,ae,Y?.error?.message??`The server answered ${N.status}.`)}return await N.json()}return{kind:"http",capabilities:{attachments:"none",realtime:"none",anchorReports:!0,identity:["guest"],export:[],serverSideSearch:!1,privateThreads:!1,assignees:!0},async init(h){const m=await Z("/config");return this.capabilities.attachments=m.features.screenshots?"direct":"none",{uid:h.uid,env:h.env,features:m.features,...m.rounds?{rounds:m.rounds}:{},...m.writable===void 0?{}:{writable:m.writable},...m.reason===void 0?{}:{reason:m.reason}}},async reportAnchors(h){if(h.length!==0)for(let m=0;m<h.length;m+=50)try{await Z("/anchor-reports",{method:"POST",body:JSON.stringify({reports:h.slice(m,m+50)})})}catch{return}},revalidate:M,member:()=>a?.member??null,adoptSession(h){try{localStorage.removeItem(d)}catch{}_(h)},signOut(){at(t),a=null,G=null;try{localStorage.setItem(d,"out")}catch{}},getRound(){return a?.round??Ye(t)?.round??null},setRound(h){a&&(a={...a,round:h});const m=Ye(t);m&&Xt(t,{...m,round:h})},async fetchForeignImage(h){try{const m=await q(),z=await fetch(`${l}/image?src=${encodeURIComponent(h)}`,{credentials:"omit",...m?{headers:{Authorization:`Bearer ${m}`}}:{}});if(!z.ok)return null;const L=await z.blob();return L.type.startsWith("image/")?L:null}catch{return null}},async uploadAttachment(h,m){const z=await q(),L=await fetch(`${l}/attachments`,{method:"POST",credentials:"omit",headers:{"content-type":h.type||"image/webp",[Ot.attachmentKind]:m.kind,...m.width?{[Ot.attachmentWidth]:String(m.width)}:{},...m.height?{[Ot.attachmentHeight]:String(m.height)}:{},...z?{Authorization:`Bearer ${z}`}:{}},body:h});if(!L.ok){const Y=await L.json().catch(()=>null);throw new Xe(L.status,Y?.error?.code??"upload_failed",Y?.error?.message??"Upload failed.")}const N=await L.json();return{id:N.id,kind:m.kind,contentType:N.contentType,byteSize:N.byteSize,...m.width?{width:m.width}:{},...m.height?{height:m.height}:{},url:`${r}/api/v1/attachments/${N.id}/blob`}},async listThreads(h){await q();const m=new URLSearchParams;n&&m.set("env",n),h?.route&&m.set("route",h.route),a?.round&&m.set("round",String(a.round));const z=await Z(`/threads?${m}`);return{data:z.data.map(L=>St(L,n,r)),...z.nextCursor?{nextCursor:z.nextCursor}:{},deleted:[],serverTime:z.serverTime}},async getThread(h){return(await this.listThreads()).data.find(z=>z.id===h)??null},async getThreadByKey(h){const m=new URLSearchParams({key:h});n&&m.set("env",n);const L=(await Z(`/threads?${m}`)).data[0];return L?St(L,n,r):null},async createThread(h){const m=await Z("/threads",{method:"POST",body:JSON.stringify({id:h.id,anchor:Es(h.anchor,h.route),anchorState:h.anchorState,context:h.context,...n?{scope:{environment:n}}:{},createdBy:{name:h.createdBy.name},...h.comment?{comment:{id:h.comment.id,body:h.comment.body}}:{},...h.attachments?.length?{attachments:h.attachments.map(z=>z.id)}:{}})});return St(m,n,r)},async patchThread(h,m){const z="assignee"in m;if(!m.status&&!z)return null;const L=await Z(`/threads/${encodeURIComponent(h)}`,{method:"PATCH",body:JSON.stringify({...m.status?{status:m.status}:{},...z?{assignee:m.assignee??null}:{}})});return St(L,n,r)},async listAssignees(h){return(await Z(`/assignees${h?`?q=${encodeURIComponent(h)}`:""}`)).data??[]},async deleteThread(h){await Z(`/threads/${encodeURIComponent(h)}`,{method:"DELETE"})},isMine(h){return h.id?h.id===(a??Ye(t))?.reviewerId||h.id===Xn(t):!1},canModerate(){const h=a??Ye(t);return!!h?.member&&!!h.moderator},can(h){return(a??Ye(t))?.permissions.includes(h)??!1},async createComment(h,m){const z=await Z(`/threads/${encodeURIComponent(h)}/comments`,{method:"POST",body:JSON.stringify({id:m.id,body:m.body})});return{id:z.id,snagId:h,body:z.body,author:z.author,createdAt:z.createdAt}},async patchComment(h,m){return await Z(`/comments/${encodeURIComponent(h)}`,{method:"PATCH",body:JSON.stringify({body:m})}),null},async deleteComment(h){await Z(`/comments/${encodeURIComponent(h)}`,{method:"DELETE"})}}}async function Rs(e,t){if(e.url&&/^https?:/i.test(e.url))try{const n=await fetch(e.url,{credentials:"omit"});if(!n.ok)return null;const o=await n.blob();return o.type&&!o.type.startsWith("image/")?null:o}catch{return null}return t(e.id)}const _s=64,Is=4096,Ps=e=>de.counts(e),Ms=e=>e.filter(t=>t.status!=="resolved").length;function zs(e,t,n){const o=new Map;for(const a of t){const d=o.get(a.route)??{n:0,seen:""};a.status!=="resolved"&&d.n++,a.updatedAt>d.seen&&(d.seen=a.updatedAt),o.set(a.route,d)}o.has(n)||o.set(n,{n:0,seen:new Date().toISOString()});const l=[...o.entries()].sort((a,d)=>d[1].seen.localeCompare(a[1].seen)).slice(0,_s);l.some(([a])=>a===n)||(l[l.length-1]=[n,o.get(n)]);let u={v:1,p:Ms(t),r:Object.fromEntries(l.map(([a,d])=>[a,d.n])),t:new Date().toISOString()};JSON.stringify(u).length>Is&&(u={...u,r:{}});try{localStorage.setItem(Ps(e),JSON.stringify(u))}catch{return null}return u}function Os(e,t){return e?.r[t]??0}const Ds="pass(?:word|wd)?|pwd|secret|token|api[_-]?key|apikey|auth(?:orization)?|credential|session|sid|cookie|jwt|bearer|otp|mfa|totp|cvv|cvc|ssn|nino|iban|card(?:[_-]?number)?|account[_-]?number|private[_-]?key|signature|client[_-]?secret|refresh[_-]?token|access[_-]?token",Ls=new RegExp(`(["'\`]?)(?<![A-Za-z0-9])(?:${Ds})[\\w-]*\\b\\1?\\s*[:=]\\s*(?:(["'\`])((?:\\\\.|(?!\\2)[^\\\\])*)\\2|([^\\s,;&}\\])]{3,}))`,"gi"),Ns=/^(?:Bearer|Basic|Digest|Negotiate|Token)$/i,Hs=(e,t,n,o,r,l,u)=>{if(!n&&Ns.test(r)&&u.slice(l+e.length).startsWith(" [redacted]")||(n?o:r).startsWith("[redacted"))return e;const a=n?`${n}${o}${n}`:r;return e.slice(0,e.length-a.length)+(n?`${n}[redacted]${n}`:"[redacted]")},qn=/data:[a-z0-9.+-]*\/?[a-z0-9.+-]*;base64,[A-Za-z0-9+/=]{16,}/gi,Qn=/\beyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{0,}/g,Gn=/\b(sk-[A-Za-z0-9]+-[A-Za-z0-9_-]{20,}|sk-ant-[A-Za-z0-9_-]{20,}|sk-[A-Za-z0-9]{20,}|(sk|pk|rk)_(live|test)_[A-Za-z0-9]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[baprs]-[A-Za-z0-9-]{10,}|xapp-[A-Za-z0-9-]{10,}|AKIA[0-9A-Z]{16}|ASIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}|ya29\.[A-Za-z0-9_-]{20,}|SG\.[A-Za-z0-9_-]{20,}|npm_[A-Za-z0-9]{30,}|dop_v1_[a-f0-9]{40,}|shpat_[a-f0-9]{30,}|sbp_[a-f0-9]{30,}|hf_[A-Za-z0-9]{30,}|nvapi-[A-Za-z0-9_-]{20,})\b/g,Ws=/\b(Bearer|Basic|Digest|Negotiate|Token)\s+[A-Za-z0-9._~+/=-]{8,}/gi,eo=/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z]{2,24})+\b/g,Jt=/\b(?:\d[ -]?){12,18}\d\b/g,to=/\b(?=[A-Za-z0-9+/]*[a-z])(?=[A-Za-z0-9+/]*[A-Z])(?=[A-Za-z0-9+/]*\d)[A-Za-z0-9+/]{40,}={0,2}\b/g,no=/\b[0-9a-f]{32,}\b/gi,oo=/\b(?=[A-Za-z0-9_-]*[a-z])(?=[A-Za-z0-9_-]*[A-Z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]{40,}\b/g,ro=/\b[a-z][a-z0-9]{1,15}(?:_[a-z0-9]{1,15}){0,2}_(?=[A-Za-z0-9_-]*[A-Z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]{24,}\b/g,so=/\b[a-z][a-z0-9+.-]*:\/\/[^\s/:@]+:[^\s/@]+@/gi,Us=/^(?=[A-Za-z0-9_~.+/=-]*[a-z])(?=[A-Za-z0-9_~.+/=-]*[A-Z])(?=[A-Za-z0-9_~.+/=-]*\d)[A-Za-z0-9_~.+/=-]{24,}$/;function Ce(e,t){e.lastIndex=0;const n=e.test(t);return e.lastIndex=0,n}function ao(e){const t=e.replace(/[ -]/g,"");if(t.length<13||t.length>19)return!1;let n=0,o=!1;for(let r=t.length-1;r>=0;r--){let l=t.charCodeAt(r)-48;o&&(l*=2,l>9&&(l-=9)),n+=l,o=!o}return n%10===0}function js(e){Jt.lastIndex=0;for(const t of e.matchAll(Jt))if(ao(t[0]))return!0;return!1}function At(e){let t=e;return t=t.replace(qn,"data:[redacted]"),t=t.replace(Ws,"$1 [redacted]"),t=t.replace(Ls,Hs),t=t.replace(Qn,"[redacted:jwt]"),t=t.replace(Gn,"[redacted:key]"),t=t.replace(ro,"[redacted:key]"),t=t.replace(so,"[redacted:url-cred]@"),t=t.replace(eo,"[redacted:email]"),t=t.replace(Jt,n=>ao(n)?"[redacted:card]":n),t=t.replace(oo,n=>`[redacted:b64:${n.length}]`),t=t.replace(to,n=>`[redacted:b64:${n.length}]`),t=t.replace(no,n=>`[redacted:hex:${n.length}]`),t}const Fs=bt.query,Bs=bt.fragment;function Zs(e,t=[]){let n;try{const o=globalThis.location?.href;n=new URL(e,o)}catch{return At(e)}n.username="",n.password="";for(const o of[...n.searchParams.keys()]){if(Bs.includes(o)){n.searchParams.set(o,"[redacted]");continue}if(Fs.includes(o))continue;if(!t.includes(o)){n.searchParams.set(o,"[redacted]");continue}const r=n.searchParams.get(o)??"";At(r)!==r&&n.searchParams.set(o,"[redacted]")}return n.hash&&n.hash.length>1&&(n.hash=t.includes("#")?n.hash:"#[redacted]"),At(n.toString().replace(/%5Bredacted%5D/gi,"[redacted]"))}function Vs(e){return e.length>120?!0:Ce(eo,e)||Ce(Qn,e)||Ce(Gn,e)||Ce(no,e)||Ce(to,e)||Ce(qn,e)||Ce(oo,e)||Ce(ro,e)||Ce(so,e)||Us.test(e)||js(e)}const kt={id:"rev_local",name:V("author.unknown"),kind:"guest"},Ys="0.0.0";function io(e,t){if(e)return{...kt,name:e,...t?{email:t}:{}};try{const n=localStorage.getItem(de.identity);if(n)return{...kt,name:n[0]==="{"?JSON.parse(n).name??kt.name:n}}catch{}return kt}function Xs(e){return`SN-${e.reduce((n,o)=>{const r=Number(o.key.split("-")[1]??0);return Number.isFinite(r)&&r>n?r:n},0)+1}`}let qt=null;const xe=e=>Wr(e,qt);function Ks(e,t){const n=vn(),o=n.ownerDocument??document,r=o.defaultView??window,l=t?.config?.site??"local",u=t?.emit??(()=>{}),a=t?.assetBase??"./",d=t?.config?.env??"default";nt(n,"tokens",Fo);const g=Zo(n.host,Bo(t?.config?.theme)),v={},C=t?.config?.storage==="local"?void 0:t?.config?.host,p=C&&l!=="local"?Ts(C,l,t?.config?.env,{reviewToken:t?.reviewToken,onSessionEnded:s=>{ce.show(s==="revoked"?"error.linkrevoked":"error.sessionended")},onSessionStarted:()=>ce.hide()}):gs(l,d,{put:(s,i)=>v.put(s,i),del:s=>v.del(s)}),_=vs(l,d);let B=null;p.init({uid:l,env:d}).then(s=>{B=s.rounds??null,K?.update(x()),s.writable===!1&&s.reason==="origin_not_allowed"&&ce.show("error.origin",void 0,{origin:location.origin})}).catch(()=>{});let S=[],M=[];const G=ms();let q=null,Z=null,h=!1,m=!1,z=!1,L=null,N=!1;const Y={get:()=>q,unavailable:()=>m||z,newPass:()=>Z?.createPassCaches(),fuzzyHit:s=>L?.hit(s)??null,wantFuzzy:(s,i)=>{if(L){L.enqueue(s,i,()=>oe());return}N||!Z||!i.text?.exact||i.text.exact.length<8||(N=!0,Pe("anchor-fuzzy",a,o).then(f=>{if(!f.ok||!Z){z=!0,oe();return}L=f.mod.createFuzzyEngine(o,Z.fuzzyDeps),Re()}))},want:s=>{h||!(s.role&&s.accessibleName)&&!s.text?.exact&&!s.path?.length||(h=!0,Pe("anchor-ext",a,o).then(i=>{if(!i.ok){m=!0,oe();return}Z=i.mod,q=i.mod.resolveExtended,Re()}))}};let ae=null,c=Tr();const R=()=>c.statuses.length>0||!!c.by||!!c.page||c.read!=="all",w=br(n,s=>{if(O==="add"){if(W?.hasText()){W.pulse();return}W?.close(),W=null,me("comments")}b(s.id)},Y,s=>{ae=s,K?K.update(x()):b()});let O=(()=>{try{return sessionStorage.getItem(de.mode)==="comments"?"comments":"browse"}catch{return"browse"}})(),W=null,K=null,re=null,Ue=!1,Se=null,je=!1,$t=null,Te=null,Ae=null,ze=!1;function he(){return Ae?Promise.resolve(Ae):ze?Promise.resolve(null):Pe("capture",a,o).then(i=>i.ok?(v.put=i.mod.putBlob,v.del=i.mod.deleteBlob,Ae=i.mod):(Ke(new Error("chunk unavailable")),null))}function Ke(s){ze||(ze=!0,O==="add"&&me("comments"),te.setDegraded(!0),ce.show("error.capture",{label:"action.retry",run:()=>{ze=!1,te.setDegraded(!1),he()}}),console.warn(`[${we}] the capture chunk failed to load`,s))}let Je=0;function Oe(){const s=new URL(a,o.location.href).href,i=new URL(Ie.panels,s);return i.searchParams.set("cv",Ys),Je>0&&i.searchParams.set("r",String(Je)),Je++,import(i.href)}async function ke(){if(je)return null;if(Se)return Se.catch(()=>null);Se=Oe().catch(async()=>(await new Promise(s=>setTimeout(s,1e3)),Oe()));try{return $t=await Se}catch(s){return Se=null,it(s),null}}function it(s){je=!0,O==="add"&&me("comments"),te.setDegraded(!0),ce.show("error.panels",{label:"action.retry",run:()=>{je=!1,te.setDegraded(!1),b(re)}}),console.warn(`[${we}] the panels chunk failed to load`,s)}const $e=o.defaultView?.matchMedia?.("(pointer: coarse)").matches??!1;let ue=null;async function Et(){if(ue)return;const s=await he();!s||ue||(ue=s.createAddChrome(n,$e,{pick:(i,f)=>void $(i,f),announce:Qe}),ue.setActive(O==="add"))}const pe=o.createElement("div");pe.style.cssText=`position:fixed;left:0;top:0;pointer-events:none;z-index:${Ve.dock}`,n.appendChild(pe);const ct=Pr(r,pe,s=>te.setPuck(s>1.2)),ce=wr(n,pe),Fe=Sr(n,pe),A=Go(n,{onPick:(s,i)=>void $(s,i),onHover:s=>s?ue?.show(s):ue?.clear(),onSelectStart:()=>{$e||nn()}});async function $(s,i){if(W?.hasText()){W.pulse();return}W?.close();const[f,T]=await Promise.all([ke(),he()]);if(!f||!T)return;const F=T.captureContext({page:T.derivePageRef(o.location,ht()),...mt()});hn(s);const J=T.deriveAnchorLabel(s);y(f,s,i,F,J,T)}function y(s,i,f,T,F,J,X,He){let be=i;pt=!1;const ge=xe(o);_t=!1;const gt=()=>{W=null,jn(ge),te.setDraft(Bt()),me("comments")},tt=()=>{et?.abort(),Ne=et=null,gt()},ve={at:f,label:F,...X?{initialBody:X.body,initialName:X.author,...X.email?{initialEmail:X.email}:{}}:{},onDraft:(ie,le,yt)=>{const ko=ns({route:ge,body:ie,author:le,...yt?{email:yt}:{},label:F,anchor:He??J.createElementAnchor(i,{point:f,viewportWidth:r.innerWidth,label:F,...J.describeElement(i)}),at:{x:f.x+r.scrollX,y:f.y+r.scrollY},savedAt:new Date().toISOString()});te.setDraft(Bt()),!ko&&!_t&&(_t=!0,an())},onSend:(ie,le,yt)=>{gt(),cn(be,f,T,ie,le,yt,He)},onRetarget:ie=>{const le=ie==="up"?J.widen(be):J.narrow(be);le&&(be=le,ue?.show(le),W?.setLabel(J.deriveAnchorLabel(le)))},...fe&&Ge!==!1?{onShotOptIn:ie=>pt=ie}:{},onCancel:tt,crumbsOn:fn!==!1,shotsOn:Ge!==!1,...C&&l!=="local"?{serverHost:new URL(C).host}:{},...C&&p.adoptSession?{studio:{host:C,uid:l,env:t?.config?.env,member:p.member(),adopt:ie=>p.adoptSession(ie),signOut:()=>p.signOut()}}:{},...He?.text?.exact?{quote:He.text.exact}:{}};W=s.openComposer(n,ve,pe),ne()}async function U(){const s=xe(o),i=os(s);if(te.setDraft(Bt()),!i||W)return;const[f,T]=await Promise.all([ke(),he()]);if(!f||!T)return;const F=Ut(i.anchor,o,{viewportWidth:r.innerWidth,...q?{extended:q}:{}});if(!F.element)return;const J=F.element.getBoundingClientRect();if(J.width===0&&J.height===0)return;const X={x:i.at.x-r.scrollX,y:i.at.y-r.scrollY};me("add"),y(f,F.element,X,T.captureContext({page:T.derivePageRef(o.location,ht()),...mt()}),i.label,T,{body:i.body,author:i.author,...i.email?{email:i.email}:{}})}async function b(s=null){if(s&&s!==re&&u("thread:open",{threadId:s}),s&&_.mark(s),re=s,Ue=!0,O==="browse"&&me("comments"),K){K.update(x());return}if(!await ke())return;const f=await Pe("dock",a,o);if(!f.ok){ce.show("error.panels",{label:"action.retry",run:()=>void b(re)});return}!Ue||K||(Te=f.mod,K=f.mod.openDock(n,x(),pe),ne())}function D(){_.markAll(S),c.newOnly&&(c={...c,newOnly:!1}),Ue=!1,K?.close(),K=null,re=null,w.highlight(null),ne(),R()&&oe()}function E(s){const i=s?S.find(f=>f.id===s):void 0;if(i&&i.route!==xe(o)){Er(r,i.id),r.location.assign(i.route);return}s&&_.mark(s),re=s,w.highlight(null),R()?oe():K?.update(x()),i&&Te?.scrollToSnag(r,n,i)}function x(){return{snags:S,route:xe(o),openId:re,seenAt:_.map(),onOpen:E,onStatus:(s,i)=>void fo(s,i),onReply:(s,i,f)=>void po(s,i,f),onEdit:(s,i)=>void Q(s,i),onDeleteComment:s=>void H(s),onDeleteThread:s=>void j(s),...p.isMine?{isMine:s=>p.isMine(s)}:{},...C&&p.adoptSession?{studio:{host:C,uid:l,env:t?.config?.env,member:p.member(),adopt:s=>p.adoptSession(s),signOut:()=>p.signOut()}}:{},canDeleteOwnThread:p.can?p.can("thread:delete:own"):!0,canModerate:p.canModerate?.()??!1,...p.listAssignees&&p.can?.("thread:assign")?{assignees:()=>p.listAssignees(),onAssign:(s,i)=>void ho(s,i)}:{},onClearAll:()=>void ee(),onClose:D,onExport:Rt,onHover:s=>w.highlight(s),...B&&B.length>1&&p.setRound?{rounds:B,activeRound:p.getRound?.()??B.find(s=>!s.closed)?.number??B[0].number,onRound:s=>{p.setRound(s),Re()}}:{},onAnnounce:Qe,loadShot:s=>Rs(s,async i=>{const f=await he();return f?(await f.getBlob(i))?.blob??null:null}),filter:c,onFilter:s=>{const i=s.statuses.join()!==c.statuses.join()||s.by!==c.by||s.page!==c.page||s.read!==c.read;c=s,i?oe():K?.update(x())},...ae?{clusterFilter:ae}:{},onClusterClear:()=>{ae=null,K?.update(x())},onShowAnyway:s=>{w.showGhost(s),Te?.scrollToSnag(r,n,s)}}}async function se(s,i){const f=S;S=s,oe();try{await _e(i)}catch{S=f,oe(),ce.show("error.sendfailed",void 0,{item:"change"})}}async function Q(s,i){await se(S.map(f=>({...f,comments:f.comments.map(T=>T.id===s?{...T,body:i}:T)})),()=>p.patchComment(s,i))}async function H(s){await se(S.map(i=>({...i,comments:i.comments.filter(f=>f.id!==s)})),()=>p.deleteComment(s))}async function j(s){const i=re;re===s&&(re=null),await se(S.filter(f=>f.id!==s),()=>p.deleteThread(s)),S.some(f=>f.id===s)&&(re=i)}async function ee(){const s=S.map(i=>i.id);S=[],re=null,oe(),await Promise.all(s.map(i=>_e(()=>p.deleteThread(i))))}const te=ls(n,{onState:s=>me(s),onPanel:()=>K?D():void b(),onNav:s=>en(s),parent:pe}),fe=r.matchMedia?.("(pointer: coarse)").matches??!1,ne=()=>{fe&&te.setConcealed(!!W||!!K)};let ye=null,De=[];function lt(s){let i=!1;const f=()=>{i||(i=!0,r.removeEventListener("scrollend",f),s())};r.addEventListener("scrollend",f,{once:!0}),r.setTimeout(f,600)}const qe=o.createElement("div");qe.setAttribute("aria-live","polite"),qe.setAttribute("role","status");const Qt="position:absolute;width:1px;height:1px;overflow:hidden";qe.style.cssText=Qt;const Ct=o.createElement("div");Ct.setAttribute("aria-live","assertive"),Ct.style.cssText=Qt,n.append(qe,Ct);let Gt=0;function Qe(s){r.clearTimeout(Gt),Gt=r.setTimeout(()=>{qe.textContent=s},400)}function en(s){const i=De.length;if(i===0)return;ye=ye===null?s===1?0:i-1:(ye+s+i)%i;const f=De[ye];us(r,n,f);const T=ye+1;lt(()=>{w.pulse(f.id),Qe(V("nav.announce",{n:T,label:f.anchor.label,i:T,total:i}))})}function tn(){if(O!=="comments"||$e){Ee?.disarm();return}nn().then(s=>{s&&O==="comments"&&s.arm()})}let Ee=null,Tt=null;async function nn(){if(Ee)return Ee;const s=await Pe("text",a,o);return!s.ok||Ee||(Tt=s.mod,Ee=s.mod.createSelectionWatcher(n,{onQuote:(i,f)=>void co(i,f)})),Ee}async function co(s,i){const f=Ae??await he();if(!f||!Tt)return;const T=Tt.createTextAnchor(s,f,{viewportWidth:r.innerWidth,ourRoot:n});if(T.kind==="refused-form-control"){$(T.el,i);return}if(T.kind!=="text")return;const F=await ke();if(!F)return;const J=f.captureContext({page:f.derivePageRef(o.location,ht()),...mt()});try{s.removeAllRanges()}catch{}y(F,T.el,T.point,J,T.label,f,void 0,T.record)}function me(s,i=!1){const f=O;O=s,s!=="add"&&W&&!i&&(W.close(),W=null),s==="add"&&K&&D(),s==="add"&&(ke(),he());try{sessionStorage.setItem(de.mode,s==="add"?"comments":s)}catch{}A.setMode(s),s!==f&&Qe(V(`toolbar.${s}`)),ne(),s==="add"&&Et(),tn(),ue?.setActive(s==="add"),te.setState(s),oe(),s!==f&&u("modechange",{mode:s,previous:f})}let Be=0,on=0;const rn=[300,800,1600,3200];function lo(){if(Be||!w.hasPending()){w.hasPending()||(on=0);return}const s=rn[Math.min(on++,rn.length-1)];Be=r.setTimeout(()=>{Be=0,oe()},s)}const uo=3e3;let sn=0;function oe(s){const i=s??(Date.now()<sn?"navigating":"authoritative");M=w.reanchor(S.filter(xo()),i),wo(),lo();const f=new Map(M.map(X=>[X.id,X]));S=S.map(X=>f.get(X.id)??X);const T=R()?new Set(M.filter(X=>!_r(X,c,_.map())&&X.id!==re).map(X=>X.id)):void 0;De=T?M.filter(X=>!T.has(X.id)):M,w.render(O==="browse"?[]:M,T);const F=xe(o),J=G?zs(o.location.origin,S,F):null;te.setCount(J?Os(J,F):G?M.filter(X=>X.status!=="resolved").length:null),ye!==null&&ye>=De.length&&(ye=null),K?.update(x())}async function Re(){const{data:s}=await p.listThreads();S=s,oe();const i=w.settled();for(const f of i)u("anchor:settled",{threadId:f.id,state:f.state,strategy:f.strategy,confidence:f.confidence});return p.capabilities.anchorReports&&p.reportAnchors&&i.length&&_e(()=>p.reportAnchors(i.map(f=>({threadId:f.id,state:f.state,confidence:f.confidence,strategy:f.strategy})))),p.capabilities.anchorReports||await Promise.all(s.flatMap(f=>{const T=S.find(F=>F.id===f.id);return!T||T.anchorState===f.anchorState?[]:[_e(()=>p.patchThread(T.id,{anchor:T.anchor,anchorState:T.anchorState}))]})),M}async function fo(s,i){S=S.map(f=>f.id===s?{...f,status:i}:f),oe(),u("thread:resolve",{threadId:s,status:i}),await _e(()=>p.patchThread(s,{status:i}))}async function ho(s,i){S=S.map(f=>f.id===s?{...f,assignee:i}:f),oe(),await _e(()=>p.patchThread(s,{assignee:i&&i.id}))}async function po(s,i,f){const T={id:Zn(),body:i,author:io(f)};S=S.map(F=>F.id===s?{...F,comments:[...F.comments,{...T,snagId:s,createdAt:new Date().toISOString()}]}:F),_.mark(s),oe(),u("comment:create",{threadId:s,comment:T}),await _e(()=>p.createComment(s,T))}function an(){ce.show("error.quota",{label:"action.exportclear",run:()=>{Rt("json"),ee()}}),console.warn(`[${we}] ${V("error.quota")}`)}async function _e(s){try{return await s()}catch(i){if(i instanceof Lt&&i.code==="local_quota_exceeded")return an(),null;throw i}}function Rt(s){he().then(async i=>{if(!i)return;const f=await i.resolveAttachmentUris(S).catch(()=>new Map);i.download(n,i.buildExport(s,S,{origin:o.location.origin,exportedAt:new Date().toISOString()},f),r)})}async function cn(s,i,f,T,F,J,X){const He=io(F,J),be=Ae??await he();if(!be)throw new Error(`[${we}] add() needs the capture chunk`);Ne||hn(s);const ge=Ne?await Ne:null;Ne=et=null,be.applyShotOutcome(f,ge,Ge===!1,fe&&!pt);const gt=ge?.blob&&p.uploadAttachment?p.uploadAttachment(ge.blob,{kind:"screenshot",...ge.width!==void 0?{width:ge.width}:{},...ge.height!==void 0?{height:ge.height}:{}}).catch(()=>null):Promise.resolve(null),tt={id:fs(),key:Xs(S),route:xe(o),anchor:X??be.createElementAnchor(s,{point:i,viewportWidth:r.innerWidth,label:be.deriveAnchorLabel(s),...be.describeElement(s)}),anchorState:"anchored",scope:bo(),context:f,createdBy:He,createdAt:new Date().toISOString(),...T?{comment:{id:Zn(),body:T,author:He}}:{}},ve=Cn(tt);ge?.blob&&(ve.screenshotBlob=ge.blob),S=[...S,ve],_.mark(ve.id),Qe(V("announce.created",{key:ve.key})),u("thread:create",{thread:ve}),O==="browse"?me("comments"):oe();try{const ie=await gt;ie&&(tt.attachments=[ie],S=S.map(le=>le.id===ve.id?{...le,attachments:[ie]}:le),oe()),await _e(()=>p.createThread(tt))}catch(ie){throw S=S.filter(le=>le.id!==ve.id),oe(),ce.show("error.sendfailed",void 0,{item:Pt.toLowerCase()}),console.warn(`[${we}] ${V("error.sendfailed",{item:Pt.toLowerCase()})}`,ie),ie}return ve}function ln(s){if((s.key==="n"||s.key==="p")&&O==="comments"&&!W){if(s.metaKey||s.ctrlKey||s.altKey)return;const i=s.composedPath()[0]??s.target;if(i&&(i.closest?.("input,textarea,select,[contenteditable]")||i.isContentEditable))return;s.preventDefault(),s.stopPropagation(),en(s.key==="n"?1:-1);return}O==="add"&&s.key==="Escape"&&(W||(s.stopPropagation(),me("comments")))}o.addEventListener("keydown",ln,!0);let dn=0;const un=()=>{if(o.hidden||!p.revalidate)return;const s=Date.now();s-dn<3e4||(dn=s,p.revalidate())};o.addEventListener("visibilitychange",un);const mo=Lo(n),go=No(n,s=>{console.warn(`[${we}] the host page hid the widget from assistive technology ${s} times; leaving it alone.`)}),yo=Do(n,s=>{console.warn(`[${we}] the host page removed the widget ${s} times; leaving it alone. Reload to comment again.`)});function bo(){return{environment:d,...t?.config?.branch?{branch:t.config.branch}:{}}}let dt={route:xe(o),url:o.location.href},_t=!1,ut=null;function vo(s){if(s){if(O==="browse")return;ut=O,me("browse",!0),Fe.show(),u("paused",{reason:"modal-dialog"})}else if(ut){const i=ut;ut=null,Fe.hide(),me(i),u("resumed",{mode:i})}}ke();function wo(){M.length>0&&Pe("dock",a,o)}{const s=o.createElement("div");s.style.cssText="position:fixed;inset:0;pointer-events:none;visibility:hidden",n.appendChild(s);const i=s.getBoundingClientRect(),f=Math.abs(i.left)>1||Math.abs(i.top)>1||Math.abs(i.width-r.innerWidth)>1||Math.abs(i.height-r.innerHeight)>1;s.remove(),f&&(console.warn(`[${we}] fixed-trapped: <html> has transform/filter/contain, so our fixed layer follows it, not the viewport. Remove it, or expect drift.`),u("error",{code:"fixed-trapped"}))}let Ze=null;const ft=new Set,Le=(()=>{const s=r[To.config];return s&&typeof s=="object"?s:void 0})(),fn=Le?.breadcrumbs,It=(()=>{const s=Le?.significantQueryParams,i=Le?.ignoredQueryParams,f={};return s==="*"?f.significantQueryParams="*":Array.isArray(s)&&(f.significantQueryParams=s.map(String)),Array.isArray(i)&&(f.ignoredQueryParams=i.map(String)),f})(),ht=()=>({routeOverride:qt,query:It,doc:o}),Ge=Le?.screenshot===!1?!1:Le?.screenshot&&typeof Le.screenshot=="object"?Le.screenshot:{};let pt=!1,Ne=null,et=null;function hn(s){if(Ge===!1||Ne||fe&&!pt)return;et=new AbortController;const i=et.signal;Ne=Pe("screenshot",a,o).then(f=>f.ok?f.mod.captureScreenshot({doc:o,target:s,signal:i,...Ge,...p.fetchForeignImage?{fetchForeignImage:T=>p.fetchForeignImage(T)}:{}}):{situation:"engine-load-failed",blindSpots:[],maskedCount:0})}function xo(){const s=xe(o),i=Hn(o.location.pathname),f=Br(o.location.search,It);return T=>(T.route===s||T.context?.page?.pathname===i)&&Zr(T.context?.page?.query,f,It)}{const s=fn;s!==!1&&Pe("crumbs",a,o).then(i=>{i.ok&&(Ze=i.mod.installTierC({win:r,...t?.early?{early:t.early}:{},...s&&typeof s=="object"?{config:s}:{},subscribeNav:f=>(ft.add(f),()=>ft.delete(f))}))})}const mt=()=>Ze?{breadcrumbs:{records:Ze.drain(),status:Ze.status()}}:{},So=Jr(o,r,()=>{O!=="browse"&&M.length>0&&oe()}),Ao=$r(r,{onResize:()=>oe(),onRoute:()=>{const s={route:xe(o),url:o.location.href},i=s.route!==dt.route;if(i){u("navigate",{from:dt,to:s});for(const f of ft)f(dt.url,s.url)}if(dt=s,!i){Re();return}sn=Date.now()+uo,r.setTimeout(()=>{p.listThreads().then(({data:f})=>{S=f,oe("optimistic")})},100),r.setTimeout(()=>void Re(),600)},onModal:vo});return te.setState(O),A.setMode(O),tn(),G||ce.show("error.nostorage",{label:"action.export",run:()=>Rt("md")}),Re().then(async s=>{const i=Cr(r);if(!i){const T=new URLSearchParams(o.location.search).get(Mo("t"));if(T){let F=s.find(J=>J.key===T);if(!F&&p.getThreadByKey){const J=await p.getThreadByKey(T).catch(()=>null);J&&(S=[...S.filter(X=>X.id!==J.id),J],oe(),F=S.find(X=>X.id===J.id))}F?(await b(F.id),Te?.scrollToSnag(r,n,F)):(ce.show("permalink.unknown"),await b(null));return}await U();return}const f=s.find(T=>T.id===i);await b(f?i:null),f&&Te?.scrollToSnag(r,n,f)}),{root:n,assetBase:t?.assetBase??"",snags:()=>M,async add(s,i,f,T){const F=T?null:await he(),J=T??(F?F.captureContext({page:F.derivePageRef(o.location,ht()),...mt()}):void 0);if(!J)throw new Error(`[${we}] add() needs the capture chunk, or an explicit context`);return cn(s,i,J,f)},refresh:Re,setRoute(s){qt=s&&s.startsWith("/")?s:null,Re()},setState:me,getState:()=>O,openPanel:b,async open(s){const i=s.startsWith(vt.thread)?S.find(f=>f.id===s):S.find(f=>f.key===s);return i?i.route!==xe(o)?{ok:!1,reason:"wrong-page",url:i.context?.url??i.route,route:i.route}:(await b(i.id),Te?.scrollToSnag(r,n,i),{ok:!0,anchorState:i.anchorState}):{ok:!1,reason:"not-found"}},closePanel:D,hitTest:(s,i)=>A.hitTest(s,i),destroy(){W?.close(),D(),ue?.destroy(),ce.destroy(),Fe.destroy(),ct(),yo(),go(),mo(),Ao.destroy(),So.destroy(),Ze?.destroy(),Ze=null,ft.clear(),Ee?.destroy(),Ee=null,L?.destroy(),L=null,Be&&r.clearTimeout(Be),Be=0,o.removeEventListener("keydown",ln,!0),o.removeEventListener("visibilitychange",un),g(),A.destroy(),w.destroy(),te.destroy(),n.host.remove()}}}export{yn as HOST_CSS,vn as createHost,Vs as isSensitiveValue,Ks as mount,At as redactText,Zs as redactUrl};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as r,Q as u,d as s}from"./useBaseQuery-DztMyAqa.js";import{y as t}from"./index-Bvmz5Xph.js";function a(e,o){return r({...e,enabled:!0,suspense:!0,throwOnError:s,placeholderData:void 0},u)}function i(){return a(t.me()).data}export{i as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as t,O as o}from"./index-Bvmz5Xph.js";const n=()=>t.jsx(o,{});export{n as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as t,O as o}from"./index-Bvmz5Xph.js";const n=()=>t.jsx(o,{});export{n as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as z,r as i,Y as P,Z as A,X as J,p as T,_ as W,j as e,V as Q,B as N,y as U,$ as oe,A as K}from"./index-Bvmz5Xph.js";import{u as B}from"./useQuery-DCEPkmeo.js";import{B as G}from"./badge-BGUQxxes.js";import{E as $,G as E,I as O,H as D,J as L,K as R}from"./dialog-Ca351GqX.js";import{L as C,I as F}from"./label-CeHVAC98.js";import{S as ae}from"./switch-Djsy8JA6.js";import{C as V}from"./ConfirmDialog-B-mNmk6U.js";import{P as re,a as X}from"./parts-BU_5BLga.js";import{C as _}from"./CopyButton-bsaLPvqU.js";import{b as Y}from"./labels--UUyt9uB.js";import{u as ie}from"./me-zNn3-t75.js";import"./useBaseQuery-DztMyAqa.js";import"./useRender-C2NyqaXd.js";import"./useAriaLabelledBy-D35XdVIh.js";import"./useValueChanged-DY7n1sYE.js";import"./card-BX32udhB.js";import"./check-DjkY9Lhe.js";import"./copy-BtOpNPn3.js";const ce={ok:{label:"Healthy",tone:"ok"},needs_reauth:{label:"Needs a new token",tone:"bad"},error:{label:"Failing",tone:"bad"}};function De(){const r=ie(),c=r.user.role==="owner",u=B(U.integrations()),f=z(),g=()=>f.invalidateQueries({queryKey:["integrations"]}),[b,d]=i.useState(null),[m,h]=i.useState(null),[x,l]=i.useState(null),j=P({mutationFn:t=>T.regenerateGitHubWebhook(t),onSuccess:({webhook:t},o)=>l({site:o,provider:"github",hook:t,fresh:!1}),onError:t=>A.error(J(t))}),v=P({mutationFn:({uid:t,provider:o})=>T.testTracker(t,o).then(a=>({...a,provider:o})),onSuccess:t=>{A[t.ok?"success":"error"](t.ok?`${W[t.provider]} can see ${t.target}`:t.detail??`${W[t.provider]} refused the token`),g()},onError:t=>A.error(J(t))}),p=P({mutationFn:({uid:t,provider:o})=>T.disconnectTracker(t,o),onSuccess:()=>{h(null),g()},onError:t=>A.error(J(t))}),k=u.data?.data??[],y=t=>k.filter(o=>o.provider===t),n=t=>r.projects.filter(o=>!y(t).some(a=>a.site===o.uid));return e.jsxs("div",{className:"flex flex-col gap-10 p-7",children:[e.jsx(re,{title:"Integrations",sub:"Mirrors converge on the comment's status here; Slack only announces"}),["github","linear","jira","slack"].map(t=>{const o=y(t),a=n(t);return e.jsxs(X,{title:W[t],description:t==="github"?"A comment becomes an issue in the site's repository, with the brief as its body; resolving it here closes the issue there, and closing it there resolves it here. A fine-grained token per site — no OAuth app to register.":t==="linear"?"A comment becomes an issue in the site's team, with the brief as its body; our status moves it between the team's workflow states by type, and a webhook from Linear moves it back. A personal API key per site — no OAuth app to register.":t==="jira"?"A comment becomes an issue in the site's Jira project, with the brief as its description; our status moves it through the workflow by status category, and a webhook from Jira moves it back. An API token with the account's email — what Atlassian gives a self-hoster.":"One message per comment in a channel, edited in place as the status moves — never a second message, never a reply. A bot token from an app you create in a click from our manifest; Slack sends nothing back.",children:[u.isPending&&e.jsx(Q,{rows:2}),u.isSuccess&&o.length===0&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(G,{variant:"outline",children:"Not connected"}),e.jsx("span",{className:"text-[13px] text-muted-foreground",children:t==="github"?"No site is connected to a repository yet.":t==="linear"?"No site is connected to a team yet.":t==="jira"?"No site is connected to a project yet.":"No site is connected to a channel yet."})]}),o.length>0&&e.jsx("ul",{className:"m-0 flex list-none flex-col gap-2 p-0",children:o.map(s=>{const w=ce[s.health]??{label:s.health,tone:"warn"};return e.jsxs("li",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 rounded-md border border-border px-3 py-2.5 text-[13px]",children:[e.jsx("span",{className:"font-medium",children:s.siteName??s.site}),e.jsx("span",{className:"text-muted-foreground",children:"→"}),e.jsx("code",{className:"font-mono text-[12.5px]",children:s.provider==="github"?`${s.owner}/${s.repo}`:s.provider==="linear"?`${s.teamKey} · ${s.teamName}`:s.provider==="jira"?`${s.projectKey} · ${s.projectName}`:`#${s.channelName} · ${s.teamName}`}),e.jsx(G,{variant:"outline",className:w.tone==="ok"?"border-ok text-ok":w.tone==="bad"?"border-destructive text-destructive":"",children:w.label}),e.jsxs("span",{className:"text-[12px] text-muted-foreground",children:[s.provider==="slack"?s.createOn==="thread.created"?"A message for every new comment":"Messages when you ask, from the brief":s.createOn==="thread.created"?"An issue for every new comment":"Issues when you ask, from the brief",s.provider==="github"&&s.labels.length?` · labels ${s.labels.join(", ")}`:"",s.provider!=="github"&&s.provider!=="slack"&&!s.hasWebhookSecret?` · no webhook secret yet, so ${W[s.provider]} cannot move comments here`:""," · ",Y(s.updatedAt)]}),s.lastError&&e.jsx("span",{className:"basis-full text-[12px] text-destructive",children:s.lastError}),c&&e.jsxs("span",{className:"ml-auto flex gap-1",children:[s.provider==="github"?e.jsx(N,{variant:"ghost",size:"sm",loading:j.isPending,onClick:()=>j.mutate(s.site),children:"Webhook…"}):s.provider==="slack"?null:e.jsx(N,{variant:"ghost",size:"sm",onClick:()=>l({site:s.site,provider:s.provider,hook:{url:`${location.origin}/api/v1/integrations/${s.provider}/inbound`},fresh:!1}),children:"Webhook…"}),e.jsx(N,{variant:"ghost",size:"sm",loading:v.isPending,onClick:()=>v.mutate({uid:s.site,provider:s.provider}),children:"Test"}),e.jsx(N,{variant:"ghost",size:"sm",onClick:()=>h(s),children:"Disconnect"})]})]},`${s.provider}:${s.site}`)})}),c&&a.length>0&&e.jsx("div",{children:e.jsx(N,{variant:"outline",size:"sm",onClick:()=>d(t),children:"Connect a site…"})})]},t)}),e.jsx(xe,{owner:c,sites:r.projects}),e.jsx(le,{open:b==="github",onOpenChange:t=>!t&&d(null),sites:n("github"),onDone:(t,o)=>{g(),o&&l({site:t,provider:"github",hook:o,fresh:!0})}}),e.jsx(me,{open:b==="linear",onOpenChange:t=>!t&&d(null),sites:n("linear"),onDone:(t,o)=>{g(),l({site:t,provider:"linear",hook:o,fresh:!0})}}),e.jsx(he,{open:b==="jira",onOpenChange:t=>!t&&d(null),sites:n("jira"),onDone:(t,o)=>{g(),l({site:t,provider:"jira",hook:o,fresh:!0})}}),e.jsx(ue,{open:b==="slack",onOpenChange:t=>!t&&d(null),sites:n("slack"),onDone:()=>void g()}),e.jsx(de,{state:x,onClose:()=>l(null),siteName:t=>k.find(o=>o.site===t)?.siteName??"the site"}),e.jsx(V,{open:m!==null,onOpenChange:t=>!t&&h(null),title:`Disconnect ${m?.siteName??"this site"} from ${m?W[m.provider]:"the tracker"}?`,description:m?.provider==="slack"?e.jsx(e.Fragment,{children:"Messages already posted stay in the channel; no new ones are posted and they stop being updated. The token is forgotten."}):e.jsx(e.Fragment,{children:"Issues already made keep their links; no new ones are made and status stops mirroring. The token is forgotten."}),confirmLabel:"Disconnect",busy:p.isPending,onConfirm:async()=>{m&&await p.mutateAsync({uid:m.site,provider:m.provider})}})]})}function le({open:r,onOpenChange:c,sites:u,onDone:f}){const[g,b]=i.useState(""),[d,m]=i.useState(""),[h,x]=i.useState(""),[l,j]=i.useState(""),[v,p]=i.useState(!1),[k,y]=i.useState(""),n=P({mutationFn:a=>T.connectTracker(a,"github",{repository:d.trim(),token:h.trim(),labels:l,createOn:v?"thread.created":"manual"})}),t=g||u[0]?.uid||"",o=async a=>{a.preventDefault(),y("");try{const s=await n.mutateAsync(t);m(""),x(""),j(""),p(!1),c(!1),f(t,s.webhook&&"secret"in s.webhook?s.webhook:void 0),A.success("GitHub connected")}catch(s){y(s instanceof K?s.message:"Could not reach the server.")}};return e.jsx($,{open:r,onOpenChange:c,children:e.jsx(E,{children:e.jsxs("form",{onSubmit:a=>void o(a),className:"flex flex-col gap-4",noValidate:!0,children:[e.jsxs(O,{children:[e.jsx(D,{children:"Connect a site to GitHub"}),e.jsxs(L,{children:["A fine-grained personal access token with ",e.jsx("b",{children:"Issues: read and write"})," on that one repository. It is checked against the repository before it is saved, and stored encrypted with this instance's secret key."]})]}),k&&e.jsx("p",{role:"alert",className:"m-0 rounded-md border border-destructive/40 bg-warn-soft px-3 py-2 text-[13px] text-destructive",children:k}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"gh-site",children:"Site"}),e.jsx("select",{id:"gh-site",value:t,onChange:a=>b(a.target.value),className:"h-8 rounded-md border border-input bg-background px-2.5 text-[13px]",children:u.map(a=>e.jsx("option",{value:a.uid,children:a.name},a.uid))})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"gh-repo",children:"Repository"}),e.jsx(F,{id:"gh-repo",placeholder:"kilnwork/site",value:d,onChange:a=>m(a.target.value),autoComplete:"off"})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"gh-token",children:"Token"}),e.jsx(F,{id:"gh-token",type:"password",placeholder:"github_pat_…",value:h,onChange:a=>x(a.target.value),autoComplete:"off"})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"gh-labels",children:"Labels"}),e.jsx(F,{id:"gh-labels",placeholder:"review, bug",value:l,onChange:a=>j(a.target.value)}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"Applied to every issue this makes. Optional."})]}),e.jsxs("label",{className:"flex cursor-pointer items-start gap-2.5 text-[13px]",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:v,onChange:a=>p(a.target.checked)}),e.jsxs("span",{children:[e.jsx("span",{className:"block font-medium",children:"An issue for every new comment"}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:'Off by default: a reviewer walking a site leaves twenty comments and half are "never mind". Make issues from the brief when you mean it.'})]})]}),e.jsxs(R,{children:[e.jsx(N,{type:"button",variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsx(N,{type:"submit",loading:n.isPending,disabled:!d.trim()||!h.trim()||!t,children:n.isPending?"Checking…":"Connect"})]})]})})})}function de({state:r,onClose:c,siteName:u}){const f=r&&"secret"in r.hook?r.hook.secret:null;return e.jsx($,{open:r!==null,onOpenChange:g=>!g&&c(),children:e.jsxs(E,{children:[e.jsxs(O,{children:[e.jsx(D,{children:r?.fresh?"Connected — now the webhook":"Webhook for "+(r?u(r.site):"")}),e.jsx(L,{children:r?.provider==="linear"?"Issues moved in Linear move the comment here. In Linear › Settings › API › Webhooks, create one for the team with this URL and Issue events; then paste its signing secret when connecting or replacing the connection.":r?.provider==="jira"?"Issues moved in Jira move the comment here. In Jira › Settings › System › Webhooks, create one with this URL, the events Issue updated and Issue deleted, and a secret; then paste the same secret when connecting or replacing the connection.":`Issues closed or reopened on GitHub move the comment here. Add a webhook to the repository — Settings › Webhooks › Add webhook — with these values. The secret is shown this once${r?.fresh?"":", and the previous one has stopped working"}.`})]}),r&&e.jsxs("dl",{className:"m-0 grid grid-cols-[110px_1fr] gap-x-3 gap-y-2 text-[13px]",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Payload URL"}),e.jsxs("dd",{className:"m-0 flex items-center gap-2",children:[e.jsx("code",{className:"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1 font-mono text-[12px]",children:r.hook.url}),e.jsx(_,{text:r.hook.url,label:"Copy the payload URL"})]}),e.jsx("dt",{className:"text-muted-foreground",children:"Content type"}),e.jsx("dd",{className:"m-0",children:e.jsx("code",{className:"font-mono text-[12px]",children:"application/json"})}),f&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-muted-foreground",children:"Secret"}),e.jsxs("dd",{className:"m-0 flex items-center gap-2",children:[e.jsx("code",{className:"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1 font-mono text-[12px]","data-testid":"webhook-secret",children:f}),e.jsx(_,{text:f,label:"Copy the secret"})]})]}),e.jsx("dt",{className:"text-muted-foreground",children:"Events"}),e.jsx("dd",{className:"m-0",children:r.provider==="linear"?"Issues":r.provider==="jira"?"Issue: updated, deleted":"Let me select individual events → Issues"})]}),e.jsx(R,{children:e.jsx(N,{type:"button",onClick:c,children:"Done"})})]})})}function me({open:r,onOpenChange:c,sites:u,onDone:f}){const[g,b]=i.useState(""),[d,m]=i.useState(""),[h,x]=i.useState(""),[l,j]=i.useState(""),[v,p]=i.useState(!1),[k,y]=i.useState(""),n=P({mutationFn:a=>T.connectTracker(a,"linear",{team:d.trim(),apiKey:h.trim(),...l.trim()?{webhookSecret:l.trim()}:{},createOn:v?"thread.created":"manual"})}),t=g||u[0]?.uid||"",o=async a=>{a.preventDefault(),y("");try{const s=await n.mutateAsync(t);m(""),x(""),j(""),p(!1),c(!1),f(t,s.webhook??{url:`${location.origin}/api/v1/integrations/linear/inbound`}),A.success("Linear connected")}catch(s){y(s instanceof K?s.message:"Could not reach the server.")}};return e.jsx($,{open:r,onOpenChange:c,children:e.jsx(E,{children:e.jsxs("form",{onSubmit:a=>void o(a),className:"flex flex-col gap-4",noValidate:!0,children:[e.jsxs(O,{children:[e.jsx(D,{children:"Connect a site to Linear"}),e.jsx(L,{children:"A personal API key from Linear › Settings › API, belonging to a member of the team. It is checked against the team before it is saved, and stored encrypted with this instance's secret key."})]}),k&&e.jsx("p",{role:"alert",className:"m-0 rounded-md border border-destructive/40 bg-warn-soft px-3 py-2 text-[13px] text-destructive",children:k}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"ln-site",children:"Site"}),e.jsx("select",{id:"ln-site",value:t,onChange:a=>b(a.target.value),className:"h-8 rounded-md border border-input bg-background px-2.5 text-[13px]",children:u.map(a=>e.jsx("option",{value:a.uid,children:a.name},a.uid))})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"ln-team",children:"Team key"}),e.jsx(F,{id:"ln-team",placeholder:"ENG",value:d,onChange:a=>m(a.target.value),autoComplete:"off"}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"The prefix of the team's issues, like the ENG in ENG-123."})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"ln-key",children:"API key"}),e.jsx(F,{id:"ln-key",type:"password",placeholder:"lin_api_…",value:h,onChange:a=>x(a.target.value),autoComplete:"off"})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"ln-secret",children:"Webhook signing secret"}),e.jsx(F,{id:"ln-secret",type:"password",placeholder:"from Linear's webhook, optional",value:l,onChange:a=>j(a.target.value),autoComplete:"off"}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"Lets Linear move comments here when issues move there. The URL to give Linear is shown after connecting."})]}),e.jsxs("label",{className:"flex cursor-pointer items-start gap-2.5 text-[13px]",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:v,onChange:a=>p(a.target.checked)}),e.jsxs("span",{children:[e.jsx("span",{className:"block font-medium",children:"An issue for every new comment"}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:"Off by default. Make issues from the brief when you mean it."})]})]}),e.jsxs(R,{children:[e.jsx(N,{type:"button",variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsx(N,{type:"submit",loading:n.isPending,disabled:!d.trim()||!h.trim()||!t,children:n.isPending?"Checking…":"Connect"})]})]})})})}function he({open:r,onOpenChange:c,sites:u,onDone:f}){const[g,b]=i.useState(""),[d,m]=i.useState(""),[h,x]=i.useState(""),[l,j]=i.useState(""),[v,p]=i.useState(""),[k,y]=i.useState(""),[n,t]=i.useState(!1),[o,a]=i.useState(""),s=P({mutationFn:S=>T.connectTracker(S,"jira",{siteUrl:d.trim(),project:h.trim(),email:l.trim(),apiToken:v.trim(),...k.trim()?{webhookSecret:k.trim()}:{},createOn:n?"thread.created":"manual"})}),w=g||u[0]?.uid||"",H=async S=>{S.preventDefault(),a("");try{const M=await s.mutateAsync(w);x(""),p(""),y(""),t(!1),c(!1),f(w,M.webhook??{url:`${location.origin}/api/v1/integrations/jira/inbound`}),A.success("Jira connected")}catch(M){a(M instanceof K?M.message:"Could not reach the server.")}},I=(S,M,Z,ee,te,se="text",q)=>e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:`jr-${S}`,children:M}),e.jsx(F,{id:`jr-${S}`,type:se,placeholder:te,value:Z,onChange:ne=>ee(ne.target.value),autoComplete:"off"}),q&&e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:q})]});return e.jsx($,{open:r,onOpenChange:c,children:e.jsx(E,{children:e.jsxs("form",{onSubmit:S=>void H(S),className:"flex flex-col gap-4",noValidate:!0,children:[e.jsxs(O,{children:[e.jsx(D,{children:"Connect a site to Jira"}),e.jsx(L,{children:"An API token from id.atlassian.com › Security, with the email of the account it belongs to. It is checked against the project before it is saved, and stored encrypted with this instance's secret key."})]}),o&&e.jsx("p",{role:"alert",className:"m-0 rounded-md border border-destructive/40 bg-warn-soft px-3 py-2 text-[13px] text-destructive",children:o}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"jr-site",children:"Site"}),e.jsx("select",{id:"jr-site",value:w,onChange:S=>b(S.target.value),className:"h-8 rounded-md border border-input bg-background px-2.5 text-[13px]",children:u.map(S=>e.jsx("option",{value:S.uid,children:S.name},S.uid))})]}),I("url","Jira site",d,m,"https://kilnwork.atlassian.net"),I("project","Project key",h,x,"KAN","text","The prefix of the project's issues, like the KAN in KAN-12."),I("email","Account email",l,j,"you@kilnwork.studio","email"),I("token","API token",v,p,"","password"),I("secret","Webhook secret",k,y,"the secret you typed into Jira's webhook, optional","password","Lets Jira move comments here when issues move there. The URL to give Jira is shown after connecting."),e.jsxs("label",{className:"flex cursor-pointer items-start gap-2.5 text-[13px]",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:n,onChange:S=>t(S.target.checked)}),e.jsxs("span",{children:[e.jsx("span",{className:"block font-medium",children:"An issue for every new comment"}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:"Off by default. Make issues from the brief when you mean it."})]})]}),e.jsxs(R,{children:[e.jsx(N,{type:"button",variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsx(N,{type:"submit",loading:s.isPending,disabled:!d.trim()||!h.trim()||!l.trim()||!v.trim()||!w,children:s.isPending?"Checking…":"Connect"})]})]})})})}function ue({open:r,onOpenChange:c,sites:u,onDone:f}){const[g,b]=i.useState(""),[d,m]=i.useState(""),[h,x]=i.useState(""),[l,j]=i.useState(!0),[v,p]=i.useState(""),k=B({queryKey:["integrations","slack","manifest"],queryFn:()=>T.slackManifest(),enabled:r,staleTime:1/0}),y=P({mutationFn:o=>T.connectTracker(o,"slack",{channel:d.trim(),token:h.trim(),createOn:l?"thread.created":"manual"})}),n=g||u[0]?.uid||"",t=async o=>{o.preventDefault(),p("");try{await y.mutateAsync(n),m(""),x(""),j(!0),c(!1),f(n),A.success("Slack connected")}catch(a){p(a instanceof K?a.message:"Could not reach the server.")}};return e.jsx($,{open:r,onOpenChange:c,children:e.jsx(E,{children:e.jsxs("form",{onSubmit:o=>void t(o),className:"flex flex-col gap-4",noValidate:!0,children:[e.jsxs(O,{children:[e.jsx(D,{children:"Connect a site to Slack"}),e.jsx(L,{children:"Create the app in your workspace from our manifest — one click, the scopes are filled in — install it, and paste its Bot User OAuth Token. The token is checked against the channel before it is saved, and stored encrypted with this instance's secret key."})]}),v&&e.jsx("p",{role:"alert",className:"m-0 rounded-md border border-destructive/40 bg-warn-soft px-3 py-2 text-[13px] text-destructive",children:v}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"sl-site",children:"Site"}),e.jsx("select",{id:"sl-site",value:n,onChange:o=>b(o.target.value),className:"h-8 rounded-md border border-input bg-background px-2.5 text-[13px]",children:u.map(o=>e.jsx("option",{value:o.uid,children:o.name},o.uid))})]}),e.jsxs("div",{className:"flex items-center gap-3 rounded-md border border-border px-3 py-2 text-[13px]",children:[e.jsxs("span",{className:"flex-1",children:[e.jsx("span",{className:"block font-medium",children:"1. Create the app"}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:"Opens api.slack.com with the manifest pasted; then Install to Workspace."})]}),e.jsx(N,{type:"button",variant:"outline",size:"sm",disabled:!k.data,render:e.jsx("a",{href:k.data?.url??"#",target:"_blank",rel:"noreferrer"}),children:"Create app…"})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"sl-token",children:"2. Bot User OAuth Token"}),e.jsx(F,{id:"sl-token",type:"password",placeholder:"xoxb-…",value:h,onChange:o=>x(o.target.value),autoComplete:"off"}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"On the app's OAuth & Permissions page after installing."})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"sl-channel",children:"3. Channel"}),e.jsx(F,{id:"sl-channel",placeholder:"#reviews",value:d,onChange:o=>m(o.target.value),autoComplete:"off"}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"A public channel by name; a private one needs the app invited first, then its name works too."})]}),e.jsxs("label",{className:"flex cursor-pointer items-start gap-2.5 text-[13px]",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:l,onChange:o=>j(o.target.checked)}),e.jsxs("span",{children:[e.jsx("span",{className:"block font-medium",children:"A message for every new comment"}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:"On by default: a channel is where people are told. Turn it off to post from the brief when you mean it."})]})]}),e.jsxs(R,{children:[e.jsx(N,{type:"button",variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsx(N,{type:"submit",loading:y.isPending,disabled:!d.trim()||!h.trim()||!n,children:y.isPending?"Checking…":"Connect"})]})]})})})}function xe({owner:r,sites:c}){const u=z(),f=B(U.mcpTokens()),[g,b]=i.useState(!1),[d,m]=i.useState(null),[h,x]=i.useState(null),l=P({mutationFn:n=>T.revokeMcpToken(n),onSuccess:()=>{x(null),u.invalidateQueries({queryKey:["mcp-tokens"]})},onError:n=>A.error(J(n))}),j=f.data?.data??[],v=j.filter(n=>!n.revokedAt),p=f.data?.http??null,k=P({mutationFn:n=>T.setMcpHttp(n),onSuccess:(n,t)=>{u.setQueryData(U.instance().queryKey,n),u.invalidateQueries({queryKey:["mcp-tokens"]}),A.success(t?"Remote transport on — the token dialog shows its config":"Remote transport off — the endpoint answers 404 again")},onError:n=>A.error(J(n))}),y=n=>{const t=new Set(n),o=t.has("comments:write")||t.has("threads:write");return!o&&!t.has("context:read")?"Read-only":o?`Writes: ${[t.has("comments:write")?"reply":"",t.has("threads:write")?"mark ready":""].filter(Boolean).join(", ")}`:"Read-only, with capture context"};return e.jsxs(X,{title:"MCP",description:"A coding agent — Claude Code, Cursor, any MCP client — reads the same brief this dashboard copies, maps a comment to the file in its checkout, and can reply or mark a fix ready. It never resolves: whoever reported a snag decides when it is fixed. A token per agent, shown once, revocable here.",children:[f.isPending&&e.jsx(Q,{rows:2}),p&&e.jsxs("div",{className:"flex items-center justify-between gap-4 rounded-md border border-border px-3 py-2.5",children:[e.jsxs("div",{children:[e.jsx(C,{htmlFor:"mcp-http-on",className:"text-[13px] font-medium",children:"Remote transport"}),e.jsxs("p",{className:"m-0 mt-0.5 text-[12px] leading-normal text-muted-foreground",children:[p.enabled?e.jsxs(e.Fragment,{children:["On. An agent anywhere talks to this studio at ",e.jsx("code",{className:"font-mono text-[11.5px]",children:p.url})," with a token as a bearer. No source mapping there; a write needs a token minted for it."]}):e.jsxs(e.Fragment,{children:["Off. Agents reach this studio only from a machine with the checkout. On, ",e.jsx("code",{className:"font-mono text-[11.5px]",children:p.url})," serves the same tools to an agent anywhere, with a token as a bearer."]}),p.source==="env"?" Set by the environment (SNAGSET_MCP_HTTP_ENABLED).":""]})]}),e.jsx(ae,{id:"mcp-http-on","aria-label":"Remote transport",checked:p.enabled,disabled:!r||p.source==="env"||k.isPending,onCheckedChange:n=>k.mutate(n)})]}),f.isSuccess&&v.length===0&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(G,{variant:"outline",children:"No tokens"}),e.jsx("span",{className:"text-[13px] text-muted-foreground",children:"No agent can read this studio yet."})]}),j.length>0&&e.jsx("ul",{className:"m-0 flex list-none flex-col gap-2 p-0","aria-label":"Agent tokens",children:j.map(n=>e.jsxs("li",{className:`flex flex-wrap items-center gap-x-3 gap-y-1 rounded-md border border-border px-3 py-2.5 text-[13px] ${n.revokedAt?"opacity-60":""}`,children:[e.jsx("span",{className:"font-medium",children:n.name}),e.jsxs("code",{className:"font-mono text-[12.5px] text-muted-foreground",children:[n.prefix,"…"]}),e.jsx(G,{variant:"outline",className:n.revokedAt?"":"border-ok text-ok",children:n.revokedAt?"Revoked":y(n.scopes)}),e.jsxs("span",{className:"text-[12px] text-muted-foreground",children:[n.site?n.site.name:"All sites"," · ",n.lastUsedAt?`last used ${Y(n.lastUsedAt)}`:"never used",n.expiresAt&&!n.revokedAt?` · expires ${new Date(n.expiresAt).toLocaleDateString()}`:"",n.createdBy?` · by ${n.createdBy}`:""]}),r&&!n.revokedAt&&e.jsx("span",{className:"ml-auto flex gap-1",children:e.jsx(N,{variant:"ghost",size:"sm",onClick:()=>x(n),children:"Revoke"})})]},n.id))}),r&&e.jsx("div",{children:e.jsx(N,{variant:"outline",size:"sm",onClick:()=>b(!0),children:"New token…"})}),e.jsx(pe,{open:g,onOpenChange:b,sites:c,http:f.data?.http??null,onDone:n=>{u.invalidateQueries({queryKey:["mcp-tokens"]}),m(n)}}),e.jsx(fe,{state:d,http:f.data?.http??null,onClose:()=>m(null)}),e.jsx(V,{open:h!==null,onOpenChange:n=>!n&&x(null),title:`Revoke “${h?.name??""}”?`,description:e.jsx(e.Fragment,{children:"The agent holding it loses access on its next request. Its past replies stay, under its name. This cannot be undone — mint a new token instead."}),confirmLabel:"Revoke",busy:l.isPending,onConfirm:async()=>{h&&await l.mutateAsync(h.id)}})]})}function pe({open:r,onOpenChange:c,sites:u,http:f,onDone:g}){const[b,d]=i.useState(""),[m,h]=i.useState(""),[x,l]=i.useState(["threads:read","source:map"]),[j,v]=i.useState(""),[p,k]=i.useState(!1),[y,n]=i.useState(""),t=P({mutationFn:()=>T.mintMcpToken({name:b.trim(),...m?{site:m}:{},scopes:x,...j?{expiresInDays:Number(j)}:{},...p?{allowRemoteWrites:!0}:{}})}),o=(s,w)=>l(H=>w?[...new Set([...H,s])]:H.filter(I=>I!==s)),a=async s=>{s.preventDefault(),n("");try{const w=await t.mutateAsync();d(""),h(""),l(["threads:read","source:map"]),v(""),k(!1),c(!1),g(w)}catch(w){n(w instanceof K?w.message:"Could not reach the server.")}};return e.jsx($,{open:r,onOpenChange:c,children:e.jsx(E,{children:e.jsxs("form",{onSubmit:s=>void a(s),className:"flex flex-col gap-4",noValidate:!0,children:[e.jsxs(O,{children:[e.jsx(D,{children:"New agent token"}),e.jsx(L,{children:"Read-only by default, plus mapping a comment to a file in the agent's own checkout. Tick more only for an agent you want writing here — and it still cannot resolve anything."})]}),y&&e.jsx("p",{role:"alert",className:"m-0 rounded-md border border-destructive/40 bg-warn-soft px-3 py-2 text-[13px] text-destructive",children:y}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"mcp-name",children:"Name"}),e.jsx(F,{id:"mcp-name",placeholder:"Claude Code",value:b,onChange:s=>d(s.target.value),autoComplete:"off",maxLength:80}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"What a client sees on the agent's replies, so name the agent, not the person."})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"mcp-site",children:"Site"}),e.jsxs("select",{id:"mcp-site",value:m,onChange:s=>h(s.target.value),className:"h-8 rounded-md border border-input bg-background px-2.5 text-[13px]",children:[e.jsx("option",{value:"",children:"All sites"}),u.map(s=>e.jsx("option",{value:s.uid,children:s.name},s.uid))]})]}),e.jsxs("fieldset",{className:"m-0 flex flex-col gap-2 border-0 p-0",children:[e.jsx("legend",{className:"mb-1 text-[13px] font-medium",children:"Scopes"}),oe.map(s=>e.jsxs("label",{className:"flex cursor-pointer items-start gap-2.5 text-[13px]",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:x.includes(s.scope),onChange:w=>o(s.scope,w.target.checked)}),e.jsxs("span",{children:[e.jsx("span",{className:"block font-medium",children:s.label}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:s.hint})]})]},s.scope))]}),f?.enabled&&(x.includes("comments:write")||x.includes("threads:write"))&&e.jsxs("label",{className:"flex cursor-pointer items-start gap-2.5 text-[13px]",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:p,onChange:s=>k(s.target.checked)}),e.jsxs("span",{children:[e.jsx("span",{className:"block font-medium",children:"May write over the remote transport"}),e.jsx("span",{className:"block text-[12px] text-muted-foreground",children:"Off by default. Over POST /mcp the agent is not on a machine you can see; a write there is a decision."})]})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(C,{htmlFor:"mcp-expires",children:"Expires"}),e.jsxs("select",{id:"mcp-expires",value:j,onChange:s=>v(s.target.value),className:"h-8 rounded-md border border-input bg-background px-2.5 text-[13px]",children:[e.jsx("option",{value:"",children:"Never"}),e.jsx("option",{value:"30",children:"In 30 days"}),e.jsx("option",{value:"90",children:"In 90 days"}),e.jsx("option",{value:"365",children:"In a year"})]})]}),e.jsxs(R,{children:[e.jsx(N,{type:"button",variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsx(N,{type:"submit",loading:t.isPending,disabled:!b.trim()||x.length===0,children:t.isPending?"Minting…":"Create token"})]})]})})})}function fe({state:r,http:c,onClose:u}){const f=typeof location<"u"?location.origin:"",g={SNAGSET_MCP_TOKEN:r?.secret??"",SNAGSET_MCP_HOST:f,...r?.token.site?{SNAGSET_MCP_PROJECT:r.token.site.uid}:{}},b=JSON.stringify({mcpServers:{snagset:{command:"npx",args:["-y","@snagset/mcp"],env:g}}},null,2),d=["claude mcp add snagset",...Object.entries(g).map(([l,j])=>`-e ${l}=${j}`),"--","npx -y @snagset/mcp"].join(" "),m=`Bearer ${r?.secret??""}`,h=["claude mcp add","--transport http","snagset",c?.url??"",`--header "Authorization: ${m}"`].join(" "),x=JSON.stringify({mcpServers:{snagset:{type:"http",url:c?.url??"",headers:{Authorization:m}}}},null,2);return e.jsx($,{open:r!==null,onOpenChange:l=>!l&&u(),children:e.jsxs(E,{className:"sm:max-w-xl",children:[e.jsxs(O,{children:[e.jsxs(D,{children:["Token for “",r?.token.name??"","”"]}),e.jsx(L,{children:"Shown this once — only its hash is stored. Put it in the agent's config, then start the agent from the site's checkout so it can map comments to files."})]}),r&&e.jsxs("div",{className:"flex flex-col gap-4 text-[13px]",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1.5 font-mono text-[12px]","data-testid":"mcp-token",children:r.secret}),e.jsx(_,{text:r.secret,label:"Copy the token"})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"font-medium",children:"Claude Code"}),e.jsx(_,{text:d,label:"Copy the Claude Code command"})]}),e.jsx("pre",{className:"m-0 whitespace-pre-wrap break-all rounded-md bg-muted px-3 py-2 font-mono text-[12px]",children:d})]}),c?.enabled&&e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"font-medium",children:"Remote — an agent that is not on a machine with the checkout"}),e.jsx(_,{text:x,label:"Copy the remote config"})]}),e.jsx("pre",{className:"m-0 whitespace-pre-wrap break-all rounded-md bg-muted px-3 py-2 font-mono text-[12px]",children:h}),e.jsx("pre",{className:"m-0 overflow-x-auto rounded-md bg-muted px-3 py-2 font-mono text-[12px]",children:x}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"No source mapping there — nothing to search. Writes need the token minted with remote writes allowed."})]}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"font-medium",children:"Cursor, Claude Desktop, any MCP client"}),e.jsx(_,{text:b,label:"Copy the JSON config"})]}),e.jsx("pre",{className:"m-0 overflow-x-auto rounded-md bg-muted px-3 py-2 font-mono text-[12px]",children:b}),e.jsx("p",{className:"m-0 text-[12px] text-muted-foreground",children:"Cursor reads it from .cursor/mcp.json in the project; Claude Desktop from its claude_desktop_config.json."})]})]}),e.jsx(R,{children:e.jsx(N,{type:"button",onClick:u,children:"Done"})})]})})}export{De as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as r,Q as u}from"./useBaseQuery-DztMyAqa.js";function a(e,s){return r(e,u)}export{a as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as n}from"./index-Bvmz5Xph.js";function u(e){return n(e.defaultTagName??"div",e,e)}export{u};
|