@epic-web/workshop-app 5.4.1 → 5.5.0

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.
Files changed (26) hide show
  1. package/build/client/assets/_exerciseNumber-DCSM0NCG.js.map +1 -1
  2. package/build/client/assets/_exerciseNumber_.finished-nbpk1ToO.js.map +1 -1
  3. package/build/client/assets/_layout-B8j0pWoF.js +6 -0
  4. package/build/client/assets/_layout-B8j0pWoF.js.map +1 -0
  5. package/build/client/assets/_layout-DTAM9xh5.js.map +1 -1
  6. package/build/client/assets/{account-C4Piztoz.js → account-DPP4rKOb.js} +2 -2
  7. package/build/client/assets/{account-C4Piztoz.js.map → account-DPP4rKOb.js.map} +1 -1
  8. package/build/client/assets/epic-video-Bp4BOD2R.js.map +1 -1
  9. package/build/client/assets/finished-C0cpfAFL.js.map +1 -1
  10. package/build/client/assets/index-Bi1TbRTj.js.map +1 -1
  11. package/build/client/assets/index-Ca4vBON4.js.map +1 -1
  12. package/build/client/assets/{manifest-e5b2a6e1.js → manifest-a8336fab.js} +1 -1
  13. package/build/client/assets/onboarding-C2YNq60k.js.map +1 -1
  14. package/build/client/assets/presence-8FPJKg_8.js +28 -0
  15. package/build/client/assets/presence-8FPJKg_8.js.map +1 -0
  16. package/build/client/assets/progress-DQt_Bn9o.js.map +1 -1
  17. package/build/client/assets/{root-a3d3Qwip.js → root-D12XnE1S.js} +2 -2
  18. package/build/client/assets/{root-a3d3Qwip.js.map → root-D12XnE1S.js.map} +1 -1
  19. package/build/client/assets/tests-DbuyD2cI.js.map +1 -1
  20. package/build/server/index.js +159 -573
  21. package/build/server/index.js.map +1 -1
  22. package/package.json +3 -3
  23. package/build/client/assets/_layout-Cbz7Qt-S.js +0 -6
  24. package/build/client/assets/_layout-Cbz7Qt-S.js.map +0 -1
  25. package/build/client/assets/presence-DJGFvdDh.js +0 -28
  26. package/build/client/assets/presence-DJGFvdDh.js.map +0 -1
