this.driver=this.driver||{},this.driver.js=(function(v){"use strict";let T={};function P(o={}){T={animate:!0,allowClose:!0,overlayOpacity:.7,smoothScroll:!1,disableActiveInteraction:!1,showProgress:!1,stagePadding:10,stageRadius:5,popoverOffset:10,showButtons:["next","previous","close"],disableButtons:[],overlayColor:"#000",...o}}function e(o){return o?T[o]:T}function t(o,r,n,s){return(o/=s/2)<1?n/2*o*o+r:-n/2*(--o*(o-2)-1)+r}function a(o){const r='a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])';return o.flatMap(n=>{const s=n.matches(r),i=Array.from(n.querySelectorAll(r));return[...s?[n]:[],...i]}).filter(n=>getComputedStyle(n).pointerEvents!=="none"&&A(n))}function p(o){if(!o||m(o))return;const r=e("smoothScroll");o.scrollIntoView({behavior:!r||y(o)?"auto":"smooth",inline:"center",block:"center"})}function y(o){if(!o||!o.parentElement)return;const r=o.parentElement;return r.scrollHeight>r.clientHeight}function m(o){const r=o.getBoundingClientRect();return r.top>=0&&r.left>=0&&r.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&r.right<=(window.innerWidth||document.documentElement.clientWidth)}function A(o){return!!(o.offsetWidth||o.offsetHeight||o.getClientRects().length)}let L={};function E(o,r){L[o]=r}function d(o){return o?L[o]:L}function K(){L={}}let F={};function R(o,r){F[o]=r}function O(o){var r;(r=F[o])==null||r.call(F)}function se(){F={}}function ae(o,r,n,s){let i=d("__activeStagePosition");const u=i||n.getBoundingClientRect(),b=s.getBoundingClientRect(),S=t(o,u.x,b.x-u.x,r),c=t(o,u.y,b.y-u.y,r),w=t(o,u.width,b.width-u.width,r),l=t(o,u.height,b.height-u.height,r);i={x:S,y:c,width:w,height:l},J(i),E("__activeStagePosition",i)}function Y(o){if(!o)return;const r=o.getBoundingClientRect(),n={x:r.x,y:r.y,width:r.width,height:r.height};E("__activeStagePosition",n),J(n)}function le(){const o=d("__activeStagePosition"),r=d("__overlaySvg");if(!o)return;if(!r){console.warn("No stage svg found.");return}const n=window.innerWidth,s=window.innerHeight;r.setAttribute("viewBox",`0 0 ${n} ${s}`)}function de(o){const r=ce(o);document.body.appendChild(r),ee(r,n=>{n.target.tagName==="path"&&O("overlayClick")}),E("__overlaySvg",r)}function J(o){const r=d("__overlaySvg");if(!r){de(o);return}const n=r.firstElementChild;if(n?.tagName!=="path")throw new Error("no path element found in stage svg");n.setAttribute("d",Q(o))}function ce(o){const r=window.innerWidth,n=window.innerHeight,s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("driver-overlay","driver-overlay-animated"),s.setAttribute("viewBox",`0 0 ${r} ${n}`),s.setAttribute("xmlSpace","preserve"),s.setAttribute("xmlnsXlink","http://www.w3.org/1999/xlink"),s.setAttribute("version","1.1"),s.setAttribute("preserveAspectRatio","xMinYMin slice"),s.style.fillRule="evenodd",s.style.clipRule="evenodd",s.style.strokeLinejoin="round",s.style.strokeMiterlimit="2",s.style.zIndex="10000",s.style.position="fixed",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%";const i=document.createElementNS("http://www.w3.org/2000/svg","path");return i.setAttribute("d",Q(o)),i.style.fill=e("overlayColor")||"rgb(0,0,0)",i.style.opacity=`${e("overlayOpacity")}`,i.style.pointerEvents="auto",i.style.cursor="auto",s.appendChild(i),s}function Q(o){const r=window.innerWidth,n=window.innerHeight,s=e("stagePadding")||0,i=e("stageRadius")||0,u=o.width+s*2,b=o.height+s*2,S=Math.min(i,u/2,b/2),c=Math.floor(Math.max(S,0)),w=o.x-s+c,l=o.y-s,h=u-c*2,g=b-c*2;return`M${r},0L0,0L0,${n}L${r},${n}L${r},0Z
M${w},${l} h${h} a${c},${c} 0 0 1 ${c},${c} v${g} a${c},${c} 0 0 1 -${c},${c} h-${h} a${c},${c} 0 0 1 -${c},-${c} v-${g} a${c},${c} 0 0 1 ${c},-${c} z`}function pe(){const o=d("__overlaySvg");o&&o.remove()}function ue(){const o=document.getElementById("driver-dummy-element");if(o)return o;let r=document.createElement("div");return r.id="driver-dummy-element",r.style.width="0",r.style.height="0",r.style.pointerEvents="none",r.style.opacity="0",r.style.position="fixed",r.style.top="50%",r.style.left="50%",document.body.appendChild(r),r}function X(o){const{element:r}=o;let n=typeof r=="string"?document.querySelector(r):r;n||(n=ue()),he(n,o)}function me(){const o=d("__activeElement"),r=d("__activeStep");o&&(Y(o),le(),ne(o,r))}function he(o,r){const n=Date.now(),s=d("__activeStep"),i=d("__activeElement")||o,u=!i||i===o,b=o.id==="driver-dummy-element",S=i.id==="driver-dummy-element",c=e("animate"),w=r.onHighlightStarted||e("onHighlightStarted"),l=r?.onHighlighted||e("onHighlighted"),h=s?.onDeselected||e("onDeselected"),g=e(),C=d();!u&&h&&h(S?void 0:i,s,{config:g,state:C}),w&&w(b?void 0:o,r,{config:g,state:C});const k=!u&&c;let x=!1;we(),E("previousStep",s),E("previousElement",i),E("activeStep",r),E("activeElement",o);const f=()=>{if(d("__transitionCallback")!==f)return;const D=Date.now()-n,B=400-D<=400/2;r.popover&&B&&!x&&k&&(te(o,r),x=!0),e("animate")&&D<400?ae(D,400,i,o):(Y(o),l&&l(b?void 0:o,r,{config:e(),state:d()}),E("__transitionCallback",void 0),E("__previousStep",s),E("__previousElement",i),E("__activeStep",r),E("__activeElement",o)),window.requestAnimationFrame(f)};E("__transitionCallback",f),window.requestAnimationFrame(f),p(o),!k&&r.popover&&te(o,r),i.classList.remove("driver-active-element","driver-no-interaction"),i.removeAttribute("aria-haspopup"),i.removeAttribute("aria-expanded"),i.removeAttribute("aria-controls"),e("disableActiveInteraction")&&o.classList.add("driver-no-interaction"),o.classList.add("driver-active-element"),o.setAttribute("aria-haspopup","dialog"),o.setAttribute("aria-expanded","true"),o.setAttribute("aria-controls","driver-popover-content")}function ge(){var o;(o=document.getElementById("driver-dummy-element"))==null||o.remove(),document.querySelectorAll(".driver-active-element").forEach(r=>{r.classList.remove("driver-active-element","driver-no-interaction"),r.removeAttribute("aria-haspopup"),r.removeAttribute("aria-expanded"),r.removeAttribute("aria-controls")})}function z(){const o=d("__resizeTimeout");o&&window.cancelAnimationFrame(o),E("__resizeTimeout",window.requestAnimationFrame(me))}function ve(o){var r;if(!d("isInitialized")||!(o.key==="Tab"||o.keyCode===9))return;const n=d("__activeElement"),s=(r=d("popover"))==null?void 0:r.wrapper,i=a([...s?[s]:[],...n?[n]:[]]),u=i[0],b=i[i.length-1];if(o.preventDefault(),o.shiftKey){const S=i[i.indexOf(document.activeElement)-1]||b;S?.focus()}else{const S=i[i.indexOf(document.activeElement)+1]||u;S?.focus()}}function Z(o){var r;((r=e("allowKeyboardControl"))==null||r)&&(o.key==="Escape"?O("escapePress"):o.key==="ArrowRight"?O("arrowRightPress"):o.key==="ArrowLeft"&&O("arrowLeftPress"))}function ee(o,r,n){const s=(i,u)=>{const b=i.target;o.contains(b)&&((!n||n(b))&&(i.preventDefault(),i.stopPropagation(),i.stopImmediatePropagation()),u?.(i))};document.addEventListener("pointerdown",s,!0),document.addEventListener("mousedown",s,!0),document.addEventListener("pointerup",s,!0),document.addEventListener("mouseup",s,!0),document.addEventListener("click",i=>{s(i,r)},!0)}function fe(){window.addEventListener("keyup",Z,!1),window.addEventListener("keydown",ve,!1),window.addEventListener("resize",z),window.addEventListener("scroll",z)}function ye(){window.removeEventListener("keyup",Z),window.removeEventListener("resize",z),window.removeEventListener("scroll",z)}function we(){const o=d("popover");o&&(o.wrapper.style.display="none")}function te(o,r){var n,s;let i=d("popover");i&&document.body.removeChild(i.wrapper),i=Te(),document.body.appendChild(i.wrapper);const{title:u,description:b,showButtons:S,disableButtons:c,showProgress:w,nextBtnText:l=e("nextBtnText")||"Next →",prevBtnText:h=e("prevBtnText")||"← Previous",progressText:g=e("progressText")||"{current} of {total}"}=r.popover||{};i.nextButton.innerHTML=l,i.previousButton.innerHTML=h,i.progress.innerHTML=g,u?(i.title.innerHTML=u,i.title.style.display="block"):i.title.style.display="none",b?(i.description.innerHTML=b,i.description.style.display="block"):i.description.style.display="none";const C=S||e("showButtons"),k=w||e("showProgress")||!1,x=C?.includes("next")||C?.includes("previous")||k;i.closeButton.style.display=C.includes("close")?"block":"none",x?(i.footer.style.display="flex",i.progress.style.display=k?"block":"none",i.nextButton.style.display=C.includes("next")?"block":"none",i.previousButton.style.display=C.includes("previous")?"block":"none"):i.footer.style.display="none";const f=c||e("disableButtons")||[];f!=null&&f.includes("next")&&(i.nextButton.disabled=!0,i.nextButton.classList.add("driver-popover-btn-disabled")),f!=null&&f.includes("previous")&&(i.previousButton.disabled=!0,i.previousButton.classList.add("driver-popover-btn-disabled")),f!=null&&f.includes("close")&&(i.closeButton.disabled=!0,i.closeButton.classList.add("driver-popover-btn-disabled"));const D=i.wrapper;D.style.display="block",D.style.left="",D.style.top="",D.style.bottom="",D.style.right="",D.id="driver-popover-content",D.setAttribute("role","dialog"),D.setAttribute("aria-labelledby","driver-popover-title"),D.setAttribute("aria-describedby","driver-popover-description");const B=i.arrow;B.className="driver-popover-arrow";const $=((n=r.popover)==null?void 0:n.popoverClass)||e("popoverClass")||"";D.className=`driver-popover ${$}`.trim(),ee(i.wrapper,M=>{var W,U,j;const H=M.target,V=((W=r.popover)==null?void 0:W.onNextClick)||e("onNextClick"),q=((U=r.popover)==null?void 0:U.onPrevClick)||e("onPrevClick"),G=((j=r.popover)==null?void 0:j.onCloseClick)||e("onCloseClick");if(H.classList.contains("driver-popover-next-btn"))return V?V(o,r,{config:e(),state:d()}):O("nextClick");if(H.classList.contains("driver-popover-prev-btn"))return q?q(o,r,{config:e(),state:d()}):O("prevClick");if(H.classList.contains("driver-popover-close-btn"))return G?G(o,r,{config:e(),state:d()}):O("closeClick")},M=>!(i!=null&&i.description.contains(M))&&!(i!=null&&i.title.contains(M))&&typeof M.className=="string"&&M.className.includes("driver-popover")),E("popover",i);const _=((s=r.popover)==null?void 0:s.onPopoverRender)||e("onPopoverRender");_&&_(i,{config:e(),state:d()}),ne(o,r),p(D);const I=o.classList.contains("driver-dummy-element"),N=a([D,...I?[]:[o]]);N.length>0&&N[0].focus()}function oe(){const o=d("popover");if(!(o!=null&&o.wrapper))return;const r=o.wrapper.getBoundingClientRect(),n=e("stagePadding")||0,s=e("popoverOffset")||0;return{width:r.width+n+s,height:r.height+n+s,realWidth:r.width,realHeight:r.height}}function re(o,r){const{elementDimensions:n,popoverDimensions:s,popoverPadding:i,popoverArrowDimensions:u}=r;return o==="start"?Math.max(Math.min(n.top-i,window.innerHeight-s.realHeight-u.width),u.width):o==="end"?Math.max(Math.min(n.top-s?.realHeight+n.height+i,window.innerHeight-s?.realHeight-u.width),u.width):o==="center"?Math.max(Math.min(n.top+n.height/2-s?.realHeight/2,window.innerHeight-s?.realHeight-u.width),u.width):0}function ie(o,r){const{elementDimensions:n,popoverDimensions:s,popoverPadding:i,popoverArrowDimensions:u}=r;return o==="start"?Math.max(Math.min(n.left-i,window.innerWidth-s.realWidth-u.width),u.width):o==="end"?Math.max(Math.min(n.left-s?.realWidth+n.width+i,window.innerWidth-s?.realWidth-u.width),u.width):o==="center"?Math.max(Math.min(n.left+n.width/2-s?.realWidth/2,window.innerWidth-s?.realWidth-u.width),u.width):0}function ne(o,r){const n=d("popover");if(!n)return;const{align:s="start",side:i="left"}=r?.popover||{},u=s,b=o.id==="driver-dummy-element"?"over":i,S=e("stagePadding")||0,c=oe(),w=n.arrow.getBoundingClientRect(),l=o.getBoundingClientRect(),h=l.top-c.height;let g=h>=0;const C=window.innerHeight-(l.bottom+c.height);let k=C>=0;const x=l.left-c.width;let f=x>=0;const D=window.innerWidth-(l.right+c.width);let B=D>=0;const $=!g&&!k&&!f&&!B;let _=b;if(b==="top"&&g?B=f=k=!1:b==="bottom"&&k?B=f=g=!1:b==="left"&&f?B=g=k=!1:b==="right"&&B&&(f=g=k=!1),b==="over"){const I=window.innerWidth/2-c.realWidth/2,N=window.innerHeight/2-c.realHeight/2;n.wrapper.style.left=`${I}px`,n.wrapper.style.right="auto",n.wrapper.style.top=`${N}px`,n.wrapper.style.bottom="auto"}else if($){const I=window.innerWidth/2-c?.realWidth/2,N=10;n.wrapper.style.left=`${I}px`,n.wrapper.style.right="auto",n.wrapper.style.bottom=`${N}px`,n.wrapper.style.top="auto"}else if(f){const I=Math.min(x,window.innerWidth-c?.realWidth-w.width),N=re(u,{elementDimensions:l,popoverDimensions:c,popoverPadding:S,popoverArrowDimensions:w});n.wrapper.style.left=`${I}px`,n.wrapper.style.top=`${N}px`,n.wrapper.style.bottom="auto",n.wrapper.style.right="auto",_="left"}else if(B){const I=Math.min(D,window.innerWidth-c?.realWidth-w.width),N=re(u,{elementDimensions:l,popoverDimensions:c,popoverPadding:S,popoverArrowDimensions:w});n.wrapper.style.right=`${I}px`,n.wrapper.style.top=`${N}px`,n.wrapper.style.bottom="auto",n.wrapper.style.left="auto",_="right"}else if(g){const I=Math.min(h,window.innerHeight-c.realHeight-w.width);let N=ie(u,{elementDimensions:l,popoverDimensions:c,popoverPadding:S,popoverArrowDimensions:w});n.wrapper.style.top=`${I}px`,n.wrapper.style.left=`${N}px`,n.wrapper.style.bottom="auto",n.wrapper.style.right="auto",_="top"}else if(k){const I=Math.min(C,window.innerHeight-c?.realHeight-w.width);let N=ie(u,{elementDimensions:l,popoverDimensions:c,popoverPadding:S,popoverArrowDimensions:w});n.wrapper.style.left=`${N}px`,n.wrapper.style.bottom=`${I}px`,n.wrapper.style.top="auto",n.wrapper.style.right="auto",_="bottom"}$?n.arrow.classList.add("driver-popover-arrow-none"):be(u,_,o)}function be(o,r,n){const s=d("popover");if(!s)return;const i=n.getBoundingClientRect(),u=oe(),b=s.arrow,S=u.width,c=window.innerWidth,w=i.width,l=i.left,h=u.height,g=window.innerHeight,C=i.top,k=i.height;b.className="driver-popover-arrow";let x=r,f=o;r==="top"?(l+w<=0?(x="right",f="end"):l+w-S<=0&&(x="top",f="start"),l>=c?(x="left",f="end"):l+S>=c&&(x="top",f="end")):r==="bottom"?(l+w<=0?(x="right",f="start"):l+w-S<=0&&(x="bottom",f="start"),l>=c?(x="left",f="start"):l+S>=c&&(x="bottom",f="end")):r==="left"?(C+k<=0?(x="bottom",f="end"):C+k-h<=0&&(x="left",f="start"),C>=g?(x="top",f="end"):C+h>=g&&(x="left",f="end")):r==="right"&&(C+k<=0?(x="bottom",f="start"):C+k-h<=0&&(x="right",f="start"),C>=g?(x="top",f="start"):C+h>=g&&(x="right",f="end")),x?(b.classList.add(`driver-popover-arrow-side-${x}`),b.classList.add(`driver-popover-arrow-align-${f}`)):b.classList.add("driver-popover-arrow-none")}function Te(){const o=document.createElement("div");o.classList.add("driver-popover");const r=document.createElement("div");r.classList.add("driver-popover-arrow");const n=document.createElement("header");n.id="driver-popover-title",n.classList.add("driver-popover-title"),n.style.display="none",n.innerText="Popover Title";const s=document.createElement("div");s.id="driver-popover-description",s.classList.add("driver-popover-description"),s.style.display="none",s.innerText="Popover description is here";const i=document.createElement("button");i.type="button",i.classList.add("driver-popover-close-btn"),i.setAttribute("aria-label","Close"),i.innerHTML="×";const u=document.createElement("footer");u.classList.add("driver-popover-footer");const b=document.createElement("span");b.classList.add("driver-popover-progress-text"),b.innerText="";const S=document.createElement("span");S.classList.add("driver-popover-navigation-btns");const c=document.createElement("button");c.type="button",c.classList.add("driver-popover-prev-btn"),c.innerHTML="← Previous";const w=document.createElement("button");return w.type="button",w.classList.add("driver-popover-next-btn"),w.innerHTML="Next →",S.appendChild(c),S.appendChild(w),u.appendChild(b),u.appendChild(S),o.appendChild(i),o.appendChild(r),o.appendChild(n),o.appendChild(s),o.appendChild(u),{wrapper:o,arrow:r,title:n,description:s,footer:u,previousButton:c,nextButton:w,closeButton:i,footerButtons:S,progress:b}}function Se(){var o;const r=d("popover");r&&((o=r.wrapper.parentElement)==null||o.removeChild(r.wrapper))}const Ee="";function Ce(o={}){P(o);function r(){e("allowClose")&&w()}function n(){const l=d("activeIndex"),h=e("steps")||[];if(typeof l>"u")return;const g=l+1;h[g]?c(g):w()}function s(){const l=d("activeIndex"),h=e("steps")||[];if(typeof l>"u")return;const g=l-1;h[g]?c(g):w()}function i(l){(e("steps")||[])[l]?c(l):w()}function u(){var l;if(d("__transitionCallback"))return;const h=d("activeIndex"),g=d("__activeStep"),C=d("__activeElement");if(typeof h>"u"||typeof g>"u"||typeof d("activeIndex")>"u")return;const k=((l=g.popover)==null?void 0:l.onPrevClick)||e("onPrevClick");if(k)return k(C,g,{config:e(),state:d()});s()}function b(){var l;if(d("__transitionCallback"))return;const h=d("activeIndex"),g=d("__activeStep"),C=d("__activeElement");if(typeof h>"u"||typeof g>"u")return;const k=((l=g.popover)==null?void 0:l.onNextClick)||e("onNextClick");if(k)return k(C,g,{config:e(),state:d()});n()}function S(){d("isInitialized")||(E("isInitialized",!0),document.body.classList.add("driver-active",e("animate")?"driver-fade":"driver-simple"),fe(),R("overlayClick",r),R("escapePress",r),R("arrowLeftPress",u),R("arrowRightPress",b))}function c(l=0){var h,g,C,k,x,f,D,B;const $=e("steps");if(!$){console.error("No steps to drive through"),w();return}if(!$[l]){w();return}E("__activeOnDestroyed",document.activeElement),E("activeIndex",l);const _=$[l],I=$[l+1],N=$[l-1],M=((h=_.popover)==null?void 0:h.doneBtnText)||e("doneBtnText")||"Done",W=e("allowClose"),U=typeof((g=_.popover)==null?void 0:g.showProgress)<"u"?(C=_.popover)==null?void 0:C.showProgress:e("showProgress"),j=(((k=_.popover)==null?void 0:k.progressText)||e("progressText")||"{{current}} of {{total}}").replace("{{current}}",`${l+1}`).replace("{{total}}",`${$.length}`),H=((x=_.popover)==null?void 0:x.showButtons)||e("showButtons"),V=["next","previous",...W?["close"]:[]].filter(ke=>!(H!=null&&H.length)||H.includes(ke)),q=((f=_.popover)==null?void 0:f.onNextClick)||e("onNextClick"),G=((D=_.popover)==null?void 0:D.onPrevClick)||e("onPrevClick"),xe=((B=_.popover)==null?void 0:B.onCloseClick)||e("onCloseClick");X({..._,popover:{showButtons:V,nextBtnText:I?void 0:M,disableButtons:[...N?[]:["previous"]],showProgress:U,progressText:j,onNextClick:q||(()=>{I?c(l+1):w()}),onPrevClick:G||(()=>{c(l-1)}),onCloseClick:xe||(()=>{w()}),..._?.popover||{}}})}function w(l=!0){const h=d("__activeElement"),g=d("__activeStep"),C=d("__activeOnDestroyed"),k=e("onDestroyStarted");if(l&&k){const D=!h||h?.id==="driver-dummy-element";k(D?void 0:h,g,{config:e(),state:d()});return}const x=g?.onDeselected||e("onDeselected"),f=e("onDestroyed");if(document.body.classList.remove("driver-active","driver-fade","driver-simple"),ye(),Se(),ge(),pe(),se(),K(),h&&g){const D=h.id==="driver-dummy-element";x&&x(D?void 0:h,g,{config:e(),state:d()}),f&&f(D?void 0:h,g,{config:e(),state:d()})}C&&C.focus()}return{isActive:()=>d("isInitialized")||!1,refresh:z,drive:(l=0)=>{S(),c(l)},setConfig:P,setSteps:l=>{K(),P({...e(),steps:l})},getConfig:e,getState:d,getActiveIndex:()=>d("activeIndex"),isFirstStep:()=>d("activeIndex")===0,isLastStep:()=>{const l=e("steps")||[],h=d("activeIndex");return h!==void 0&&h===l.length-1},getActiveStep:()=>d("activeStep"),getActiveElement:()=>d("activeElement"),getPreviousElement:()=>d("previousElement"),getPreviousStep:()=>d("previousStep"),moveNext:n,movePrevious:s,moveTo:i,hasNextStep:()=>{const l=e("steps")||[],h=d("activeIndex");return h!==void 0&&l[h+1]},hasPreviousStep:()=>{const l=e("steps")||[],h=d("activeIndex");return h!==void 0&&l[h-1]},highlight:l=>{S(),X({...l,popover:l.popover?{showButtons:[],showProgress:!1,progressText:"",...l.popover}:void 0})},destroy:()=>{w(!1)}}}return v.driver=Ce,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"}),v})({}),(function(v){"use strict";class T{constructor(){this.errors=[],this.maxErrors=50}logError(e,t,a={}){const p={timestamp:new Date().toISOString(),context:e,message:t instanceof Error?t.message:t,stack:t instanceof Error?t.stack:null,metadata:a};this.errors.push(p),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${e}:`,t,a)}recoverFromError(e,t){switch(this.classifyError(e)){case"ELEMENT_NOT_FOUND":return this.logError("Element Not Found",e,{currentStep:t}),{action:"SKIP_STEP",nextStep:t+1,message:"Target element not found, skipping to next step"};case"STORAGE_UNAVAILABLE":return this.logError("Storage Unavailable",e),{action:"USE_MEMORY_STORAGE",message:"Local storage unavailable, using in-memory storage"};case"DRIVER_NOT_LOADED":return this.logError("Driver.js Not Loaded",e),{action:"ABORT_TOUR",message:"Driver.js library not loaded, cannot start tour"};case"INVALID_TOOLTIP":return this.logError("Invalid Tooltip Configuration",e,{currentStep:t}),{action:"SKIP_STEP",nextStep:t+1,message:"Invalid tooltip configuration, skipping"};case"THEME_DETECTION_FAILED":return this.logError("Theme Detection Failed",e),{action:"USE_DEFAULT_THEME",message:"Using default dark theme"};default:return this.logError("Unknown Error",e,{currentStep:t}),{action:"ABORT_TOUR",message:"Unexpected error occurred, aborting tour"}}}classifyError(e){const t=e.message||e.toString();return t.includes("element")&&t.includes("not found")?"ELEMENT_NOT_FOUND":t.includes("storage")||t.includes("quota")?"STORAGE_UNAVAILABLE":t.includes("driver")||t.includes("undefined")?"DRIVER_NOT_LOADED":t.includes("invalid")||t.includes("validation")?"INVALID_TOOLTIP":t.includes("theme")?"THEME_DETECTION_FAILED":"UNKNOWN"}getErrors(){return[...this.errors]}clearErrors(){this.errors=[]}getStatistics(){const e={total:this.errors.length,byContext:{},byType:{},recent:this.errors.slice(-10)};return this.errors.forEach(t=>{e.byContext[t.context]=(e.byContext[t.context]||0)+1;const a=this.classifyError({message:t.message});e.byType[a]=(e.byType[a]||0)+1}),e}handleDriverLoadFailure(){this.logError("Driver.js Load Failure","Driver.js library failed to load");const e=document.createElement("div");return e.id="onboarding-fallback",e.style.cssText=`
position: fixed;
bottom: 20px;
right: 20px;
background: var(--card-base, #2a2a2a);
color: var(--fg, #ffffff);
padding: 15px 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
z-index: 9999;
max-width: 300px;
font-size: 14px;
`,e.innerHTML=`
Welcome to DashCaddy!
The interactive tour is unavailable, but you can explore the dashboard freely. Check the documentation for help getting started.
`,document.body.appendChild(e),setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},1e4),!0}handleStorageUnavailable(){this.logError("Storage Unavailable","Local storage is not available");const e={data:{},getItem(t){return this.data[t]||null},setItem(t,a){this.data[t]=a},removeItem(t){delete this.data[t]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),e}sendToErrorTracking(e){}}v.ErrorHandler=T,console.log("[ErrorHandler] Module loaded")})(window),(function(v){"use strict";class T{constructor(e="dashcaddy_onboarding"){this.storageKey=e,this.storageVersion="1.0",this.installOnboardingCompleted=typeof SITE<"u"&&SITE.onboardingCompleted===!0,this._initializeStorage(),this._updateLastVisit()}_initializeStorage(){const e=this._getStorage();if(!e||e.version!==this.storageVersion){const t={version:this.storageVersion,tourCompleted:!1,completedTooltips:[],currentStep:0,completionTimestamp:null,dnsSetupDeferred:!1,lastVisit:new Date().toISOString()};this._setStorage(t)}}_getStorage(){try{const e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):null}catch(e){return console.error("[ProgressTracker] Error reading from storage:",e),null}}_setStorage(e){try{localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(t){console.error("[ProgressTracker] Error writing to storage:",t),this._handleStorageError(t)}}_handleStorageError(e){try{sessionStorage.setItem(this.storageKey,JSON.stringify(this._getStorage())),console.warn("[ProgressTracker] Falling back to session storage")}catch(t){console.error("[ProgressTracker] Session storage also unavailable:",t)}}_updateLastVisit(){const e=this._getStorage();e&&(e.lastVisit=new Date().toISOString(),this._setStorage(e))}isTooltipCompleted(e){const t=this._getStorage();return t?t.completedTooltips.includes(e):!1}markTooltipCompleted(e){const t=this._getStorage();t&&(t.completedTooltips.includes(e)||(t.completedTooltips.push(e),t.tooltipTimestamps||(t.tooltipTimestamps={}),t.tooltipTimestamps[e]=new Date().toISOString(),this._setStorage(t)))}isTourCompleted(){const e=this._getStorage();return e?e.tourCompleted===!0:!1}isInstallOnboardingCompleted(){return this.installOnboardingCompleted===!0}async markInstallOnboardingCompleted(){if(!this.installOnboardingCompleted){this.installOnboardingCompleted=!0,typeof SITE<"u"&&(SITE.onboardingCompleted=!0);try{await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({onboardingCompleted:!0})})}catch(e){console.error("[ProgressTracker] Failed to persist install onboarding state:",e)}}}markTourCompleted(){const e=this._getStorage();e&&(e.tourCompleted=!0,e.completionTimestamp=new Date().toISOString(),this._setStorage(e))}getCurrentStep(){const e=this._getStorage();return e&&e.currentStep||0}setCurrentStep(e){const t=this._getStorage();t&&(t.currentStep=e,this._setStorage(t))}resetProgress(){const e={version:this.storageVersion,tourCompleted:!1,completedTooltips:[],currentStep:0,completionTimestamp:null,dnsSetupDeferred:!1,lastVisit:new Date().toISOString()};this._setStorage(e)}getCompletionTimestamp(){const e=this._getStorage();return!e||!e.completionTimestamp?null:new Date(e.completionTimestamp)}isDnsSetupDeferred(){const e=this._getStorage();return e?e.dnsSetupDeferred===!0:!1}markDnsSetupDeferred(){const e=this._getStorage();e&&(e.dnsSetupDeferred=!0,this._setStorage(e))}getTooltipTimestamp(e){const t=this._getStorage();return!t||!t.tooltipTimestamps||!t.tooltipTimestamps[e]?null:new Date(t.tooltipTimestamps[e])}getCompletedTooltips(){const e=this._getStorage();return e?e.completedTooltips||[]:[]}getLastVisit(){const e=this._getStorage();return!e||!e.lastVisit?null:new Date(e.lastVisit)}}v.ProgressTracker=T,console.log("[ProgressTracker] Module loaded")})(window),(function(v){"use strict";const T={dark:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(0, 0, 0, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},light:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent-strong)",overlayColor:"rgba(0, 0, 0, 0.5)",borderColor:"var(--border)",highlightColor:"var(--accent-strong)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},blue:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(25, 8, 172, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},nord:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(46, 52, 64, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},dracula:{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(40, 42, 54, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},"solarized-dark":{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(0, 43, 54, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"},"solarized-light":{backgroundColor:"var(--card-base)",textColor:"var(--fg)",primaryColor:"var(--accent)",overlayColor:"rgba(253, 246, 227, 0.7)",borderColor:"var(--border)",highlightColor:"var(--accent)",fontFamily:"'Sami Grotesk', 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"}};class P{constructor(){this.currentTheme=this.getCurrentTheme(),this.themeChangeCallbacks=[],this._setupThemeChangeListener()}getCurrentTheme(){const t=document.documentElement,a=Array.from(t.classList);return(v.THEMES||[]).filter(m=>m!=="dark").find(m=>a.includes(m))||"dark"}getDriverTheme(){const t=this.getCurrentTheme(),a=T[t]||T.dark,p={};for(const[y,m]of Object.entries(a))if(typeof m=="string"&&m.startsWith("var(")){const A=m.match(/var\((--[^)]+)\)/)?.[1];if(A){const L=getComputedStyle(document.documentElement).getPropertyValue(A).trim();p[y]=L||m}else p[y]=m}else p[y]=m;return p}onThemeChange(t){typeof t=="function"&&this.themeChangeCallbacks.push(t)}_setupThemeChangeListener(){const t=document.documentElement;new MutationObserver(p=>{p.forEach(y=>{if(y.type==="attributes"&&y.attributeName==="class"){const m=this.getCurrentTheme();if(m!==this.currentTheme){const A=this.currentTheme;this.currentTheme=m,this._notifyThemeChange(m,A)}}})}).observe(t,{attributes:!0,attributeFilter:["class"]}),console.log("[ThemeAdapter] Theme change listener initialized")}_notifyThemeChange(t,a){console.log(`[ThemeAdapter] Theme changed: ${a} \u2192 ${t}`),this.themeChangeCallbacks.forEach(p=>{try{p(t,a)}catch(y){console.error("[ThemeAdapter] Error in theme change callback:",y)}})}applyTheme(t){if(!t){console.warn("[ThemeAdapter] No driver instance provided");return}const a=this.getDriverTheme();this._injectDriverStyles(a),console.log("[ThemeAdapter] Theme applied to driver:",this.currentTheme)}_injectDriverStyles(t){const a=document.getElementById("driver-theme-styles");a&&a.remove();const p=document.createElement("style");p.id="driver-theme-styles",p.textContent=` .driver-popover { background: ${t.backgroundColor} !important; color: ${t.textColor} !important; border: 1px solid ${t.borderColor} !important; border-radius: 12px !important; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4) !important; font-family: ${t.fontFamily} !important; } .driver-popover-title { color: ${t.textColor} !important; font-weight: 600 !important; font-family: ${t.fontFamily} !important; } .driver-popover-description { color: ${t.textColor} !important; font-family: ${t.fontFamily} !important; } .driver-popover-footer button { background: ${t.primaryColor} !important; color: ${t.backgroundColor} !important; border: none !important; font-family: ${t.fontFamily} !important; font-weight: 500 !important; } .driver-popover-footer button:hover { opacity: 0.9 !important; } .driver-popover-close-btn { color: ${t.textColor} !important; } .driver-overlay { background: ${t.overlayColor} !important; } .driver-highlighted-element { outline: 2px solid ${t.highlightColor} !important; outline-offset: 4px !important; } .driver-popover-progress-text { color: ${t.textColor} !important; opacity: 0.7 !important; font-family: ${t.fontFamily} !important; } `,document.head.appendChild(p)}getAvailableThemes(){return Object.keys(T)}isThemeAvailable(t){return T.hasOwnProperty(t)}}v.ThemeAdapter=P,console.log("[ThemeAdapter] Module loaded")})(window),(function(v){"use strict";function T(a){const p=[];if((!a.id||typeof a.id!="string")&&p.push("Tooltip must have a valid string id"),a.element||p.push("Tooltip must have an element selector or HTMLElement"),!a.popover||typeof a.popover!="object")p.push("Tooltip must have a popover object");else{if((!a.popover.title||typeof a.popover.title!="string")&&p.push("Tooltip popover must have a valid string title"),(!a.popover.description||typeof a.popover.description!="string")&&p.push("Tooltip popover must have a valid string description"),a.popover.position){const m=["top","bottom","left","right","center"];m.includes(a.popover.position)||p.push(`Invalid position: ${a.popover.position}. Must be one of: ${m.join(", ")}`)}if(a.popover.align){const m=["start","center","end"];m.includes(a.popover.align)||p.push(`Invalid align: ${a.popover.align}. Must be one of: ${m.join(", ")}`)}a.popover.showButtons&&!Array.isArray(a.popover.showButtons)&&p.push("showButtons must be an array"),["onNext","onPrevious","onClose","onSetupNow","onLater"].forEach(m=>{a.popover[m]&&typeof a.popover[m]!="function"&&p.push(`${m} must be a function`)})}return a.condition&&typeof a.condition!="function"&&p.push("condition must be a function"),a.priority!==void 0&&typeof a.priority!="number"&&p.push("priority must be a number"),{valid:p.length===0,errors:p}}function P(a){if(!Array.isArray(a))return{valid:!1,errors:[{tooltip:null,errors:["tooltips must be an array"]}]};const p=[],y=new Set;return a.forEach((m,A)=>{const L=T(m);L.valid||p.push({tooltip:m.id||`index ${A}`,errors:L.errors}),m.id&&(y.has(m.id)&&p.push({tooltip:m.id,errors:[`Duplicate tooltip ID: ${m.id}`]}),y.add(m.id))}),{valid:p.length===0,errors:p}}class e extends Error{constructor(p,y=null){super(p),this.name="TooltipError",this.tooltipId=y}}function t(a){if(!a.valid){const p=a.errors.map(y=>`${y.tooltip}: ${y.errors.join(", ")}`).join(` `);throw console.error("[TooltipDefinitions] Validation errors:",p),new e(`Tooltip validation failed: ${p}`)}}v.TooltipValidation={validateTooltipDefinition:T,validateTooltipDefinitions:P,handleValidationErrors:t,TooltipError:e},console.log("[TooltipDefinitions] Validation module loaded")})(window);const TOOLTIP_DEFINITIONS=[{id:"welcome",element:"#brand",popover:{title:"Welcome to DashCaddy!",description:`Your unified control panel for Docker, Caddy, and DNS — all in one place.
This tour will walk you through every section so you know exactly where everything is.
You can click your logo anytime to customize it.
`,position:"bottom",align:"start",showButtons:["next"],showProgress:!0},priority:1},{id:"infrastructure",element:".top",popover:{title:"Infrastructure Overview",description:`This top row shows the backbone of your setup:
These core services are always pinned here, separate from your app grid.
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:2},{id:"service-cards",element:"#cards",popover:{title:"Your App Grid",description:`Every app you deploy appears here as a card. Each one shows:
Hover over a card to see action buttons: Logs, Restart, Update, Settings, and Open.
`,position:"top",showButtons:["previous","next"],showProgress:!0},priority:3},{id:"app-selector",element:"#add-service-btn",popover:{title:"App Selector — Deploy in One Click",description:`Browse 50+ self-hosted apps organized by category:
Each app deploys with Docker, Caddy reverse proxy, and DNS — fully configured automatically.
★ Premium: Recipes let you deploy entire stacks (e.g., full media server) in one click with pre-wired configs.
`,position:"top",showButtons:["previous","next"],showProgress:!0},priority:4,condition:()=>document.getElementById("add-service-btn")!==null},{id:"smart-arr",element:"#arr-setup-btn",popover:{title:"Smart Arr Connect",description:`Automatically wire up your entire media stack:
No manual API key copying — DashCaddy handles it all.
`,position:"top",showButtons:["previous","next"],showProgress:!0},priority:5,condition:()=>document.getElementById("arr-setup-btn")!==null},{id:"add-manual",element:"#add-service",popover:{title:"Add App Manually",description:`Already have a service running? Add it to your dashboard manually.
You can add:
Switch between 7 built-in themes:
Dark, Light, Blue, Nord, Dracula, Solarized Dark, and Solarized Light.
Your preference is saved automatically. You can also build custom themes with the Theme Builder (in Admin → settings).
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:7},{id:"toolbar-status",element:'.tools-section[data-section="status"]',popover:{title:"Status Tools",description:`Click Status to expand these tools:
These sections remember whether you left them open or closed.
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:8},{id:"toolbar-tools",element:'.tools-section[data-section="tools"]',popover:{title:"Operational Tools",description:`Click Tools for day-to-day operations:
Click Admin for setup and maintenance:
Shows current conditions for your location. Click the gear icon to configure your city or switch temperature units.
Uses Open-Meteo — no API key required.
`,position:"bottom",showButtons:["previous","next"],showProgress:!0},priority:11,condition:()=>document.getElementById("weather-widget")!==null},{id:"reload-caddy",element:"#reload-caddy-top",popover:{title:"Reload Caddy",description:`After changing Caddy configuration (adding reverse proxy rules, SSL settings, etc.), click here to apply the changes live.
This is a graceful reload — existing connections are not dropped.
`,position:"bottom",align:"end",showButtons:["previous","next"],showProgress:!0},priority:12,condition:()=>document.getElementById("reload-caddy-top")!==null},{id:"tour-complete",element:"#brand",popover:{title:"You're All Set!",description:`That covers the essentials. A few tips to get the most out of DashCaddy:
? anytime to see them all★ Unlock Premium
Premium adds powerful features for serious homelabbers:
Activate in Admin → License
You can restart this tour anytime from Admin → Help Tour.
`,position:"bottom",align:"start",showButtons:["previous","close"],showProgress:!0},priority:13}];function getTooltipDefinitions(){return TOOLTIP_DEFINITIONS}function getTooltipById(v){return TOOLTIP_DEFINITIONS.find(T=>T.id===v)||null}function getActiveTooltips(){return TOOLTIP_DEFINITIONS.filter(v=>{if(v.condition&&typeof v.condition=="function")try{return v.condition()}catch(T){return console.error(`[TooltipDefinitions] Error evaluating condition for ${v.id}:`,T),!1}return!0})}function getSortedTooltips(){return getActiveTooltips().sort((T,P)=>{const e=T.priority||999,t=P.priority||999;return e-t})}function getNewFeatureTooltips(){return getActiveTooltips().filter(T=>T.isNewFeature===!0).sort((T,P)=>{const e=T.priority||999,t=P.priority||999;return e-t})}window.TooltipDefinitions={TOOLTIP_DEFINITIONS,getTooltipDefinitions,getTooltipById,getActiveTooltips,getSortedTooltips,getNewFeatureTooltips},console.log("[TooltipDefinitions] Definitions loaded:",TOOLTIP_DEFINITIONS.length,"tooltips"),(function(v){"use strict";class T{constructor(e){this.progressTracker=e,this.modal=null,this.onTemplateSelected=null,console.log("[DnsTemplateSelector] Module loaded")}getDnsTemplates(){return[{id:"technitium",name:"Technitium DNS Server",description:"Modern DNS server with web UI for managing private zones",icon:"\u{1F310}",difficulty:"Easy",features:["Web-based management interface","Private zone management for .sami domain","DHCP server integration","DNS-over-HTTPS and DNS-over-TLS support"],recommended:!0},{id:"bind9",name:"BIND9 DNS Server",description:"Industry-standard DNS server - powerful and flexible",icon:"\u{1F527}",difficulty:"Advanced",features:["Industry standard DNS server","Full RFC compliance","Advanced zone management","DNSSEC support"],recommended:!1},{id:"pihole",name:"Pi-hole",description:"Network-wide ad blocker with DNS capabilities",icon:"\u{1F6E1}\uFE0F",difficulty:"Intermediate",features:["Ad blocking at DNS level","Web interface for management","DHCP server included","Query logging and statistics"],recommended:!1},{id:"powerdns",name:"PowerDNS",description:"High-performance DNS server with SQL backend",icon:"\u26A1",difficulty:"Intermediate",features:["SQL database backend","RESTful API for automation","Geographic load balancing","DNSSEC support"],recommended:!1},{id:"coredns",name:"CoreDNS",description:"Cloud-native DNS server - lightweight and flexible",icon:"\u2601\uFE0F",difficulty:"Intermediate",features:["Plugin-based architecture","Kubernetes-native","Lightweight and fast","Prometheus metrics"],recommended:!1}]}showTemplateSelector(){this.modal||this.createModal(),this.populateTemplates(),this.modal.style.display="flex",document.body.style.overflow="hidden"}createModal(){const e=document.createElement("div");e.id="dns-template-modal",e.className="dns-template-modal",e.innerHTML=` `,document.body.appendChild(e),this.modal=e,e.querySelector(".dns-template-close").addEventListener("click",()=>this.close()),e.querySelector("#dns-setup-later").addEventListener("click",()=>this.handleSetupLater()),e.addEventListener("click",t=>{t.target===e&&this.close()}),document.addEventListener("keydown",t=>{t.key==="Escape"&&e.style.display==="flex"&&this.close()})}populateTemplates(){const e=document.getElementById("dns-template-grid");if(!e)return;const t=this.getDnsTemplates();e.innerHTML="",t.forEach(a=>{const p=this.createTemplateCard(a);e.appendChild(p)})}createTemplateCard(e){const t=document.createElement("div");t.className="dns-template-card",e.recommended&&t.classList.add("recommended");const a=e.difficulty.toLowerCase();return t.innerHTML=` ${e.recommended?'${e.description}