dev3000 0.0.83 → 0.0.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +37 -192
- package/dist/dev-environment.js.map +1 -1
- package/dist/src/tui-interface-impl.tsx +1 -1
- package/dist/tui-interface-impl.js +1 -1
- package/dist/tui-interface-impl.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/app-path-routes-manifest.json +1 -0
- package/mcp-server/.next/build-manifest.json +5 -6
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/next-server.js.nft.json +1 -1
- package/mcp-server/.next/prerender-manifest.json +3 -3
- package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +3 -4
- package/mcp-server/.next/server/app/_global-error/page.js +1 -1
- package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +3 -4
- package/mcp-server/.next/server/app/_not-found/page.js +1 -1
- package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +2 -2
- package/mcp-server/.next/server/app/api/jank/[session]/route.js +1 -1
- package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/rotate/route.js +1 -1
- package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/orchestrator/route/app-paths-manifest.json +3 -0
- package/mcp-server/.next/server/app/api/orchestrator/route/build-manifest.json +11 -0
- package/mcp-server/.next/server/app/api/orchestrator/route/server-reference-manifest.json +4 -0
- package/mcp-server/.next/server/app/api/orchestrator/route.js +8 -0
- package/mcp-server/.next/server/app/api/orchestrator/route.js.map +5 -0
- package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +1 -0
- package/mcp-server/.next/server/app/api/orchestrator/route_client-reference-manifest.js +2 -0
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +1 -1
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/screenshots/list/route.js +1 -1
- package/mcp-server/.next/server/app/api/screenshots/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +3 -3
- package/mcp-server/.next/server/app/logs/page/build-manifest.json +3 -4
- package/mcp-server/.next/server/app/logs/page.js +1 -1
- package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/mcp/route.js +4 -3
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page/build-manifest.json +3 -4
- package/mcp-server/.next/server/app/page.js +1 -1
- package/mcp-server/.next/server/app/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page/build-manifest.json +3 -4
- package/mcp-server/.next/server/app/video/[session]/page.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app-paths-manifest.json +1 -0
- package/mcp-server/.next/server/chunks/[externals]_node:crypto_c20cce38._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__05e38acd._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__05e38acd._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__6ee9a99f._.js → [root-of-the-server]__3130ceec._.js} +2 -2
- package/mcp-server/.next/server/chunks/[root-of-the-server]__4637d3dd._.js +3 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__bc773251._.js → [root-of-the-server]__5114419d._.js} +2 -2
- package/mcp-server/.next/server/chunks/[root-of-the-server]__5248c9ff._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__5248c9ff._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__94037b23._.js +7 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__94037b23._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__55c04517._.js → [root-of-the-server]__a004a307._.js} +2 -2
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js +91 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__cc74dbef._.js +7 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__cc74dbef._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__dc0b0022._.js +17 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__dc0b0022._.js.map +1 -0
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_orchestrator_route_actions_c6fba9ec.js +3 -0
- package/mcp-server/.next/server/chunks/mcp-server__next-internal_server_app_api_orchestrator_route_actions_c6fba9ec.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__61c905ce._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bf771f7e._.js.map → [root-of-the-server]__61c905ce._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8863b0f6._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8863b0f6._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9bc632fa._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__c4e78a20._.js.map → [root-of-the-server]__9bc632fa._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__a4bb31a6._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__a4bb31a6._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__cf17e26a._.js → [root-of-the-server]__aed64cd3._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__aed64cd3._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__cf030fda._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__cf030fda._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{_96ba1d8e._.js → _74bf5366._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/_74bf5366._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_3d10aa72._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_3d10aa72._.js.map +1 -0
- package/mcp-server/.next/server/middleware-build-manifest.js +3 -4
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/.next/static/chunks/{55cedb1a993e951c.js → 1d2676338b51bbcf.js} +1 -1
- package/mcp-server/.next/static/chunks/312a4c1c7f6436ef.js +1 -0
- package/mcp-server/.next/static/chunks/8364b81221aabb64.js +1 -0
- package/mcp-server/.next/static/chunks/a42830291751fe48.js +1 -0
- package/mcp-server/.next/static/chunks/bb2e6ac36794beea.css +1 -0
- package/mcp-server/.next/static/chunks/c578923146856601.js +1 -0
- package/mcp-server/.next/static/chunks/turbopack-22a9e2c19fd12b04.js +3 -0
- package/mcp-server/app/api/orchestrator/route.ts +73 -0
- package/mcp-server/app/globals.css +0 -1
- package/mcp-server/app/logs/LogsClient.infinite-loop.test.tsx +1 -1
- package/mcp-server/app/mcp/client-manager.ts +281 -0
- package/mcp-server/app/mcp/route.ts +166 -0
- package/mcp-server/app/mcp/tools.ts +71 -18
- package/mcp-server/app/page.tsx +79 -65
- package/mcp-server/package.json +7 -9
- package/package.json +3 -8
- package/src/tui-interface-impl.tsx +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__00592d3f._.js +0 -91
- package/mcp-server/.next/server/chunks/[root-of-the-server]__00592d3f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__177c72c6._.js +0 -17
- package/mcp-server/.next/server/chunks/[root-of-the-server]__177c72c6._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__2942c072._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e6dcd8bf._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__22d96eb1._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__22d96eb1._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__63dd19ce._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__63dd19ce._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__94d8e211._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__94d8e211._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bf771f7e._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__c4e78a20._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__cf17e26a._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_28084f73._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/_28084f73._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_96ba1d8e._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_aa32a659._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/_aa32a659._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_b2368b47._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_b2368b47._.js.map +0 -1
- package/mcp-server/.next/static/chunks/0cf268b98f36b0b5.css +0 -1
- package/mcp-server/.next/static/chunks/571fbcba7786c174.js +0 -1
- package/mcp-server/.next/static/chunks/5fdb882fe407a798.js +0 -1
- package/mcp-server/.next/static/chunks/98e04adc8a00688a.js +0 -1
- package/mcp-server/.next/static/chunks/db42008ac1e97815.js +0 -1
- package/mcp-server/.next/static/chunks/dbbdc51e76f4cea4.js +0 -1
- package/mcp-server/.next/static/chunks/turbopack-7112e6b6aee1d84f.js +0 -3
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__2942c072._.js.map → [externals]_node:crypto_c20cce38._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__6ee9a99f._.js.map → [root-of-the-server]__3130ceec._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__e6dcd8bf._.js.map → [root-of-the-server]__4637d3dd._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__bc773251._.js.map → [root-of-the-server]__5114419d._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__55c04517._.js.map → [root-of-the-server]__a004a307._.js.map} +0 -0
- /package/mcp-server/.next/static/{jEIKNmPAC0p1vOw5j9cTy → 5ZNPgBUtuG6HhHaBXqChL}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{jEIKNmPAC0p1vOw5j9cTy → 5ZNPgBUtuG6HhHaBXqChL}/_clientMiddlewareManifest.json +0 -0
- /package/mcp-server/.next/static/{jEIKNmPAC0p1vOw5j9cTy → 5ZNPgBUtuG6HhHaBXqChL}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95299,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},57157,(e,t,r)=>{"use strict";var n=e.r(72938).__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;r.c=function(e){return n.H.useMemoCache(e)}},62772,(e,t,r)=>{"use strict";t.exports=e.r(57157)},33323,(e,t,r)=>{"use strict";function n(e){let{widthInt:t,heightInt:r,blurWidth:n,blurHeight:i,blurDataURL:o,objectFit:l}=e,u=n?40*n:t,a=i?40*i:r,s=u&&a?"viewBox='0 0 "+u+" "+a+"'":"";return"%3Csvg xmlns='http://www.w3.org/2000/svg' "+s+"%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='"+(s?"none":"contain"===l?"xMidYMid":"cover"===l?"xMidYMid slice":"none")+"' style='filter: url(%23b);' href='"+o+"'/%3E%3C/svg%3E"}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"getImageBlurSvg",{enumerable:!0,get:function(){return n}})},95827,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),!function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(r,{VALID_LOADERS:function(){return n},imageConfigDefault:function(){return i}});let n=["default","imgix","cloudinary","akamai","custom"],i={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1}},76154,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"getImgProps",{enumerable:!0,get:function(){return a}}),e.r(95299);let n=e.r(33323),i=e.r(95827),o=["-moz-initial","fill","none","scale-down",void 0];function l(e){return void 0!==e.default}function u(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function a(e,t){var r,a;let s,d,c,{src:f,sizes:p,unoptimized:g=!1,priority:m=!1,preload:h=!1,loading:b,className:_,quality:y,width:v,height:j,fill:O=!1,style:w,overrideSrc:P,onLoad:C,onLoadingComplete:S,placeholder:x="empty",blurDataURL:E,fetchPriority:R,decoding:M="async",layout:z,objectFit:I,objectPosition:A,lazyBoundary:T,lazyRoot:D,...N}=e,{imgConf:k,showAltText:U,blurComplete:L,defaultLoader:F}=t,q=k||i.imageConfigDefault;if("allSizes"in q)s=q;else{let e=[...q.deviceSizes,...q.imageSizes].sort((e,t)=>e-t),t=q.deviceSizes.sort((e,t)=>e-t),n=null==(r=q.qualities)?void 0:r.sort((e,t)=>e-t);s={...q,allSizes:e,deviceSizes:t,qualities:n}}if(void 0===F)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let B=N.loader||F;delete N.loader,delete N.srcSet;let G="__next_img_default"in B;if(G){if("custom"===s.loader)throw Object.defineProperty(Error('Image with src "'+f+'" is missing "loader" prop.\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader'),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=B;B=t=>{let{config:r,...n}=t;return e(n)}}if(z){"fill"===z&&(O=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[z];e&&(w={...w,...e});let t={responsive:"100vw",fill:"100vw"}[z];t&&!p&&(p=t)}let W="",H=u(v),V=u(j);if((a=f)&&"object"==typeof a&&(l(a)||void 0!==a.src)){let e=l(f)?f.default:f;if(!e.src)throw Object.defineProperty(Error("An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received "+JSON.stringify(e)),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!e.height||!e.width)throw Object.defineProperty(Error("An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received "+JSON.stringify(e)),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(d=e.blurWidth,c=e.blurHeight,E=E||e.blurDataURL,W=e.src,!O)if(H||V){if(H&&!V){let t=H/e.width;V=Math.round(e.height*t)}else if(!H&&V){let t=V/e.height;H=Math.round(e.width*t)}}else H=e.width,V=e.height}let X=!m&&!h&&("lazy"===b||void 0===b);(!(f="string"==typeof f?f:W)||f.startsWith("data:")||f.startsWith("blob:"))&&(g=!0,X=!1),s.unoptimized&&(g=!0),G&&!s.dangerouslyAllowSVG&&f.split("?",1)[0].endsWith(".svg")&&(g=!0);let Y=u(y),$=Object.assign(O?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:I,objectPosition:A}:{},U?{}:{color:"transparent"},w),J=L||"empty"===x?null:"blur"===x?'url("data:image/svg+xml;charset=utf-8,'+(0,n.getImageBlurSvg)({widthInt:H,heightInt:V,blurWidth:d,blurHeight:c,blurDataURL:E||"",objectFit:$.objectFit})+'")':'url("'+x+'")',K=o.includes($.objectFit)?"fill"===$.objectFit?"100% 100%":"cover":$.objectFit,Q=J?{backgroundSize:K,backgroundPosition:$.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:J}:{},Z=function(e){let{config:t,src:r,unoptimized:n,width:i,quality:o,sizes:l,loader:u}=e;if(n)return{src:r,srcSet:void 0,sizes:void 0};let{widths:a,kind:s}=function(e,t,r){let{deviceSizes:n,allSizes:i}=e;if(r){let e=/(^|\s)(1?\d?\d)vw/g,t=[];for(let n;n=e.exec(r);)t.push(parseInt(n[2]));if(t.length){let e=.01*Math.min(...t);return{widths:i.filter(t=>t>=n[0]*e),kind:"w"}}return{widths:i,kind:"w"}}return"number"!=typeof t?{widths:n,kind:"w"}:{widths:[...new Set([t,2*t].map(e=>i.find(t=>t>=e)||i[i.length-1]))],kind:"x"}}(t,i,l),d=a.length-1;return{sizes:l||"w"!==s?l:"100vw",srcSet:a.map((e,n)=>u({config:t,src:r,quality:o,width:e})+" "+("w"===s?e:n+1)+s).join(", "),src:u({config:t,src:r,quality:o,width:a[d]})}}({config:s,src:f,unoptimized:g,width:H,quality:Y,sizes:p,loader:B}),ee=X?"lazy":b;return{props:{...N,loading:ee,fetchPriority:R,width:H,height:V,decoding:M,className:_,style:{...$,...Q},sizes:Z.sizes,srcSet:Z.srcSet,src:P||Z.src},meta:{unoptimized:g,preload:h||m,placeholder:x,fill:O}}}},33360,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return u}});let n=e.r(72938),i="undefined"==typeof window,o=i?()=>{}:n.useLayoutEffect,l=i?()=>{}:n.useEffect;function u(e){let{headManager:t,reduceComponentsToState:r}=e;function u(){if(t&&t.mountedInstances){let i=n.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(r(i,e))}}if(i){var a;null==t||null==(a=t.mountedInstances)||a.add(e.children),u()}return o(()=>{var r;return null==t||null==(r=t.mountedInstances)||r.add(e.children),()=>{var r;null==t||null==(r=t.mountedInstances)||r.delete(e.children)}}),o(()=>(t&&(t._pendingUpdate=u),()=>{t&&(t._pendingUpdate=u)})),l(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},85487,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"AmpStateContext",{enumerable:!0,get:function(){return n}});let n=e.r(81258)._(e.r(72938)).default.createContext({})},57883,(e,t,r)=>{"use strict";function n(e){let{ampFirst:t=!1,hybrid:r=!1,hasQuery:n=!1}=void 0===e?{}:e;return t||r&&n}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isInAmpMode",{enumerable:!0,get:function(){return n}})},89454,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),!function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(r,{default:function(){return m},defaultHead:function(){return c}});let n=e.r(81258),i=e.r(44066),o=e.r(54610),l=i._(e.r(72938)),u=n._(e.r(33360)),a=e.r(85487),s=e.r(30741),d=e.r(57883);function c(e){void 0===e&&(e=!1);let t=[(0,o.jsx)("meta",{charSet:"utf-8"},"charset")];return e||t.push((0,o.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")),t}function f(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===l.default.Fragment?e.concat(l.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(95299);let p=["name","httpEquiv","charSet","itemProp"];function g(e,t){let{inAmpMode:r}=t;return e.reduce(f,[]).reverse().concat(c(r).reverse()).filter(function(){let e=new Set,t=new Set,r=new Set,n={};return i=>{let o=!0,l=!1;if(i.key&&"number"!=typeof i.key&&i.key.indexOf("$")>0){l=!0;let t=i.key.slice(i.key.indexOf("$")+1);e.has(t)?o=!1:e.add(t)}switch(i.type){case"title":case"base":t.has(i.type)?o=!1:t.add(i.type);break;case"meta":for(let e=0,t=p.length;e<t;e++){let t=p[e];if(i.props.hasOwnProperty(t))if("charSet"===t)r.has(t)?o=!1:r.add(t);else{let e=i.props[t],r=n[t]||new Set;("name"!==t||!l)&&r.has(e)?o=!1:(r.add(e),n[t]=r)}}}return o}}()).reverse().map((e,t)=>{let r=e.key||t;return l.default.cloneElement(e,{key:r})})}let m=function(e){let{children:t}=e,r=(0,l.useContext)(a.AmpStateContext),n=(0,l.useContext)(s.HeadManagerContext);return(0,o.jsx)(u.default,{reduceComponentsToState:g,headManager:n,inAmpMode:(0,d.isInAmpMode)(r),children:t})};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},64721,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ImageConfigContext",{enumerable:!0,get:function(){return o}});let n=e.r(81258)._(e.r(72938)),i=e.r(95827),o=n.default.createContext(i.imageConfigDefault)},8946,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"RouterContext",{enumerable:!0,get:function(){return n}});let n=e.r(81258)._(e.r(72938)).default.createContext(null)},24440,(e,t,r)=>{"use strict";function n(e,t){var r;let n=e||75;return(null==t||null==(r=t.qualities)?void 0:r.length)?t.qualities.reduce((e,t)=>Math.abs(t-n)<Math.abs(e-n)?t:e,0):n}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"findClosestQuality",{enumerable:!0,get:function(){return n}})},20237,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let n=e.r(24440);function i(e){let{config:t,src:r,width:i,quality:o}=e,l=(0,n.findClosestQuality)(o,t);return t.path+"?url="+encodeURIComponent(r)+"&w="+i+"&q="+l+(r.startsWith("/_next/static/media/"),"")}i.__next_img_default=!0;let o=i},33830,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return i}});let n=e.r(72938);function i(e,t){let r=(0,n.useRef)(null),i=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=i.current;t&&(i.current=null,t())}else e&&(r.current=o(e,n)),t&&(i.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77708,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"Image",{enumerable:!0,get:function(){return v}});let n=e.r(81258),i=e.r(44066),o=e.r(54610),l=i._(e.r(72938)),u=n._(e.r(457)),a=n._(e.r(89454)),s=e.r(76154),d=e.r(95827),c=e.r(64721);e.r(95299);let f=e.r(8946),p=n._(e.r(20237)),g=e.r(33830),m={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0};function h(e,t,r,n,i,o,l){let u=null==e?void 0:e.src;e&&e["data-loaded-src"]!==u&&(e["data-loaded-src"]=u,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&i(!0),null==r?void 0:r.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let n=!1,i=!1;r.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>n,isPropagationStopped:()=>i,persist:()=>{},preventDefault:()=>{n=!0,t.preventDefault()},stopPropagation:()=>{i=!0,t.stopPropagation()}})}(null==n?void 0:n.current)&&n.current(e)}}))}function b(e){return l.use?{fetchPriority:e}:{fetchpriority:e}}"undefined"==typeof window&&(globalThis.__NEXT_IMAGE_IMPORTED=!0);let _=(0,l.forwardRef)((e,t)=>{let{src:r,srcSet:n,sizes:i,height:u,width:a,decoding:s,className:d,style:c,fetchPriority:f,placeholder:p,loading:m,unoptimized:_,fill:y,onLoadRef:v,onLoadingCompleteRef:j,setBlurComplete:O,setShowAltText:w,sizesInput:P,onLoad:C,onError:S,...x}=e,E=(0,l.useCallback)(e=>{e&&(S&&(e.src=e.src),e.complete&&h(e,p,v,j,O,_,P))},[r,p,v,j,O,S,_,P]),R=(0,g.useMergedRef)(t,E);return(0,o.jsx)("img",{...x,...b(f),loading:m,width:a,height:u,decoding:s,"data-nimg":y?"fill":"1",className:d,style:c,sizes:i,srcSet:n,src:r,ref:R,onLoad:e=>{h(e.currentTarget,p,v,j,O,_,P)},onError:e=>{w(!0),"empty"!==p&&O(!0),S&&S(e)}})});function y(e){let{isAppRouter:t,imgAttributes:r}=e,n={as:"image",imageSrcSet:r.srcSet,imageSizes:r.sizes,crossOrigin:r.crossOrigin,referrerPolicy:r.referrerPolicy,...b(r.fetchPriority)};return t&&u.default.preload?(u.default.preload(r.src,n),null):(0,o.jsx)(a.default,{children:(0,o.jsx)("link",{rel:"preload",href:r.srcSet?void 0:r.src,...n},"__nimg-"+r.src+r.srcSet+r.sizes)})}let v=(0,l.forwardRef)((e,t)=>{let r=(0,l.useContext)(f.RouterContext),n=(0,l.useContext)(c.ImageConfigContext),i=(0,l.useMemo)(()=>{var e;let t=m||n||d.imageConfigDefault,r=[...t.deviceSizes,...t.imageSizes].sort((e,t)=>e-t),i=t.deviceSizes.sort((e,t)=>e-t),o=null==(e=t.qualities)?void 0:e.sort((e,t)=>e-t);return{...t,allSizes:r,deviceSizes:i,qualities:o}},[n]),{onLoad:u,onLoadingComplete:a}=e,g=(0,l.useRef)(u);(0,l.useEffect)(()=>{g.current=u},[u]);let h=(0,l.useRef)(a);(0,l.useEffect)(()=>{h.current=a},[a]);let[b,v]=(0,l.useState)(!1),[j,O]=(0,l.useState)(!1),{props:w,meta:P}=(0,s.getImgProps)(e,{defaultLoader:p.default,imgConf:i,blurComplete:b,showAltText:j});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(_,{...w,unoptimized:P.unoptimized,placeholder:P.placeholder,fill:P.fill,onLoadRef:g,onLoadingCompleteRef:h,setBlurComplete:v,setShowAltText:O,sizesInput:e.sizes,ref:t}),P.preload?(0,o.jsx)(y,{isAppRouter:!r,imgAttributes:w}):null]})});("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},46568,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),!function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(r,{default:function(){return a},getImageProps:function(){return u}});let n=e.r(81258),i=e.r(76154),o=e.r(77708),l=n._(e.r(20237));function u(e){let{props:t}=(0,i.getImgProps)(e,{defaultLoader:l.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,r]of Object.entries(t))void 0===r&&delete t[e];return{props:t}}let a=o.Image},91075,(e,t,r)=>{t.exports=e.r(46568)}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:transparent;--tw-gradient-via:transparent;--tw-gradient-to:transparent;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:transparent;--tw-gradient-via:transparent;--tw-gradient-to:transparent;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-200:#ffcaca;--color-red-500:#fb2c36;--color-red-600:#e40014;--color-red-800:#9f0712;--color-orange-500:#fe6e00;--color-orange-600:#f05100;--color-yellow-200:#fff085;--color-yellow-800:#874b00;--color-green-100:#dcfce7;--color-green-200:#b9f8cf;--color-green-400:#05df72;--color-green-500:#00c758;--color-green-600:#00a544;--color-green-700:#008138;--color-green-800:#016630;--color-blue-100:#dbeafe;--color-blue-200:#bedbff;--color-blue-300:#90c5ff;--color-blue-400:#54a2ff;--color-blue-500:#3080ff;--color-blue-600:#155dfc;--color-blue-700:#1447e6;--color-blue-800:#193cb8;--color-blue-900:#1c398e;--color-purple-100:#f3e8ff;--color-purple-200:#e9d5ff;--color-purple-300:#d9b3ff;--color-purple-600:#9810fa;--color-purple-700:#8200da;--color-purple-800:#6e11b0;--color-gray-50:#f9fafb;--color-gray-100:#f3f4f6;--color-gray-200:#e5e7eb;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-gray-700:#364153;--color-gray-800:#1e2939;--color-gray-900:#101828;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color:color(display-p3 0 0 0)){:root,:host{--color-red-200:color(display-p3 .969562 .798149 .794299);--color-red-500:color(display-p3 .903738 .262579 .253307);--color-red-600:color(display-p3 .830323 .140383 .133196);--color-red-800:color(display-p3 .569606 .121069 .108493);--color-orange-500:color(display-p3 .946589 .449788 .0757345);--color-orange-600:color(display-p3 .887467 .341665 .0219962);--color-yellow-200:color(display-p3 .988789 .943116 .579188);--color-yellow-800:color(display-p3 .503181 .30478 .075537);--color-green-100:color(display-p3 .885269 .984329 .910368);--color-green-200:color(display-p3 .776442 .964383 .823412);--color-green-400:color(display-p3 .399536 .862346 .49324);--color-green-500:color(display-p3 .308734 .774754 .374307);--color-green-600:color(display-p3 .243882 .640824 .294808);--color-green-700:color(display-p3 .198355 .501799 .245335);--color-green-800:color(display-p3 .168568 .395123 .211217);--color-blue-100:color(display-p3 .869214 .915931 .989622);--color-blue-200:color(display-p3 .76688 .855207 .987483);--color-blue-300:color(display-p3 .602559 .767214 .993938);--color-blue-400:color(display-p3 .397443 .62813 .992116);--color-blue-500:color(display-p3 .266422 .491219 .988624);--color-blue-600:color(display-p3 .174493 .358974 .950247);--color-blue-700:color(display-p3 .1379 .274983 .867624);--color-blue-800:color(display-p3 .134023 .230646 .695537);--color-blue-900:color(display-p3 .136395 .219428 .537145);--color-purple-100:color(display-p3 .945034 .910569 .992972);--color-purple-200:color(display-p3 .901181 .835978 .992237);--color-purple-300:color(display-p3 .829394 .703737 .996084);--color-purple-600:color(display-p3 .546729 .130167 .94439);--color-purple-700:color(display-p3 .465298 .0652579 .824397);--color-purple-800:color(display-p3 .393513 .10339 .664476);--color-gray-50:color(display-p3 .977213 .98084 .985102);--color-gray-100:color(display-p3 .953567 .956796 .964321);--color-gray-200:color(display-p3 .899787 .906171 .92106);--color-gray-400:color(display-p3 .605734 .630385 .680158);--color-gray-500:color(display-p3 .421287 .446085 .504784);--color-gray-600:color(display-p3 .297358 .332176 .39043);--color-gray-700:color(display-p3 .219968 .253721 .318679);--color-gray-800:color(display-p3 .125854 .159497 .216835);--color-gray-900:color(display-p3 .070423 .0928982 .151928)}}@supports (color:lab(0% 0 0)){:root,:host{--color-red-200:lab(86.017% 19.8815 7.75869);--color-red-500:lab(55.4814% 75.0732 48.8528);--color-red-600:lab(48.4493% 77.4328 61.5452);--color-red-800:lab(33.7174% 55.8993 41.0293);--color-orange-500:lab(64.272% 57.1788 90.3583);--color-orange-600:lab(57.1026% 64.2584 89.8886);--color-yellow-200:lab(94.3433% -5.00429 52.9663);--color-yellow-800:lab(38.7484% 23.5833 51.4916);--color-green-100:lab(96.1861% -13.8464 6.52365);--color-green-200:lab(92.4222% -26.4702 12.9427);--color-green-400:lab(78.503% -64.9265 39.7492);--color-green-500:lab(70.5521% -66.5147 45.8073);--color-green-600:lab(59.0978% -58.6621 41.2579);--color-green-700:lab(47.0329% -47.0239 31.4788);--color-green-800:lab(37.4616% -36.7971 22.9692);--color-blue-100:lab(92.0301% -2.24757 -11.6453);--color-blue-200:lab(86.15% -4.04379 -21.0797);--color-blue-300:lab(77.5052% -6.4629 -36.42);--color-blue-400:lab(65.0361% -1.42065 -56.9802);--color-blue-500:lab(54.1736% 13.3369 -74.6839);--color-blue-600:lab(44.0605% 29.0279 -86.0352);--color-blue-700:lab(36.9089% 35.0961 -85.6872);--color-blue-800:lab(30.2514% 27.7853 -70.2699);--color-blue-900:lab(26.1542% 15.7545 -51.5504);--color-purple-100:lab(93.3333% 6.97437 -9.83434);--color-purple-200:lab(87.8405% 13.4282 -18.7159);--color-purple-300:lab(78.3298% 26.2195 -34.9499);--color-purple-600:lab(43.0295% 75.21 -86.5669);--color-purple-700:lab(36.1758% 69.8525 -80.0381);--color-purple-800:lab(30.6017% 56.7637 -64.4751);--color-gray-50:lab(98.2596% -.247031 -.706708);--color-gray-100:lab(96.1596% -.0823438 -1.13575);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425);--color-gray-700:lab(27.1134% -.956401 -12.3224);--color-gray-800:lab(16.1051% -1.18239 -11.7533);--color-gray-900:lab(8.11897% .811279 -12.254)}}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:-moz-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){padding-left:20px}:where(select:-moz-any([multiple],[size])) optgroup option:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){padding-left:20px}:where(select:is([multiple],[size])) optgroup option:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){padding-left:20px}:where(select:-webkit-any([multiple],[size])) optgroup option:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:20px}:where(select:-moz-any([multiple],[size])) optgroup option:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:20px}:where(select:is([multiple],[size])) optgroup option:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:20px}:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::-webkit-file-upload-button{margin-right:4px}:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::file-selector-button{margin-right:4px}:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::file-selector-button{margin-right:4px}:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::-webkit-file-upload-button{margin-left:4px}:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::file-selector-button{margin-left:4px}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::file-selector-button{margin-left:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;-moz-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.-top-6{top:calc(var(--spacing)*-6)}.top-0{top:calc(var(--spacing)*0)}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.mx-auto{margin-left:auto;margin-right:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-20{margin-top:calc(var(--spacing)*20)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-60{max-height:calc(var(--spacing)*60)}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-32{width:calc(var(--spacing)*32)}.w-80{width:calc(var(--spacing)*80)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7xl{max-width:var(--container-7xl)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-80{min-width:calc(var(--spacing)*80)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-\[auto_auto_1fr\]{grid-template-columns:auto auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-accent\/20{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/20{border-color:color-mix(in oklab,var(--accent)20%,transparent)}}.border-blue-200{border-color:var(--color-blue-200)}.border-border{border-color:var(--border)}.border-current{border-color:currentColor}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-green-200{border-color:var(--color-green-200)}.border-input{border-color:var(--input)}.border-primary{border-color:var(--primary)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-300{border-color:var(--color-purple-300)}.border-red-200{border-color:var(--color-red-200)}.border-red-500{border-color:var(--color-red-500)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-purple-600{border-top-color:var(--color-purple-600)}.border-t-transparent{border-top-color:transparent}.bg-accent\/10{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab,var(--accent)10%,transparent)}}.bg-accent\/20{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/20{background-color:color-mix(in oklab,var(--accent)20%,transparent)}}.bg-background,.bg-background\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/50{background-color:color-mix(in oklab,var(--background)50%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-800{background-color:var(--color-blue-800)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-foreground{background-color:var(--foreground)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/20{background-color:rgba(0,199,88,.2)}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-800{background-color:var(--color-green-800)}.bg-muted,.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted)30%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted)50%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--primary)10%,transparent)}}.bg-primary\/20{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab,var(--primary)20%,transparent)}}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-secondary{background-color:var(--secondary)}.bg-white{background-color:var(--color-white)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-primary\/10{--tw-gradient-from:var(--primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/10{--tw-gradient-from:color-mix(in oklab,var(--primary)10%,transparent)}}.from-primary\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-secondary\/10{--tw-gradient-to:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.to-secondary\/10{--tw-gradient-to:color-mix(in oklab,var(--secondary)10%,transparent)}}.to-secondary\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-contain{object-fit:contain}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-1{padding-top:calc(var(--spacing)*1)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--accent-foreground)}.text-background{color:var(--background)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-muted-foreground,.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--muted-foreground)70%,transparent)}}.text-orange-600{color:var(--color-orange-600)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.italic{font-style:italic}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,rgba(0,0,0,.1)),0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,rgba(0,0,0,.1)),0 2px 4px -2px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,rgba(0,0,0,.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,-webkit-text-decoration-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-muted-foreground\/50:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:border-muted-foreground\/50:hover{border-color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-muted:hover,.hover\:bg-muted\/80:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/80:hover{background-color:color-mix(in oklab,var(--muted)80%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-purple-200:hover{background-color:var(--color-purple-200)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}@media (min-width:40rem){.sm\:flex{display:flex}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:px-3{padding-inline:calc(var(--spacing)*3)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:48rem){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:border-blue-800{border-color:var(--color-blue-800)}.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-green-800{border-color:var(--color-green-800)}.dark\:border-input{border-color:var(--input)}.dark\:border-purple-800{border-color:var(--color-purple-800)}.dark\:border-red-800{border-color:var(--color-red-800)}.dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark\:bg-blue-800{background-color:var(--color-blue-800)}.dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark\:bg-destructive\/60{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60{background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-gray-800\/50{background-color:rgba(30,41,57,.5)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark\:bg-green-800{background-color:var(--color-green-800)}.dark\:bg-input\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:bg-purple-800{background-color:var(--color-purple-800)}.dark\:text-blue-200{color:var(--color-blue-200)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-green-200{color:var(--color-green-200)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-purple-200{color:var(--color-purple-200)}@media (hover:hover){.dark\:hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}.dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}}:root{--background:#f8f8f8;--foreground:#000;--card:#f2f2f2;--card-foreground:#000;--popover:#f2f2f2;--popover-foreground:#000;--primary:#000;--primary-foreground:#f8f8f8;--secondary:#dedede;--secondary-foreground:#000;--muted:#dedede;--muted-foreground:#484848;--accent:#cecece;--accent-foreground:#000;--destructive:#e40014;--destructive-foreground:#f8f8f8;--border:#cecece;--input:#cecece;--ring:gray;--radius:.5rem}@supports (color:color(display-p3 0 0 0)){:root{--background:color(display-p3 .973691 .973691 .973691);--foreground:color(display-p3 .00010336 .00010336 .00010336);--card:color(display-p3 .947516 .947516 .947516);--card-foreground:color(display-p3 .00010336 .00010336 .00010336);--popover:color(display-p3 .947516 .947516 .947516);--popover-foreground:color(display-p3 .00010336 .00010336 .00010336);--primary:color(display-p3 .00010336 .00010336 .00010336);--primary-foreground:color(display-p3 .973691 .973691 .973691);--secondary:color(display-p3 .869816 .869817 .869816);--secondary-foreground:color(display-p3 .00010336 .00010336 .00010336);--muted:color(display-p3 .869816 .869817 .869816);--muted-foreground:color(display-p3 .280604 .280604 .280604);--accent:color(display-p3 .806045 .806045 .806046);--accent-foreground:color(display-p3 .00010336 .00010336 .00010336);--destructive:color(display-p3 .830323 .140383 .133196);--destructive-foreground:color(display-p3 .973691 .973691 .973691);--border:color(display-p3 .806045 .806045 .806046);--input:color(display-p3 .806045 .806045 .806046);--ring:color(display-p3 .502111 .502111 .502111)}}@supports (color:lab(0% 0 0)){:root{--background:lab(97.68% -.0000298023 .0000119209);--foreground:lab(.00722694% 0 0);--card:lab(95.36% 0 0);--card-foreground:lab(.00722694% 0 0);--popover:lab(95.36% 0 0);--popover-foreground:lab(.00722694% 0 0);--primary:lab(.00722694% 0 0);--primary-foreground:lab(97.68% -.0000298023 .0000119209);--secondary:lab(88.4% 0 .0000119209);--secondary-foreground:lab(.00722694% 0 0);--muted:lab(88.4% 0 .0000119209);--muted-foreground:lab(30.4% -.0000149012 0);--accent:lab(82.6% .0000298023 -.0000119209);--accent-foreground:lab(.00722694% 0 0);--destructive:lab(48.4493% 77.4328 61.5452);--destructive-foreground:lab(97.68% -.0000298023 .0000119209);--border:lab(82.6% .0000298023 -.0000119209);--input:lab(82.6% .0000298023 -.0000119209);--ring:lab(53.6% 0 0)}}.dark{--background:#000;--foreground:#f8f8f8;--card:#000;--card-foreground:#f8f8f8;--popover:#000;--popover-foreground:#f8f8f8;--primary:#f8f8f8;--primary-foreground:#000;--secondary:#030303;--secondary-foreground:#f8f8f8;--muted:#030303;--muted-foreground:gray;--accent:#0b0b0b;--accent-foreground:#f8f8f8;--destructive:#e40014;--destructive-foreground:#f8f8f8;--border:#0b0b0b;--input:#0b0b0b;--ring:#484848}@supports (color:color(display-p3 0 0 0)){.dark{--background:color(display-p3 .00010336 .00010336 .00010336);--foreground:color(display-p3 .973691 .973691 .973691);--card:color(display-p3 .00082688 .00082688 .00082688);--card-foreground:color(display-p3 .973691 .973691 .973691);--popover:color(display-p3 .00082688 .00082688 .00082688);--popover-foreground:color(display-p3 .973691 .973691 .973691);--primary:color(display-p3 .973691 .973691 .973691);--primary-foreground:color(display-p3 .00010336 .00010336 .00010336);--secondary:color(display-p3 .01292 .01292 .01292);--secondary-foreground:color(display-p3 .973691 .973691 .973691);--muted:color(display-p3 .01292 .01292 .01292);--muted-foreground:color(display-p3 .502111 .502111 .502111);--accent:color(display-p3 .0434842 .0434842 .0434842);--accent-foreground:color(display-p3 .973691 .973691 .973691);--destructive:color(display-p3 .830323 .140383 .133196);--destructive-foreground:color(display-p3 .973691 .973691 .973691);--border:color(display-p3 .0434842 .0434842 .0434842);--input:color(display-p3 .0434842 .0434842 .0434842);--ring:color(display-p3 .280604 .280604 .280604)}}@supports (color:lab(0% 0 0)){.dark{--background:lab(.00722694% 0 0);--foreground:lab(97.68% -.0000298023 .0000119209);--card:lab(.0578117% 0 0);--card-foreground:lab(97.68% -.0000298023 .0000119209);--popover:lab(.0578117% 0 0);--popover-foreground:lab(97.68% -.0000298023 .0000119209);--primary:lab(97.68% -.0000298023 .0000119209);--primary-foreground:lab(.00722694% 0 0);--secondary:lab(.903296% 0 0);--secondary-foreground:lab(97.68% -.0000298023 .0000119209);--muted:lab(.903296% 0 0);--muted-foreground:lab(53.6% 0 0);--accent:lab(3.04863% 0 0);--accent-foreground:lab(97.68% -.0000298023 .0000119209);--destructive:lab(48.4493% 77.4328 61.5452);--destructive-foreground:lab(97.68% -.0000298023 .0000119209);--border:lab(3.04863% 0 0);--input:lab(3.04863% 0 0);--ring:lab(30.4% -.0000149012 0)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:transparent}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:transparent}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:transparent}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95299,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"warnOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},57157,(e,t,n)=>{"use strict";var r=e.r(72938).__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;n.c=function(e){return r.H.useMemoCache(e)}},62772,(e,t,n)=>{"use strict";t.exports=e.r(57157)},33323,(e,t,n)=>{"use strict";function r(e){let{widthInt:t,heightInt:n,blurWidth:r,blurHeight:i,blurDataURL:l,objectFit:a}=e,o=r?40*r:t,s=i?40*i:n,u=o&&s?"viewBox='0 0 "+o+" "+s+"'":"";return"%3Csvg xmlns='http://www.w3.org/2000/svg' "+u+"%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='"+(u?"none":"contain"===a?"xMidYMid":"cover"===a?"xMidYMid slice":"none")+"' style='filter: url(%23b);' href='"+l+"'/%3E%3C/svg%3E"}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"getImageBlurSvg",{enumerable:!0,get:function(){return r}})},95827,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),!function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(n,{VALID_LOADERS:function(){return r},imageConfigDefault:function(){return i}});let r=["default","imgix","cloudinary","akamai","custom"],i={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1}},76154,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"getImgProps",{enumerable:!0,get:function(){return s}}),e.r(95299);let r=e.r(33323),i=e.r(95827),l=["-moz-initial","fill","none","scale-down",void 0];function a(e){return void 0!==e.default}function o(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function s(e,t){var n,s;let u,d,c,{src:f,sizes:p,unoptimized:m=!1,priority:g=!1,preload:h=!1,loading:b,className:v,quality:y,width:_,height:x,fill:j=!1,style:w,overrideSrc:S,onLoad:O,onLoadingComplete:C,placeholder:P="empty",blurDataURL:E,fetchPriority:M,decoding:R="async",layout:N,objectFit:I,objectPosition:z,lazyBoundary:k,lazyRoot:A,...T}=e,{imgConf:D,showAltText:B,blurComplete:L,defaultLoader:U}=t,F=D||i.imageConfigDefault;if("allSizes"in F)u=F;else{let e=[...F.deviceSizes,...F.imageSizes].sort((e,t)=>e-t),t=F.deviceSizes.sort((e,t)=>e-t),r=null==(n=F.qualities)?void 0:n.sort((e,t)=>e-t);u={...F,allSizes:e,deviceSizes:t,qualities:r}}if(void 0===U)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let q=T.loader||U;delete T.loader,delete T.srcSet;let G="__next_img_default"in q;if(G){if("custom"===u.loader)throw Object.defineProperty(Error('Image with src "'+f+'" is missing "loader" prop.\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader'),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=q;q=t=>{let{config:n,...r}=t;return e(r)}}if(N){"fill"===N&&(j=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[N];e&&(w={...w,...e});let t={responsive:"100vw",fill:"100vw"}[N];t&&!p&&(p=t)}let W="",H=o(_),V=o(x);if((s=f)&&"object"==typeof s&&(a(s)||void 0!==s.src)){let e=a(f)?f.default:f;if(!e.src)throw Object.defineProperty(Error("An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received "+JSON.stringify(e)),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!e.height||!e.width)throw Object.defineProperty(Error("An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received "+JSON.stringify(e)),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(d=e.blurWidth,c=e.blurHeight,E=E||e.blurDataURL,W=e.src,!j)if(H||V){if(H&&!V){let t=H/e.width;V=Math.round(e.height*t)}else if(!H&&V){let t=V/e.height;H=Math.round(e.width*t)}}else H=e.width,V=e.height}let X=!g&&!h&&("lazy"===b||void 0===b);(!(f="string"==typeof f?f:W)||f.startsWith("data:")||f.startsWith("blob:"))&&(m=!0,X=!1),u.unoptimized&&(m=!0),G&&!u.dangerouslyAllowSVG&&f.split("?",1)[0].endsWith(".svg")&&(m=!0);let Y=o(y),$=Object.assign(j?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:I,objectPosition:z}:{},B?{}:{color:"transparent"},w),J=L||"empty"===P?null:"blur"===P?'url("data:image/svg+xml;charset=utf-8,'+(0,r.getImageBlurSvg)({widthInt:H,heightInt:V,blurWidth:d,blurHeight:c,blurDataURL:E||"",objectFit:$.objectFit})+'")':'url("'+P+'")',K=l.includes($.objectFit)?"fill"===$.objectFit?"100% 100%":"cover":$.objectFit,Q=J?{backgroundSize:K,backgroundPosition:$.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:J}:{},Z=function(e){let{config:t,src:n,unoptimized:r,width:i,quality:l,sizes:a,loader:o}=e;if(r)return{src:n,srcSet:void 0,sizes:void 0};let{widths:s,kind:u}=function(e,t,n){let{deviceSizes:r,allSizes:i}=e;if(n){let e=/(^|\s)(1?\d?\d)vw/g,t=[];for(let r;r=e.exec(n);)t.push(parseInt(r[2]));if(t.length){let e=.01*Math.min(...t);return{widths:i.filter(t=>t>=r[0]*e),kind:"w"}}return{widths:i,kind:"w"}}return"number"!=typeof t?{widths:r,kind:"w"}:{widths:[...new Set([t,2*t].map(e=>i.find(t=>t>=e)||i[i.length-1]))],kind:"x"}}(t,i,a),d=s.length-1;return{sizes:a||"w"!==u?a:"100vw",srcSet:s.map((e,r)=>o({config:t,src:n,quality:l,width:e})+" "+("w"===u?e:r+1)+u).join(", "),src:o({config:t,src:n,quality:l,width:s[d]})}}({config:u,src:f,unoptimized:m,width:H,quality:Y,sizes:p,loader:q}),ee=X?"lazy":b;return{props:{...T,loading:ee,fetchPriority:M,width:H,height:V,decoding:R,className:v,style:{...$,...Q},sizes:Z.sizes,srcSet:Z.srcSet,src:S||Z.src},meta:{unoptimized:m,preload:h||g,placeholder:P,fill:j}}}},33360,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return o}});let r=e.r(72938),i="undefined"==typeof window,l=i?()=>{}:r.useLayoutEffect,a=i?()=>{}:r.useEffect;function o(e){let{headManager:t,reduceComponentsToState:n}=e;function o(){if(t&&t.mountedInstances){let i=r.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(n(i,e))}}if(i){var s;null==t||null==(s=t.mountedInstances)||s.add(e.children),o()}return l(()=>{var n;return null==t||null==(n=t.mountedInstances)||n.add(e.children),()=>{var n;null==t||null==(n=t.mountedInstances)||n.delete(e.children)}}),l(()=>(t&&(t._pendingUpdate=o),()=>{t&&(t._pendingUpdate=o)})),a(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},85487,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"AmpStateContext",{enumerable:!0,get:function(){return r}});let r=e.r(81258)._(e.r(72938)).default.createContext({})},57883,(e,t,n)=>{"use strict";function r(e){let{ampFirst:t=!1,hybrid:n=!1,hasQuery:r=!1}=void 0===e?{}:e;return t||n&&r}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isInAmpMode",{enumerable:!0,get:function(){return r}})},89454,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),!function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(n,{default:function(){return g},defaultHead:function(){return c}});let r=e.r(81258),i=e.r(44066),l=e.r(54610),a=i._(e.r(72938)),o=r._(e.r(33360)),s=e.r(85487),u=e.r(30741),d=e.r(57883);function c(e){void 0===e&&(e=!1);let t=[(0,l.jsx)("meta",{charSet:"utf-8"},"charset")];return e||t.push((0,l.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")),t}function f(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===a.default.Fragment?e.concat(a.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(95299);let p=["name","httpEquiv","charSet","itemProp"];function m(e,t){let{inAmpMode:n}=t;return e.reduce(f,[]).reverse().concat(c(n).reverse()).filter(function(){let e=new Set,t=new Set,n=new Set,r={};return i=>{let l=!0,a=!1;if(i.key&&"number"!=typeof i.key&&i.key.indexOf("$")>0){a=!0;let t=i.key.slice(i.key.indexOf("$")+1);e.has(t)?l=!1:e.add(t)}switch(i.type){case"title":case"base":t.has(i.type)?l=!1:t.add(i.type);break;case"meta":for(let e=0,t=p.length;e<t;e++){let t=p[e];if(i.props.hasOwnProperty(t))if("charSet"===t)n.has(t)?l=!1:n.add(t);else{let e=i.props[t],n=r[t]||new Set;("name"!==t||!a)&&n.has(e)?l=!1:(n.add(e),r[t]=n)}}}return l}}()).reverse().map((e,t)=>{let n=e.key||t;return a.default.cloneElement(e,{key:n})})}let g=function(e){let{children:t}=e,n=(0,a.useContext)(s.AmpStateContext),r=(0,a.useContext)(u.HeadManagerContext);return(0,l.jsx)(o.default,{reduceComponentsToState:m,headManager:r,inAmpMode:(0,d.isInAmpMode)(n),children:t})};("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},64721,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"ImageConfigContext",{enumerable:!0,get:function(){return l}});let r=e.r(81258)._(e.r(72938)),i=e.r(95827),l=r.default.createContext(i.imageConfigDefault)},8946,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"RouterContext",{enumerable:!0,get:function(){return r}});let r=e.r(81258)._(e.r(72938)).default.createContext(null)},24440,(e,t,n)=>{"use strict";function r(e,t){var n;let r=e||75;return(null==t||null==(n=t.qualities)?void 0:n.length)?t.qualities.reduce((e,t)=>Math.abs(t-r)<Math.abs(e-r)?t:e,0):r}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"findClosestQuality",{enumerable:!0,get:function(){return r}})},20237,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return l}});let r=e.r(24440);function i(e){let{config:t,src:n,width:i,quality:l}=e,a=(0,r.findClosestQuality)(l,t);return t.path+"?url="+encodeURIComponent(n)+"&w="+i+"&q="+a+(n.startsWith("/_next/static/media/"),"")}i.__next_img_default=!0;let l=i},33830,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return i}});let r=e.r(72938);function i(e,t){let n=(0,r.useRef)(null),i=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=i.current;t&&(i.current=null,t())}else e&&(n.current=l(e,r)),t&&(i.current=l(t,r))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},77708,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"Image",{enumerable:!0,get:function(){return _}});let r=e.r(81258),i=e.r(44066),l=e.r(54610),a=i._(e.r(72938)),o=r._(e.r(457)),s=r._(e.r(89454)),u=e.r(76154),d=e.r(95827),c=e.r(64721);e.r(95299);let f=e.r(8946),p=r._(e.r(20237)),m=e.r(33830),g={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0};function h(e,t,n,r,i,l,a){let o=null==e?void 0:e.src;e&&e["data-loaded-src"]!==o&&(e["data-loaded-src"]=o,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&i(!0),null==n?void 0:n.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let r=!1,i=!1;n.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>r,isPropagationStopped:()=>i,persist:()=>{},preventDefault:()=>{r=!0,t.preventDefault()},stopPropagation:()=>{i=!0,t.stopPropagation()}})}(null==r?void 0:r.current)&&r.current(e)}}))}function b(e){return a.use?{fetchPriority:e}:{fetchpriority:e}}"undefined"==typeof window&&(globalThis.__NEXT_IMAGE_IMPORTED=!0);let v=(0,a.forwardRef)((e,t)=>{let{src:n,srcSet:r,sizes:i,height:o,width:s,decoding:u,className:d,style:c,fetchPriority:f,placeholder:p,loading:g,unoptimized:v,fill:y,onLoadRef:_,onLoadingCompleteRef:x,setBlurComplete:j,setShowAltText:w,sizesInput:S,onLoad:O,onError:C,...P}=e,E=(0,a.useCallback)(e=>{e&&(C&&(e.src=e.src),e.complete&&h(e,p,_,x,j,v,S))},[n,p,_,x,j,C,v,S]),M=(0,m.useMergedRef)(t,E);return(0,l.jsx)("img",{...P,...b(f),loading:g,width:s,height:o,decoding:u,"data-nimg":y?"fill":"1",className:d,style:c,sizes:i,srcSet:r,src:n,ref:M,onLoad:e=>{h(e.currentTarget,p,_,x,j,v,S)},onError:e=>{w(!0),"empty"!==p&&j(!0),C&&C(e)}})});function y(e){let{isAppRouter:t,imgAttributes:n}=e,r={as:"image",imageSrcSet:n.srcSet,imageSizes:n.sizes,crossOrigin:n.crossOrigin,referrerPolicy:n.referrerPolicy,...b(n.fetchPriority)};return t&&o.default.preload?(o.default.preload(n.src,r),null):(0,l.jsx)(s.default,{children:(0,l.jsx)("link",{rel:"preload",href:n.srcSet?void 0:n.src,...r},"__nimg-"+n.src+n.srcSet+n.sizes)})}let _=(0,a.forwardRef)((e,t)=>{let n=(0,a.useContext)(f.RouterContext),r=(0,a.useContext)(c.ImageConfigContext),i=(0,a.useMemo)(()=>{var e;let t=g||r||d.imageConfigDefault,n=[...t.deviceSizes,...t.imageSizes].sort((e,t)=>e-t),i=t.deviceSizes.sort((e,t)=>e-t),l=null==(e=t.qualities)?void 0:e.sort((e,t)=>e-t);return{...t,allSizes:n,deviceSizes:i,qualities:l}},[r]),{onLoad:o,onLoadingComplete:s}=e,m=(0,a.useRef)(o);(0,a.useEffect)(()=>{m.current=o},[o]);let h=(0,a.useRef)(s);(0,a.useEffect)(()=>{h.current=s},[s]);let[b,_]=(0,a.useState)(!1),[x,j]=(0,a.useState)(!1),{props:w,meta:S}=(0,u.getImgProps)(e,{defaultLoader:p.default,imgConf:i,blurComplete:b,showAltText:x});return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(v,{...w,unoptimized:S.unoptimized,placeholder:S.placeholder,fill:S.fill,onLoadRef:m,onLoadingCompleteRef:h,setBlurComplete:_,setShowAltText:j,sizesInput:e.sizes,ref:t}),S.preload?(0,l.jsx)(y,{isAppRouter:!n,imgAttributes:w}):null]})});("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},46568,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),!function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(n,{default:function(){return s},getImageProps:function(){return o}});let r=e.r(81258),i=e.r(76154),l=e.r(77708),a=r._(e.r(20237));function o(e){let{props:t}=(0,i.getImgProps)(e,{defaultLoader:a.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,n]of Object.entries(t))void 0===n&&delete t[e];return{props:t}}let s=l.Image},91075,(e,t,n)=>{t.exports=e.r(46568)},88659,e=>{"use strict";var t=e.i(54610),n=e.i(62772),r=e.i(91075),i=e.i(72938);function l(e){var l,d;let c,f,p,m,g,h,b,v,y,_,x,j,w,S,O,C,P,E,M,R,N,I,z,k,A,T,D,B,L,U,F,q=(0,n.c)(85),{params:G}=e,{session:W}=(0,i.use)(G);q[0]===Symbol.for("react.memo_cache_sentinel")?(c=[],q[0]=c):c=q[0];let[H,V]=(0,i.useState)(c),[X,Y]=(0,i.useState)(0),[$,J]=(0,i.useState)(!1),[K,Q]=(0,i.useState)(10);q[1]===Symbol.for("react.memo_cache_sentinel")?(f={width:1920,height:1080},q[1]=f):f=q[1];let[Z,ee]=(0,i.useState)(f),[et,en]=(0,i.useState)(null);q[2]===Symbol.for("react.memo_cache_sentinel")?(p=[],q[2]=p):p=q[2];let[er,ei]=(0,i.useState)(p);q[3]!==W?(m=()=>{fetch("/api/screenshots/list?pattern=".concat(W)).then(u).then(e=>{let t=e.files.filter(e=>e.includes("jank-")&&e.includes(W)).sort(s);if(V(t),t.length>0){let e=new Image;e.onload=()=>{ee({width:e.naturalWidth,height:e.naturalHeight})},e.src="/api/screenshots/".concat(t[0])}}),fetch("/api/jank/".concat(W)).then(o).then(e=>{ei(e.clsMarkers||[])}).catch(()=>{ei([])})},g=[W],q[3]=W,q[4]=m,q[5]=g):(m=q[4],g=q[5]),(0,i.useEffect)(m,g),q[6]!==K||q[7]!==H.length||q[8]!==$?(h=()=>{if(!$||0===H.length)return;let e=setInterval(()=>{Y(e=>e>=H.length-1?(J(!1),e):e+1)},1e3/K);return()=>clearInterval(e)},b=[$,H.length,K],q[6]=K,q[7]=H.length,q[8]=$,q[9]=h,q[10]=b):(h=q[9],b=q[10]),(0,i.useEffect)(h,b);let[,el]=(0,i.useState)(0);if(q[11]!==el?(v=()=>{let e=()=>el(a);return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},q[11]=el,q[12]=v):v=q[12],q[13]===Symbol.for("react.memo_cache_sentinel")?(y=[],q[13]=y):y=q[13],(0,i.useEffect)(v,y),0===H.length){let e;return q[14]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("div",{className:"p-8",children:"Loading frames..."}),q[14]=e):e=q[14],e}let ea=H[X];q[15]!==ea?(_=(null==ea||null==(l=ea.match(/jank-(\d+)ms/))?void 0:l[1])||"0",q[15]=ea,q[16]=_):_=q[16];let eo=_,es=parseInt(eo,10);if(q[17]!==er||q[18]!==es){let e;q[20]!==es?(e=e=>100>Math.abs(e.timestamp-es),q[20]=es,q[21]=e):e=q[21],x=er.find(e),q[17]=er,q[18]=es,q[19]=x}else x=q[19];let eu=x;q[22]===Symbol.for("react.memo_cache_sentinel")?(j={},q[22]=j):j=q[22];let ed=j;if(et&&(null==eu?void 0:eu.boundingBox)){let e=null==(d=et.parentElement)?void 0:d.getBoundingClientRect(),t=Z.width,n=Z.height;if(e){let r,i,l,a,o,s=e.width/e.height,u=t/n;s>u?(r=(i=e.height)*u,l=(e.width-r)/2,a=0):(i=(r=e.width)/u,l=0,a=(e.height-i)/2);let d=r/t,c="".concat(l+eu.boundingBox.x*d,"px"),f="".concat(a+eu.boundingBox.y*d,"px"),p="".concat(eu.boundingBox.width*d,"px"),m="".concat(eu.boundingBox.height*d,"px");q[23]!==c||q[24]!==f||q[25]!==p||q[26]!==m?(o={left:c,top:f,width:p,height:m},q[23]=c,q[24]=f,q[25]=p,q[26]=m,q[27]=o):o=q[27],ed=o}}let ec="/api/screenshots/".concat(ea),ef="Frame ".concat(X);q[28]!==ec||q[29]!==ef?(w=(0,t.jsx)(r.default,{ref:en,src:ec,alt:ef,className:"w-full h-full object-contain",fill:!0,unoptimized:!0}),q[28]=ec,q[29]=ef,q[30]=w):w=q[30],q[31]!==(null==eu?void 0:eu.boundingBox)||q[32]!==et||q[33]!==ed?(S=(null==eu?void 0:eu.boundingBox)&&et&&(0,t.jsx)("div",{className:"absolute border-2 border-red-500 pointer-events-none",style:ed}),q[31]=null==eu?void 0:eu.boundingBox,q[32]=et,q[33]=ed,q[34]=S):S=q[34],q[35]!==w||q[36]!==S?(O=(0,t.jsxs)("div",{className:"flex-1 flex items-center justify-center relative overflow-hidden",children:[w,S]}),q[35]=w,q[36]=S,q[37]=O):O=q[37],q[38]!==$?(C=()=>J(!$),q[38]=$,q[39]=C):C=q[39];let ep=$?"Pause":"Play";q[40]!==C||q[41]!==ep?(P=(0,t.jsx)("button",{type:"button",onClick:C,className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded",children:ep}),q[40]=C,q[41]=ep,q[42]=P):P=q[42],q[43]!==X?(E=()=>Y(Math.max(0,X-1)),q[43]=X,q[44]=E):E=q[44];let em=0===X;q[45]!==E||q[46]!==em?(M=(0,t.jsx)("button",{type:"button",onClick:E,disabled:em,className:"px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded disabled:opacity-50",children:"Previous"}),q[45]=E,q[46]=em,q[47]=M):M=q[47],q[48]!==X||q[49]!==H.length?(R=()=>Y(Math.min(H.length-1,X+1)),q[48]=X,q[49]=H.length,q[50]=R):R=q[50];let eg=X===H.length-1;q[51]!==R||q[52]!==eg?(N=(0,t.jsx)("button",{type:"button",onClick:R,disabled:eg,className:"px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded disabled:opacity-50",children:"Next"}),q[51]=R,q[52]=eg,q[53]=N):N=q[53];let eh=X+1;q[54]!==eo||q[55]!==H.length||q[56]!==eh?(I=(0,t.jsxs)("span",{className:"flex-1 text-center",children:["Frame ",eh," / ",H.length," (",eo,"ms)"]}),q[54]=eo,q[55]=H.length,q[56]=eh,q[57]=I):I=q[57],q[58]===Symbol.for("react.memo_cache_sentinel")?(z=e=>Q(Number(e.target.value)),q[58]=z):z=q[58],q[59]!==K?(k=(0,t.jsxs)("label",{className:"flex items-center gap-2",children:["Speed:",(0,t.jsx)("input",{type:"range",min:"1",max:"30",value:K,onChange:z,className:"w-32"}),(0,t.jsxs)("span",{className:"w-12",children:[K," fps"]})]}),q[59]=K,q[60]=k):k=q[60],q[61]!==P||q[62]!==M||q[63]!==N||q[64]!==I||q[65]!==k?(A=(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[P,M,N,I,k]}),q[61]=P,q[62]=M,q[63]=N,q[64]=I,q[65]=k,q[66]=A):A=q[66];let eb=H.length-1;if(q[67]===Symbol.for("react.memo_cache_sentinel")?(T=e=>Y(Number(e.target.value)),q[67]=T):T=q[67],q[68]!==X||q[69]!==eb?(D=(0,t.jsx)("input",{type:"range",min:"0",max:eb,value:X,onChange:T,className:"w-full"}),q[68]=X,q[69]=eb,q[70]=D):D=q[70],q[71]!==er||q[72]!==H){let e;q[74]!==H?(e=e=>{let n=H.findIndex(t=>{var n;return parseInt((null==(n=t.match(/jank-(\d+)ms/))?void 0:n[1])||"0",10)>=e.timestamp});if(-1===n)return null;let r=n/(H.length-1)*100;return(0,t.jsxs)("div",{className:"absolute top-0 h-full pointer-events-none",style:{left:"".concat(r,"%")},children:[(0,t.jsx)("div",{className:"w-0.5 h-full bg-red-500"}),(0,t.jsx)("div",{className:"absolute -top-6 left-0 -translate-x-1/2 bg-red-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap",children:e.clsScore?(0,t.jsxs)(t.Fragment,{children:["CLS ",e.clsScore.toFixed(4)," @ ",e.timestamp,"ms",e.element&&(0,t.jsxs)("span",{className:"ml-1 opacity-75",children:["<",e.element.toLowerCase(),">"]})]}):"CLS ".concat(e.timestamp,"ms")})]},e.timestamp)},q[74]=H,q[75]=e):e=q[75],B=er.map(e),q[71]=er,q[72]=H,q[73]=B}else B=q[73];return q[76]!==D||q[77]!==B?(L=(0,t.jsxs)("div",{className:"relative w-full",children:[D,B]}),q[76]=D,q[77]=B,q[78]=L):L=q[78],q[79]!==A||q[80]!==L?(U=(0,t.jsxs)("div",{className:"bg-gray-900 text-white p-4 space-y-4",children:[A,L]}),q[79]=A,q[80]=L,q[81]=U):U=q[81],q[82]!==O||q[83]!==U?(F=(0,t.jsxs)("div",{className:"flex flex-col h-screen bg-black",children:[O,U]}),q[82]=O,q[83]=U,q[84]=F):F=q[84],F}function a(e){return e+1}function o(e){return e.json()}function s(e,t){var n,r;return parseInt((null==(n=e.match(/jank-(\d+)ms/))?void 0:n[1])||"0",10)-parseInt((null==(r=t.match(/jank-(\d+)ms/))?void 0:r[1])||"0",10)}function u(e){return e.json()}e.s(["default",()=>l])}]);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/1d2676338b51bbcf.js","static/chunks/7abbb9a17b62c1fa.js","static/chunks/526448e84b58822c.js","static/chunks/8364b81221aabb64.js"],runtimeModuleIds:[53558]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=new WeakMap;function n(e,t){this.m=e,this.e=t}let o=n.prototype,l=Object.prototype.hasOwnProperty,i="undefined"!=typeof Symbol&&Symbol.toStringTag;function s(e,t,r){l.call(e,t)||Object.defineProperty(e,t,r)}function u(e,t){let r=e[t];return r||(r=a(t),e[t]=r),r}function a(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function c(e,t){s(e,"__esModule",{value:!0}),i&&s(e,i,{value:"Module"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if("number"==typeof o)if(0===o)s(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[r]?s(e,n,{get:o,set:t[r++],enumerable:!0}):s(e,n,{get:o,enumerable:!0})}Object.seal(e)}o.s=function(e,t){let r,n;null!=t?n=(r=u(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,c(n,e)},o.j=function(e,t){var n,o;let i,s,a;null!=t?s=(i=u(this.c,t)).exports:(i=this.m,s=this.e);let c=(n=i,o=s,(a=r.get(n))||(r.set(n,a=[]),n.exports=n.namespaceObject=new Proxy(o,{get(e,t){if(l.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of a){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of a)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),a);"object"==typeof e&&null!==e&&c.push(e)},o.v=function(e,t){(null!=t?u(this.c,t):this.m).exports=e},o.n=function(e,t){let r;(r=null!=t?u(this.c,t):this.m).exports=r.namespaceObject=e};let f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,p=[null,f({}),f([]),f(f)];function h(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!p.includes(t);t=f(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),c(t,n),t}function d(e){let t=M(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=h(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function m(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}o.i=d,o.A=function(e){return this.r(e)(d.bind(this))},o.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},o.r=function(e){return M(e,this.m).exports},o.f=function(e){function t(t){if(l.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(l.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let b=Symbol("turbopack queues"),y=Symbol("turbopack exports"),O=Symbol("turbopack error");function g(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}o.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:s}=m(),u=Object.assign(s,{[y]:r.exports,[b]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[y]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(b in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[y]:{},[b]:e=>e(t)};return e.then(e=>{r[y]=e,g(t)},e=>{r[O]=e,g(t)}),r}}return{[y]:e,[b]:()=>{}}}),r=()=>t.map(e=>{if(e[O])throw e[O];return e[y]}),{promise:l,resolve:i}=m(),s=Object.assign(()=>i(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[b](u)),s.queueCount?l:r()},function(e){e?i(u[O]=e):l(u[y]),g(n)}),n&&-1===n.status&&(n.status=0)};let w=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}w.prototype=URL.prototype,o.U=w,o.z=function(e){throw Error("dynamic usage of require is not supported")},o.g=globalThis;let j=n.prototype;var C=function(e){return e[e.Runtime=0]="Runtime",e[e.Parent=1]="Parent",e[e.Update=2]="Update",e}(C||{});let _=new Map;o.M=_;let U=new Map,k=new Map;async function v(e,t,r){let n;if("string"==typeof r)return T(e,t,A(r));let o=r.included||[],l=o.map(e=>!!_.has(e)||U.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],s=i.map(e=>k.get(e)).filter(e=>e);if(s.length>0){if(s.length===i.length)return void await Promise.all(s);let r=new Set;for(let e of i)k.has(e)||r.add(e);for(let n of r){let r=T(e,t,A(n));k.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=T(e,t,A(r.path)),i))k.has(o)||k.set(o,n)}for(let e of o)U.has(e)||U.set(e,n);await n}j.l=function(e){return v(1,this.m.id,e)};let P=Promise.resolve(void 0),$=new WeakMap;function T(t,r,n){let o=e.loadChunkCached(t,n),l=$.get(o);if(void 0===l){let e=$.set.bind($,o,P);l=o.then(e).catch(e=>{let o;switch(t){case 0:o=`as a runtime dependency of chunk ${r}`;break;case 1:o=`from module ${r}`;break;case 2:o="from an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}throw Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0)}),$.set(o,l)}return l}function A(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}`}j.L=function(e){return T(1,this.m.id,e)},j.R=function(e){let t=this.r(e);return t?.default??t},j.P=function(e){return`/ROOT/${e??""}`},j.b=function(e){let t=new Blob([`self.TURBOPACK_WORKER_LOCATION = ${JSON.stringify(location.origin)};
|
|
2
|
+
self.TURBOPACK_NEXT_CHUNK_URLS = ${JSON.stringify(e.reverse().map(A),null,2)};
|
|
3
|
+
importScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:"text/javascript"});return URL.createObjectURL(t)};let S=/\.js(?:\?[^#]*)?(?:#.*)?$/,E=/\.css(?:\?[^#]*)?(?:#.*)?$/;function K(e){return E.test(e)}o.w=function(t,r,n){return e.loadWebAssembly(1,this.m.id,t,r,n)},o.u=function(t,r){return e.loadWebAssemblyModule(1,this.m.id,t,r)};let x={};o.c=x;let M=(e,t)=>{let r=x[e];if(r){if(r.error)throw r.error;return r}return N(e,C.Parent,t.id)};function N(e,t,r){let o=_.get(e);"function"!=typeof o&&function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}throw Error(`Module ${e} was instantiated ${n}, but the module factory is not available. It might have been deleted in an HMR update.`)}(e,t,r);let l=a(e),i=l.exports;x[e]=l;let s=new n(l,i);try{o(s,l,i)}catch(e){throw l.error=e,e}return l.namespaceObject&&l.exports!==l.namespaceObject&&h(l.exports,l.namespaceObject),l}function L(r){let n,o=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(("undefined"!=typeof TURBOPACK_NEXT_CHUNK_URLS?TURBOPACK_NEXT_CHUNK_URLS.pop():e.getAttribute("src")).replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(r[0]);return 2===r.length?n=r[1]:(n=void 0,!function(e,t,r,n){let o=1;for(;o<e.length;){let t=e[o],n=o+1;for(;n<e.length&&"function"!=typeof e[n];)n++;if(n===e.length)throw Error("malformed chunk format, expected a factory function");if(!r.has(t)){let l=e[n];for(Object.defineProperty(l,"name",{value:"__TURBOPACK__module__evaluation__"});o<n;o++)t=e[o],r.set(t,l)}o=n+1}}(r,0,_)),e.registerChunk(o,n)}let B=new Map;(()=>{function t(e){let t=B.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},B.set(e,t)}return t}e={async registerChunk(e,r){if(t(A(e)).resolve(),null!=r){for(let e of r.otherChunks)t(A("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(t=>v(0,e,t))),r.runtimeModuleIds.length>0)for(let t of r.runtimeModuleIds)!function(e,t){let r=x[t];if(r){if(r.error)throw r.error;return}N(t,C.Runtime,e)}(e,t)}},loadChunkCached:(e,r)=>(function(e,r){let n=t(r);if(n.loadingStarted)return n.promise;if(e===C.Runtime)return n.loadingStarted=!0,K(r)&&n.resolve(),n.promise;if("function"==typeof importScripts)if(K(r));else if(S.test(r))self.TURBOPACK_NEXT_CHUNK_URLS.push(r),importScripts(TURBOPACK_WORKER_LOCATION+r);else throw Error(`can't infer type of chunk from URL ${r} in worker`);else{let e=decodeURI(r);if(K(r))if(document.querySelectorAll(`link[rel=stylesheet][href="${r}"],link[rel=stylesheet][href^="${r}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)n.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=r,e.onerror=()=>{n.reject()},e.onload=()=>{n.resolve()},document.head.appendChild(e)}else if(S.test(r)){let t=document.querySelectorAll(`script[src="${r}"],script[src^="${r}?"],script[src="${e}"],script[src^="${e}?"]`);if(t.length>0)for(let e of Array.from(t))e.addEventListener("error",()=>{n.reject()});else{let e=document.createElement("script");e.src=r,e.onerror=()=>{n.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${r}`)}return n.loadingStarted=!0,n.promise})(e,r),async loadWebAssembly(e,t,r,n,o){let l=fetch(A(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(A(r));return await WebAssembly.compileStreaming(o)}}})();let q=globalThis.TURBOPACK;globalThis.TURBOPACK={push:L},q.forEach(L)})();
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs"
|
|
2
|
+
import { homedir } from "node:os"
|
|
3
|
+
import { join } from "node:path"
|
|
4
|
+
import { NextResponse } from "next/server"
|
|
5
|
+
import { getMCPClientManager } from "@/app/mcp/client-manager"
|
|
6
|
+
|
|
7
|
+
export const dynamic = "force-dynamic"
|
|
8
|
+
|
|
9
|
+
export async function GET(request: Request) {
|
|
10
|
+
const clientManager = getMCPClientManager()
|
|
11
|
+
const connectedMCPs = clientManager.getConnectedMCPs()
|
|
12
|
+
const allTools = clientManager.getAllTools()
|
|
13
|
+
|
|
14
|
+
// Read session files to get project info
|
|
15
|
+
const sessionDir = join(homedir(), ".d3k")
|
|
16
|
+
const projects: Array<{ name: string; cdpUrl?: string; appPort?: number }> = []
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
if (existsSync(sessionDir)) {
|
|
20
|
+
const sessionFiles = readdirSync(sessionDir).filter((f) => f.endsWith(".json"))
|
|
21
|
+
|
|
22
|
+
for (const file of sessionFiles) {
|
|
23
|
+
try {
|
|
24
|
+
const sessionPath = join(sessionDir, file)
|
|
25
|
+
const sessionData = JSON.parse(readFileSync(sessionPath, "utf-8"))
|
|
26
|
+
const projectName = file.replace(".json", "")
|
|
27
|
+
|
|
28
|
+
projects.push({
|
|
29
|
+
name: projectName,
|
|
30
|
+
cdpUrl: sessionData.cdpUrl,
|
|
31
|
+
appPort: sessionData.appPort
|
|
32
|
+
})
|
|
33
|
+
} catch {
|
|
34
|
+
// Skip invalid session files
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error("[Orchestrator API] Failed to read session files:", error)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const mcpDetails = connectedMCPs.map((mcpName) => {
|
|
43
|
+
const tools = allTools.filter((t) => t.mcpName === mcpName)
|
|
44
|
+
|
|
45
|
+
// Determine which projects this MCP is connected to
|
|
46
|
+
const connectedProjects = projects.filter((p) => {
|
|
47
|
+
if (mcpName === "chrome-devtools") return p.cdpUrl
|
|
48
|
+
if (mcpName === "nextjs-dev") return p.appPort
|
|
49
|
+
return false
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
name: mcpName,
|
|
54
|
+
connected: true,
|
|
55
|
+
toolCount: tools.length,
|
|
56
|
+
tools: tools.map((t) => t.tool.name),
|
|
57
|
+
projects: connectedProjects.map((p) => p.name)
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
return NextResponse.json({
|
|
62
|
+
orchestratorEnabled: true,
|
|
63
|
+
connectedMCPs: connectedMCPs,
|
|
64
|
+
totalConnections: connectedMCPs.length,
|
|
65
|
+
mcpDetails,
|
|
66
|
+
totalProjects: projects.length,
|
|
67
|
+
projects: projects.map((p) => p.name),
|
|
68
|
+
message:
|
|
69
|
+
connectedMCPs.length > 0
|
|
70
|
+
? `Connected to ${connectedMCPs.length} downstream MCP${connectedMCPs.length > 1 ? "s" : ""} across ${projects.length} project${projects.length !== 1 ? "s" : ""}`
|
|
71
|
+
: "No downstream MCPs connected (waiting for dev3000 to start Chrome/dev server)"
|
|
72
|
+
})
|
|
73
|
+
}
|
|
@@ -60,7 +60,7 @@ describe("LogsClient Infinite Loop Prevention", () => {
|
|
|
60
60
|
let retryCount = 0
|
|
61
61
|
const maxRetries = 5
|
|
62
62
|
const failedUrl = "/api/logs/tail?test=1"
|
|
63
|
-
let lastFailedUrl = null
|
|
63
|
+
let lastFailedUrl: string | null = null
|
|
64
64
|
|
|
65
65
|
// Simulate retry logic
|
|
66
66
|
const attemptFetch = (url: string): boolean => {
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Client Manager - Orchestrates connections to downstream MCP servers
|
|
3
|
+
*
|
|
4
|
+
* This implements the "orchestrator" or "gateway" pattern where dev3000 acts as:
|
|
5
|
+
* - MCP Server (to AI clients like Claude)
|
|
6
|
+
* - MCP Client (to chrome-devtools and nextjs-dev MCPs)
|
|
7
|
+
*
|
|
8
|
+
* Benefits:
|
|
9
|
+
* - Users only configure dev3000 once globally
|
|
10
|
+
* - Auto-discovery of chrome-devtools and nextjs-dev MCPs
|
|
11
|
+
* - Reduced context bloat for AI clients
|
|
12
|
+
* - Intelligent orchestration across multiple MCP sources
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
|
|
16
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
|
|
17
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
|
|
18
|
+
import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"
|
|
19
|
+
|
|
20
|
+
interface MCPClientConfig {
|
|
21
|
+
name: string
|
|
22
|
+
type: "http" | "stdio"
|
|
23
|
+
url?: string // For HTTP transport
|
|
24
|
+
command?: string // For stdio transport
|
|
25
|
+
args?: string[] // For stdio transport
|
|
26
|
+
enabled: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class MCPClientManager {
|
|
30
|
+
private clients: Map<string, Client> = new Map()
|
|
31
|
+
private transports: Map<string, StreamableHTTPClientTransport | StdioClientTransport> = new Map()
|
|
32
|
+
private tools: Map<string, Tool[]> = new Map()
|
|
33
|
+
private reconnectTimers: Map<string, NodeJS.Timeout> = new Map()
|
|
34
|
+
private lastConfigs: Map<string, MCPClientConfig> = new Map()
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Initialize MCP clients for available downstream servers
|
|
38
|
+
*/
|
|
39
|
+
async initialize(config: {
|
|
40
|
+
chromeDevtools?: { command: string; args: string[]; enabled: boolean }
|
|
41
|
+
nextjsDev?: { url: string; enabled: boolean }
|
|
42
|
+
}): Promise<void> {
|
|
43
|
+
const configs: MCPClientConfig[] = []
|
|
44
|
+
|
|
45
|
+
if (config.chromeDevtools?.enabled) {
|
|
46
|
+
configs.push({
|
|
47
|
+
name: "chrome-devtools",
|
|
48
|
+
type: "stdio",
|
|
49
|
+
command: config.chromeDevtools.command,
|
|
50
|
+
args: config.chromeDevtools.args,
|
|
51
|
+
enabled: true
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (config.nextjsDev?.enabled) {
|
|
56
|
+
configs.push({
|
|
57
|
+
name: "nextjs-dev",
|
|
58
|
+
type: "http",
|
|
59
|
+
url: config.nextjsDev.url,
|
|
60
|
+
enabled: true
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Connect to each available MCP
|
|
65
|
+
for (const cfg of configs) {
|
|
66
|
+
try {
|
|
67
|
+
await this.connectToMCP(cfg)
|
|
68
|
+
const location = cfg.type === "http" ? cfg.url : `${cfg.command} ${cfg.args?.join(" ")}`
|
|
69
|
+
console.log(`[MCP Orchestrator] Connected to ${cfg.name} (${cfg.type}) at ${location}`)
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.warn(`[MCP Orchestrator] Failed to connect to ${cfg.name}:`, error)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Connect to a downstream MCP server
|
|
78
|
+
*/
|
|
79
|
+
private async connectToMCP(config: MCPClientConfig): Promise<void> {
|
|
80
|
+
// Store config for reconnection
|
|
81
|
+
this.lastConfigs.set(config.name, config)
|
|
82
|
+
|
|
83
|
+
const client = new Client(
|
|
84
|
+
{
|
|
85
|
+
name: "dev3000-orchestrator",
|
|
86
|
+
version: "1.0.0"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
capabilities: {}
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
client.onerror = (error) => {
|
|
94
|
+
console.error(`[MCP Orchestrator] ${config.name} error:`, error)
|
|
95
|
+
// Schedule reconnection for HTTP transports (SSE disconnects)
|
|
96
|
+
if (config.type === "http") {
|
|
97
|
+
this.scheduleReconnect(config.name)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
let transport: StreamableHTTPClientTransport | StdioClientTransport
|
|
102
|
+
|
|
103
|
+
if (config.type === "http" && config.url) {
|
|
104
|
+
transport = new StreamableHTTPClientTransport(new URL(config.url))
|
|
105
|
+
} else if (config.type === "stdio" && config.command) {
|
|
106
|
+
transport = new StdioClientTransport({
|
|
107
|
+
command: config.command,
|
|
108
|
+
args: config.args || []
|
|
109
|
+
})
|
|
110
|
+
} else {
|
|
111
|
+
throw new Error(`Invalid MCP config for ${config.name}`)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
await client.connect(transport)
|
|
115
|
+
|
|
116
|
+
this.clients.set(config.name, client)
|
|
117
|
+
this.transports.set(config.name, transport)
|
|
118
|
+
|
|
119
|
+
// Discover available tools (non-fatal - connection already succeeded)
|
|
120
|
+
try {
|
|
121
|
+
const toolsResult = await client.request(
|
|
122
|
+
{
|
|
123
|
+
method: "tools/list",
|
|
124
|
+
params: {}
|
|
125
|
+
},
|
|
126
|
+
undefined as any // Type inference will work at runtime
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if (toolsResult && "tools" in toolsResult) {
|
|
130
|
+
this.tools.set(config.name, toolsResult.tools as Tool[])
|
|
131
|
+
console.log(`[MCP Orchestrator] Discovered ${toolsResult.tools.length} tools from ${config.name}`)
|
|
132
|
+
} else {
|
|
133
|
+
// Set empty array if no tools found
|
|
134
|
+
this.tools.set(config.name, [])
|
|
135
|
+
console.log(`[MCP Orchestrator] No tools discovered from ${config.name} (will retry on first use)`)
|
|
136
|
+
}
|
|
137
|
+
} catch (error) {
|
|
138
|
+
// Tool discovery failed but connection succeeded - tools will be discovered on first use
|
|
139
|
+
this.tools.set(config.name, [])
|
|
140
|
+
console.log(`[MCP Orchestrator] Tool discovery deferred for ${config.name} (will discover on first tool call)`)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Get all discovered tools from all connected MCPs
|
|
146
|
+
*/
|
|
147
|
+
getAllTools(): Array<{ mcpName: string; tool: Tool }> {
|
|
148
|
+
const allTools: Array<{ mcpName: string; tool: Tool }> = []
|
|
149
|
+
|
|
150
|
+
for (const [mcpName, tools] of this.tools.entries()) {
|
|
151
|
+
for (const tool of tools) {
|
|
152
|
+
allTools.push({ mcpName, tool })
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return allTools
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Call a tool on a downstream MCP server
|
|
161
|
+
*/
|
|
162
|
+
async callTool(mcpName: string, toolName: string, args: Record<string, unknown>): Promise<CallToolResult> {
|
|
163
|
+
const client = this.clients.get(mcpName)
|
|
164
|
+
|
|
165
|
+
if (!client) {
|
|
166
|
+
throw new Error(`MCP client '${mcpName}' not connected`)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
const result = await client.request(
|
|
171
|
+
{
|
|
172
|
+
method: "tools/call",
|
|
173
|
+
params: {
|
|
174
|
+
name: toolName,
|
|
175
|
+
arguments: args
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
undefined as any // Type inference will work at runtime
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return result as CallToolResult
|
|
182
|
+
} catch (error) {
|
|
183
|
+
console.error(`[MCP Orchestrator] Error calling ${mcpName}.${toolName}:`, error)
|
|
184
|
+
throw error
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Check if a specific MCP is connected
|
|
190
|
+
*/
|
|
191
|
+
isConnected(mcpName: string): boolean {
|
|
192
|
+
return this.clients.has(mcpName)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Get list of connected MCP names
|
|
197
|
+
*/
|
|
198
|
+
getConnectedMCPs(): string[] {
|
|
199
|
+
return Array.from(this.clients.keys())
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Schedule reconnection for a disconnected MCP
|
|
204
|
+
*/
|
|
205
|
+
private scheduleReconnect(mcpName: string): void {
|
|
206
|
+
// Clear any existing reconnect timer
|
|
207
|
+
const existingTimer = this.reconnectTimers.get(mcpName)
|
|
208
|
+
if (existingTimer) {
|
|
209
|
+
clearTimeout(existingTimer)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Schedule reconnection after 3 seconds
|
|
213
|
+
const timer = setTimeout(async () => {
|
|
214
|
+
const config = this.lastConfigs.get(mcpName)
|
|
215
|
+
if (!config) {
|
|
216
|
+
console.warn(`[MCP Orchestrator] No config found for reconnection: ${mcpName}`)
|
|
217
|
+
return
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
console.log(`[MCP Orchestrator] Attempting to reconnect to ${mcpName}...`)
|
|
221
|
+
try {
|
|
222
|
+
// Clean up old connection
|
|
223
|
+
const oldTransport = this.transports.get(mcpName)
|
|
224
|
+
if (oldTransport) {
|
|
225
|
+
try {
|
|
226
|
+
await oldTransport.close()
|
|
227
|
+
} catch {
|
|
228
|
+
// Ignore close errors
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
this.clients.delete(mcpName)
|
|
232
|
+
this.transports.delete(mcpName)
|
|
233
|
+
|
|
234
|
+
// Attempt reconnection
|
|
235
|
+
await this.connectToMCP(config)
|
|
236
|
+
console.log(`[MCP Orchestrator] Successfully reconnected to ${mcpName}`)
|
|
237
|
+
} catch (error) {
|
|
238
|
+
console.warn(`[MCP Orchestrator] Reconnection to ${mcpName} failed:`, error)
|
|
239
|
+
// Schedule another retry
|
|
240
|
+
this.scheduleReconnect(mcpName)
|
|
241
|
+
}
|
|
242
|
+
}, 3000)
|
|
243
|
+
|
|
244
|
+
this.reconnectTimers.set(mcpName, timer)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Disconnect all MCP clients
|
|
249
|
+
*/
|
|
250
|
+
async disconnect(): Promise<void> {
|
|
251
|
+
// Clear all reconnect timers
|
|
252
|
+
for (const timer of this.reconnectTimers.values()) {
|
|
253
|
+
clearTimeout(timer)
|
|
254
|
+
}
|
|
255
|
+
this.reconnectTimers.clear()
|
|
256
|
+
|
|
257
|
+
for (const [name, transport] of this.transports.entries()) {
|
|
258
|
+
try {
|
|
259
|
+
await transport.close()
|
|
260
|
+
console.log(`[MCP Orchestrator] Disconnected from ${name}`)
|
|
261
|
+
} catch (error) {
|
|
262
|
+
console.error(`[MCP Orchestrator] Error disconnecting from ${name}:`, error)
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
this.clients.clear()
|
|
267
|
+
this.transports.clear()
|
|
268
|
+
this.tools.clear()
|
|
269
|
+
this.lastConfigs.clear()
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Singleton instance
|
|
274
|
+
let clientManager: MCPClientManager | null = null
|
|
275
|
+
|
|
276
|
+
export function getMCPClientManager(): MCPClientManager {
|
|
277
|
+
if (!clientManager) {
|
|
278
|
+
clientManager = new MCPClientManager()
|
|
279
|
+
}
|
|
280
|
+
return clientManager
|
|
281
|
+
}
|