@@ -1 +1 @@
1
- window.__remixManifest={"entry":{"module":"/assets/entry.client-DqIWuxf8.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/root-a3d3Qwip.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/pe-ChIwTk8v.js","/assets/error-boundary-BZA-ffa8.js","/assets/progress-bar-BaTU3Yx_.js","/assets/index-C9Hx0Dey.js","/assets/tooltip-DO9uwurQ.js","/assets/index-Bdg3v8tC.js","/assets/presence-DJGFvdDh.js","/assets/seo-pBpFCWsy.js","/assets/request-info-ByUEfOil.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_-BrkpfnBb.js","imports":["/assets/index-BFGhCX_U.js","/assets/error-boundary-BZA-ffa8.js","/assets/misc-DUy_whwE.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_layout-Cbz7Qt-S.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/pe-ChIwTk8v.js","/assets/product-DIAmCwmZ.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/tooltip-DO9uwurQ.js","/assets/index-BCTr8uu6.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/presence-DJGFvdDh.js","/assets/progress-DQt_Bn9o.js","/assets/index-Bdg3v8tC.js","/assets/components-Be92gVxW.js","/assets/request-info-ByUEfOil.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/account-C4Piztoz.js","imports":["/assets/index-BFGhCX_U.js","/assets/button-_qPvcoqR.js","/assets/misc-DUy_whwE.js","/assets/tooltip-DO9uwurQ.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/presence-DJGFvdDh.js","/assets/components-Be92gVxW.js","/assets/request-info-ByUEfOil.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName/","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/discord-Bdnx7fu-.js","imports":["/assets/discord-BUWZUTEC.js","/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/components-Be92gVxW.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_layout-88n0To1b.js","imports":["/assets/index-BFGhCX_U.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-DCSM0NCG.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/progress-DQt_Bn9o.js","/assets/misc-DUy_whwE.js","/assets/seo-pBpFCWsy.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber-BIMJh_sg.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber","path":":type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_layout-DTAM9xh5.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/error-boundary-BZA-ffa8.js","/assets/nav-chevrons-DnR25VLp.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/progress-DQt_Bn9o.js","/assets/set-playground-CBHBA46B.js","/assets/seo-pBpFCWsy.js","/assets/misc-DUy_whwE.js","/assets/epic-video-Bp4BOD2R.js","/assets/tooltip-DO9uwurQ.js","/assets/request-info-ByUEfOil.js","/assets/components-Be92gVxW.js","/assets/index-BCTr8uu6.js","/assets/progress-bar-BaTU3Yx_.js","/assets/pe-ChIwTk8v.js","/assets/index-DZDhtMuq.js","/assets/index-Bdg3v8tC.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/app-DgTXXO8s.js","imports":["/assets/index-BFGhCX_U.js","/assets/preview-DaZd0wMb.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/request-info-ByUEfOil.js","/assets/button-_qPvcoqR.js","/assets/loading-XhMtj4mp.js","/assets/index-Bdg3v8tC.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/progress-bar-BaTU3Yx_.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/index-Bi1TbRTj.js","imports":["/assets/index-BFGhCX_U.js","/assets/tooltip-DO9uwurQ.js","/assets/index-DZDhtMuq.js","/assets/misc-DUy_whwE.js","/assets/diff-8nlDkmpc.js","/assets/error-boundary-BZA-ffa8.js","/assets/loading-XhMtj4mp.js","/assets/discord-BUWZUTEC.js","/assets/components-Be92gVxW.js","/assets/index-C9Hx0Dey.js","/assets/set-playground-CBHBA46B.js","/assets/tests-DbuyD2cI.js","/assets/preview-DaZd0wMb.js","/assets/index-BCTr8uu6.js","/assets/accordion-D9-D-n9p.js","/assets/mdx-CEjzXoEx.js","/assets/epic-video-Bp4BOD2R.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/pe-ChIwTk8v.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/use-event-source-x59d4R2Z.js","/assets/button-_qPvcoqR.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test-DoKJvNug.js","imports":["/assets/index-BFGhCX_U.js","/assets/tests-DbuyD2cI.js","/assets/components-Be92gVxW.js","/assets/epic-video-Bp4BOD2R.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/misc-DUy_whwE.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/accordion-D9-D-n9p.js","/assets/index-DZDhtMuq.js","/assets/index-BCTr8uu6.js","/assets/use-event-source-x59d4R2Z.js","/assets/set-playground-CBHBA46B.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-nbpk1ToO.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/loading-XhMtj4mp.js","/assets/nav-chevrons-DnR25VLp.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/progress-DQt_Bn9o.js","/assets/misc-DUy_whwE.js","/assets/seo-pBpFCWsy.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/finished-C0cpfAFL.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/loading-XhMtj4mp.js","/assets/nav-chevrons-DnR25VLp.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/misc-DUy_whwE.js","/assets/seo-pBpFCWsy.js","/assets/progress-DQt_Bn9o.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/index-Ca4vBON4.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/error-boundary-BZA-ffa8.js","/assets/mdx-CEjzXoEx.js","/assets/misc-DUy_whwE.js","/assets/progress-DQt_Bn9o.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/login-C1oOgi98.js","imports":["/assets/index-BFGhCX_U.js","/assets/use-event-source-x59d4R2Z.js","/assets/button-_qPvcoqR.js","/assets/loading-XhMtj4mp.js","/assets/product-DIAmCwmZ.js","/assets/workshop-config-WVltG_BV.js","/assets/request-info-ByUEfOil.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/index-Bdg3v8tC.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/support-CIz02V_r.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_layout-Dfmv2zcn.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/cache-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-pkiQppkK.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/tooltip-DO9uwurQ.js","/assets/progress-DQt_Bn9o.js","/assets/components-Be92gVxW.js","/assets/pe-ChIwTk8v.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/version-lxUUxt3s.js","imports":["/assets/index-BFGhCX_U.js","/assets/workshop-config-WVltG_BV.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/diff-BhRAIPKc.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/diff-8nlDkmpc.js","/assets/nav-chevrons-DnR25VLp.js","/assets/components-Be92gVxW.js","/assets/accordion-D9-D-n9p.js","/assets/tooltip-DO9uwurQ.js","/assets/index-DZDhtMuq.js","/assets/index-BCTr8uu6.js","/assets/mdx-CEjzXoEx.js","/assets/epic-video-Bp4BOD2R.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js","/assets/revalidation-ws-dUa9CAqr.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/onboarding":{"id":"routes/onboarding","parentId":"root","path":"onboarding","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/onboarding-C2YNq60k.js","imports":["/assets/index-BFGhCX_U.js","/assets/button-_qPvcoqR.js","/assets/epic-video-Bp4BOD2R.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-e5b2a6e1.js","version":"e5b2a6e1"};
1
+ window.__remixManifest={"entry":{"module":"/assets/entry.client-DqIWuxf8.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/root-D12XnE1S.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/pe-ChIwTk8v.js","/assets/error-boundary-BZA-ffa8.js","/assets/progress-bar-BaTU3Yx_.js","/assets/index-C9Hx0Dey.js","/assets/tooltip-DO9uwurQ.js","/assets/index-Bdg3v8tC.js","/assets/presence-8FPJKg_8.js","/assets/seo-pBpFCWsy.js","/assets/request-info-ByUEfOil.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_-BrkpfnBb.js","imports":["/assets/index-BFGhCX_U.js","/assets/error-boundary-BZA-ffa8.js","/assets/misc-DUy_whwE.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_layout-B8j0pWoF.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/pe-ChIwTk8v.js","/assets/product-DIAmCwmZ.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/tooltip-DO9uwurQ.js","/assets/index-BCTr8uu6.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/presence-8FPJKg_8.js","/assets/progress-DQt_Bn9o.js","/assets/index-Bdg3v8tC.js","/assets/components-Be92gVxW.js","/assets/request-info-ByUEfOil.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/account-DPP4rKOb.js","imports":["/assets/index-BFGhCX_U.js","/assets/button-_qPvcoqR.js","/assets/misc-DUy_whwE.js","/assets/tooltip-DO9uwurQ.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/presence-8FPJKg_8.js","/assets/components-Be92gVxW.js","/assets/request-info-ByUEfOil.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName/","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/discord-Bdnx7fu-.js","imports":["/assets/discord-BUWZUTEC.js","/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/components-Be92gVxW.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_layout-88n0To1b.js","imports":["/assets/index-BFGhCX_U.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-DCSM0NCG.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/progress-DQt_Bn9o.js","/assets/misc-DUy_whwE.js","/assets/seo-pBpFCWsy.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber-BIMJh_sg.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber","path":":type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/_layout-DTAM9xh5.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/error-boundary-BZA-ffa8.js","/assets/nav-chevrons-DnR25VLp.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/progress-DQt_Bn9o.js","/assets/set-playground-CBHBA46B.js","/assets/seo-pBpFCWsy.js","/assets/misc-DUy_whwE.js","/assets/epic-video-Bp4BOD2R.js","/assets/tooltip-DO9uwurQ.js","/assets/request-info-ByUEfOil.js","/assets/components-Be92gVxW.js","/assets/index-BCTr8uu6.js","/assets/progress-bar-BaTU3Yx_.js","/assets/pe-ChIwTk8v.js","/assets/index-DZDhtMuq.js","/assets/index-Bdg3v8tC.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/app-DgTXXO8s.js","imports":["/assets/index-BFGhCX_U.js","/assets/preview-DaZd0wMb.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/request-info-ByUEfOil.js","/assets/button-_qPvcoqR.js","/assets/loading-XhMtj4mp.js","/assets/index-Bdg3v8tC.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/progress-bar-BaTU3Yx_.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/index-Bi1TbRTj.js","imports":["/assets/index-BFGhCX_U.js","/assets/tooltip-DO9uwurQ.js","/assets/index-DZDhtMuq.js","/assets/misc-DUy_whwE.js","/assets/diff-8nlDkmpc.js","/assets/error-boundary-BZA-ffa8.js","/assets/loading-XhMtj4mp.js","/assets/discord-BUWZUTEC.js","/assets/components-Be92gVxW.js","/assets/index-C9Hx0Dey.js","/assets/set-playground-CBHBA46B.js","/assets/tests-DbuyD2cI.js","/assets/preview-DaZd0wMb.js","/assets/index-BCTr8uu6.js","/assets/accordion-D9-D-n9p.js","/assets/mdx-CEjzXoEx.js","/assets/epic-video-Bp4BOD2R.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/pe-ChIwTk8v.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/use-event-source-x59d4R2Z.js","/assets/button-_qPvcoqR.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test-DoKJvNug.js","imports":["/assets/index-BFGhCX_U.js","/assets/tests-DbuyD2cI.js","/assets/components-Be92gVxW.js","/assets/epic-video-Bp4BOD2R.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/misc-DUy_whwE.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/accordion-D9-D-n9p.js","/assets/index-DZDhtMuq.js","/assets/index-BCTr8uu6.js","/assets/use-event-source-x59d4R2Z.js","/assets/set-playground-CBHBA46B.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-nbpk1ToO.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/loading-XhMtj4mp.js","/assets/nav-chevrons-DnR25VLp.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/progress-DQt_Bn9o.js","/assets/misc-DUy_whwE.js","/assets/seo-pBpFCWsy.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/finished-C0cpfAFL.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/loading-XhMtj4mp.js","/assets/nav-chevrons-DnR25VLp.js","/assets/revalidation-ws-dUa9CAqr.js","/assets/mdx-CEjzXoEx.js","/assets/misc-DUy_whwE.js","/assets/seo-pBpFCWsy.js","/assets/progress-DQt_Bn9o.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":true,"module":"/assets/index-Ca4vBON4.js","imports":["/assets/index-BFGhCX_U.js","/assets/index-BCxBKsqT.js","/assets/epic-video-Bp4BOD2R.js","/assets/error-boundary-BZA-ffa8.js","/assets/mdx-CEjzXoEx.js","/assets/misc-DUy_whwE.js","/assets/progress-DQt_Bn9o.js","/assets/components-Be92gVxW.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/login-C1oOgi98.js","imports":["/assets/index-BFGhCX_U.js","/assets/use-event-source-x59d4R2Z.js","/assets/button-_qPvcoqR.js","/assets/loading-XhMtj4mp.js","/assets/product-DIAmCwmZ.js","/assets/workshop-config-WVltG_BV.js","/assets/request-info-ByUEfOil.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/index-Bdg3v8tC.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/support-CIz02V_r.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_layout-Dfmv2zcn.js","imports":["/assets/index-BFGhCX_U.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/cache-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-pkiQppkK.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/tooltip-DO9uwurQ.js","/assets/progress-DQt_Bn9o.js","/assets/components-Be92gVxW.js","/assets/pe-ChIwTk8v.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/version-lxUUxt3s.js","imports":["/assets/index-BFGhCX_U.js","/assets/workshop-config-WVltG_BV.js","/assets/components-Be92gVxW.js"],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/diff-BhRAIPKc.js","imports":["/assets/index-BFGhCX_U.js","/assets/misc-DUy_whwE.js","/assets/diff-8nlDkmpc.js","/assets/nav-chevrons-DnR25VLp.js","/assets/components-Be92gVxW.js","/assets/accordion-D9-D-n9p.js","/assets/tooltip-DO9uwurQ.js","/assets/index-DZDhtMuq.js","/assets/index-BCTr8uu6.js","/assets/mdx-CEjzXoEx.js","/assets/epic-video-Bp4BOD2R.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js","/assets/progress-bar-BaTU3Yx_.js","/assets/revalidation-ws-dUa9CAqr.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/onboarding":{"id":"routes/onboarding","parentId":"root","path":"onboarding","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/onboarding-C2YNq60k.js","imports":["/assets/index-BFGhCX_U.js","/assets/button-_qPvcoqR.js","/assets/epic-video-Bp4BOD2R.js","/assets/components-Be92gVxW.js","/assets/misc-DUy_whwE.js","/assets/index-Bdg3v8tC.js","/assets/request-info-ByUEfOil.js","/assets/tooltip-DO9uwurQ.js","/assets/pe-ChIwTk8v.js","/assets/loading-XhMtj4mp.js","/assets/user-Bv6wYhQP.js","/assets/workshop-config-WVltG_BV.js"],"css":["/assets/epic-video-DUnRvy1A.css"]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-a8336fab.js","version":"a8336fab"};
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-C2YNq60k.js","sources":["../../../app/routes/onboarding.tsx"],"sourcesContent":["import { invariantResponse } from '@epic-web/invariant'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tgetAuthInfo,\n\tmarkOnboardingVideoWatched,\n} from '@epic-web/workshop-utils/db.server'\nimport { makeTimings } from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tunstable_data as data,\n\tredirect,\n\ttype ActionFunctionArgs,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport { Form, useLoaderData } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport {\n\tDeferredEpicVideo,\n\tEpicVideoInfoProvider,\n} from '#app/components/epic-video.tsx'\nimport { getEpicVideoInfos } from '#app/utils/epic-api.ts'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('onboarding')\n\n\tconst { onboardingVideo } = getWorkshopConfig()\n\tconst videoInfos = getEpicVideoInfos([onboardingVideo], { request, timings })\n\treturn data(\n\t\t{ onboardingVideo, videoInfos },\n\t\t{ headers: { 'Server-Timing': timings.toString() } },\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': loaderHeaders.get('Server-Timing') ?? '',\n\t}\n\treturn headers\n}\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tconst data = await request.formData()\n\tconst authInfo = await getAuthInfo()\n\tconst intent = data.get('intent')\n\tinvariantResponse(intent === 'complete', 'Invalid intent')\n\tconst { onboardingVideo } = getWorkshopConfig()\n\tawait markOnboardingVideoWatched(onboardingVideo)\n\n\tif (authInfo) throw redirect('/')\n\telse throw redirect('/login')\n}\n\nexport default function Onboarding() {\n\tconst data = useLoaderData<typeof loader>()\n\treturn (\n\t\t<main className=\"flex h-full w-full flex-col items-center justify-between gap-4\">\n\t\t\t<div className=\"container flex h-full w-full max-w-5xl flex-1 flex-col items-center gap-4 overflow-y-scroll py-12 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<h1 className=\"text-5xl\">Onboarding</h1>\n\t\t\t\t<p className=\"text-xl\">Welcome to EpicWeb.dev!</p>\n\t\t\t\t<p className=\"text-lg\">\n\t\t\t\t\tBefore you get started, <strong>you must watch the tour video</strong>\n\t\t\t\t\t! You're going to be spending a lot of time in here, so it's important\n\t\t\t\t\tyou understand how to work effectively in this workshop\n\t\t\t\t</p>\n\t\t\t\t<div className=\"w-[780px] max-w-full\">\n\t\t\t\t\t<EpicVideoInfoProvider epicVideoInfosPromise={data.videoInfos}>\n\t\t\t\t\t\t<DeferredEpicVideo url={data.onboardingVideo} />\n\t\t\t\t\t</EpicVideoInfoProvider>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<Form method=\"post\" className=\"pb-4\">\n\t\t\t\t<Button name=\"intent\" value=\"complete\" varient=\"primary\">\n\t\t\t\t\tI've watched it. Let's go!\n\t\t\t\t</Button>\n\t\t\t</Form>\n\t\t</main>\n\t)\n}\n"],"names":["handle","getSitemapEntries","Onboarding","data","useLoaderData","jsxs","className","children","jsx","EpicVideoInfoProvider","epicVideoInfosPromise","videoInfos","DeferredEpicVideo","url","onboardingVideo","Form","method","Button","name","value","varient"],"mappings":"yaAuBO,MAAMA,EAAoB,CAChCC,kBAAmBA,IAAM,IAC1B,EAgCA,SAAwBC,GAAa,CACpC,MAAMC,EAAOC,IAEZ,OAAAC,EAAAA,KAAC,OAAK,CAAAC,UAAU,iEACfC,SAAA,CAACF,EAAA,KAAA,MAAA,CAAIC,UAAU,6IACdC,SAAA,CAACC,EAAA,IAAA,KAAA,CAAGF,UAAU,WAAWC,SAAU,YAAA,CAAA,EAClCC,EAAA,IAAA,IAAA,CAAEF,UAAU,UAAUC,SAAuB,yBAAA,CAAA,EAC9CF,EAAA,KAAC,IAAE,CAAAC,UAAU,UAAUC,SAAA,CAAA,2BACEC,EAAA,IAAC,UAAOD,SAA6B,+BAAA,CAAA,EAAS,gIAAA,CAGvE,CAAA,EACCC,EAAA,IAAA,MAAA,CAAIF,UAAU,uBACdC,eAACE,EAAsB,CAAAC,sBAAuBP,EAAKQ,WAClDJ,eAACK,EAAkB,CAAAC,IAAKV,EAAKW,gBAAiB,EAC/C,CACD,CAAA,CAAA,CACD,CAAA,EACCN,EAAA,IAAAO,EAAA,CAAKC,OAAO,OAAOV,UAAU,OAC7BC,SAAAC,EAAA,IAACS,EAAO,CAAAC,KAAK,SAASC,MAAM,WAAWC,QAAQ,UAAUb,sCAEzD,CACD,CAAA,CAAA,CACD,CAAA,CAEF"}
1
+ {"version":3,"file":"onboarding-C2YNq60k.js","sources":["../../../app/routes/onboarding.tsx"],"sourcesContent":["import { invariantResponse } from '@epic-web/invariant'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tgetAuthInfo,\n\tmarkOnboardingVideoWatched,\n} from '@epic-web/workshop-utils/db.server'\nimport { makeTimings } from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tunstable_data as data,\n\tredirect,\n\ttype ActionFunctionArgs,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport { Form, useLoaderData } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport {\n\tDeferredEpicVideo,\n\tEpicVideoInfoProvider,\n} from '#app/components/epic-video.tsx'\nimport { getEpicVideoInfos } from '@epic-web/workshop-utils/epic-api.server'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('onboarding')\n\n\tconst { onboardingVideo } = getWorkshopConfig()\n\tconst videoInfos = getEpicVideoInfos([onboardingVideo], { request, timings })\n\treturn data(\n\t\t{ onboardingVideo, videoInfos },\n\t\t{ headers: { 'Server-Timing': timings.toString() } },\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': loaderHeaders.get('Server-Timing') ?? '',\n\t}\n\treturn headers\n}\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tconst data = await request.formData()\n\tconst authInfo = await getAuthInfo()\n\tconst intent = data.get('intent')\n\tinvariantResponse(intent === 'complete', 'Invalid intent')\n\tconst { onboardingVideo } = getWorkshopConfig()\n\tawait markOnboardingVideoWatched(onboardingVideo)\n\n\tif (authInfo) throw redirect('/')\n\telse throw redirect('/login')\n}\n\nexport default function Onboarding() {\n\tconst data = useLoaderData<typeof loader>()\n\treturn (\n\t\t<main className=\"flex h-full w-full flex-col items-center justify-between gap-4\">\n\t\t\t<div className=\"container flex h-full w-full max-w-5xl flex-1 flex-col items-center gap-4 overflow-y-scroll py-12 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<h1 className=\"text-5xl\">Onboarding</h1>\n\t\t\t\t<p className=\"text-xl\">Welcome to EpicWeb.dev!</p>\n\t\t\t\t<p className=\"text-lg\">\n\t\t\t\t\tBefore you get started, <strong>you must watch the tour video</strong>\n\t\t\t\t\t! You're going to be spending a lot of time in here, so it's important\n\t\t\t\t\tyou understand how to work effectively in this workshop\n\t\t\t\t</p>\n\t\t\t\t<div className=\"w-[780px] max-w-full\">\n\t\t\t\t\t<EpicVideoInfoProvider epicVideoInfosPromise={data.videoInfos}>\n\t\t\t\t\t\t<DeferredEpicVideo url={data.onboardingVideo} />\n\t\t\t\t\t</EpicVideoInfoProvider>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<Form method=\"post\" className=\"pb-4\">\n\t\t\t\t<Button name=\"intent\" value=\"complete\" varient=\"primary\">\n\t\t\t\t\tI've watched it. Let's go!\n\t\t\t\t</Button>\n\t\t\t</Form>\n\t\t</main>\n\t)\n}\n"],"names":["handle","getSitemapEntries","Onboarding","data","useLoaderData","jsxs","className","children","jsx","EpicVideoInfoProvider","epicVideoInfosPromise","videoInfos","DeferredEpicVideo","url","onboardingVideo","Form","method","Button","name","value","varient"],"mappings":"yaAuBO,MAAMA,EAAoB,CAChCC,kBAAmBA,IAAM,IAC1B,EAgCA,SAAwBC,GAAa,CACpC,MAAMC,EAAOC,IAEZ,OAAAC,EAAAA,KAAC,OAAK,CAAAC,UAAU,iEACfC,SAAA,CAACF,EAAA,KAAA,MAAA,CAAIC,UAAU,6IACdC,SAAA,CAACC,EAAA,IAAA,KAAA,CAAGF,UAAU,WAAWC,SAAU,YAAA,CAAA,EAClCC,EAAA,IAAA,IAAA,CAAEF,UAAU,UAAUC,SAAuB,yBAAA,CAAA,EAC9CF,EAAA,KAAC,IAAE,CAAAC,UAAU,UAAUC,SAAA,CAAA,2BACEC,EAAA,IAAC,UAAOD,SAA6B,+BAAA,CAAA,EAAS,gIAAA,CAGvE,CAAA,EACCC,EAAA,IAAA,MAAA,CAAIF,UAAU,uBACdC,eAACE,EAAsB,CAAAC,sBAAuBP,EAAKQ,WAClDJ,eAACK,EAAkB,CAAAC,IAAKV,EAAKW,gBAAiB,EAC/C,CACD,CAAA,CAAA,CACD,CAAA,EACCN,EAAA,IAAAO,EAAA,CAAKC,OAAO,OAAOV,UAAU,OAC7BC,SAAAC,EAAA,IAACS,EAAO,CAAAC,KAAK,SAASC,MAAM,WAAWC,QAAQ,UAAUb,sCAEzD,CACD,CAAA,CAAA,CACD,CAAA,CAEF"}
@@ -0,0 +1,28 @@
1
+ var I=Object.defineProperty;var j=(t,o,e)=>o in t?I(t,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[o]=e;var c=(t,o,e)=>j(t,typeof o!="symbol"?o+"":o,e);import{r as p,j as A,b as q}from"./index-BFGhCX_U.js";import{z as a,u as F}from"./request-info-ByUEfOil.js";import{c as E}from"./components-Be92gVxW.js";const R="epic-web-presence",G=`https://epic-web-presence.kentcdodds.partykit.dev/parties/main/${R}`,T=a.object({id:a.string(),hasAccess:a.boolean().nullable().optional(),avatarUrl:a.string().nullable().optional(),imageUrlSmall:a.string().nullable().optional(),imageUrlLarge:a.string().nullable().optional(),name:a.string().nullable().optional(),location:a.object({workshopTitle:a.string().nullable().optional(),origin:a.string().nullable().optional(),exercise:a.object({type:a.union([a.literal("problem"),a.literal("solution")]).nullable().optional(),exerciseNumber:a.number().nullable().optional(),stepNumber:a.number().nullable().optional()}).nullable().optional()}).nullable().optional()}),$=a.object({type:a.literal("remove-user"),payload:a.object({id:a.string()})}).or(a.object({type:a.literal("add-user"),payload:T})).or(a.object({type:a.literal("presence"),payload:a.object({users:a.array(T)})}));a.object({users:a.array(T)});(!globalThis.EventTarget||!globalThis.Event)&&console.error(`
2
+ PartySocket requires a global 'EventTarget' class to be available!
3
+ You can polyfill this global by adding this to your code before any partysocket imports:
4
+
5
+ \`\`\`
6
+ import 'partysocket/event-target-polyfill';
7
+ \`\`\`
8
+ Please file an issue at https://github.com/partykit/partykit if you're still having trouble.
9
+ `);var O=class extends Event{constructor(o,e){super("error",e);c(this,"message");c(this,"error");this.message=o.message,this.error=o}},U=class extends Event{constructor(o=1e3,e="",s){super("close",s);c(this,"code");c(this,"reason");c(this,"wasClean",!0);this.code=o,this.reason=e}},S={Event,ErrorEvent:O,CloseEvent:U};function Q(t,o){if(!t)throw new Error(o)}function J(t){return new t.constructor(t.type,t)}function z(t){return"data"in t?new MessageEvent(t.type,t):"code"in t||"reason"in t?new U(t.code||1999,t.reason||"unknown reason",t):"error"in t?new O(t.error,t):new Event(t.type,t)}var P,B=typeof process<"u"&&typeof((P=process.versions)==null?void 0:P.node)<"u"&&typeof document>"u",x=B?z:J,y={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+Math.random()*4e3,minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1},L=!1,H=class g extends EventTarget{constructor(e,s,r={}){super();c(this,"_ws");c(this,"_retryCount",-1);c(this,"_uptimeTimeout");c(this,"_connectTimeout");c(this,"_shouldReconnect",!0);c(this,"_connectLock",!1);c(this,"_binaryType","blob");c(this,"_closeCalled",!1);c(this,"_messageQueue",[]);c(this,"_debugLogger",console.log.bind(console));c(this,"_url");c(this,"_protocols");c(this,"_options");c(this,"onclose",null);c(this,"onerror",null);c(this,"onmessage",null);c(this,"onopen",null);c(this,"_handleOpen",e=>{this._debug("open event");const{minUptime:s=y.minUptime}=this._options;clearTimeout(this._connectTimeout),this._uptimeTimeout=setTimeout(()=>this._acceptOpen(),s),Q(this._ws,"WebSocket is not defined"),this._ws.binaryType=this._binaryType,this._messageQueue.forEach(r=>{var n;return(n=this._ws)==null?void 0:n.send(r)}),this._messageQueue=[],this.onopen&&this.onopen(e),this.dispatchEvent(x(e))});c(this,"_handleMessage",e=>{this._debug("message event"),this.onmessage&&this.onmessage(e),this.dispatchEvent(x(e))});c(this,"_handleError",e=>{this._debug("error event",e.message),this._disconnect(void 0,e.message==="TIMEOUT"?"timeout":void 0),this.onerror&&this.onerror(e),this._debug("exec error listeners"),this.dispatchEvent(x(e)),this._connect()});c(this,"_handleClose",e=>{this._debug("close event"),this._clearTimeouts(),this._shouldReconnect&&this._connect(),this.onclose&&this.onclose(e),this.dispatchEvent(x(e))});this._url=e,this._protocols=s,this._options=r,this._options.startClosed&&(this._shouldReconnect=!1),this._options.debugLogger&&(this._debugLogger=this._options.debugLogger),this._connect()}static get CONNECTING(){return 0}static get OPEN(){return 1}static get CLOSING(){return 2}static get CLOSED(){return 3}get CONNECTING(){return g.CONNECTING}get OPEN(){return g.OPEN}get CLOSING(){return g.CLOSING}get CLOSED(){return g.CLOSED}get binaryType(){return this._ws?this._ws.binaryType:this._binaryType}set binaryType(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)}get retryCount(){return Math.max(this._retryCount,0)}get bufferedAmount(){return this._messageQueue.reduce((s,r)=>(typeof r=="string"?s+=r.length:r instanceof Blob?s+=r.size:s+=r.byteLength,s),0)+(this._ws?this._ws.bufferedAmount:0)}get extensions(){return this._ws?this._ws.extensions:""}get protocol(){return this._ws?this._ws.protocol:""}get readyState(){return this._ws?this._ws.readyState:this._options.startClosed?g.CLOSED:g.CONNECTING}get url(){return this._ws?this._ws.url:""}get shouldReconnect(){return this._shouldReconnect}close(e=1e3,s){if(this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),!this._ws){this._debug("close enqueued: no ws instance");return}if(this._ws.readyState===this.CLOSED){this._debug("close: already closed");return}this._ws.close(e,s)}reconnect(e,s){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,!this._ws||this._ws.readyState===this.CLOSED?this._connect():(this._disconnect(e,s),this._connect())}send(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{const{maxEnqueuedMessages:s=y.maxEnqueuedMessages}=this._options;this._messageQueue.length<s&&(this._debug("enqueue",e),this._messageQueue.push(e))}}_debug(...e){this._options.debug&&this._debugLogger("RWS>",...e)}_getNextDelay(){const{reconnectionDelayGrowFactor:e=y.reconnectionDelayGrowFactor,minReconnectionDelay:s=y.minReconnectionDelay,maxReconnectionDelay:r=y.maxReconnectionDelay}=this._options;let n=0;return this._retryCount>0&&(n=s*Math.pow(e,this._retryCount-1),n>r&&(n=r)),this._debug("next delay",n),n}_wait(){return new Promise(e=>{setTimeout(e,this._getNextDelay())})}_getNextProtocols(e){if(!e)return Promise.resolve(null);if(typeof e=="string"||Array.isArray(e))return Promise.resolve(e);if(typeof e=="function"){const s=e();if(!s)return Promise.resolve(null);if(typeof s=="string"||Array.isArray(s))return Promise.resolve(s);if(s.then)return s}throw Error("Invalid protocols")}_getNextUrl(e){if(typeof e=="string")return Promise.resolve(e);if(typeof e=="function"){const s=e();if(typeof s=="string")return Promise.resolve(s);if(s.then)return s}throw Error("Invalid URL")}_connect(){if(this._connectLock||!this._shouldReconnect)return;this._connectLock=!0;const{maxRetries:e=y.maxRetries,connectionTimeout:s=y.connectionTimeout}=this._options;if(this._retryCount>=e){this._debug("max retries reached",this._retryCount,">=",e);return}this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),this._wait().then(()=>Promise.all([this._getNextUrl(this._url),this._getNextProtocols(this._protocols||null)])).then(([r,n])=>{if(this._closeCalled){this._connectLock=!1;return}!this._options.WebSocket&&typeof WebSocket>"u"&&!L&&(console.error(`‼️ No WebSocket implementation available. You should define options.WebSocket.
10
+
11
+ For example, if you're using node.js, run \`npm install ws\`, and then in your code:
12
+
13
+ import PartySocket from 'partysocket';
14
+ import WS from 'ws';
15
+
16
+ const partysocket = new PartySocket({
17
+ host: "127.0.0.1:1999",
18
+ room: "test-room",
19
+ WebSocket: WS
20
+ });
21
+
22
+ `),L=!0);const d=this._options.WebSocket||WebSocket;this._debug("connect",{url:r,protocols:n}),this._ws=n?new d(r,n):new d(r),this._ws.binaryType=this._binaryType,this._connectLock=!1,this._addListeners(),this._connectTimeout=setTimeout(()=>this._handleTimeout(),s)}).catch(r=>{this._connectLock=!1,this._handleError(new S.ErrorEvent(Error(r.message),this))})}_handleTimeout(){this._debug("timeout event"),this._handleError(new S.ErrorEvent(Error("TIMEOUT"),this))}_disconnect(e=1e3,s){if(this._clearTimeouts(),!!this._ws){this._removeListeners();try{this._ws.close(e,s),this._handleClose(new S.CloseEvent(e,s,this))}catch{}}}_acceptOpen(){this._debug("accept open"),this._retryCount=0}_removeListeners(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))}_addListeners(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))}_clearTimeouts(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)}};/*!
23
+ * Reconnecting WebSocket
24
+ * by Pedro Ladaria <pedro.ladaria@gmail.com>
25
+ * https://github.com/pladaria/reconnecting-websocket
26
+ * License MIT
27
+ */var K=t=>t[1]!==null&&t[1]!==void 0;function Y(){if(typeof crypto<"u"&&crypto.randomUUID)return crypto.randomUUID();let t=new Date().getTime(),o=typeof performance<"u"&&performance.now&&performance.now()*1e3||0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let s=Math.random()*16;return t>0?(s=(t+s)%16|0,t=Math.floor(t/16)):(s=(o+s)%16|0,o=Math.floor(o/16)),(e==="x"?s:s&3|8).toString(16)})}function W(t,o,e={}){const{host:s,path:r,protocol:n,room:d,party:l,prefix:i,query:u}=t;let h=s.replace(/^(http|https|ws|wss):\/\//,"");if(h.endsWith("/")&&(h=h.slice(0,-1)),r&&r.startsWith("/"))throw new Error("path must not start with a slash");const m=l??"main",w=r?`/${r}`:"",_=n||(h.startsWith("localhost:")||h.startsWith("127.0.0.1:")||h.startsWith("192.168.")||h.startsWith("10.")||h.startsWith("172.")&&h.split(".")[1]>="16"&&h.split(".")[1]<="31"||h.startsWith("[::ffff:7f00:1]:")?o:o+"s"),b=`${_}://${h}/${i||`parties/${m}/${d}`}${w}`,f=(k={})=>`${b}?${new URLSearchParams([...Object.entries(e),...Object.entries(k).filter(K)])}`,v=typeof u=="function"?async()=>f(await u()):f(u);return{host:h,path:w,room:d,name:m,protocol:_,partyUrl:b,urlProvider:v}}var X=class extends H{constructor(o){const e=N(o);super(e.urlProvider,e.protocols,e.socketOptions);c(this,"_pk");c(this,"_pkurl");c(this,"name");c(this,"room");c(this,"host");c(this,"path");this.partySocketOptions=o,this.setWSProperties(e)}updateProperties(o){const e=N({...this.partySocketOptions,...o,host:o.host??this.host,room:o.room??this.room,path:o.path??this.path});this._url=e.urlProvider,this._protocols=e.protocols,this._options=e.socketOptions,this.setWSProperties(e)}setWSProperties(o){const{_pk:e,_pkurl:s,name:r,room:n,host:d,path:l}=o;this._pk=e,this._pkurl=s,this.name=r,this.room=n,this.host=d,this.path=l}reconnect(o,e){if(!this.room||!this.host)throw new Error("The room and host must be set before connecting, use `updateProperties` method to set them or pass them to the constructor.");super.reconnect(o,e)}get id(){return this._pk}get roomUrl(){return this._pkurl}static async fetch(o,e){const s=W(o,"http"),r=typeof s.urlProvider=="string"?s.urlProvider:await s.urlProvider();return(o.fetch??fetch)(r,e)}};function N(t){const{id:o,host:e,path:s,party:r,room:n,protocol:d,query:l,protocols:i,...u}=t,h=o||Y(),m=W(t,"ws",{_pk:h});return{_pk:h,_pkurl:m.partyUrl,name:m.name,room:m.room,host:m.host,path:m.path,protocols:i,socketOptions:u,urlProvider:m.urlProvider}}var Z=(t,o)=>{const e=p.useRef(o);e.current=o,p.useEffect(()=>{const s=l=>{var i,u;return(u=(i=e.current)==null?void 0:i.onOpen)==null?void 0:u.call(i,l)},r=l=>{var i,u;return(u=(i=e.current)==null?void 0:i.onMessage)==null?void 0:u.call(i,l)},n=l=>{var i,u;return(u=(i=e.current)==null?void 0:i.onClose)==null?void 0:u.call(i,l)},d=l=>{var i,u;return(u=(i=e.current)==null?void 0:i.onError)==null?void 0:u.call(i,l)};return t.addEventListener("open",s),t.addEventListener("close",n),t.addEventListener("error",d),t.addEventListener("message",r),()=>{t.removeEventListener("open",s),t.removeEventListener("close",n),t.removeEventListener("error",d),t.removeEventListener("message",r)}},[t])},V=t=>[t.startClosed,t.minUptime,t.maxRetries,t.connectionTimeout,t.maxEnqueuedMessages,t.maxReconnectionDelay,t.minReconnectionDelay,t.reconnectionDelayGrowFactor,t.debug];function ee({options:t,createSocket:o,createSocketMemoKey:e}){const s=e(t),r=p.useMemo(()=>t,[s]),[n,d]=p.useState(()=>o({...r,startClosed:!0})),l=p.useRef(null),i=p.useRef(o);return i.current=o,p.useEffect(()=>{if(l.current===n){const u=i.current({...r,startClosed:!1});d(u)}else return!l.current&&r.startClosed!==!0&&n.reconnect(),l.current=n,()=>{n.close()}},[n,r]),n}function te(t){const{host:o,...e}=t,s=ee({options:{host:o||(typeof window<"u"?window.location.host:"dummy-domain.com"),...e},createSocket:r=>new X(r),createSocketMemoKey:r=>JSON.stringify([r.query,r.id,r.host,r.room,r.party,r.path,r.protocol,r.protocols,...V(r)])});return Z(s,t),s}const D=p.createContext(null);function se(){var o;const t=E("root");return((o=t==null?void 0:t.preferences)==null?void 0:o.presence)??null}function re(){const t=E("root");return(t==null?void 0:t.workshopTitle)??null}const oe=a.object({type:a.union([a.literal("problem"),a.literal("solution")]).optional(),exerciseNumber:a.coerce.number().finite(),stepNumber:a.coerce.number().finite().optional()});function ne(t,o){const[e]=p.useState(()=>new Promise(l=>setTimeout(l,o))),s=p.useRef(!0),r=p.useRef(null),n=p.useRef(t);return p.useEffect(()=>{n.current=t},[t]),p.useCallback((...l)=>{const i=Symbol();r.current=i,e.then(()=>{s.current&&r.current===i&&n.current(...l)})},[e])}function ie(t){const o=re(),{userHasAccess:e=!1,userId:s}=E("root")??{},r=F(),n=q(),d=se(),l=E("root"),[i,u]=p.useState((l==null?void 0:l.presence.users)??[]),h=ne(M=>{const C=$.safeParse(JSON.parse(String(M.data)));C.success&&C.data.type==="presence"&&u(C.data.payload.users)},2e3),m=te({host:new URL(G).host,room:R,onMessage:h}),w=oe.safeParse(n),_=w.success?w.data:null,b={workshopTitle:o,origin:r.origin,..._?{exercise:{type:_.type,exerciseNumber:_.exerciseNumber,stepNumber:_.stepNumber}}:null};let f=null;t?d!=null&&d.optOut?f={type:"remove-user",payload:{id:t.id}}:f={type:"add-user",payload:{id:t.id,name:t.name,hasAccess:e,imageUrlSmall:t.imageUrlSmall,imageUrlLarge:t.imageUrlLarge,location:b}}:s!=null&&s.id&&(f={type:"add-user",payload:{id:s.id,location:b}});const v=f?JSON.stringify(f):null;return p.useEffect(()=>{v&&m.send(v)},[v,m]),{users:ae({id:s==null?void 0:s.id,location:b},i)}}function ae(t,o){const{location:e}=t;return o.map(r=>{var l,i,u,h;let n=0;const d=5;return r.hasAccess&&(n+=1),(e==null?void 0:e.workshopTitle)===((l=r.location)==null?void 0:l.workshopTitle)&&(n+=1,(i=e==null?void 0:e.exercise)!=null&&i.exerciseNumber&&e.exercise.exerciseNumber===((h=(u=r.location)==null?void 0:u.exercise)==null?void 0:h.exerciseNumber)&&(n+=1,e.exercise.stepNumber&&e.exercise.stepNumber===r.location.exercise.stepNumber&&(n+=1,e.exercise.type&&e.exercise.type===r.location.exercise.type&&(n+=1)))),{user:r,score:Math.floor(n/d*10)/10}}).sort((r,n)=>r.user.id===(t==null?void 0:t.id)?-1:n.user.id===(t==null?void 0:t.id)?1:r.score===n.score?0:r.score>n.score?-1:1)}function de({user:t,children:o}){return A.jsx(D.Provider,{value:ie(t),children:o})}function pe(){const t=p.useContext(D);if(!t)throw new Error("usePresence must be used within a PresenceProvider");return t}export{de as P,pe as a,se as u};
28
+ //# sourceMappingURL=presence-8FPJKg_8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence-8FPJKg_8.js","sources":["../../../../workshop-presence/src/presence.ts","../../../../../node_modules/partysocket/dist/chunk-4SNNYC7I.mjs","../../../../../node_modules/partysocket/dist/chunk-H3IJA3WK.mjs","../../../../../node_modules/partysocket/dist/chunk-WTCYYULC.mjs","../../../../../node_modules/partysocket/dist/react.mjs","../../../app/utils/presence.tsx"],"sourcesContent":["import { z } from 'zod'\n\nexport const partykitRoom = 'epic-web-presence'\n// export const partykitBaseUrl = `http://127.0.0.1:1999/parties/main/${partykitRoom}`\nexport const partykitBaseUrl = `https://epic-web-presence.kentcdodds.partykit.dev/parties/main/${partykitRoom}`\n\nexport const UserSchema = z.object({\n\tid: z.string(),\n\thasAccess: z.boolean().nullable().optional(),\n\t// TODO: remove the avatarUrl field once people have updated their workshops\n\tavatarUrl: z.string().nullable().optional(),\n\timageUrlSmall: z.string().nullable().optional(),\n\timageUrlLarge: z.string().nullable().optional(),\n\tname: z.string().nullable().optional(),\n\tlocation: z\n\t\t.object({\n\t\t\tworkshopTitle: z.string().nullable().optional(),\n\t\t\torigin: z.string().nullable().optional(),\n\t\t\texercise: z\n\t\t\t\t.object({\n\t\t\t\t\ttype: z\n\t\t\t\t\t\t.union([z.literal('problem'), z.literal('solution')])\n\t\t\t\t\t\t.nullable()\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\texerciseNumber: z.number().nullable().optional(),\n\t\t\t\t\tstepNumber: z.number().nullable().optional(),\n\t\t\t\t})\n\t\t\t\t.nullable()\n\t\t\t\t.optional(),\n\t\t})\n\t\t.nullable()\n\t\t.optional(),\n})\n\nexport const MessageSchema = z\n\t.object({\n\t\ttype: z.literal('remove-user'),\n\t\tpayload: z.object({ id: z.string() }),\n\t})\n\t.or(z.object({ type: z.literal('add-user'), payload: UserSchema }))\n\t.or(\n\t\tz.object({\n\t\t\ttype: z.literal('presence'),\n\t\t\tpayload: z.object({ users: z.array(UserSchema) }),\n\t\t}),\n\t)\n\nexport type Message = z.infer<typeof MessageSchema>\n\nexport type User = z.infer<typeof UserSchema>\n\nexport const PresenceSchema = z.object({ users: z.array(UserSchema) })\n","// src/ws.ts\nif (!globalThis.EventTarget || !globalThis.Event) {\n console.error(`\n PartySocket requires a global 'EventTarget' class to be available!\n You can polyfill this global by adding this to your code before any partysocket imports: \n \n \\`\\`\\`\n import 'partysocket/event-target-polyfill';\n \\`\\`\\`\n Please file an issue at https://github.com/partykit/partykit if you're still having trouble.\n`);\n}\nvar ErrorEvent = class extends Event {\n message;\n error;\n constructor(error, target) {\n super(\"error\", target);\n this.message = error.message;\n this.error = error;\n }\n};\nvar CloseEvent = class extends Event {\n code;\n reason;\n wasClean = true;\n constructor(code = 1e3, reason = \"\", target) {\n super(\"close\", target);\n this.code = code;\n this.reason = reason;\n }\n};\nvar Events = {\n Event,\n ErrorEvent,\n CloseEvent\n};\nfunction assert(condition, msg) {\n if (!condition) {\n throw new Error(msg);\n }\n}\nfunction cloneEventBrowser(e) {\n return new e.constructor(e.type, e);\n}\nfunction cloneEventNode(e) {\n if (\"data\" in e) {\n const evt2 = new MessageEvent(e.type, e);\n return evt2;\n }\n if (\"code\" in e || \"reason\" in e) {\n const evt2 = new CloseEvent(\n // @ts-expect-error we need to fix event/listener types\n e.code || 1999,\n // @ts-expect-error we need to fix event/listener types\n e.reason || \"unknown reason\",\n e\n );\n return evt2;\n }\n if (\"error\" in e) {\n const evt2 = new ErrorEvent(e.error, e);\n return evt2;\n }\n const evt = new Event(e.type, e);\n return evt;\n}\nvar isNode = typeof process !== \"undefined\" && typeof process.versions?.node !== \"undefined\" && typeof document === \"undefined\";\nvar cloneEvent = isNode ? cloneEventNode : cloneEventBrowser;\nvar DEFAULT = {\n maxReconnectionDelay: 1e4,\n minReconnectionDelay: 1e3 + Math.random() * 4e3,\n minUptime: 5e3,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: 4e3,\n maxRetries: Infinity,\n maxEnqueuedMessages: Infinity,\n startClosed: false,\n debug: false\n};\nvar didWarnAboutMissingWebSocket = false;\nvar ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {\n _ws;\n _retryCount = -1;\n _uptimeTimeout;\n _connectTimeout;\n _shouldReconnect = true;\n _connectLock = false;\n _binaryType = \"blob\";\n _closeCalled = false;\n _messageQueue = [];\n _debugLogger = console.log.bind(console);\n _url;\n _protocols;\n _options;\n constructor(url, protocols, options = {}) {\n super();\n this._url = url;\n this._protocols = protocols;\n this._options = options;\n if (this._options.startClosed) {\n this._shouldReconnect = false;\n }\n if (this._options.debugLogger) {\n this._debugLogger = this._options.debugLogger;\n }\n this._connect();\n }\n static get CONNECTING() {\n return 0;\n }\n static get OPEN() {\n return 1;\n }\n static get CLOSING() {\n return 2;\n }\n static get CLOSED() {\n return 3;\n }\n get CONNECTING() {\n return _ReconnectingWebSocket.CONNECTING;\n }\n get OPEN() {\n return _ReconnectingWebSocket.OPEN;\n }\n get CLOSING() {\n return _ReconnectingWebSocket.CLOSING;\n }\n get CLOSED() {\n return _ReconnectingWebSocket.CLOSED;\n }\n get binaryType() {\n return this._ws ? this._ws.binaryType : this._binaryType;\n }\n set binaryType(value) {\n this._binaryType = value;\n if (this._ws) {\n this._ws.binaryType = value;\n }\n }\n /**\n * Returns the number or connection retries\n */\n get retryCount() {\n return Math.max(this._retryCount, 0);\n }\n /**\n * The number of bytes of data that have been queued using calls to send() but not yet\n * transmitted to the network. This value resets to zero once all queued data has been sent.\n * This value does not reset to zero when the connection is closed; if you keep calling send(),\n * this will continue to climb. Read only\n */\n get bufferedAmount() {\n const bytes = this._messageQueue.reduce((acc, message) => {\n if (typeof message === \"string\") {\n acc += message.length;\n } else if (message instanceof Blob) {\n acc += message.size;\n } else {\n acc += message.byteLength;\n }\n return acc;\n }, 0);\n return bytes + (this._ws ? this._ws.bufferedAmount : 0);\n }\n /**\n * The extensions selected by the server. This is currently only the empty string or a list of\n * extensions as negotiated by the connection\n */\n get extensions() {\n return this._ws ? this._ws.extensions : \"\";\n }\n /**\n * A string indicating the name of the sub-protocol the server selected;\n * this will be one of the strings specified in the protocols parameter when creating the\n * WebSocket object\n */\n get protocol() {\n return this._ws ? this._ws.protocol : \"\";\n }\n /**\n * The current state of the connection; this is one of the Ready state constants\n */\n get readyState() {\n if (this._ws) {\n return this._ws.readyState;\n }\n return this._options.startClosed ? _ReconnectingWebSocket.CLOSED : _ReconnectingWebSocket.CONNECTING;\n }\n /**\n * The URL as resolved by the constructor\n */\n get url() {\n return this._ws ? this._ws.url : \"\";\n }\n /**\n * Whether the websocket object is now in reconnectable state\n */\n get shouldReconnect() {\n return this._shouldReconnect;\n }\n /**\n * An event listener to be called when the WebSocket connection's readyState changes to CLOSED\n */\n onclose = null;\n /**\n * An event listener to be called when an error occurs\n */\n onerror = null;\n /**\n * An event listener to be called when a message is received from the server\n */\n onmessage = null;\n /**\n * An event listener to be called when the WebSocket connection's readyState changes to OPEN;\n * this indicates that the connection is ready to send and receive data\n */\n onopen = null;\n /**\n * Closes the WebSocket connection or connection attempt, if any. If the connection is already\n * CLOSED, this method does nothing\n */\n close(code = 1e3, reason) {\n this._closeCalled = true;\n this._shouldReconnect = false;\n this._clearTimeouts();\n if (!this._ws) {\n this._debug(\"close enqueued: no ws instance\");\n return;\n }\n if (this._ws.readyState === this.CLOSED) {\n this._debug(\"close: already closed\");\n return;\n }\n this._ws.close(code, reason);\n }\n /**\n * Closes the WebSocket connection or connection attempt and connects again.\n * Resets retry counter;\n */\n reconnect(code, reason) {\n this._shouldReconnect = true;\n this._closeCalled = false;\n this._retryCount = -1;\n if (!this._ws || this._ws.readyState === this.CLOSED) {\n this._connect();\n } else {\n this._disconnect(code, reason);\n this._connect();\n }\n }\n /**\n * Enqueue specified data to be transmitted to the server over the WebSocket connection\n */\n send(data) {\n if (this._ws && this._ws.readyState === this.OPEN) {\n this._debug(\"send\", data);\n this._ws.send(data);\n } else {\n const { maxEnqueuedMessages = DEFAULT.maxEnqueuedMessages } = this._options;\n if (this._messageQueue.length < maxEnqueuedMessages) {\n this._debug(\"enqueue\", data);\n this._messageQueue.push(data);\n }\n }\n }\n _debug(...args) {\n if (this._options.debug) {\n this._debugLogger(\"RWS>\", ...args);\n }\n }\n _getNextDelay() {\n const {\n reconnectionDelayGrowFactor = DEFAULT.reconnectionDelayGrowFactor,\n minReconnectionDelay = DEFAULT.minReconnectionDelay,\n maxReconnectionDelay = DEFAULT.maxReconnectionDelay\n } = this._options;\n let delay = 0;\n if (this._retryCount > 0) {\n delay = minReconnectionDelay * Math.pow(reconnectionDelayGrowFactor, this._retryCount - 1);\n if (delay > maxReconnectionDelay) {\n delay = maxReconnectionDelay;\n }\n }\n this._debug(\"next delay\", delay);\n return delay;\n }\n _wait() {\n return new Promise((resolve) => {\n setTimeout(resolve, this._getNextDelay());\n });\n }\n _getNextProtocols(protocolsProvider) {\n if (!protocolsProvider) return Promise.resolve(null);\n if (typeof protocolsProvider === \"string\" || Array.isArray(protocolsProvider)) {\n return Promise.resolve(protocolsProvider);\n }\n if (typeof protocolsProvider === \"function\") {\n const protocols = protocolsProvider();\n if (!protocols) return Promise.resolve(null);\n if (typeof protocols === \"string\" || Array.isArray(protocols)) {\n return Promise.resolve(protocols);\n }\n if (protocols.then) {\n return protocols;\n }\n }\n throw Error(\"Invalid protocols\");\n }\n _getNextUrl(urlProvider) {\n if (typeof urlProvider === \"string\") {\n return Promise.resolve(urlProvider);\n }\n if (typeof urlProvider === \"function\") {\n const url = urlProvider();\n if (typeof url === \"string\") {\n return Promise.resolve(url);\n }\n if (url.then) {\n return url;\n }\n }\n throw Error(\"Invalid URL\");\n }\n _connect() {\n if (this._connectLock || !this._shouldReconnect) {\n return;\n }\n this._connectLock = true;\n const {\n maxRetries = DEFAULT.maxRetries,\n connectionTimeout = DEFAULT.connectionTimeout\n } = this._options;\n if (this._retryCount >= maxRetries) {\n this._debug(\"max retries reached\", this._retryCount, \">=\", maxRetries);\n return;\n }\n this._retryCount++;\n this._debug(\"connect\", this._retryCount);\n this._removeListeners();\n this._wait().then(\n () => Promise.all([\n this._getNextUrl(this._url),\n this._getNextProtocols(this._protocols || null)\n ])\n ).then(([url, protocols]) => {\n if (this._closeCalled) {\n this._connectLock = false;\n return;\n }\n if (!this._options.WebSocket && typeof WebSocket === \"undefined\" && !didWarnAboutMissingWebSocket) {\n console.error(`\\u203C\\uFE0F No WebSocket implementation available. You should define options.WebSocket. \n\nFor example, if you're using node.js, run \\`npm install ws\\`, and then in your code:\n\nimport PartySocket from 'partysocket';\nimport WS from 'ws';\n\nconst partysocket = new PartySocket({\n host: \"127.0.0.1:1999\",\n room: \"test-room\",\n WebSocket: WS\n});\n\n`);\n didWarnAboutMissingWebSocket = true;\n }\n const WS = this._options.WebSocket || WebSocket;\n this._debug(\"connect\", { url, protocols });\n this._ws = protocols ? new WS(url, protocols) : new WS(url);\n this._ws.binaryType = this._binaryType;\n this._connectLock = false;\n this._addListeners();\n this._connectTimeout = setTimeout(\n () => this._handleTimeout(),\n connectionTimeout\n );\n }).catch((err) => {\n this._connectLock = false;\n this._handleError(new Events.ErrorEvent(Error(err.message), this));\n });\n }\n _handleTimeout() {\n this._debug(\"timeout event\");\n this._handleError(new Events.ErrorEvent(Error(\"TIMEOUT\"), this));\n }\n _disconnect(code = 1e3, reason) {\n this._clearTimeouts();\n if (!this._ws) {\n return;\n }\n this._removeListeners();\n try {\n this._ws.close(code, reason);\n this._handleClose(new Events.CloseEvent(code, reason, this));\n } catch (error) {\n }\n }\n _acceptOpen() {\n this._debug(\"accept open\");\n this._retryCount = 0;\n }\n _handleOpen = (event) => {\n this._debug(\"open event\");\n const { minUptime = DEFAULT.minUptime } = this._options;\n clearTimeout(this._connectTimeout);\n this._uptimeTimeout = setTimeout(() => this._acceptOpen(), minUptime);\n assert(this._ws, \"WebSocket is not defined\");\n this._ws.binaryType = this._binaryType;\n this._messageQueue.forEach((message) => this._ws?.send(message));\n this._messageQueue = [];\n if (this.onopen) {\n this.onopen(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _handleMessage = (event) => {\n this._debug(\"message event\");\n if (this.onmessage) {\n this.onmessage(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _handleError = (event) => {\n this._debug(\"error event\", event.message);\n this._disconnect(\n void 0,\n event.message === \"TIMEOUT\" ? \"timeout\" : void 0\n );\n if (this.onerror) {\n this.onerror(event);\n }\n this._debug(\"exec error listeners\");\n this.dispatchEvent(cloneEvent(event));\n this._connect();\n };\n _handleClose = (event) => {\n this._debug(\"close event\");\n this._clearTimeouts();\n if (this._shouldReconnect) {\n this._connect();\n }\n if (this.onclose) {\n this.onclose(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _removeListeners() {\n if (!this._ws) {\n return;\n }\n this._debug(\"removeListeners\");\n this._ws.removeEventListener(\"open\", this._handleOpen);\n this._ws.removeEventListener(\"close\", this._handleClose);\n this._ws.removeEventListener(\"message\", this._handleMessage);\n this._ws.removeEventListener(\"error\", this._handleError);\n }\n _addListeners() {\n if (!this._ws) {\n return;\n }\n this._debug(\"addListeners\");\n this._ws.addEventListener(\"open\", this._handleOpen);\n this._ws.addEventListener(\"close\", this._handleClose);\n this._ws.addEventListener(\"message\", this._handleMessage);\n this._ws.addEventListener(\"error\", this._handleError);\n }\n _clearTimeouts() {\n clearTimeout(this._connectTimeout);\n clearTimeout(this._uptimeTimeout);\n }\n};\n\nexport {\n ErrorEvent,\n CloseEvent,\n ReconnectingWebSocket\n};\n/*!\n * Reconnecting WebSocket\n * by Pedro Ladaria <pedro.ladaria@gmail.com>\n * https://github.com/pladaria/reconnecting-websocket\n * License MIT\n */\n","import {\n ReconnectingWebSocket\n} from \"./chunk-4SNNYC7I.mjs\";\n\n// src/index.ts\nvar valueIsNotNil = (keyValuePair) => keyValuePair[1] !== null && keyValuePair[1] !== void 0;\nfunction generateUUID() {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n let d = (/* @__PURE__ */ new Date()).getTime();\n let d2 = typeof performance !== \"undefined\" && performance.now && performance.now() * 1e3 || 0;\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n let r = Math.random() * 16;\n if (d > 0) {\n r = (d + r) % 16 | 0;\n d = Math.floor(d / 16);\n } else {\n r = (d2 + r) % 16 | 0;\n d2 = Math.floor(d2 / 16);\n }\n return (c === \"x\" ? r : r & 3 | 8).toString(16);\n });\n}\nfunction getPartyInfo(partySocketOptions, defaultProtocol, defaultParams = {}) {\n const {\n host: rawHost,\n path: rawPath,\n protocol: rawProtocol,\n room,\n party,\n prefix,\n query\n } = partySocketOptions;\n let host = rawHost.replace(/^(http|https|ws|wss):\\/\\//, \"\");\n if (host.endsWith(\"/\")) {\n host = host.slice(0, -1);\n }\n if (rawPath && rawPath.startsWith(\"/\")) {\n throw new Error(\"path must not start with a slash\");\n }\n const name = party ?? \"main\";\n const path = rawPath ? `/${rawPath}` : \"\";\n const protocol = rawProtocol || (host.startsWith(\"localhost:\") || host.startsWith(\"127.0.0.1:\") || host.startsWith(\"192.168.\") || host.startsWith(\"10.\") || host.startsWith(\"172.\") && host.split(\".\")[1] >= \"16\" && host.split(\".\")[1] <= \"31\" || host.startsWith(\"[::ffff:7f00:1]:\") ? (\n // http / ws\n defaultProtocol\n ) : (\n // https / wss\n defaultProtocol + \"s\"\n ));\n const baseUrl = `${protocol}://${host}/${prefix || `parties/${name}/${room}`}${path}`;\n const makeUrl = (query2 = {}) => `${baseUrl}?${new URLSearchParams([\n ...Object.entries(defaultParams),\n ...Object.entries(query2).filter(valueIsNotNil)\n ])}`;\n const urlProvider = typeof query === \"function\" ? async () => makeUrl(await query()) : makeUrl(query);\n return {\n host,\n path,\n room,\n name,\n protocol,\n partyUrl: baseUrl,\n urlProvider\n };\n}\nvar PartySocket = class extends ReconnectingWebSocket {\n constructor(partySocketOptions) {\n const wsOptions = getWSOptions(partySocketOptions);\n super(wsOptions.urlProvider, wsOptions.protocols, wsOptions.socketOptions);\n this.partySocketOptions = partySocketOptions;\n this.setWSProperties(wsOptions);\n }\n _pk;\n _pkurl;\n name;\n room;\n host;\n path;\n updateProperties(partySocketOptions) {\n const wsOptions = getWSOptions({\n ...this.partySocketOptions,\n ...partySocketOptions,\n host: partySocketOptions.host ?? this.host,\n room: partySocketOptions.room ?? this.room,\n path: partySocketOptions.path ?? this.path\n });\n this._url = wsOptions.urlProvider;\n this._protocols = wsOptions.protocols;\n this._options = wsOptions.socketOptions;\n this.setWSProperties(wsOptions);\n }\n setWSProperties(wsOptions) {\n const { _pk, _pkurl, name, room, host, path } = wsOptions;\n this._pk = _pk;\n this._pkurl = _pkurl;\n this.name = name;\n this.room = room;\n this.host = host;\n this.path = path;\n }\n reconnect(code, reason) {\n if (!this.room || !this.host) {\n throw new Error(\n \"The room and host must be set before connecting, use `updateProperties` method to set them or pass them to the constructor.\"\n );\n }\n super.reconnect(code, reason);\n }\n get id() {\n return this._pk;\n }\n /**\n * Exposes the static PartyKit room URL without applying query parameters.\n * To access the currently connected WebSocket url, use PartySocket#url.\n */\n get roomUrl() {\n return this._pkurl;\n }\n // a `fetch` method that uses (almost) the same options as `PartySocket`\n static async fetch(options, init) {\n const party = getPartyInfo(options, \"http\");\n const url = typeof party.urlProvider === \"string\" ? party.urlProvider : await party.urlProvider();\n const doFetch = options.fetch ?? fetch;\n return doFetch(url, init);\n }\n};\nfunction getWSOptions(partySocketOptions) {\n const {\n id,\n host: _host,\n path: _path,\n party: _party,\n room: _room,\n protocol: _protocol,\n query: _query,\n protocols,\n ...socketOptions\n } = partySocketOptions;\n const _pk = id || generateUUID();\n const party = getPartyInfo(partySocketOptions, \"ws\", { _pk });\n return {\n _pk,\n _pkurl: party.partyUrl,\n name: party.name,\n room: party.room,\n host: party.host,\n path: party.path,\n protocols,\n socketOptions,\n urlProvider: party.urlProvider\n };\n}\n\nexport {\n PartySocket\n};\n","import {\n ReconnectingWebSocket\n} from \"./chunk-4SNNYC7I.mjs\";\n\n// src/use-handlers.ts\nimport { useEffect, useRef } from \"react\";\nvar useAttachWebSocketEventHandlers = (socket, options) => {\n const handlersRef = useRef(options);\n handlersRef.current = options;\n useEffect(() => {\n const onOpen = (event) => handlersRef.current?.onOpen?.(event);\n const onMessage = (event) => handlersRef.current?.onMessage?.(event);\n const onClose = (event) => handlersRef.current?.onClose?.(event);\n const onError = (event) => handlersRef.current?.onError?.(event);\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"close\", onClose);\n socket.addEventListener(\"error\", onError);\n socket.addEventListener(\"message\", onMessage);\n return () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"close\", onClose);\n socket.removeEventListener(\"error\", onError);\n socket.removeEventListener(\"message\", onMessage);\n };\n }, [socket]);\n};\n\n// src/use-socket.ts\nimport { useEffect as useEffect2, useMemo, useRef as useRef2, useState } from \"react\";\nvar getOptionsThatShouldCauseRestartWhenChanged = (options) => [\n options.startClosed,\n options.minUptime,\n options.maxRetries,\n options.connectionTimeout,\n options.maxEnqueuedMessages,\n options.maxReconnectionDelay,\n options.minReconnectionDelay,\n options.reconnectionDelayGrowFactor,\n options.debug\n];\nfunction useStableSocket({\n options,\n createSocket,\n createSocketMemoKey: createOptionsMemoKey\n}) {\n const shouldReconnect = createOptionsMemoKey(options);\n const socketOptions = useMemo(() => {\n return options;\n }, [shouldReconnect]);\n const [socket, setSocket] = useState(\n () => (\n // only connect on first mount\n createSocket({ ...socketOptions, startClosed: true })\n )\n );\n const socketInitializedRef = useRef2(null);\n const createSocketRef = useRef2(createSocket);\n createSocketRef.current = createSocket;\n useEffect2(() => {\n if (socketInitializedRef.current === socket) {\n const newSocket = createSocketRef.current({\n ...socketOptions,\n // when reconnecting because of options change, we always reconnect\n // (startClosed only applies to initial mount)\n startClosed: false\n });\n setSocket(newSocket);\n } else {\n if (!socketInitializedRef.current && socketOptions.startClosed !== true) {\n socket.reconnect();\n }\n socketInitializedRef.current = socket;\n return () => {\n socket.close();\n };\n }\n }, [socket, socketOptions]);\n return socket;\n}\n\n// src/use-ws.ts\nfunction useWebSocket(url, protocols, options = {}) {\n const socket = useStableSocket({\n options,\n createSocket: (options2) => new ReconnectingWebSocket(url, protocols, options2),\n createSocketMemoKey: (options2) => JSON.stringify([\n // will reconnect if url or protocols are specified as a string.\n // if they are functions, the WebSocket will handle reconnection\n url,\n protocols,\n ...getOptionsThatShouldCauseRestartWhenChanged(options2)\n ])\n });\n useAttachWebSocketEventHandlers(socket, options);\n return socket;\n}\n\nexport {\n useAttachWebSocketEventHandlers,\n getOptionsThatShouldCauseRestartWhenChanged,\n useStableSocket,\n useWebSocket\n};\n","import {\n PartySocket\n} from \"./chunk-H3IJA3WK.mjs\";\nimport {\n getOptionsThatShouldCauseRestartWhenChanged,\n useAttachWebSocketEventHandlers,\n useStableSocket,\n useWebSocket\n} from \"./chunk-WTCYYULC.mjs\";\nimport \"./chunk-4SNNYC7I.mjs\";\n\n// src/react.ts\nfunction usePartySocket(options) {\n const { host, ...otherOptions } = options;\n const socket = useStableSocket({\n options: {\n host: host || (typeof window !== \"undefined\" ? window.location.host : \"dummy-domain.com\"),\n ...otherOptions\n },\n createSocket: (options2) => new PartySocket(options2),\n createSocketMemoKey: (options2) => JSON.stringify([\n // NOTE: if query is defined as a function, the socket\n // won't reconnect when you change the function identity\n options2.query,\n options2.id,\n options2.host,\n options2.room,\n options2.party,\n options2.path,\n options2.protocol,\n options2.protocols,\n ...getOptionsThatShouldCauseRestartWhenChanged(options2)\n ])\n });\n useAttachWebSocketEventHandlers(socket, options);\n return socket;\n}\nexport {\n usePartySocket as default,\n usePartySocket,\n useWebSocket\n};\n","import {\n\tMessageSchema,\n\tpartykitBaseUrl,\n\tpartykitRoom,\n\ttype Message,\n\ttype User,\n} from '@epic-web/workshop-presence/presence'\nimport { useParams, useRouteLoaderData } from '@remix-run/react'\nimport { usePartySocket } from 'partysocket/react'\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n} from 'react'\nimport { z } from 'zod'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { useRequestInfo } from './request-info.ts'\n\nexport * from '@epic-web/workshop-presence/presence'\n\nconst PresenceContext = createContext<ReturnType<\n\ttypeof usePresenceSocket\n> | null>(null)\n\nexport function usePresencePreferences() {\n\tconst data = useRouteLoaderData<typeof rootLoader>('root')\n\treturn data?.preferences?.presence ?? null\n}\n\nexport function useOptionalWorkshopTitle() {\n\tconst data = useRouteLoaderData<typeof rootLoader>('root')\n\treturn data?.workshopTitle ?? null\n}\n\nconst ExerciseAppParamsSchema = z.object({\n\ttype: z.union([z.literal('problem'), z.literal('solution')]).optional(),\n\texerciseNumber: z.coerce.number().finite(),\n\tstepNumber: z.coerce.number().finite().optional(),\n})\n\n/**\n * useFirstCallDelayedCallback\n *\n * This hook creates a callback that is delayed on its first call.\n * It's useful for scenarios where you want to delay the execution of a function\n * for a certain amount of time, but only on the initial call.\n *\n * If it's called again before the delay expires, then the prior call is ignored\n * and when the delay expires, the latest call is executed.\n *\n * The motivation here is that the server may get one set of presence and by the\n * time it shows up on the client it's stale. This delays the re-rendering of\n * the UI to avoid a flicker as soon as you land on the page.\n *\n * @param cb The callback function to be delayed\n * @param delay The delay in milliseconds before the callback is executed\n * @returns A new function that wraps the original callback with the delay logic\n */\nfunction useFirstCallDelayedCallback<Args extends unknown[]>(\n\tcb: (...args: Args) => void,\n\tdelay: number,\n) {\n\tconst [timedPromise] = useState(\n\t\t() => new Promise((resolve) => setTimeout(resolve, delay)),\n\t)\n\tconst mounted = useRef(true)\n\tconst currentCallRef = useRef<symbol | null>(null)\n\tconst lastCbRef = useRef(cb)\n\n\tuseEffect(() => {\n\t\tlastCbRef.current = cb\n\t}, [cb])\n\n\tconst delayedCb = useCallback(\n\t\t(...args: Args) => {\n\t\t\tconst thisOne = Symbol()\n\t\t\tcurrentCallRef.current = thisOne\n\t\t\tvoid timedPromise.then(() => {\n\t\t\t\tif (!mounted.current) return\n\t\t\t\tif (currentCallRef.current !== thisOne) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlastCbRef.current(...args)\n\t\t\t})\n\t\t},\n\t\t[timedPromise],\n\t)\n\n\treturn delayedCb\n}\n\nexport function usePresenceSocket(user?: User | null) {\n\tconst workshopTitle = useOptionalWorkshopTitle()\n\tconst { userHasAccess = false, userId } =\n\t\tuseRouteLoaderData<typeof rootLoader>('root') ?? {}\n\tconst requestInfo = useRequestInfo()\n\tconst rawParams = useParams()\n\tconst prefs = usePresencePreferences()\n\tconst data = useRouteLoaderData<typeof rootLoader>('root')\n\tconst [users, setUsers] = useState(data?.presence.users ?? [])\n\n\tconst handleMessage = useFirstCallDelayedCallback((evt: MessageEvent) => {\n\t\tconst messageResult = MessageSchema.safeParse(JSON.parse(String(evt.data)))\n\t\tif (!messageResult.success) return\n\t\tif (messageResult.data.type === 'presence') {\n\t\t\tsetUsers(messageResult.data.payload.users)\n\t\t}\n\t}, 2000)\n\n\tconst socket = usePartySocket({\n\t\thost: new URL(partykitBaseUrl).host,\n\t\troom: partykitRoom,\n\t\tonMessage: handleMessage,\n\t})\n\n\tconst paramsResult = ExerciseAppParamsSchema.safeParse(rawParams)\n\tconst params = paramsResult.success ? paramsResult.data : null\n\tconst location = {\n\t\tworkshopTitle,\n\t\torigin: requestInfo.origin,\n\t\t...(params\n\t\t\t? {\n\t\t\t\t\texercise: {\n\t\t\t\t\t\ttype: params.type,\n\t\t\t\t\t\texerciseNumber: params.exerciseNumber,\n\t\t\t\t\t\tstepNumber: params.stepNumber,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: null),\n\t} satisfies User['location']\n\n\tlet message: Message | null = null\n\tif (user) {\n\t\tif (prefs?.optOut) {\n\t\t\tmessage = { type: 'remove-user', payload: { id: user.id } }\n\t\t} else {\n\t\t\tmessage = {\n\t\t\t\ttype: 'add-user',\n\t\t\t\tpayload: {\n\t\t\t\t\tid: user.id,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\thasAccess: userHasAccess,\n\t\t\t\t\timageUrlSmall: user.imageUrlSmall,\n\t\t\t\t\timageUrlLarge: user.imageUrlLarge,\n\t\t\t\t\tlocation,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t} else if (userId?.id) {\n\t\tmessage = { type: 'add-user', payload: { id: userId.id, location } }\n\t}\n\n\tconst messageJson = message ? JSON.stringify(message) : null\n\tuseEffect(() => {\n\t\tif (messageJson) socket.send(messageJson)\n\t}, [messageJson, socket])\n\n\tconst scoredUsers = scoreUsers({ id: userId?.id, location }, users)\n\n\treturn { users: scoredUsers }\n}\n\nfunction scoreUsers(\n\tuser: { id?: string | null; location: User['location'] },\n\tusers: Array<User>,\n) {\n\tconst { location } = user\n\tconst scoredUsers = users.map((user) => {\n\t\tlet score = 0\n\t\tconst available = 5\n\t\tif (user.hasAccess) {\n\t\t\tscore += 1\n\t\t}\n\t\tif (location?.workshopTitle === user.location?.workshopTitle) {\n\t\t\tscore += 1\n\t\t\tif (\n\t\t\t\tlocation?.exercise?.exerciseNumber &&\n\t\t\t\tlocation.exercise.exerciseNumber ===\n\t\t\t\t\tuser.location?.exercise?.exerciseNumber\n\t\t\t) {\n\t\t\t\tscore += 1\n\t\t\t\tif (\n\t\t\t\t\tlocation.exercise.stepNumber &&\n\t\t\t\t\tlocation.exercise.stepNumber === user.location.exercise.stepNumber\n\t\t\t\t) {\n\t\t\t\t\tscore += 1\n\t\t\t\t\tif (\n\t\t\t\t\t\tlocation.exercise.type &&\n\t\t\t\t\t\tlocation.exercise.type === user.location.exercise.type\n\t\t\t\t\t) {\n\t\t\t\t\t\tscore += 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { user, score: Math.floor((score / available) * 10) / 10 }\n\t})\n\treturn scoredUsers.sort((a, b) => {\n\t\tif (a.user.id === user?.id) return -1\n\t\tif (b.user.id === user?.id) return 1\n\t\tif (a.score === b.score) return 0\n\t\treturn a.score > b.score ? -1 : 1\n\t})\n}\n\nexport function Presence({\n\tuser,\n\tchildren,\n}: {\n\tuser?: User | null\n\tchildren: React.ReactNode\n}) {\n\treturn (\n\t\t<PresenceContext.Provider value={usePresenceSocket(user)}>\n\t\t\t{children}\n\t\t</PresenceContext.Provider>\n\t)\n}\n\nexport function usePresence() {\n\tconst presence = useContext(PresenceContext)\n\tif (!presence) {\n\t\tthrow new Error('usePresence must be used within a PresenceProvider')\n\t}\n\treturn presence\n}\n"],"names":["partykitRoom","partykitBaseUrl","UserSchema","z","MessageSchema","ErrorEvent","error","target","__publicField","CloseEvent","code","reason","Events","assert","condition","msg","cloneEventBrowser","e","cloneEventNode","isNode","_a","cloneEvent","DEFAULT","didWarnAboutMissingWebSocket","ReconnectingWebSocket","_ReconnectingWebSocket","url","protocols","options","event","minUptime","message","value","acc","data","maxEnqueuedMessages","args","reconnectionDelayGrowFactor","minReconnectionDelay","maxReconnectionDelay","delay","resolve","protocolsProvider","urlProvider","maxRetries","connectionTimeout","WS","err","valueIsNotNil","keyValuePair","generateUUID","d","d2","c","r","getPartyInfo","partySocketOptions","defaultProtocol","defaultParams","rawHost","rawPath","rawProtocol","room","party","prefix","query","host","name","path","protocol","baseUrl","makeUrl","query2","PartySocket","wsOptions","getWSOptions","_pk","_pkurl","init","id","_host","_path","_party","_room","_protocol","_query","socketOptions","useAttachWebSocketEventHandlers","socket","handlersRef","useRef","useEffect","onOpen","_b","onMessage","onClose","onError","getOptionsThatShouldCauseRestartWhenChanged","useStableSocket","createSocket","createOptionsMemoKey","shouldReconnect","useMemo","setSocket","useState","socketInitializedRef","useRef2","createSocketRef","useEffect2","newSocket","usePartySocket","otherOptions","options2","PresenceContext","createContext","usePresencePreferences","useRouteLoaderData","useOptionalWorkshopTitle","ExerciseAppParamsSchema","useFirstCallDelayedCallback","cb","timedPromise","mounted","currentCallRef","lastCbRef","useCallback","thisOne","usePresenceSocket","user","workshopTitle","userHasAccess","userId","requestInfo","useRequestInfo","rawParams","useParams","prefs","users","setUsers","handleMessage","evt","messageResult","paramsResult","params","location","messageJson","scoreUsers","score","available","a","b","Presence","children","jsx","usePresence","presence","useContext"],"mappings":"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","x_google_ignoreList":[1,2,3,4]}