fe(Ie+Qt))})}continue}Q++}return G}return{currentId:e,currentProfileId:n,messages:a,streaming:r,pendingImages:i,pendingFiles:s,artifacts:o,files:c,viewedImages:h,contextTokens:l,maxContextTokens:u,loading:d,imagesProcessing:_,awaitingStream:m,streamingMsg:p,scrollToMessageIndex:b,recall:I,terminals:R,backgroundTasks:y,queuedMessages:L,archiveLoading:f,archiveHasMore:A,archiveNextBefore:w,loadSession:F,clearSession:j,reloadSession:_e,fetchArtifacts:oe,fetchFiles:pe,fetchTasks:Ce,rateMessage:lt,saveDraft:at,loadDraft:We,appendUserMessage:Vt,buildMessageList:vt,onStreamStart:Ae,onReplayStart:He,onReplayEnd:ke,onThinkingDelta:rt,onThinkingEnd:je,onTurnThinking:Et,onPlanningStatus:ut,onPlanReady:bt,onToolStarted:D,onToolCall:P,onTerminalOutput:re,onTerminalClosed:ee,onTerminalOpened:ae,onTaskUpdate:W,onMessageQueued:de,onStreamDelta:Ne,onStreamEnd:ce,onStreamStopped:Re,onProfileSwitched:ye,onCompressionStarted:Fe,onContextCompressed:qe,onError:Qe,loadRecall:et,onRecallUpdate:Mt,loadArchivedMessages:dt,initArchiveState:Lt}}),is=ka("auth",()=>{const t=Y(null),e=Y(!1),n=Y(!1),a=ue(()=>t.value!==null),r=ue(()=>{var _;return((_=t.value)==null?void 0:_.role)==="admin"});function i(_){return t.value?t.value.role==="admin"?!0:(t.value.permissions||[]).includes(_):!1}async function s(){var _;console.log("[auth] fetchMe start"),e.value=!0;try{t.value=await Yh(),console.log("[auth] fetchMe success",t.value)}catch(m){console.log("[auth] fetchMe error",m.message),(_=m.message)!=null&&_.includes("401")&&(t.value=null)}finally{e.value=!1,console.log("[auth] fetchMe loading=false")}}const o=Y(!0);async function c(){console.log("[auth] fetchStatus start");try{const _=await fetch("/auth/status");if(console.log("[auth] fetchStatus response",_.status,_.ok),_.ok){const m=await _.json();console.log("[auth] fetchStatus data",m),o.value=m.enabled!==!1,n.value=!!m.configured,console.log("[auth] fetchStatus authEnabled set to",o.value),console.log("[auth] fetchStatus authConfigured set to",n.value)}else console.log("[auth] fetchStatus not ok"),o.value=!0,n.value=!1}catch(_){console.log("[auth] fetchStatus error",_),o.value=!0,n.value=!1}}function l(){const _=navigator.userAgent.includes("NaviAndroid"),m=new URLSearchParams;_&&m.set("platform","android");const p=m.toString();window.location.href="/auth/login"+(p?"?"+p:"")}async function u(){try{await $h()}catch{}t.value=null,window.location.reload()}const d=ue(()=>!o.value);return{user:t,loading:e,authConfigured:n,authEnabled:o,isAuthenticated:a,isAdmin:r,isNoAuthMode:d,hasPermission:i,fetchMe:s,fetchStatus:c,login:l,logout:u}}),bv=Object.freeze(Object.defineProperty({__proto__:null,useAuthStore:is},Symbol.toStringTag,{value:"Module"})),ju="/images/logo.svg";function __(t){if(!t)return"";const e=new Date(t);if(isNaN(e))return"";const n=Date.now()-e;return n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString()}function ed(t){const e=Y(__(t.value));let n=null;function a(){e.value=__(t.value)}return Sn(()=>{a(),n=setInterval(a,3e4)}),fa(()=>{n&&clearInterval(n)}),e}const ki=Y(!1),Zf=qE(""),Iu=[];function Tv(){return{visible:ki,message:Zf}}function ss(){return function(e){return Zf.value=e,ki.value=!0,new Promise(n=>{Iu.push(n)})}}function p_(t){ki.value=!1;const e=Iu.shift();e==null||e(t),Iu.length===0&&(ki.value=!1)}const ht=(t,e)=>{const n=t.__vccOpts||t;for(const[a,r]of e)n[a]=r;return n},hv={key:0,class:"session-icons"},vv={key:0,class:"ph ph-push-pin session-pin-icon",title:"Pinned"},Rv={key:1,class:"ph ph-clock session-recall-icon",title:"Scheduled recall pending"},Cv={key:2,class:"ph ph-robot session-special-icon",title:"Service session (Synapse reaction)"},yv={class:"session-info"},Nv={class:"session-name-row"},Ov=["innerHTML"],Av=["innerHTML"],Iv={key:1,class:"session-time"},Dv=["title"],wv={__name:"SessionItem",props:{session:{type:Object,required:!0},active:{type:Boolean,default:!1},searchQuery:{type:String,default:""}},emits:["select","delete","pin","cancel-recall","skip-recall"],setup(t,{emit:e}){const n=t,a=e,r=ss(),i=ue(()=>{const p=n.session.session_id??"";return n.session.name||p.slice(0,8)}),s=ue(()=>n.searchQuery&&n.session.match_preview?n.session.match_preview:n.session.preview),o=ue(()=>n.session.last_active),c=ed(o);function l(p){return typeof p!="string"?String(p??""):p.replace(/&/g,"&").replace(//g,">")}function u(p,E){if(!E||!p)return l(p);const b=E.toLowerCase(),I=p.toLowerCase(),R=[];let y=0;for(;;){const L=I.indexOf(b,y);if(L===-1)break;L>y&&R.push(l(p.slice(y,L))),R.push(`${l(p.slice(L,L+E.length))}`),y=L+E.length}return yu(i.value,n.searchQuery)),_=ue(()=>u(s.value,n.searchQuery));async function m(){await r("Delete this conversation?")&&a("delete")}return(p,E)=>(v(),x("div",{class:Ge(["session-item",{"is-active":t.active,"is-pinned":t.session.pinned,"has-recall":t.session.has_pending_recall,"is-special":t.session.special}]),onClick:E[4]||(E[4]=b=>a("select"))},[t.session.pinned||t.session.has_pending_recall||t.session.special?(v(),x("div",hv,[t.session.pinned?(v(),x("i",vv)):J("",!0),t.session.has_pending_recall?(v(),x("i",Rv)):J("",!0),t.session.special?(v(),x("i",Cv)):J("",!0)])):J("",!0),g("div",yv,[g("div",Nv,[g("span",{class:"session-name",innerHTML:d.value},null,8,Ov)]),s.value?(v(),x("div",{key:0,class:"session-preview",innerHTML:_.value},null,8,Av)):J("",!0),$(c)?(v(),x("div",Iv,X($(c)),1)):J("",!0)]),g("div",{class:"session-actions",onClick:E[3]||(E[3]=ga(()=>{},["stop"]))},[t.session.has_pending_recall?(v(),x("button",{key:0,class:"btn-icon",title:"Cancel recall",onClick:E[0]||(E[0]=b=>a("cancel-recall"))},[...E[5]||(E[5]=[g("i",{class:"ph ph-clock-slash"},null,-1)])])):J("",!0),t.session.has_pending_recall?(v(),x("button",{key:1,class:"btn-icon",title:"Skip next",onClick:E[1]||(E[1]=b=>a("skip-recall"))},[...E[6]||(E[6]=[g("i",{class:"ph ph-skip-forward"},null,-1)])])):J("",!0),g("button",{class:"btn-icon",title:t.session.pinned?"Unpin":"Pin",onClick:E[2]||(E[2]=b=>a("pin"))},[g("i",{class:Ge(t.session.pinned?"ph ph-push-pin-slash":"ph ph-push-pin")},null,2)],8,Dv),g("button",{class:"btn-icon",title:"Delete",onClick:m},[...E[7]||(E[7]=[g("i",{class:"ph ph-trash"},null,-1)])])])],2))}},xv=ht(wv,[["__scopeId","data-v-308a2eeb"]]),Lv={class:"ptr-label"},Mv={key:0,class:"sessions-loading"},kv={key:1,class:"empty-sessions"},Pv={key:2,class:"empty-sessions"},Uv={key:4,class:"sessions-loading sessions-loading-more"},m_=80,Fv=120,Bv={__name:"SessionList",emits:["select"],setup(t,{emit:e}){const n=e,a=Un(),r=sn(),i=li();st(()=>i.selectedProfileId,N=>{N&&N!==a.currentProfileId&&a.fetchSessions(N)});function s(N){n("select",N)}async function o(N){const C=N.session_id===r.currentId;await a.deleteSession(N.session_id),C&&r.clearSession()}async function c(N){await a.pinSession(N.session_id,!N.pinned)}async function l(N){try{await Qf(N.session_id),a.updateRecallStatus(N.session_id,!1)}catch(C){console.error("cancel recall failed",C)}}async function u(N){try{await Xf(N.session_id)}catch(C){console.error("skip recall failed",C)}}function d(N){const C=N.target;C.scrollHeight-C.scrollTop-C.clientHeight<160&&a.fetchMoreSessions()}const _=Y(!1),m=Y(0),p=Y(!1),E=Y(null),b=ue(()=>({transform:`translateY(${Math.min(m.value,Fv)}px)`,opacity:_.value?Math.min(m.value/m_,1):0})),I=ue(()=>a.loading?"Refreshing...":p.value?"Release to refresh":"Pull to refresh");let R=0,y=0;function L(N){var f;const C=E.value;C&&(y=C.scrollTop||0,!(y>2)&&(R=((f=N.touches[0])==null?void 0:f.clientY)??0,_.value=!1,m.value=0,p.value=!1))}function U(N){var A;if(y>2||!R)return;const f=(((A=N.touches[0])==null?void 0:A.clientY)??0)-R;if(f<=0){_.value=!1;return}f>4&&N.preventDefault(),_.value=!0,m.value=f,p.value=f>=m_}function h(){p.value&&!a.loading&&a.fetchSessions(i.selectedProfileId),_.value=!1,m.value=0,p.value=!1,R=0,y=0}return(N,C)=>(v(),x("div",{class:"session-list-wrap",onTouchstart:L,onTouchmove:U,onTouchend:h},[g("div",{class:Ge(["ptr-indicator",{"ptr-active":_.value&&!$(a).loading}]),style:Da(b.value)},[g("span",{class:Ge(["ptr-spinner",{"ptr-spinning":p.value}])},null,2),g("span",Lv,X(I.value),1)],6),$(a).loading&&!$(a).sessions.length?(v(),x("div",Mv,[...C[0]||(C[0]=[g("span",{class:"sessions-spinner"},null,-1),g("p",null,"Loading conversations...",-1)])])):$(a).sessions.length?$(a).filteredSessions.length?J("",!0):(v(),x("div",Pv,[...C[2]||(C[2]=[g("i",{class:"ph ph-faders"},null,-1),g("p",null,"No conversations match the current filter",-1)])])):(v(),x("div",kv,[...C[1]||(C[1]=[g("i",{class:"ph ph-chat-dots"},null,-1),g("p",null,"No conversations yet",-1)])])),$(a).filteredSessions.length?(v(),x("div",{key:3,ref_key:"scrollerRef",ref:E,class:Ge(["session-scroller",{"ptr-pulled":_.value}]),onScrollPassive:d},[(v(!0),x(Ue,null,Dt($(a).filteredSessions,(f,A)=>(v(),ze(xv,{key:f.session_id,session:f,active:f.session_id===$(r).currentId,"search-query":$(a).searchActive?$(a).searchQuery:"",onSelect:w=>s(f),onDelete:w=>o(f),onPin:w=>c(f),onCancelRecall:w=>l(f),onSkipRecall:w=>u(f)},null,8,["session","active","search-query","onSelect","onDelete","onPin","onCancelRecall","onSkipRecall"]))),128))],34)):J("",!0),$(a).loadingMore?(v(),x("div",Uv,[...C[3]||(C[3]=[g("span",{class:"sessions-spinner"},null,-1)])])):J("",!0)],32))}},Gv=ht(Bv,[["__scopeId","data-v-306ab182"]]),Yv={class:"sidebar-header"},$v={class:"sidebar-logo-row"},qv={class:"sidebar-sessions"},Hv={class:"sessions-header"},Vv={class:"sessions-label"},zv={class:"sessions-header-actions"},Wv={class:"sidebar-footer"},Kv={class:"user-info",title:"Authorization is disabled"},Qv={class:"sidebar-footer-actions"},Xv=["href"],Zv={class:"user-name"},Jv={class:"sidebar-footer-actions"},jv={key:0,href:"/admin",target:"_blank",rel:"noopener noreferrer",class:"btn-icon admin-link",title:"Admin"},eR={__name:"AppSidebar",props:{mobileOpen:Boolean},emits:["close"],setup(t,{emit:e}){const n=t,a=e,r=li(),i=Un(),s=sn(),o=is(),c=Y(!1),l=Y(""),u=Y(null);let d=null;st(()=>s.currentProfileId,C=>{C&&(r.selectedProfileId=C)}),st(()=>r.selectedProfileId,C=>{C&&(c.value&&(c.value=!1,i.exitSearch()),i.fetchSessions(C),Ht(()=>{var f,A;(A=(f=_.value)==null?void 0:f.querySelector(".chip-selected"))==null||A.scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}))},{immediate:!0});const _=Y(null);function m(C){const f=_.value;f&&(f.scrollLeft+=Math.abs(C.deltaX)>Math.abs(C.deltaY)?C.deltaX:C.deltaY)}function p(C,f){var A;r.selectedProfileId=C,(A=f==null?void 0:f.currentTarget)==null||A.scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}function E(){i.showSpecial=!i.showSpecial,i.showSpecial&&c.value&&(c.value=!1,l.value="",i.clearSearch(),i.exitSearch()),i.fetchSessions(r.selectedProfileId)}function b(){var A;const C=((A=u.value)==null?void 0:A.$el)??u.value;if(!C)return;const f=C.querySelector("input");f==null||f.focus()}st(()=>s.currentProfileId,C=>{C&&(r.selectedProfileId=C)});function I(){c.value=!c.value,c.value&&(setTimeout(b,50),i.searchQuery&&(l.value=i.searchQuery,i.restoreSearch()))}function R(){c.value&&(c.value=!1,i.exitSearch(),i.fetchSessions(r.selectedProfileId))}function y(){c.value=!1,l.value="",i.clearSearch(),i.exitSearch(),i.fetchSessions(r.selectedProfileId)}st(l,C=>{if(d&&clearTimeout(d),!C){i.clearSearch(),i.fetchSessions(r.selectedProfileId);return}d=setTimeout(()=>{i.setSearch(C),i.fetchSessions()},300)});function L(){s.clearSession(),a("close")}async function U(C){var A;const f=i.searchActive;f&&C.profile_id&&(r.selectedProfileId=C.profile_id),await s.loadSession(C.session_id,f?(A=C.match_indices)==null?void 0:A[0]:null),f&&(c.value=!1,i.exitSearch(),i.fetchSessions(r.selectedProfileId)),a("close")}function h(){location.hash="#settings",a("close")}function N(C){(C.ctrlKey||C.metaKey)&&C.key==="k"&&(C.preventDefault(),I())}return Sn(()=>window.addEventListener("keydown",N)),Yn(()=>window.removeEventListener("keydown",N)),(C,f)=>{var be,oe,pe,Ce,ot,lt,at;const A=tt("GnButton"),w=tt("GnIconButton"),F=tt("GnSearchField"),j=tt("GnChip"),_e=tt("GnAvatar");return v(),x("aside",{class:Ge(["app-sidebar",{"is-mobile-open":n.mobileOpen}])},[g("div",Yv,[g("div",$v,[f[5]||(f[5]=g("div",{class:"sidebar-logo"},[g("img",{src:ju,alt:"Navi"}),g("span",null,"Navi")],-1)),ne(A,{variant:"primary",icon:"ph ph-plus",onClick:L},{default:Be(()=>[...f[4]||(f[4]=[$e(" New Chat ",-1)])]),_:1}),ne(w,{icon:"ph ph-x",label:"Close",class:"sidebar-close-btn",onClick:f[0]||(f[0]=We=>a("close"))})])]),g("div",{class:Ge(["sidebar-search",{"is-open":c.value}])},[g("div",{class:Ge(["sidebar-search-inner",{"is-loading":$(i).loading&&$(i).searchActive}])},[ne(F,{ref_key:"searchFieldEl",ref:u,modelValue:l.value,"onUpdate:modelValue":f[1]||(f[1]=We=>l.value=We),placeholder:"Search conversations...",compact:"",clearable:"",onClear:y,onKeydown:ea(R,["esc"])},null,8,["modelValue"])],2)],2),g("div",qv,[g("div",{ref_key:"profilesEl",ref:_,class:"sessions-profiles",onWheel:ga(m,["prevent"])},[(v(!0),x(Ue,null,Dt($(r).profiles,We=>(v(),ze(j,{key:We.id,clickable:"",selected:$(r).selectedProfileId===We.id,onClick:Ae=>p(We.id,Ae)},{default:Be(()=>[$e(X(We.name),1)]),_:2},1032,["selected","onClick"]))),128))],544),g("div",Hv,[g("div",Vv,[$(i).searchActive?(v(),x(Ue,{key:0},[$e(X($(i).sessions.length)+" result"+X($(i).sessions.length===1?"":"s"),1)],64)):(v(),x(Ue,{key:1},[$e(X($(i).showSpecial?"Service sessions":"Conversations"),1)],64))]),g("div",zv,[ne(w,{icon:"ph ph-clock",label:"Pending recalls only",class:Ge(["recall-filter-btn",{active:$(i).hasPendingRecallFilter}]),onClick:f[2]||(f[2]=We=>$(i).hasPendingRecallFilter=!$(i).hasPendingRecallFilter)},null,8,["class"]),ne(w,{icon:"ph ph-robot",label:"Service (Synapse) sessions",class:Ge(["special-filter-btn",{active:$(i).showSpecial}]),onClick:E},null,8,["class"]),ne(w,{icon:"ph ph-magnifying-glass",label:"Search",class:Ge(["search-toggle-btn",{active:c.value||$(i).searchActive}]),onClick:I},null,8,["class"]),ne(w,{icon:"ph ph-arrow-clockwise",label:"Refresh",class:Ge(["sessions-refresh-btn",{"is-spinning":$(i).loading}]),onClick:f[3]||(f[3]=We=>$(i).fetchSessions($(r).selectedProfileId))},null,8,["class"])])]),ne(Gv,{onSelect:U})]),g("div",Wv,[$(o).isNoAuthMode?(v(),x(Ue,{key:0},[g("div",Kv,[ne(_e,{size:"sm",src:"",alt:"local",initials:"L"}),f[6]||(f[6]=g("span",{class:"user-name"},"Local mode",-1))]),g("div",Qv,[ne(w,{icon:"ph ph-gear",label:"Settings",onClick:h}),f[7]||(f[7]=g("a",{href:"/admin",target:"_blank",rel:"noopener noreferrer",class:"btn-icon admin-link",title:"Admin"},[g("i",{class:"ph ph-shield-check"})],-1))])],64)):$(o).isAuthenticated?(v(),x(Ue,{key:1},[g("a",{class:"user-info",href:(be=$(o).user)==null?void 0:be.profile_url,target:"_blank",rel:"noopener noreferrer",title:"Open profile in gnexus-auth"},[ne(_e,{size:"sm",src:((oe=$(o).user)==null?void 0:oe.avatar_url)||"",alt:((pe=$(o).user)==null?void 0:pe.display_name)||"avatar",initials:(((Ce=$(o).user)==null?void 0:Ce.display_name)||((ot=$(o).user)==null?void 0:ot.email)||"?").charAt(0).toUpperCase()},null,8,["src","alt","initials"]),g("span",Zv,X(((lt=$(o).user)==null?void 0:lt.display_name)||((at=$(o).user)==null?void 0:at.email)),1)],8,Xv),g("div",Jv,[ne(w,{icon:"ph ph-gear",label:"Settings",onClick:h}),$(o).isAdmin?(v(),x("a",jv,[...f[8]||(f[8]=[g("i",{class:"ph ph-shield-check"},null,-1)])])):J("",!0),ne(w,{icon:"ph ph-sign-out",label:"Logout",onClick:$(o).logout},null,8,["onClick"])])],64)):(v(),ze(A,{key:2,variant:"primary",icon:"ph ph-sign-in",onClick:$(o).login},{default:Be(()=>[...f[9]||(f[9]=[$e(" Login ",-1)])]),_:1},8,["onClick"]))])],2)}}},tR=ht(eR,[["__scopeId","data-v-7de86c3c"]]),Jf={__name:"ConfirmDialog",setup(t){const{visible:e,message:n}=Tv();function a(){p_(!0)}function r(){p_(!1)}return(i,s)=>{const o=tt("GnConfirmDialog");return v(),ze(o,{open:$(e),"onUpdate:open":s[0]||(s[0]=c=>Bt(e)?e.value=c:null),message:$(n),title:"Requires confirmation","cancel-text":"No","confirm-text":"Yes","confirm-variant":"warning",onConfirm:a,onCancel:r},null,8,["open","message"])}}},nR=Object.freeze(Object.defineProperty({__proto__:null,default:Jf},Symbol.toStringTag,{value:"Module"})),mr=Y(null);function aR(){mr.value&&(mr.value=null)}typeof window<"u"&&window.addEventListener("popstate",aR);function ci(){function t(n){var a;(a=history.state)!=null&&a.lightbox||history.pushState({lightbox:!0},""),mr.value=n}function e(){var n;mr.value&&(mr.value=null,(n=history.state)!=null&&n.lightbox&&history.back())}return{src:mr,open:t,close:e}}const rR={key:0,class:"modal a-show","aria-hidden":"false"},iR={class:"modal-dialog lightbox-dialog",role:"dialog","aria-modal":"true",tabindex:"-1"},sR={class:"modal-header"},oR={class:"modal-panel lightbox-panel"},lR={class:"modal-body"},cR=["src"],uR={key:1,class:"lightbox-error"},jf={__name:"ImageLightbox",setup(t){const{src:e,close:n}=ci(),a=Y(!1);return st(e,r=>{document.body.style.overflow=r?"hidden":"",a.value=!1}),(r,i)=>(v(),ze(Ji,{to:"body"},[$(e)?(v(),x("div",rR,[g("div",{class:"modal-backdrop",onClick:i[0]||(i[0]=(...s)=>$(n)&&$(n)(...s))}),g("div",iR,[g("header",sR,[i[3]||(i[3]=g("h4",{class:"modal-title"},"Photo",-1)),g("button",{class:"btn-icon modal-close",type:"button","aria-label":"Close",onClick:i[1]||(i[1]=(...s)=>$(n)&&$(n)(...s))},"✕")]),g("div",oR,[g("div",lR,[a.value?(v(),x("div",uR,[...i[4]||(i[4]=[g("i",{class:"ph ph-image-broken"},null,-1),g("span",null,"Failed to load image",-1)])])):(v(),x("img",{key:0,src:$(e),class:"lightbox-img",onError:i[2]||(i[2]=s=>a.value=!0)},null,40,cR))])])])])):J("",!0)]))}},dR=Object.freeze(Object.defineProperty({__proto__:null,default:jf},Symbol.toStringTag,{value:"Module"})),fi=Y("");function eS(){function t(n){fi.value=n}function e(){const n=fi.value;return fi.value="",n}return{pendingQuote:fi,requestQuote:t,consumeQuote:e}}const _R={__name:"SelectionToolbar",setup(t){const{requestQuote:e}=eS(),n=Y(!1),a=Y({x:0,y:0});let r="";function i(){const u=window.getSelection();if(!u||u.isCollapsed||!u.toString().trim())return null;const d=u.getRangeAt(0),_=d.commonAncestorContainer;return(_.nodeType===Node.TEXT_NODE?_.parentElement:_).closest(".msg-assistant-content")?{text:u.toString().trim(),range:d}:null}function s(){const u=window.getSelection();if(!u||u.isCollapsed||!u.rangeCount){n.value=!1;return}const _=u.getRangeAt(0).getBoundingClientRect();if(!_.width&&!_.height){n.value=!1;return}a.value={x:Math.round(_.left+_.width/2),y:Math.round(_.top-44)}}function o(){setTimeout(()=>{const u=i();if(!u){n.value=!1;return}r=u.text,s(),n.value=!0},10)}function c(){const u=window.getSelection();(!u||u.isCollapsed)&&(n.value=!1)}function l(){var u;r&&(e(r),(u=window.getSelection())==null||u.removeAllRanges(),n.value=!1)}return Sn(()=>{document.addEventListener("mouseup",o),document.addEventListener("selectionchange",c),document.addEventListener("scroll",s,!0)}),fa(()=>{document.removeEventListener("mouseup",o),document.removeEventListener("selectionchange",c),document.removeEventListener("scroll",s,!0)}),(u,d)=>{const _=tt("GnButton");return v(),ze(Ji,{to:"body"},[n.value?(v(),x("div",{key:0,class:"selection-toolbar",style:Da({top:a.value.y+"px",left:a.value.x+"px"}),onMousedown:d[0]||(d[0]=ga(()=>{},["prevent"]))},[ne(_,{variant:"warning",size:"sm",icon:"ph ph-quotes",style:{color:"var(--gn-color-black)"},title:"Reply to selection",onClick:l},{default:Be(()=>[...d[1]||(d[1]=[$e(" Reply ",-1)])]),_:1})],36)):J("",!0)])}}},tS=ht(_R,[["__scopeId","data-v-b94aaefd"]]),pR=Object.freeze(Object.defineProperty({__proto__:null,default:tS},Symbol.toStringTag,{value:"Module"}));function tr(t){if(!t)return"";let e;try{e=new URL(t,window.location.origin)}catch{return t}return e.origin===window.location.origin?`${e.pathname}${e.search}${e.hash}`:e.href}function Pi(t){return t?new URL(t,window.location.origin).href:""}function mR(t,e){const n=tr(t);return!n||!e?n:`${n}${n.includes("?")?"&":"?"}v=${encodeURIComponent(e)}`}function nS(t,e){const n=new URL(`/content-viewers/${t}.html`,window.location.origin);return n.searchParams.set("url",e),n.href}function gR(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Ns,g_;function ER(){if(g_)return Ns;g_=1;function t(k){return k instanceof Map?k.clear=k.delete=k.set=function(){throw new Error("map is read-only")}:k instanceof Set&&(k.add=k.clear=k.delete=function(){throw new Error("set is read-only")}),Object.freeze(k),Object.getOwnPropertyNames(k).forEach(V=>{const se=k[V],Ie=typeof se;(Ie==="object"||Ie==="function")&&!Object.isFrozen(se)&&t(se)}),k}class e{constructor(V){V.data===void 0&&(V.data={}),this.data=V.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function n(k){return k.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function a(k,...V){const se=Object.create(null);for(const Ie in k)se[Ie]=k[Ie];return V.forEach(function(Ie){for(const mt in Ie)se[mt]=Ie[mt]}),se}const r="",i=k=>!!k.scope,s=(k,{prefix:V})=>{if(k.startsWith("language:"))return k.replace("language:","language-");if(k.includes(".")){const se=k.split(".");return[`${V}${se.shift()}`,...se.map((Ie,mt)=>`${Ie}${"_".repeat(mt+1)}`)].join(" ")}return`${V}${k}`};class o{constructor(V,se){this.buffer="",this.classPrefix=se.classPrefix,V.walk(this)}addText(V){this.buffer+=n(V)}openNode(V){if(!i(V))return;const se=s(V.scope,{prefix:this.classPrefix});this.span(se)}closeNode(V){i(V)&&(this.buffer+=r)}value(){return this.buffer}span(V){this.buffer+=``}}const c=(k={})=>{const V={children:[]};return Object.assign(V,k),V};class l{constructor(){this.rootNode=c(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(V){this.top.children.push(V)}openNode(V){const se=c({scope:V});this.add(se),this.stack.push(se)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(V){return this.constructor._walk(V,this.rootNode)}static _walk(V,se){return typeof se=="string"?V.addText(se):se.children&&(V.openNode(se),se.children.forEach(Ie=>this._walk(V,Ie)),V.closeNode(se)),V}static _collapse(V){typeof V!="string"&&V.children&&(V.children.every(se=>typeof se=="string")?V.children=[V.children.join("")]:V.children.forEach(se=>{l._collapse(se)}))}}class u extends l{constructor(V){super(),this.options=V}addText(V){V!==""&&this.add(V)}startScope(V){this.openNode(V)}endScope(){this.closeNode()}__addSublanguage(V,se){const Ie=V.root;se&&(Ie.scope=`language:${se}`),this.add(Ie)}toHTML(){return new o(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function d(k){return k?typeof k=="string"?k:k.source:null}function _(k){return E("(?=",k,")")}function m(k){return E("(?:",k,")*")}function p(k){return E("(?:",k,")?")}function E(...k){return k.map(se=>d(se)).join("")}function b(k){const V=k[k.length-1];return typeof V=="object"&&V.constructor===Object?(k.splice(k.length-1,1),V):{}}function I(...k){return"("+(b(k).capture?"":"?:")+k.map(Ie=>d(Ie)).join("|")+")"}function R(k){return new RegExp(k.toString()+"|").exec("").length-1}function y(k,V){const se=k&&k.exec(V);return se&&se.index===0}const L=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function U(k,{joinWith:V}){let se=0;return k.map(Ie=>{se+=1;const mt=se;let _t=d(Ie),ve="";for(;_t.length>0;){const me=L.exec(_t);if(!me){ve+=_t;break}ve+=_t.substring(0,me.index),_t=_t.substring(me.index+me[0].length),me[0][0]==="\\"&&me[1]?ve+="\\"+String(Number(me[1])+mt):(ve+=me[0],me[0]==="("&&se++)}return ve}).map(Ie=>`(${Ie})`).join(V)}const h=/\b\B/,N="[a-zA-Z]\\w*",C="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",A="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",F="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",j=(k={})=>{const V=/^#![ ]*\//;return k.binary&&(k.begin=E(V,/.*\b/,k.binary,/\b.*/)),a({scope:"meta",begin:V,end:/$/,relevance:0,"on:begin":(se,Ie)=>{se.index!==0&&Ie.ignoreMatch()}},k)},_e={begin:"\\\\[\\s\\S]",relevance:0},be={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[_e]},oe={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[_e]},pe={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},Ce=function(k,V,se={}){const Ie=a({scope:"comment",begin:k,end:V,contains:[]},se);Ie.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const mt=I("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return Ie.contains.push({begin:E(/[ ]+/,"(",mt,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),Ie},ot=Ce("//","$"),lt=Ce("/\\*","\\*/"),at=Ce("#","$"),We={scope:"number",begin:f,relevance:0},Ae={scope:"number",begin:A,relevance:0},He={scope:"number",begin:w,relevance:0},ke={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[_e,{begin:/\[/,end:/\]/,relevance:0,contains:[_e]}]},rt={scope:"title",begin:N,relevance:0},je={scope:"title",begin:C,relevance:0},Ke={begin:"\\.\\s*"+C,relevance:0};var ut=Object.freeze({__proto__:null,APOS_STRING_MODE:be,BACKSLASH_ESCAPE:_e,BINARY_NUMBER_MODE:He,BINARY_NUMBER_RE:w,COMMENT:Ce,C_BLOCK_COMMENT_MODE:lt,C_LINE_COMMENT_MODE:ot,C_NUMBER_MODE:Ae,C_NUMBER_RE:A,END_SAME_AS_BEGIN:function(k){return Object.assign(k,{"on:begin":(V,se)=>{se.data._beginMatch=V[1]},"on:end":(V,se)=>{se.data._beginMatch!==V[1]&&se.ignoreMatch()}})},HASH_COMMENT_MODE:at,IDENT_RE:N,MATCH_NOTHING_RE:h,METHOD_GUARD:Ke,NUMBER_MODE:We,NUMBER_RE:f,PHRASAL_WORDS_MODE:pe,QUOTE_STRING_MODE:oe,REGEXP_MODE:ke,RE_STARTERS_RE:F,SHEBANG:j,TITLE_MODE:rt,UNDERSCORE_IDENT_RE:C,UNDERSCORE_TITLE_MODE:je});function bt(k,V){k.input[k.index-1]==="."&&V.ignoreMatch()}function D(k,V){k.className!==void 0&&(k.scope=k.className,delete k.className)}function P(k,V){V&&k.beginKeywords&&(k.begin="\\b("+k.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",k.__beforeBegin=bt,k.keywords=k.keywords||k.beginKeywords,delete k.beginKeywords,k.relevance===void 0&&(k.relevance=0))}function z(k,V){Array.isArray(k.illegal)&&(k.illegal=I(...k.illegal))}function K(k,V){if(k.match){if(k.begin||k.end)throw new Error("begin & end are not supported with match");k.begin=k.match,delete k.match}}function Z(k,V){k.relevance===void 0&&(k.relevance=1)}const W=(k,V)=>{if(!k.beforeMatch)return;if(k.starts)throw new Error("beforeMatch cannot be used with starts");const se=Object.assign({},k);Object.keys(k).forEach(Ie=>{delete k[Ie]}),k.keywords=se.keywords,k.begin=E(se.beforeMatch,_(se.begin)),k.starts={relevance:0,contains:[Object.assign(se,{endsParent:!0})]},k.relevance=0,delete se.beforeMatch},de=["of","and","for","in","not","or","if","then","parent","list","value"],ae="keyword";function re(k,V,se=ae){const Ie=Object.create(null);return typeof k=="string"?mt(se,k.split(" ")):Array.isArray(k)?mt(se,k):Object.keys(k).forEach(function(_t){Object.assign(Ie,re(k[_t],V,_t))}),Ie;function mt(_t,ve){V&&(ve=ve.map(me=>me.toLowerCase())),ve.forEach(function(me){const De=me.split("|");Ie[De[0]]=[_t,ee(De[0],De[1])]})}}function ee(k,V){return V?Number(V):Ne(k)?0:1}function Ne(k){return de.includes(k.toLowerCase())}const ce={},Re=k=>{console.error(k)},ye=(k,...V)=>{console.log(`WARN: ${k}`,...V)},Fe=(k,V)=>{ce[`${k}/${V}`]||(console.log(`Deprecated as of ${k}. ${V}`),ce[`${k}/${V}`]=!0)},qe=new Error;function Qe(k,V,{key:se}){let Ie=0;const mt=k[se],_t={},ve={};for(let me=1;me<=V.length;me++)ve[me+Ie]=mt[me],_t[me+Ie]=!0,Ie+=R(V[me-1]);k[se]=ve,k[se]._emit=_t,k[se]._multi=!0}function et(k){if(Array.isArray(k.begin)){if(k.skip||k.excludeBegin||k.returnBegin)throw Re("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),qe;if(typeof k.beginScope!="object"||k.beginScope===null)throw Re("beginScope must be object"),qe;Qe(k,k.begin,{key:"beginScope"}),k.begin=U(k.begin,{joinWith:""})}}function dt(k){if(Array.isArray(k.end)){if(k.skip||k.excludeEnd||k.returnEnd)throw Re("skip, excludeEnd, returnEnd not compatible with endScope: {}"),qe;if(typeof k.endScope!="object"||k.endScope===null)throw Re("endScope must be object"),qe;Qe(k,k.end,{key:"endScope"}),k.end=U(k.end,{joinWith:""})}}function Lt(k){k.scope&&typeof k.scope=="object"&&k.scope!==null&&(k.beginScope=k.scope,delete k.scope)}function Mt(k){Lt(k),typeof k.beginScope=="string"&&(k.beginScope={_wrap:k.beginScope}),typeof k.endScope=="string"&&(k.endScope={_wrap:k.endScope}),et(k),dt(k)}function Vt(k){function V(ve,me){return new RegExp(d(ve),"m"+(k.case_insensitive?"i":"")+(k.unicodeRegex?"u":"")+(me?"g":""))}class se{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(me,De){De.position=this.position++,this.matchIndexes[this.matchAt]=De,this.regexes.push([De,me]),this.matchAt+=R(me)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const me=this.regexes.map(De=>De[1]);this.matcherRe=V(U(me,{joinWith:"|"}),!0),this.lastIndex=0}exec(me){this.matcherRe.lastIndex=this.lastIndex;const De=this.matcherRe.exec(me);if(!De)return null;const it=De.findIndex((Ft,kt)=>kt>0&&Ft!==void 0),ct=this.matchIndexes[it];return De.splice(0,it),Object.assign(De,ct)}}class Ie{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(me){if(this.multiRegexes[me])return this.multiRegexes[me];const De=new se;return this.rules.slice(me).forEach(([it,ct])=>De.addRule(it,ct)),De.compile(),this.multiRegexes[me]=De,De}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(me,De){this.rules.push([me,De]),De.type==="begin"&&this.count++}exec(me){const De=this.getMatcher(this.regexIndex);De.lastIndex=this.lastIndex;let it=De.exec(me);if(this.resumingScanAtSamePosition()&&!(it&&it.index===this.lastIndex)){const ct=this.getMatcher(0);ct.lastIndex=this.lastIndex+1,it=ct.exec(me)}return it&&(this.regexIndex+=it.position+1,this.regexIndex===this.count&&this.considerAll()),it}}function mt(ve){const me=new Ie;return ve.contains.forEach(De=>me.addRule(De.begin,{rule:De,type:"begin"})),ve.terminatorEnd&&me.addRule(ve.terminatorEnd,{type:"end"}),ve.illegal&&me.addRule(ve.illegal,{type:"illegal"}),me}function _t(ve,me){const De=ve;if(ve.isCompiled)return De;[D,K,Mt,W].forEach(ct=>ct(ve,me)),k.compilerExtensions.forEach(ct=>ct(ve,me)),ve.__beforeBegin=null,[P,z,Z].forEach(ct=>ct(ve,me)),ve.isCompiled=!0;let it=null;return typeof ve.keywords=="object"&&ve.keywords.$pattern&&(ve.keywords=Object.assign({},ve.keywords),it=ve.keywords.$pattern,delete ve.keywords.$pattern),it=it||/\w+/,ve.keywords&&(ve.keywords=re(ve.keywords,k.case_insensitive)),De.keywordPatternRe=V(it,!0),me&&(ve.begin||(ve.begin=/\B|\b/),De.beginRe=V(De.begin),!ve.end&&!ve.endsWithParent&&(ve.end=/\B|\b/),ve.end&&(De.endRe=V(De.end)),De.terminatorEnd=d(De.end)||"",ve.endsWithParent&&me.terminatorEnd&&(De.terminatorEnd+=(ve.end?"|":"")+me.terminatorEnd)),ve.illegal&&(De.illegalRe=V(ve.illegal)),ve.contains||(ve.contains=[]),ve.contains=[].concat(...ve.contains.map(function(ct){return vt(ct==="self"?ve:ct)})),ve.contains.forEach(function(ct){_t(ct,De)}),ve.starts&&_t(ve.starts,me),De.matcher=mt(De),De}if(k.compilerExtensions||(k.compilerExtensions=[]),k.contains&&k.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return k.classNameAliases=a(k.classNameAliases||{}),_t(k)}function Ut(k){return k?k.endsWithParent||Ut(k.starts):!1}function vt(k){return k.variants&&!k.cachedVariants&&(k.cachedVariants=k.variants.map(function(V){return a(k,{variants:null},V)})),k.cachedVariants?k.cachedVariants:Ut(k)?a(k,{starts:k.starts?a(k.starts):null}):Object.isFrozen(k)?a(k):k}var O="11.11.1";class G extends Error{constructor(V,se){super(V),this.name="HTMLInjectionError",this.html=se}}const Q=n,fe=a,he=Symbol("nomatch"),we=7,Pe=function(k){const V=Object.create(null),se=Object.create(null),Ie=[];let mt=!0;const _t="Could not find the language '{}', did you forget to load/include a language module?",ve={disableAutodetect:!0,name:"Plain text",contains:[]};let me={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:u};function De(le){return me.noHighlightRe.test(le)}function it(le){let xe=le.className+" ";xe+=le.parentNode?le.parentNode.className:"";const Xe=me.languageDetectRe.exec(xe);if(Xe){const Nt=Zt(Xe[1]);return Nt||(ye(_t.replace("{}",Xe[1])),ye("Falling back to no-highlight mode for this block.",le)),Nt?Xe[1]:"no-highlight"}return xe.split(/\s+/).find(Nt=>De(Nt)||Zt(Nt))}function ct(le,xe,Xe){let Nt="",Pt="";typeof xe=="object"?(Nt=le,Xe=xe.ignoreIllegals,Pt=xe.language):(Fe("10.7.0","highlight(lang, code, ...args) has been deprecated."),Fe("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),Pt=le,Nt=xe),Xe===void 0&&(Xe=!0);const ln={code:Nt,language:Pt};$n("before:highlight",ln);const Pn=ln.result?ln.result:Ft(ln.language,ln.code,Xe);return Pn.code=ln.code,$n("after:highlight",Pn),Pn}function Ft(le,xe,Xe,Nt){const Pt=Object.create(null);function ln(S,M){return S.keywords[M]}function Pn(){if(!Ve.keywords){qt.addText(Tt);return}let S=0;Ve.keywordPatternRe.lastIndex=0;let M=Ve.keywordPatternRe.exec(Tt),H="";for(;M;){H+=Tt.substring(S,M.index);const te=cn.case_insensitive?M[0].toLowerCase():M[0],Ee=ln(Ve,te);if(Ee){const[Le,Ot]=Ee;if(qt.addText(H),H="",Pt[te]=(Pt[te]||0)+1,Pt[te]<=we&&(Hn+=Ot),Le.startsWith("_"))H+=M[0];else{const wt=cn.classNameAliases[Le]||Le;en(M[0],wt)}}else H+=M[0];S=Ve.keywordPatternRe.lastIndex,M=Ve.keywordPatternRe.exec(Tt)}H+=Tt.substring(S),qt.addText(H)}function Ta(){if(Tt==="")return;let S=null;if(typeof Ve.subLanguage=="string"){if(!V[Ve.subLanguage]){qt.addText(Tt);return}S=Ft(Ve.subLanguage,Tt,!0,Ga[Ve.subLanguage]),Ga[Ve.subLanguage]=S._top}else S=on(Tt,Ve.subLanguage.length?Ve.subLanguage:null);Ve.relevance>0&&(Hn+=S.relevance),qt.__addSublanguage(S._emitter,S.language)}function Jt(){Ve.subLanguage!=null?Ta():Pn(),Tt=""}function en(S,M){S!==""&&(qt.startScope(M),qt.addText(S),qt.endScope())}function Pa(S,M){let H=1;const te=M.length-1;for(;H<=te;){if(!S._emit[H]){H++;continue}const Ee=cn.classNameAliases[S[H]]||S[H],Le=M[H];Ee?en(Le,Ee):(Tt=Le,Pn(),Tt=""),H++}}function ha(S,M){return S.scope&&typeof S.scope=="string"&&qt.openNode(cn.classNameAliases[S.scope]||S.scope),S.beginScope&&(S.beginScope._wrap?(en(Tt,cn.classNameAliases[S.beginScope._wrap]||S.beginScope._wrap),Tt=""):S.beginScope._multi&&(Pa(S.beginScope,M),Tt="")),Ve=Object.create(S,{parent:{value:Ve}}),Ve}function qn(S,M,H){let te=y(S.endRe,H);if(te){if(S["on:end"]){const Ee=new e(S);S["on:end"](M,Ee),Ee.isMatchIgnored&&(te=!1)}if(te){for(;S.endsParent&&S.parent;)S=S.parent;return S}}if(S.endsWithParent)return qn(S.parent,M,H)}function va(S){return Ve.matcher.regexIndex===0?(Tt+=S[0],1):(ie=!0,0)}function vn(S){const M=S[0],H=S.rule,te=new e(H),Ee=[H.__beforeBegin,H["on:begin"]];for(const Le of Ee)if(Le&&(Le(S,te),te.isMatchIgnored))return va(M);return H.skip?Tt+=M:(H.excludeBegin&&(Tt+=M),Jt(),!H.returnBegin&&!H.excludeBegin&&(Tt=M)),ha(H,S),H.returnBegin?0:M.length}function di(S){const M=S[0],H=xe.substring(S.index),te=qn(Ve,S,H);if(!te)return he;const Ee=Ve;Ve.endScope&&Ve.endScope._wrap?(Jt(),en(M,Ve.endScope._wrap)):Ve.endScope&&Ve.endScope._multi?(Jt(),Pa(Ve.endScope,S)):Ee.skip?Tt+=M:(Ee.returnEnd||Ee.excludeEnd||(Tt+=M),Jt(),Ee.excludeEnd&&(Tt=M));do Ve.scope&&qt.closeNode(),!Ve.skip&&!Ve.subLanguage&&(Hn+=Ve.relevance),Ve=Ve.parent;while(Ve!==te.parent);return te.starts&&ha(te.starts,S),Ee.returnEnd?0:M.length}function Ua(){const S=[];for(let M=Ve;M!==cn;M=M.parent)M.scope&&S.unshift(M.scope);S.forEach(M=>qt.openNode(M))}let Fa={};function Ba(S,M){const H=M&&M[0];if(Tt+=S,H==null)return Jt(),0;if(Fa.type==="begin"&&M.type==="end"&&Fa.index===M.index&&H===""){if(Tt+=xe.slice(M.index,M.index+1),!mt){const te=new Error(`0 width match regex (${le})`);throw te.languageName=le,te.badRule=Fa.rule,te}return 1}if(Fa=M,M.type==="begin")return vn(M);if(M.type==="illegal"&&!Xe){const te=new Error('Illegal lexeme "'+H+'" for mode "'+(Ve.scope||" ")+'"');throw te.mode=Ve,te}else if(M.type==="end"){const te=di(M);if(te!==he)return te}if(M.type==="illegal"&&H==="")return Tt+=` -`,1;if(na>1e5&&na>M.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Tt+=H,H.length}const cn=Zt(le);if(!cn)throw Re(_t.replace("{}",le)),new Error('Unknown language: "'+le+'"');const cr=Vt(cn);let Ra="",Ve=Nt||cr;const Ga={},qt=new me.__emitter(me);Ua();let Tt="",Hn=0,un=0,na=0,ie=!1;try{if(cn.__emitTokens)cn.__emitTokens(xe,qt);else{for(Ve.matcher.considerAll();;){na++,ie?ie=!1:Ve.matcher.considerAll(),Ve.matcher.lastIndex=un;const S=Ve.matcher.exec(xe);if(!S)break;const M=xe.substring(un,S.index),H=Ba(M,S);un=S.index+H}Ba(xe.substring(un))}return qt.finalize(),Ra=qt.toHTML(),{language:le,value:Ra,relevance:Hn,illegal:!1,_emitter:qt,_top:Ve}}catch(S){if(S.message&&S.message.includes("Illegal"))return{language:le,value:Q(xe),illegal:!0,relevance:0,_illegalBy:{message:S.message,index:un,context:xe.slice(un-100,un+100),mode:S.mode,resultSoFar:Ra},_emitter:qt};if(mt)return{language:le,value:Q(xe),illegal:!1,relevance:0,errorRaised:S,_emitter:qt,_top:Ve};throw S}}function kt(le){const xe={value:Q(le),illegal:!1,relevance:0,_top:ve,_emitter:new me.__emitter(me)};return xe._emitter.addText(le),xe}function on(le,xe){xe=xe||me.languages||Object.keys(V);const Xe=kt(le),Nt=xe.filter(Zt).filter(In).map(Jt=>Ft(Jt,le,!1));Nt.unshift(Xe);const Pt=Nt.sort((Jt,en)=>{if(Jt.relevance!==en.relevance)return en.relevance-Jt.relevance;if(Jt.language&&en.language){if(Zt(Jt.language).supersetOf===en.language)return 1;if(Zt(en.language).supersetOf===Jt.language)return-1}return 0}),[ln,Pn]=Pt,Ta=ln;return Ta.secondBest=Pn,Ta}function Qt(le,xe,Xe){const Nt=xe&&se[xe]||Xe;le.classList.add("hljs"),le.classList.add(`language-${Nt}`)}function Mn(le){let xe=null;const Xe=it(le);if(De(Xe))return;if($n("before:highlightElement",{el:le,language:Xe}),le.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",le);return}if(le.children.length>0&&(me.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(le)),me.throwUnescapedHTML))throw new G("One of your code blocks includes unescaped HTML.",le.innerHTML);xe=le;const Nt=xe.textContent,Pt=Xe?ct(Nt,{language:Xe,ignoreIllegals:!0}):on(Nt);le.innerHTML=Pt.value,le.dataset.highlighted="yes",Qt(le,Xe,Pt.language),le.result={language:Pt.language,re:Pt.relevance,relevance:Pt.relevance},Pt.secondBest&&(le.secondBest={language:Pt.secondBest.language,relevance:Pt.secondBest.relevance}),$n("after:highlightElement",{el:le,result:Pt,text:Nt})}function lr(le){me=fe(me,le)}const B=()=>{Te(),Fe("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function q(){Te(),Fe("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Oe=!1;function Te(){function le(){Te()}if(document.readyState==="loading"){Oe||window.addEventListener("DOMContentLoaded",le,!1),Oe=!0;return}document.querySelectorAll(me.cssSelector).forEach(Mn)}function Se(le,xe){let Xe=null;try{Xe=xe(k)}catch(Nt){if(Re("Language definition for '{}' could not be registered.".replace("{}",le)),mt)Re(Nt);else throw Nt;Xe=ve}Xe.name||(Xe.name=le),V[le]=Xe,Xe.rawDefinition=xe.bind(null,k),Xe.aliases&&jt(Xe.aliases,{languageName:le})}function $t(le){delete V[le];for(const xe of Object.keys(se))se[xe]===le&&delete se[xe]}function Yt(){return Object.keys(V)}function Zt(le){return le=(le||"").toLowerCase(),V[le]||V[se[le]]}function jt(le,{languageName:xe}){typeof le=="string"&&(le=[le]),le.forEach(Xe=>{se[Xe.toLowerCase()]=xe})}function In(le){const xe=Zt(le);return xe&&!xe.disableAutodetect}function ba(le){le["before:highlightBlock"]&&!le["before:highlightElement"]&&(le["before:highlightElement"]=xe=>{le["before:highlightBlock"](Object.assign({block:xe.el},xe))}),le["after:highlightBlock"]&&!le["after:highlightElement"]&&(le["after:highlightElement"]=xe=>{le["after:highlightBlock"](Object.assign({block:xe.el},xe))})}function ta(le){ba(le),Ie.push(le)}function Ar(le){const xe=Ie.indexOf(le);xe!==-1&&Ie.splice(xe,1)}function $n(le,xe){const Xe=le;Ie.forEach(function(Nt){Nt[Xe]&&Nt[Xe](xe)})}function kn(le){return Fe("10.7.0","highlightBlock will be removed entirely in v12.0"),Fe("10.7.0","Please use highlightElement now."),Mn(le)}Object.assign(k,{highlight:ct,highlightAuto:on,highlightAll:Te,highlightElement:Mn,highlightBlock:kn,configure:lr,initHighlighting:B,initHighlightingOnLoad:q,registerLanguage:Se,unregisterLanguage:$t,listLanguages:Yt,getLanguage:Zt,registerAliases:jt,autoDetection:In,inherit:fe,addPlugin:ta,removePlugin:Ar}),k.debugMode=function(){mt=!1},k.safeMode=function(){mt=!0},k.versionString=O,k.regex={concat:E,lookahead:_,either:I,optional:p,anyNumberOfTimes:m};for(const le in ut)typeof ut[le]=="object"&&t(ut[le]);return Object.assign(k,ut),k},Je=Pe({});return Je.newInstance=()=>Pe({}),Ns=Je,Je.HighlightJS=Je,Je.default=Je,Ns}var Os,E_;function fR(){if(E_)return Os;E_=1;function t(e){const n="[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+",i="далее "+"возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ",c="загрузитьизфайла "+"вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ",m="разделительстраниц разделительстрок символтабуляции "+"ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон "+"acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища "+"wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ",lt="webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля "+"автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени форматкартинки ширинаподчиненныхэлементовформы "+"виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента "+"авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных "+"использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц "+"отображениевремениэлементовпланировщика "+"типфайлаформатированногодокумента "+"обходрезультатазапроса типзаписизапроса "+"видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов "+"доступкфайлу режимдиалогавыборафайла режимоткрытияфайла "+"типизмеренияпостроителязапроса "+"видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений "+"wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs форматдатыjson экранированиесимволовjson "+"видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных использованиеусловногооформлениякомпоновкиданных "+"важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты статусразборапочтовогосообщения "+"режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации "+"расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии типхранилищасертификатовкриптографии "+"кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip режимсохраненияпутейzip уровеньсжатияzip "+"звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp "+"направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса "+"httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса типномерадокумента типномеразадачи типформы удалениедвижений "+"важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты",Ae="comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных "+"comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура фиксированноесоответствие фиксированныймассив ",He="null истина ложь неопределено",ke=e.inherit(e.NUMBER_MODE),rt={className:"string",begin:'"|\\|',end:'"|$',contains:[{begin:'""'}]},je={begin:"'",end:"'",excludeBegin:!0,excludeEnd:!0,contains:[{className:"number",begin:"\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}"}]},Ke={match:/[;()+\-:=,]/,className:"punctuation",relevance:0},Et=e.inherit(e.C_LINE_COMMENT_MODE),ut={className:"meta",begin:"#|&",end:"$",keywords:{$pattern:n,keyword:i+c},contains:[Et]},bt={className:"symbol",begin:"~",end:";|:",excludeEnd:!0},D={className:"function",variants:[{begin:"процедура|функция",end:"\\)",keywords:"процедура функция"},{begin:"конецпроцедуры|конецфункции",keywords:"конецпроцедуры конецфункции"}],contains:[{begin:"\\(",end:"\\)",endsParent:!0,contains:[{className:"params",begin:n,end:",",excludeEnd:!0,endsWithParent:!0,keywords:{$pattern:n,keyword:"знач",literal:He},contains:[ke,rt,je]},Et]},e.inherit(e.TITLE_MODE,{begin:n})]};return{name:"1C:Enterprise",case_insensitive:!0,keywords:{$pattern:n,keyword:i,built_in:m,class:lt,type:Ae,literal:He},contains:[ut,D,Et,bt,ke,rt,je,Ke]}}return Os=t,Os}var As,f_;function SR(){if(f_)return As;f_=1;function t(e){const n=e.regex,a=/^[a-zA-Z][a-zA-Z0-9-]*/,r=["ALPHA","BIT","CHAR","CR","CRLF","CTL","DIGIT","DQUOTE","HEXDIG","HTAB","LF","LWSP","OCTET","SP","VCHAR","WSP"],i=e.COMMENT(/;/,/$/),s={scope:"symbol",match:/%b[0-1]+(-[0-1]+|(\.[0-1]+)+)?/},o={scope:"symbol",match:/%d[0-9]+(-[0-9]+|(\.[0-9]+)+)?/},c={scope:"symbol",match:/%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+)?/},l={scope:"symbol",match:/%[si](?=".*")/},u={scope:"attribute",match:n.concat(a,/(?=\s*=)/)};return{name:"Augmented Backus-Naur Form",illegal:/[!@#$^&',?+~`|:]/,keywords:r,contains:[{scope:"operator",match:/=\/?/},u,i,s,o,c,l,e.QUOTE_STRING_MODE,e.NUMBER_MODE]}}return As=t,As}var Is,S_;function bR(){if(S_)return Is;S_=1;function t(e){const n=e.regex,a=["GET","POST","HEAD","PUT","DELETE","CONNECT","OPTIONS","PATCH","TRACE"];return{name:"Apache Access Log",contains:[{className:"number",begin:/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?\b/,relevance:5},{className:"number",begin:/\b\d+\b/,relevance:0},{className:"string",begin:n.concat(/"/,n.either(...a)),end:/"/,keywords:a,illegal:/\n/,relevance:5,contains:[{begin:/HTTP\/[12]\.\d'/,relevance:5}]},{className:"string",begin:/\[\d[^\]\n]{8,}\]/,illegal:/\n/,relevance:1},{className:"string",begin:/\[/,end:/\]/,illegal:/\n/,relevance:0},{className:"string",begin:/"Mozilla\/\d\.\d \(/,end:/"/,illegal:/\n/,relevance:3},{className:"string",begin:/"/,end:/"/,illegal:/\n/,relevance:0}]}}return Is=t,Is}var Ds,b_;function TR(){if(b_)return Ds;b_=1;function t(e){const n=e.regex,a=/[a-zA-Z_$][a-zA-Z0-9_$]*/,r=n.concat(a,n.concat("(\\.",a,")*")),i=/([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)/,s={className:"rest_arg",begin:/[.]{3}/,end:a,relevance:10};return{name:"ActionScript",aliases:["as"],keywords:{keyword:["as","break","case","catch","class","const","continue","default","delete","do","dynamic","each","else","extends","final","finally","for","function","get","if","implements","import","in","include","instanceof","interface","internal","is","namespace","native","new","override","package","private","protected","public","return","set","static","super","switch","this","throw","try","typeof","use","var","void","while","with"],literal:["true","false","null","undefined"]},contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,{match:[/\bpackage/,/\s+/,r],className:{1:"keyword",3:"title.class"}},{match:[/\b(?:class|interface|extends|implements)/,/\s+/,a],className:{1:"keyword",3:"title.class"}},{className:"meta",beginKeywords:"import include",end:/;/,keywords:{keyword:"import include"}},{beginKeywords:"function",end:/[{;]/,excludeEnd:!0,illegal:/\S/,contains:[e.inherit(e.TITLE_MODE,{className:"title.function"}),{className:"params",begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]},{begin:n.concat(/:\s*/,i)}]},e.METHOD_GUARD],illegal:/#/}}return Ds=t,Ds}var ws,T_;function hR(){if(T_)return ws;T_=1;function t(e){const n="\\d(_|\\d)*",a="[eE][-+]?"+n,r=n+"(\\."+n+")?("+a+")?",i="\\w+",o="\\b("+(n+"#"+i+"(\\."+i+")?#("+a+")?")+"|"+r+")",c="[A-Za-z](_?[A-Za-z0-9.])*",l=`[]\\{\\}%#'"`,u=e.COMMENT("--","$"),d={begin:"\\s+:\\s+",end:"\\s*(:=|;|\\)|=>|$)",illegal:l,contains:[{beginKeywords:"loop for declare others",endsParent:!0},{className:"keyword",beginKeywords:"not null constant access function procedure in out aliased exception"},{className:"type",begin:c,endsParent:!0,relevance:0}]};return{name:"Ada",case_insensitive:!0,keywords:{keyword:["abort","else","new","return","abs","elsif","not","reverse","abstract","end","accept","entry","select","access","exception","of","separate","aliased","exit","or","some","all","others","subtype","and","for","out","synchronized","array","function","overriding","at","tagged","generic","package","task","begin","goto","pragma","terminate","body","private","then","if","procedure","type","case","in","protected","constant","interface","is","raise","use","declare","range","delay","limited","record","when","delta","loop","rem","while","digits","renames","with","do","mod","requeue","xor"],literal:["True","False"]},contains:[u,{className:"string",begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{className:"string",begin:/'.'/},{className:"number",begin:o,relevance:0},{className:"symbol",begin:"'"+c},{className:"title",begin:"(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?",end:"(is|$)",keywords:"package body",excludeBegin:!0,excludeEnd:!0,illegal:l},{begin:"(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+",end:"(\\bis|\\bwith|\\brenames|\\)\\s*;)",keywords:"overriding function procedure with is renames return",returnBegin:!0,contains:[u,{className:"title",begin:"(\\bwith\\s+)?\\b(function|procedure)\\s+",end:"(\\(|\\s+|$)",excludeBegin:!0,excludeEnd:!0,illegal:l},d,{className:"type",begin:"\\breturn\\s+",end:"(\\s+|;|$)",keywords:"return",excludeBegin:!0,excludeEnd:!0,endsParent:!0,illegal:l}]},{className:"type",begin:"\\b(sub)?type\\s+",end:"\\s+",keywords:"type",excludeBegin:!0,illegal:l},d]}}return ws=t,ws}var xs,h_;function vR(){if(h_)return xs;h_=1;function t(e){const n={className:"built_in",begin:"\\b(void|bool|int8|int16|int32|int64|int|uint8|uint16|uint32|uint64|uint|string|ref|array|double|float|auto|dictionary)"},a={className:"symbol",begin:"[a-zA-Z0-9_]+@"},r={className:"keyword",begin:"<",end:">",contains:[n,a]};return n.contains=[r],a.contains=[r],{name:"AngelScript",aliases:["asc"],keywords:["for","in|0","break","continue","while","do|0","return","if","else","case","switch","namespace","is","cast","or","and","xor","not","get|0","in","inout|10","out","override","set|0","private","public","const","default|0","final","shared","external","mixin|10","enum","typedef","funcdef","this","super","import","from","interface","abstract|0","try","catch","protected","explicit","property"],illegal:"(^using\\s+[A-Za-z0-9_\\.]+;$|\\bfunction\\s*[^\\(])",contains:[{className:"string",begin:"'",end:"'",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE],relevance:0},{className:"string",begin:'"""',end:'"""'},{className:"string",begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE],relevance:0},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",begin:"^\\s*\\[",end:"\\]"},{beginKeywords:"interface namespace",end:/\{/,illegal:"[;.\\-]",contains:[{className:"symbol",begin:"[a-zA-Z0-9_]+"}]},{beginKeywords:"class",end:/\{/,illegal:"[;.\\-]",contains:[{className:"symbol",begin:"[a-zA-Z0-9_]+",contains:[{begin:"[:,]\\s*",contains:[{className:"symbol",begin:"[a-zA-Z0-9_]+"}]}]}]},n,a,{className:"literal",begin:"\\b(null|true|false)"},{className:"number",relevance:0,begin:"(-?)(\\b0[xXbBoOdD][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?f?|\\.\\d+f?)([eE][-+]?\\d+f?)?)"}]}}return xs=t,xs}var Ls,v_;function RR(){if(v_)return Ls;v_=1;function t(e){const n={className:"number",begin:/[$%]\d+/},a={className:"number",begin:/\b\d+/},r={className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/},i={className:"number",begin:/:\d{1,5}/};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/,contains:[r,i,e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{_:["order","deny","allow","setenv","rewriterule","rewriteengine","rewritecond","documentroot","sethandler","errordocument","loadmodule","options","header","listen","serverroot","servername"]},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{scope:"punctuation",match:/\\\n/},{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable",begin:/[\$%]\{/,end:/\}/,contains:["self",n]},r,a,e.QUOTE_STRING_MODE]}}],illegal:/\S/}}return Ls=t,Ls}var Ms,R_;function CR(){if(R_)return Ms;R_=1;function t(e){const n=e.regex,a=e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),r={className:"params",begin:/\(/,end:/\)/,contains:["self",e.C_NUMBER_MODE,a]},i=e.COMMENT(/--/,/$/),s=e.COMMENT(/\(\*/,/\*\)/,{contains:["self",i]}),o=[i,s,e.HASH_COMMENT_MODE],c=[/apart from/,/aside from/,/instead of/,/out of/,/greater than/,/isn't|(doesn't|does not) (equal|come before|come after|contain)/,/(greater|less) than( or equal)?/,/(starts?|ends|begins?) with/,/contained by/,/comes (before|after)/,/a (ref|reference)/,/POSIX (file|path)/,/(date|time) string/,/quoted form/],l=[/clipboard info/,/the clipboard/,/info for/,/list (disks|folder)/,/mount volume/,/path to/,/(close|open for) access/,/(get|set) eof/,/current date/,/do shell script/,/get volume settings/,/random number/,/set volume/,/system attribute/,/system info/,/time to GMT/,/(load|run|store) script/,/scripting components/,/ASCII (character|number)/,/localized string/,/choose (application|color|file|file name|folder|from list|remote application|URL)/,/display (alert|dialog)/];return{name:"AppleScript",aliases:["osascript"],keywords:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without",literal:"AppleScript false linefeed return pi quote result space tab true",built_in:"alias application boolean class constant date file integer list number real record string text activate beep count delay launch log offset read round run say summarize write character characters contents day frontmost id item length month name|0 paragraph paragraphs rest reverse running time version weekday word words year"},contains:[a,e.C_NUMBER_MODE,{className:"built_in",begin:n.concat(/\b/,n.either(...l),/\b/)},{className:"built_in",begin:/^\s*return\b/},{className:"literal",begin:/\b(text item delimiters|current application|missing value)\b/},{className:"keyword",begin:n.concat(/\b/,n.either(...c),/\b/)},{beginKeywords:"on",illegal:/[${=;\n]/,contains:[e.UNDERSCORE_TITLE_MODE,r]},...o],illegal:/\/\/|->|=>|\[\[/}}return Ms=t,Ms}var ks,C_;function yR(){if(C_)return ks;C_=1;function t(e){const n=e.regex,a="[A-Za-z_][0-9A-Za-z_]*",r={keyword:["break","case","catch","continue","debugger","do","else","export","for","function","if","import","in","new","of","return","switch","try","var","void","while"],literal:["BackSlash","DoubleQuote","ForwardSlash","Infinity","NaN","NewLine","PI","SingleQuote","Tab","TextFormatting","false","null","true","undefined"],built_in:["Abs","Acos","All","Angle","Any","Area","AreaGeodetic","Array","Asin","Atan","Atan2","Attachments","Average","Back","Bearing","Boolean","Buffer","BufferGeodetic","Ceil","Centroid","ChangeTimeZone","Clip","Concatenate","Console","Constrain","Contains","ConvertDirection","ConvexHull","Cos","Count","Crosses","Cut","Date|0","DateAdd","DateDiff","DateOnly","Day","Decode","DefaultValue","Densify","DensifyGeodetic","Dictionary","Difference","Disjoint","Distance","DistanceGeodetic","DistanceToCoordinate","Distinct","Domain","DomainCode","DomainName","EnvelopeIntersects","Equals","Erase","Exp","Expects","Extent","Feature","FeatureInFilter","FeatureSet","FeatureSetByAssociation","FeatureSetById","FeatureSetByName","FeatureSetByPortalItem","FeatureSetByRelationshipClass","FeatureSetByRelationshipName","Filter","FilterBySubtypeCode","Find","First|0","Floor","FromCharCode","FromCodePoint","FromJSON","Front","GdbVersion","Generalize","Geometry","GetEnvironment","GetFeatureSet","GetFeatureSetInfo","GetUser","GroupBy","Guid","HasKey","HasValue","Hash","Hour","IIf","ISOMonth","ISOWeek","ISOWeekday","ISOYear","Includes","IndexOf","Insert","Intersection","Intersects","IsEmpty","IsNan","IsSelfIntersecting","IsSimple","KnowledgeGraphByPortalItem","Left|0","Length","Length3D","LengthGeodetic","Log","Lower","Map","Max","Mean","MeasureToCoordinate","Mid","Millisecond","Min","Minute","Month","MultiPartToSinglePart","Multipoint","NearestCoordinate","NearestVertex","NextSequenceValue","None","Now","Number","Offset","OrderBy","Overlaps","Point","PointToCoordinate","Polygon","Polyline","Pop","Portal","Pow","Proper","Push","QueryGraph","Random","Reduce","Relate","Replace","Resize","Reverse","Right|0","RingIsClockwise","Rotate","Round","Schema","Second","SetGeometry","Simplify","Sin","Slice","Sort","Splice","Split","Sqrt","StandardizeFilename","StandardizeGuid","Stdev","SubtypeCode","SubtypeName","Subtypes","Sum","SymmetricDifference","Tan","Text","Time","TimeZone","TimeZoneOffset","Timestamp","ToCharCode","ToCodePoint","ToHex","ToLocal","ToUTC","Today","Top|0","Touches","TrackAccelerationAt","TrackAccelerationWindow","TrackCurrentAcceleration","TrackCurrentDistance","TrackCurrentSpeed","TrackCurrentTime","TrackDistanceAt","TrackDistanceWindow","TrackDuration","TrackFieldWindow","TrackGeometryWindow","TrackIndex","TrackSpeedAt","TrackSpeedWindow","TrackStartTime","TrackWindow","Trim","TypeOf","Union","Upper","UrlEncode","Variance","Week","Weekday","When|0","Within","Year|0"]},i=["aggregatedFeatures","analytic","config","datapoint","datastore","editcontext","feature","featureSet","feedfeature","fencefeature","fencenotificationtype","graph","join","layer","locationupdate","map","measure","measure","originalFeature","record","reference","rowindex","sourcedatastore","sourcefeature","sourcelayer","target","targetdatastore","targetfeature","targetlayer","userInput","value","variables","view"],s={className:"symbol",begin:"\\$"+n.either(...i)},o={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:e.C_NUMBER_RE}],relevance:0},c={className:"subst",begin:"\\$\\{",end:"\\}",keywords:r,contains:[]},l={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,c]};c.contains=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,l,o,e.REGEXP_MODE];const u=c.contains.concat([e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]);return{name:"ArcGIS Arcade",case_insensitive:!0,keywords:r,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,l,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,o,{begin:/[{,]\s*/,relevance:0,contains:[{begin:a+"\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:a,relevance:0}]}]},{begin:"("+e.RE_STARTERS_RE+"|\\b(return)\\b)\\s*",keywords:"return",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+a+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:a},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:r,contains:u}]}]}],relevance:0},{beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{className:"title.function",begin:a}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:u}],illegal:/\[|%/},{begin:/\$[(.]/}],illegal:/#(?!!)/}}return ks=t,ks}var Ps,y_;function NR(){if(y_)return Ps;y_=1;function t(n){const a=n.regex,r=n.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),i="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",c="(?!struct)("+i+"|"+a.optional(s)+"[a-zA-Z_]\\w*"+a.optional("<[^<>]+>")+")",l={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[n.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},n.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},_={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},m={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},n.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},r,n.C_BLOCK_COMMENT_MODE]},p={className:"title",begin:a.optional(s)+n.IDENT_RE,relevance:0},E=a.optional(s)+n.IDENT_RE+"\\s*\\(",b=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],I=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],R=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],y=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],h={type:I,keyword:b,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:R},N={className:"function.dispatch",relevance:0,keywords:{_hint:y},begin:a.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,n.IDENT_RE,a.lookahead(/(<[^<>]+>|)\s*\(/))},C=[N,m,l,r,n.C_BLOCK_COMMENT_MODE,_,d],f={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:h,contains:C.concat([{begin:/\(/,end:/\)/,keywords:h,contains:C.concat(["self"]),relevance:0}]),relevance:0},A={className:"function",begin:"("+c+"[\\*&\\s]+)+"+E,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:h,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:i,keywords:h,relevance:0},{begin:E,returnBegin:!0,contains:[p],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[d,_]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:h,relevance:0,contains:[r,n.C_BLOCK_COMMENT_MODE,d,_,l,{begin:/\(/,end:/\)/,keywords:h,relevance:0,contains:["self",r,n.C_BLOCK_COMMENT_MODE,d,_,l]}]},l,r,n.C_BLOCK_COMMENT_MODE,m]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:h,illegal:"",classNameAliases:{"function.dispatch":"built_in"},contains:[].concat(f,A,N,C,[m,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)",end:">",keywords:h,contains:["self",l]},{begin:n.IDENT_RE+"::",keywords:h},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function e(n){const a={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},r=t(n),i=r.keywords;return i.type=[...i.type,...a.type],i.literal=[...i.literal,...a.literal],i.built_in=[...i.built_in,...a.built_in],i._hints=a._hints,r.name="Arduino",r.aliases=["ino"],r.supersetOf="cpp",r}return Ps=e,Ps}var Us,N_;function OR(){if(N_)return Us;N_=1;function t(e){const n={variants:[e.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),e.COMMENT("[;@]","$",{relevance:0}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+e.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 w18 w19 w20 w21 w22 w23 w24 w25 w26 w27 w28 w29 w30 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},n,e.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}return Us=t,Us}var Fs,O_;function AR(){if(O_)return Fs;O_=1;function t(e){const n=e.regex,a=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:"symbol",begin:/&[a-z]+;|[0-9]+;|[a-f0-9]+;/},s={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},o=e.inherit(s,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),u={endsWithParent:!0,illegal:/,relevance:0,contains:[{className:"attr",begin:r,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[i]},{begin:/'/,end:/'/,contains:[i]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[s,l,c,o,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[s,o,l,c]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/ \ No newline at end of file + diff --git a/webclient/src/components/settings/NotificationSettingsPanel.vue b/webclient/src/components/settings/NotificationSettingsPanel.vue index cd60b47..810f76d 100644 --- a/webclient/src/components/settings/NotificationSettingsPanel.vue +++ b/webclient/src/components/settings/NotificationSettingsPanel.vue @@ -3,9 +3,16 @@ Notifications
- Push notifications let Navi ping you when a reply is ready — even when the - tab is closed. You get one notification per finished reply, but only when - no Navi window is open on that session. + + The app keeps its connection open in the background and raises a native + notification when a reply finishes while Navi is minimized. Notifications + stop if you close the app itself. + + + Push notifications let Navi ping you when a reply is ready — even when the + tab is closed. You get one notification per finished reply, but only when + no Navi window is open on that session. +
@@ -20,8 +27,15 @@ @@ -39,7 +53,7 @@ import { usePush } from '@/composables/usePush.js' import { useToast } from 'gnexus-ui-kit/vue' -const { supported, permission, subscribed, busy, enable, disable, syncState } = usePush() +const { supported, bridgeMode, permission, subscribed, busy, enable, disable, syncState } = usePush() const toast = useToast() onMounted(() => { @@ -51,7 +65,12 @@ if (want) { const ok = await enable() if (ok === false && permission.value === 'denied') { - toast.error({ title: 'Permission denied', text: 'Allow notifications in the browser site settings.' }) + toast.error({ + title: 'Permission denied', + text: bridgeMode.value + ? 'Allow notifications in the system app settings.' + : 'Allow notifications in the browser site settings.', + }) } else if (ok === false) { toast.error({ title: 'Push unavailable', text: 'The server does not accept push subscriptions right now.' }) } diff --git a/webclient/src/composables/nativeBridge.js b/webclient/src/composables/nativeBridge.js new file mode 100644 index 0000000..b622b47 --- /dev/null +++ b/webclient/src/composables/nativeBridge.js @@ -0,0 +1,84 @@ +/** + * JS bridge into the Android WebView app (window.NaviAndroid, added by + * MainActivity's NaviBridge). Web push APIs don't exist inside a WebView, + * so the app shows notifications natively; this composable is the only + * place that touches the bridge surface. + */ + +/** The bridge object or null — never throws in non-WebView contexts. */ +export function nativeBridge() { + return typeof window !== 'undefined' ? window.NaviAndroid ?? null : null +} + +/** Bridge present with the full surface. */ +export function bridgeAvailable() { + const b = nativeBridge() + return !!b && typeof b.notify === 'function' && typeof b.enableBackgroundMode === 'function' +} + +const FLAG_KEY = 'navi_push_android' + +/** Whether the user turned native push on (persisted locally, no server side). */ +export function nativePushFlag() { + try { + return localStorage.getItem(FLAG_KEY) === '1' + } catch { + return false + } +} + +function setNativePushFlag(on) { + try { + if (on) localStorage.setItem(FLAG_KEY, '1') + else localStorage.removeItem(FLAG_KEY) + } catch { /* storage unavailable — state stays in-memory */ } +} + +/** + * Run the bridge's permission request through the 'navi-perm-result' + * CustomEvent the app posts back with {detail: granted}. + */ +export function requestPermissionViaBridge() { + const bridge = nativeBridge() + if (!bridge || typeof bridge.requestNotificationPermission !== 'function') { + return Promise.resolve(false) + } + if (bridge.hasNotificationPermission?.()) return Promise.resolve(true) + return new Promise((resolve) => { + const onResult = (e) => { + clearTimeout(timer) + window.removeEventListener('navi-perm-result', onResult) + resolve(!!(e && e.detail)) + } + // Safety valve: if the activity never answers, fail closed. + const timer = setTimeout(() => { + window.removeEventListener('navi-perm-result', onResult) + resolve(false) + }, 30000) + window.addEventListener('navi-perm-result', onResult) + bridge.requestNotificationPermission() + }) +} + +/** + * Raise a native turn-complete notification via the bridge — only when the + * user turned native push on and the app window is not visible (the + * foreground session already shows everything on screen). + */ +export function notifyNativeTurn(title, body, url) { + const bridge = nativeBridge() + if (!bridge || typeof bridge.notify !== 'function') return + if (typeof document !== 'undefined' && !document.hidden) return + let enabled + try { + enabled = localStorage.getItem(FLAG_KEY) === '1' + } catch { + return + } + if (!enabled) return + try { + bridge.notify(String(title), String(body), String(url ?? '/')) + } catch (err) { + console.warn('[nativeBridge] notify failed', err) + } +} \ No newline at end of file diff --git a/webclient/src/composables/usePush.js b/webclient/src/composables/usePush.js index 37dd059..1b79f53 100644 --- a/webclient/src/composables/usePush.js +++ b/webclient/src/composables/usePush.js @@ -1,5 +1,11 @@ import { ref, computed } from 'vue' import { getVapidKey, subscribePush, unsubscribePush } from '@/api' +import { + bridgeAvailable, + nativeBridge, + nativePushFlag, + requestPermissionViaBridge, +} from '@/composables/nativeBridge.js' /** URL-safe base64 → Uint8Array (the format PushManager expects for VAPID keys). */ export function urlBase64ToUint8Array(base64String) { @@ -26,13 +32,37 @@ return typeof Notification !== 'undefined' } -/** Supported = SW + PushManager + Notification APIs all present. */ -export const supported = computed(() => pmSupported() && notifSupported()) +/** Supported = the Android bridge (notifications natively, no web push in + * WebView) or the browser trio SW + PushManager + Notification APIs. */ +export const supported = computed(() => bridgeAvailable() || (pmSupported() && notifSupported())) -const permission = ref(notifSupported() ? Notification.permission : 'denied') +/** The Android-app path replaces the web-push machinery entirely. */ +export const bridgeMode = computed(() => bridgeAvailable()) + +const permission = ref(initialPermission()) const subscribed = ref(false) const busy = ref(false) +function initialPermission() { + const bridge = nativeBridge() + if (bridge && typeof bridge.hasNotificationPermission === 'function') { + try { + return bridge.hasNotificationPermission() ? 'granted' : 'default' + } catch { /* fall through to web checks */ } + } + return notifSupported() ? Notification.permission : 'denied' +} + +function bridgePermission() { + const bridge = nativeBridge() + if (!bridge) return 'denied' + try { + return bridge.hasNotificationPermission() ? 'granted' : 'default' + } catch { + return 'default' + } +} + async function currentSubscription() { if (!swSupported() || !pmSupported()) return null const reg = await navigator.serviceWorker.getRegistration() @@ -41,11 +71,16 @@ } async function syncState() { + if (bridgeMode.value) { + subscribed.value = nativePushFlag() + permission.value = bridgePermission() + return + } if (!swSupported() || !pmSupported()) return try { const sub = await currentSubscription() subscribed.value = !!sub - permission.value = notificationsSupported ? Notification.permission : 'denied' + permission.value = notifSupported() ? Notification.permission : 'denied' } catch { subscribed.value = false } @@ -54,6 +89,31 @@ /** Ask for permission, subscribe via the SW and register the endpoint server-side. */ async function enable() { if (!supported.value || busy.value) return + if (bridgeMode.value) { + busy.value = true + try { + if (bridgePermission() !== 'granted') { + const ok = await requestPermissionViaBridge() + if (!ok) return false + } + const bridge = nativeBridge() + // Hold the process (and the WebView WebSocket) open when minimized. + bridge.enableBackgroundMode() + if ( + typeof bridge.isIgnoringBatteryOptimizations === 'function' && + !bridge.isIgnoringBatteryOptimizations() + ) { + // One-time ask for the Doze exemption — the system shows its own dialog. + bridge.requestIgnoreBatteryOptimizations() + } + try { localStorage.setItem('navi_push_android', '1') } catch { /* memory only */ } + subscribed.value = true + permission.value = 'granted' + return true + } finally { + busy.value = false + } + } busy.value = true try { permission.value = await Notification.requestPermission() @@ -85,6 +145,18 @@ /** Unsubscribe from the push service and unregister the endpoint server-side. */ async function disable() { + if (bridgeMode.value) { + if (busy.value) return + busy.value = true + try { + nativeBridge()?.disableBackgroundMode?.() + try { localStorage.removeItem('navi_push_android') } catch { /* memory only */ } + subscribed.value = false + return true + } finally { + busy.value = false + } + } if (!swSupported() || !pmSupported() || busy.value) return busy.value = true try { @@ -102,5 +174,5 @@ } export function usePush() { - return { supported, permission, subscribed, busy, enable, disable, syncState } + return { supported, bridgeMode, permission, subscribed, busy, enable, disable, syncState } } \ No newline at end of file diff --git a/webclient/src/stores/chat.js b/webclient/src/stores/chat.js index 82686a8..aa5aa4f 100644 --- a/webclient/src/stores/chat.js +++ b/webclient/src/stores/chat.js @@ -2,6 +2,7 @@ import { ref, shallowRef } from 'vue' import * as api from '@/api/index.js' import { useSessionsStore } from '@/stores/sessions.js' +import { notifyNativeTurn } from '@/composables/nativeBridge.js' // Guard against late completion of stale loadSession calls let _lastLoadId = null @@ -784,6 +785,12 @@ useSessionsStore().updatePreview(currentId.value, msg.text.slice(0, 80)) } + // Android app: raise a native notification when the answer finished while + // the window was hidden (bridge notify() re-checks visibility + the flag). + if (msg?.text && currentId.value) { + notifyNativeTurn('Navi ответила', msg.text.slice(0, 140), `/#${currentId.value}`) + } + // Try to generate session name in background (only if not named yet) if (currentId.value) { _tryGenerateName(currentId.value) diff --git a/webclient/tests/unit/components/settings/mcpKeysPanel.test.js b/webclient/tests/unit/components/settings/mcpKeysPanel.test.js index b104514..9584f55 100644 --- a/webclient/tests/unit/components/settings/mcpKeysPanel.test.js +++ b/webclient/tests/unit/components/settings/mcpKeysPanel.test.js @@ -30,20 +30,35 @@ { server_name: 'http-server', transport: 'streamable_http', + accepts_user_key: true, key_type: 'header', key_location: 'Authorization', prefix: 'Bearer ', has_key: false, updated_at: null, + profiles: ['server_admin'], }, { server_name: 'stdio-server', transport: 'stdio', + accepts_user_key: true, key_type: 'env', key_location: 'API_KEY', prefix: null, has_key: true, updated_at: '2026-10-07T12:00:00Z', + profiles: ['discuss', 'server_admin'], + }, + { + server_name: 'navi-web', + transport: 'stdio', + accepts_user_key: false, + key_type: null, + key_location: null, + prefix: null, + has_key: false, + updated_at: null, + profiles: ['discuss', 'secretary'], }, ] @@ -59,23 +74,42 @@ api.resetMcpKey.mockResolvedValue(undefined) }) - it('renders one row per eligible server with its key location', async () => { + it('renders every connected server, keyed ones with their key location', async () => { const wrapper = mount(McpKeysPanel) await new Promise(r => setTimeout(r)) - expect(wrapper.text()).toContain('MCP Keys') + expect(wrapper.text()).toContain('MCP servers') expect(wrapper.text()).toContain('http-server') expect(wrapper.text()).toContain('stdio-server') expect(wrapper.text()).toContain('Authorization header (Bearer …)') expect(wrapper.text()).toContain('API_KEY env') + // Keyless servers are listed too, with the profile they serve. + expect(wrapper.text()).toContain('navi-web') + expect(wrapper.text()).toContain('discuss, secretary') + expect(wrapper.text()).toContain('No personal key slot') + expect(wrapper.findAll('.mcp-keys-row')).toHaveLength(3) }) - it('shows an empty-state message when there are no eligible servers', async () => { + it('offers a key input only for servers that declare a slot', async () => { + const wrapper = mount(McpKeysPanel) + await new Promise(r => setTimeout(r)) + // Three rows, two of them with a slot → exactly two password inputs. + expect(wrapper.findAll('input[type="password"]')).toHaveLength(2) + const keylessRow = wrapper.findAll('.mcp-keys-row').find(r => r.text().includes('navi-web')) + expect(keylessRow.classes()).toContain('is-keyless') + expect(keylessRow.find('input').exists()).toBe(false) + // A keyed server without a saved key says the shared one is in use. + const httpRow = wrapper.findAll('.mcp-keys-row').find(r => r.text().includes('http-server')) + expect(httpRow.text()).toContain('the shared key from the config is used') + const stdioRow = wrapper.findAll('.mcp-keys-row').find(r => r.text().includes('stdio-server')) + expect(stdioRow.text()).toContain('Personal key set') + }) + + it('shows an empty-state message when no server is connected', async () => { api.getMcpKeys.mockResolvedValue({ items: [] }) const wrapper = mount(McpKeysPanel) await new Promise(r => setTimeout(r)) expect(wrapper.find('.mcp-keys-empty').exists()).toBe(true) - expect(wrapper.text()).toContain('No MCP servers accept a personal key') - expect(wrapper.text()).toContain('user_key') + expect(wrapper.text()).toContain('No MCP servers are connected to any profile') expect(wrapper.find('.mcp-keys-row').exists()).toBe(false) }) diff --git a/webclient/tests/unit/composables/nativeBridge.test.js b/webclient/tests/unit/composables/nativeBridge.test.js new file mode 100644 index 0000000..0c9336f --- /dev/null +++ b/webclient/tests/unit/composables/nativeBridge.test.js @@ -0,0 +1,92 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { + bridgeAvailable, + nativeBridge, + nativePushFlag, + notifyNativeTurn, + requestPermissionViaBridge, +} from '@/composables/nativeBridge.js' + +function makeBridge(overrides = {}) { + return { + notify: vi.fn(), + enableBackgroundMode: vi.fn(), + disableBackgroundMode: vi.fn(), + hasNotificationPermission: vi.fn(() => true), + requestNotificationPermission: vi.fn(), + isIgnoringBatteryOptimizations: vi.fn(() => true), + requestIgnoreBatteryOptimizations: vi.fn(), + ...overrides, + } +} + +describe('nativeBridge', () => { + // node env here may have no localStorage global — provide a minimal shim + // so the flag path is testable. + let mem + beforeEach(() => { + mem = {} + if (!globalThis.localStorage) { + vi.stubGlobal('localStorage', { + getItem: (k) => (k in mem ? mem[k] : null), + setItem: (k, v) => { mem[k] = String(v) }, + removeItem: (k) => { delete mem[k] }, + clear: () => { for (const key of Object.keys(mem)) delete mem[key] }, + }) + } else { + localStorage.clear() + } + if (window.NaviAndroid) delete window.NaviAndroid + }) + afterEach(() => { + if (window.NaviAndroid) delete window.NaviAndroid + }) + + it('without the bridge everything is a safe no-op', () => { + expect(nativeBridge()).toBe(null) + expect(bridgeAvailable()).toBe(false) + expect(nativePushFlag()).toBe(false) + expect(() => notifyNativeTurn('t', 'b', '/x')).not.toThrow() + }) + + it('detects the bridge surface', () => { + window.NaviAndroid = makeBridge() + expect(bridgeAvailable()).toBe(true) + }) + + it('notifyNativeTurn skips unless the user enabled native push', () => { + window.NaviAndroid = makeBridge() + Object.defineProperty(document, 'hidden', { value: true, configurable: true }) + notifyNativeTurn('Navi', 'body', '/#s1') + expect(window.NaviAndroid.notify).not.toHaveBeenCalled() + + localStorage?.setItem?.("navi_push_android", "1") + notifyNativeTurn('Navi', 'body', '/#s1') + expect(window.NaviAndroid.notify).toHaveBeenCalledWith('Navi', 'body', '/#s1') + }) + + it('notifyNativeTurn skips when the window is visible', () => { + Object.defineProperty(document, 'hidden', { value: false, configurable: true }) + window.NaviAndroid = makeBridge() + localStorage?.setItem?.("navi_push_android", "1") + notifyNativeTurn('Navi', 'body', '/#s1') + expect(window.NaviAndroid.notify).not.toHaveBeenCalled() + }) + + it('requestPermissionViaBridge resolves from the navi-perm-result event', async () => { + const bridge = makeBridge({ hasNotificationPermission: vi.fn(() => false) }) + window.NaviAndroid = bridge + const p = requestPermissionViaBridge() + expect(bridge.requestNotificationPermission).toHaveBeenCalled() + window.dispatchEvent(new CustomEvent('navi-perm-result', { detail: true })) + await expect(p).resolves.toBe(true) + }) + + it('requestPermissionViaBridge fails closed when already-declined is echoed', async () => { + const bridge = makeBridge({ hasNotificationPermission: vi.fn(() => false) }) + window.NaviAndroid = bridge + const p = requestPermissionViaBridge() + window.dispatchEvent(new CustomEvent('navi-perm-result', { detail: false })) + await expect(p).resolves.toBe(false) + }) +}) \ No newline at end of filePush notifications- Enabled — this device is subscribed. - Blocked in browser site settings. + + + Enabled — background mode holds the connection open when minimized. + + Enabled — this device is subscribed. + + + {{ bridgeMode ? 'Blocked in the system app settings.' : 'Blocked in browser site settings.' }} + Disabled.