From 1d8487b80c8e13de8040edb560e79642defa160f Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 1 Apr 2026 11:43:53 -0400 Subject: [PATCH 1/4] update fields and fill entries --- frontend/dist/assets/index-BN5M8IzP.js | 199 ----- frontend/dist/assets/index-BRkoL4m2.js | 199 +++++ frontend/dist/assets/index-Cw0xPReC.css | 1 - frontend/dist/assets/index-D0VB5yOL.css | 1 + frontend/dist/data/reproinventory_data.json | 749 +++++++++++++----- frontend/dist/index.html | 4 +- frontend/public/data/reproinventory_data.json | 708 ++++++++++++----- frontend/src/components/AddMaterialDialog.tsx | 37 +- .../src/components/EditMaterialDialog.tsx | 57 +- frontend/src/training-materials-browser.tsx | 60 +- frontend/src/types/reproinventory.ts | 8 +- model/model.yaml | 14 +- model/reproinventory_data.yaml | 600 ++++++++++---- 13 files changed, 1745 insertions(+), 892 deletions(-) delete mode 100644 frontend/dist/assets/index-BN5M8IzP.js create mode 100644 frontend/dist/assets/index-BRkoL4m2.js delete mode 100644 frontend/dist/assets/index-Cw0xPReC.css create mode 100644 frontend/dist/assets/index-D0VB5yOL.css diff --git a/frontend/dist/assets/index-BN5M8IzP.js b/frontend/dist/assets/index-BN5M8IzP.js deleted file mode 100644 index e2a81e2..0000000 --- a/frontend/dist/assets/index-BN5M8IzP.js +++ /dev/null @@ -1,199 +0,0 @@ -function f0(a,r){for(var s=0;sc[f]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const v of d.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&c(v)}).observe(document,{childList:!0,subtree:!0});function s(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=s(f);fetch(f.href,d)}})();function cv(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var mu={exports:{}},Yi={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var pg;function d0(){if(pg)return Yi;pg=1;var a=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function s(c,f,d){var v=null;if(d!==void 0&&(v=""+d),f.key!==void 0&&(v=""+f.key),"key"in f){d={};for(var p in f)p!=="key"&&(d[p]=f[p])}else d=f;return f=d.ref,{$$typeof:a,type:c,key:v,ref:f!==void 0?f:null,props:d}}return Yi.Fragment=r,Yi.jsx=s,Yi.jsxs=s,Yi}var yg;function m0(){return yg||(yg=1,mu.exports=d0()),mu.exports}var u=m0(),hu={exports:{}},Se={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var xg;function h0(){if(xg)return Se;xg=1;var a=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),v=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),m=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),b=Symbol.iterator;function w(A){return A===null||typeof A!="object"?null:(A=b&&A[b]||A["@@iterator"],typeof A=="function"?A:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},M=Object.assign,N={};function T(A,Y,W){this.props=A,this.context=Y,this.refs=N,this.updater=W||_}T.prototype.isReactComponent={},T.prototype.setState=function(A,Y){if(typeof A!="object"&&typeof A!="function"&&A!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,A,Y,"setState")},T.prototype.forceUpdate=function(A){this.updater.enqueueForceUpdate(this,A,"forceUpdate")};function z(){}z.prototype=T.prototype;function j(A,Y,W){this.props=A,this.context=Y,this.refs=N,this.updater=W||_}var U=j.prototype=new z;U.constructor=j,M(U,T.prototype),U.isPureReactComponent=!0;var q=Array.isArray,G={H:null,A:null,T:null,S:null,V:null},J=Object.prototype.hasOwnProperty;function F(A,Y,W,P,I,ye){return W=ye.ref,{$$typeof:a,type:A,key:Y,ref:W!==void 0?W:null,props:ye}}function X(A,Y){return F(A.type,Y,void 0,void 0,void 0,A.props)}function ie(A){return typeof A=="object"&&A!==null&&A.$$typeof===a}function me(A){var Y={"=":"=0",":":"=2"};return"$"+A.replace(/[=:]/g,function(W){return Y[W]})}var xe=/\/+/g;function ue(A,Y){return typeof A=="object"&&A!==null&&A.key!=null?me(""+A.key):Y.toString(36)}function be(){}function ve(A){switch(A.status){case"fulfilled":return A.value;case"rejected":throw A.reason;default:switch(typeof A.status=="string"?A.then(be,be):(A.status="pending",A.then(function(Y){A.status==="pending"&&(A.status="fulfilled",A.value=Y)},function(Y){A.status==="pending"&&(A.status="rejected",A.reason=Y)})),A.status){case"fulfilled":return A.value;case"rejected":throw A.reason}}throw A}function de(A,Y,W,P,I){var ye=typeof A;(ye==="undefined"||ye==="boolean")&&(A=null);var ce=!1;if(A===null)ce=!0;else switch(ye){case"bigint":case"string":case"number":ce=!0;break;case"object":switch(A.$$typeof){case a:case r:ce=!0;break;case g:return ce=A._init,de(ce(A._payload),Y,W,P,I)}}if(ce)return I=I(A),ce=P===""?"."+ue(A,0):P,q(I)?(W="",ce!=null&&(W=ce.replace(xe,"$&/")+"/"),de(I,Y,W,"",function(De){return De})):I!=null&&(ie(I)&&(I=X(I,W+(I.key==null||A&&A.key===I.key?"":(""+I.key).replace(xe,"$&/")+"/")+ce)),Y.push(I)),1;ce=0;var ee=P===""?".":P+":";if(q(A))for(var oe=0;oe>>1,A=R[re];if(0>>1;ref(P,B))If(ye,P)?(R[re]=ye,R[I]=B,re=I):(R[re]=P,R[W]=B,re=W);else if(If(ye,B))R[re]=ye,R[I]=B,re=I;else break e}}return K}function f(R,K){var B=R.sortIndex-K.sortIndex;return B!==0?B:R.id-K.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var v=Date,p=v.now();a.unstable_now=function(){return v.now()-p}}var x=[],m=[],g=1,b=null,w=3,_=!1,M=!1,N=!1,T=!1,z=typeof setTimeout=="function"?setTimeout:null,j=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;function q(R){for(var K=s(m);K!==null;){if(K.callback===null)c(m);else if(K.startTime<=R)c(m),K.sortIndex=K.expirationTime,r(x,K);else break;K=s(m)}}function G(R){if(N=!1,q(R),!M)if(s(x)!==null)M=!0,J||(J=!0,ue());else{var K=s(m);K!==null&&de(G,K.startTime-R)}}var J=!1,F=-1,X=5,ie=-1;function me(){return T?!0:!(a.unstable_now()-ieR&&me());){var re=b.callback;if(typeof re=="function"){b.callback=null,w=b.priorityLevel;var A=re(b.expirationTime<=R);if(R=a.unstable_now(),typeof A=="function"){b.callback=A,q(R),K=!0;break t}b===s(x)&&c(x),q(R)}else c(x);b=s(x)}if(b!==null)K=!0;else{var Y=s(m);Y!==null&&de(G,Y.startTime-R),K=!1}}break e}finally{b=null,w=B,_=!1}K=void 0}}finally{K?ue():J=!1}}}var ue;if(typeof U=="function")ue=function(){U(xe)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,ve=be.port2;be.port1.onmessage=xe,ue=function(){ve.postMessage(null)}}else ue=function(){z(xe,0)};function de(R,K){F=z(function(){R(a.unstable_now())},K)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(R){R.callback=null},a.unstable_forceFrameRate=function(R){0>R||125re?(R.sortIndex=B,r(m,R),s(x)===null&&R===s(m)&&(N?(j(F),F=-1):N=!0,de(G,B-re))):(R.sortIndex=A,r(x,R),M||_||(M=!0,J||(J=!0,ue()))),R},a.unstable_shouldYield=me,a.unstable_wrapCallback=function(R){var K=w;return function(){var B=w;w=K;try{return R.apply(this,arguments)}finally{w=B}}}}(pu)),pu}var wg;function v0(){return wg||(wg=1,vu.exports=g0()),vu.exports}var yu={exports:{}},Nt={};/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ng;function p0(){if(Ng)return Nt;Ng=1;var a=Ju();function r(x){var m="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),yu.exports=p0(),yu.exports}/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ag;function y0(){if(Ag)return Xi;Ag=1;var a=v0(),r=Ju(),s=ov();function c(e){var t="https://react.dev/errors/"+e;if(1A||(e.current=re[A],re[A]=null,A--)}function P(e,t){A++,re[A]=e.current,e.current=t}var I=Y(null),ye=Y(null),ce=Y(null),ee=Y(null);function oe(e,t){switch(P(ce,t),P(ye,e),P(I,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Qh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Qh(t),e=Zh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}W(I),P(I,e)}function De(){W(I),W(ye),W(ce)}function je(e){e.memoizedState!==null&&P(ee,e);var t=I.current,n=Zh(t,e.type);t!==n&&(P(ye,e),P(I,n))}function Ne(e){ye.current===e&&(W(I),W(ye)),ee.current===e&&(W(ee),Li._currentValue=B)}var Ee=Object.prototype.hasOwnProperty,lt=a.unstable_scheduleCallback,xt=a.unstable_cancelCallback,En=a.unstable_shouldYield,Pt=a.unstable_requestPaint,at=a.unstable_now,Za=a.unstable_getCurrentPriorityLevel,Q=a.unstable_ImmediatePriority,fe=a.unstable_UserBlockingPriority,Ot=a.unstable_NormalPriority,un=a.unstable_LowPriority,fn=a.unstable_IdlePriority,wl=a.log,ht=a.unstable_setDisableYieldValue,dn=null,ot=null;function It(e){if(typeof wl=="function"&&ht(e),ot&&typeof ot.setStrictMode=="function")try{ot.setStrictMode(dn,e)}catch{}}var bt=Math.clz32?Math.clz32:Iy,lr=Math.log,it=Math.LN2;function Iy(e){return e>>>=0,e===0?32:31-(lr(e)/it|0)|0}var ar=256,ir=4194304;function Nl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function rr(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,o=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var y=l&134217727;return y!==0?(l=y&~o,l!==0?i=Nl(l):(h&=y,h!==0?i=Nl(h):n||(n=y&~e,n!==0&&(i=Nl(n))))):(y=l&~o,y!==0?i=Nl(y):h!==0?i=Nl(h):n||(n=l&~e,n!==0&&(i=Nl(n)))),i===0?0:t!==0&&t!==i&&(t&o)===0&&(o=i&-i,n=t&-t,o>=n||o===32&&(n&4194048)!==0)?t:i}function Ka(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Jy(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function _f(){var e=ar;return ar<<=1,(ar&4194048)===0&&(ar=256),e}function jf(){var e=ir;return ir<<=1,(ir&62914560)===0&&(ir=4194304),e}function ts(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $a(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Wy(e,t,n,l,i,o){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,E=e.expirationTimes,k=e.hiddenUpdates;for(n=h&~n;0)":-1i||E[l]!==k[i]){var V=` -`+E[l].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=l&&0<=i);break}}}finally{cs=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Jl(n):""}function ix(e){switch(e.tag){case 26:case 27:case 5:return Jl(e.type);case 16:return Jl("Lazy");case 13:return Jl("Suspense");case 19:return Jl("SuspenseList");case 0:case 15:return ss(e.type,!1);case 11:return ss(e.type.render,!1);case 1:return ss(e.type,!0);case 31:return Jl("Activity");default:return""}}function Bf(e){try{var t="";do t+=ix(e),e=e.return;while(e);return t}catch(n){return` -Error generating stack: `+n.message+` -`+n.stack}}function qt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Gf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function rx(e){var t=Gf(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),l=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(h){l=""+h,o.call(this,h)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return l},setValue:function(h){l=""+h},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function or(e){e._valueTracker||(e._valueTracker=rx(e))}function qf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),l="";return e&&(l=Gf(e)?e.checked?"true":"false":e.value),e=l,e!==n?(t.setValue(e),!0):!1}function ur(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var cx=/[\n"\\]/g;function Vt(e){return e.replace(cx,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function os(e,t,n,l,i,o,h,y){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+qt(t)):e.value!==""+qt(t)&&(e.value=""+qt(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?us(e,h,qt(t)):n!=null?us(e,h,qt(n)):l!=null&&e.removeAttribute("value"),i==null&&o!=null&&(e.defaultChecked=!!o),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.name=""+qt(y):e.removeAttribute("name")}function Vf(e,t,n,l,i,o,h,y){if(o!=null&&typeof o!="function"&&typeof o!="symbol"&&typeof o!="boolean"&&(e.type=o),t!=null||n!=null){if(!(o!=="submit"&&o!=="reset"||t!=null))return;n=n!=null?""+qt(n):"",t=t!=null?""+qt(t):n,y||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=y?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h)}function us(e,t,n){t==="number"&&ur(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Wl(e,t,n,l){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),gs=!1;if(Cn)try{var Ja={};Object.defineProperty(Ja,"passive",{get:function(){gs=!0}}),window.addEventListener("test",Ja,Ja),window.removeEventListener("test",Ja,Ja)}catch{gs=!1}var Zn=null,vs=null,dr=null;function Ff(){if(dr)return dr;var e,t=vs,n=t.length,l,i="value"in Zn?Zn.value:Zn.textContent,o=i.length;for(e=0;e=ti),td=" ",nd=!1;function ld(e,t){switch(e){case"keyup":return kx.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ad(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var la=!1;function Hx(e,t){switch(e){case"compositionend":return ad(t);case"keypress":return t.which!==32?null:(nd=!0,td);case"textInput":return e=t.data,e===td&&nd?null:e;default:return null}}function Lx(e,t){if(la)return e==="compositionend"||!Ss&&ld(e,t)?(e=Ff(),dr=vs=Zn=null,la=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=dd(n)}}function hd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ur(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ur(e.document)}return t}function Es(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Zx=Cn&&"documentMode"in document&&11>=document.documentMode,aa=null,As=null,ii=null,Cs=!1;function vd(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Cs||aa==null||aa!==ur(l)||(l=aa,"selectionStart"in l&&Es(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),ii&&ai(ii,l)||(ii=l,l=nc(As,"onSelect"),0>=h,i-=h,_n=1<<32-bt(t)+i|n<o?o:8;var h=R.T,y={};R.T=y,fo(e,!1,t,n);try{var E=i(),k=R.S;if(k!==null&&k(y,E),E!==null&&typeof E=="object"&&typeof E.then=="function"){var V=tb(E,l);bi(e,t,V,Ht(e))}else bi(e,t,l,Ht(e))}catch($){bi(e,t,{then:function(){},status:"rejected",reason:$},Ht())}finally{K.p=o,R.T=h}}function rb(){}function oo(e,t,n,l){if(e.tag!==5)throw Error(c(476));var i=pm(e).queue;vm(e,i,t,B,n===null?rb:function(){return ym(e),n(l)})}function pm(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:B,baseState:B,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mn,lastRenderedState:B},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ym(e){var t=pm(e).next.queue;bi(e,t,{},Ht())}function uo(){return wt(Li)}function xm(){return et().memoizedState}function bm(){return et().memoizedState}function cb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Ht();e=Fn(n);var l=Pn(t,e,n);l!==null&&(Lt(l,t,n),hi(l,t,n)),t={cache:Gs()},e.payload=t;return}t=t.return}}function sb(e,t,n){var l=Ht();n={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Ur(e)?wm(t,n):(n=Rs(e,t,n,l),n!==null&&(Lt(n,e,l),Nm(n,t,l)))}function Sm(e,t,n){var l=Ht();bi(e,t,n,l)}function bi(e,t,n,l){var i={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ur(e))wm(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var h=t.lastRenderedState,y=o(h,n);if(i.hasEagerState=!0,i.eagerState=y,Mt(y,h))return xr(e,t,i,0),Xe===null&&yr(),!1}catch{}finally{}if(n=Rs(e,t,i,l),n!==null)return Lt(n,e,l),Nm(n,t,l),!0}return!1}function fo(e,t,n,l){if(l={lane:2,revertLane:Xo(),action:l,hasEagerState:!1,eagerState:null,next:null},Ur(e)){if(t)throw Error(c(479))}else t=Rs(e,n,l,2),t!==null&&Lt(t,e,2)}function Ur(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function wm(e,t){ha=Rr=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Nm(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,Of(e,n)}}var Hr={readContext:wt,use:Mr,useCallback:Pe,useContext:Pe,useEffect:Pe,useImperativeHandle:Pe,useLayoutEffect:Pe,useInsertionEffect:Pe,useMemo:Pe,useReducer:Pe,useRef:Pe,useState:Pe,useDebugValue:Pe,useDeferredValue:Pe,useTransition:Pe,useSyncExternalStore:Pe,useId:Pe,useHostTransitionStatus:Pe,useFormState:Pe,useActionState:Pe,useOptimistic:Pe,useMemoCache:Pe,useCacheRefresh:Pe},Em={readContext:wt,use:Mr,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:wt,useEffect:cm,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,kr(4194308,4,fm.bind(null,t,e),n)},useLayoutEffect:function(e,t){return kr(4194308,4,e,t)},useInsertionEffect:function(e,t){kr(4,2,e,t)},useMemo:function(e,t){var n=Tt();t=t===void 0?null:t;var l=e();if(Ul){It(!0);try{e()}finally{It(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=Tt();if(n!==void 0){var i=n(t);if(Ul){It(!0);try{n(t)}finally{It(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=sb.bind(null,Ae,e),[l.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:function(e){e=io(e);var t=e.queue,n=Sm.bind(null,Ae,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:co,useDeferredValue:function(e,t){var n=Tt();return so(n,e,t)},useTransition:function(){var e=io(!1);return e=vm.bind(null,Ae,e.queue,!0,!1),Tt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=Ae,i=Tt();if(ke){if(n===void 0)throw Error(c(407));n=n()}else{if(n=t(),Xe===null)throw Error(c(349));(Me&124)!==0||Qd(l,t,n)}i.memoizedState=n;var o={value:n,getSnapshot:t};return i.queue=o,cm(Kd.bind(null,l,o,e),[e]),l.flags|=2048,va(9,zr(),Zd.bind(null,l,o,n,t),null),n},useId:function(){var e=Tt(),t=Xe.identifierPrefix;if(ke){var n=jn,l=_n;n=(l&~(1<<32-bt(l)-1)).toString(32)+n,t="«"+t+"R"+n,n=Or++,0ge?(mt=se,se=null):mt=se.sibling;var ze=H(O,se,D[ge],Z);if(ze===null){se===null&&(se=mt);break}e&&se&&ze.alternate===null&&t(O,se),C=o(ze,C,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze,se=mt}if(ge===D.length)return n(O,se),ke&&Rl(O,ge),ne;if(se===null){for(;gege?(mt=se,se=null):mt=se.sibling;var ml=H(O,se,ze.value,Z);if(ml===null){se===null&&(se=mt);break}e&&se&&ml.alternate===null&&t(O,se),C=o(ml,C,ge),Te===null?ne=ml:Te.sibling=ml,Te=ml,se=mt}if(ze.done)return n(O,se),ke&&Rl(O,ge),ne;if(se===null){for(;!ze.done;ge++,ze=D.next())ze=$(O,ze.value,Z),ze!==null&&(C=o(ze,C,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return ke&&Rl(O,ge),ne}for(se=l(se);!ze.done;ge++,ze=D.next())ze=L(se,O,ge,ze.value,Z),ze!==null&&(e&&ze.alternate!==null&&se.delete(ze.key===null?ge:ze.key),C=o(ze,C,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return e&&se.forEach(function(u0){return t(O,u0)}),ke&&Rl(O,ge),ne}function qe(O,C,D,Z){if(typeof D=="object"&&D!==null&&D.type===M&&D.key===null&&(D=D.props.children),typeof D=="object"&&D!==null){switch(D.$$typeof){case w:e:{for(var ne=D.key;C!==null;){if(C.key===ne){if(ne=D.type,ne===M){if(C.tag===7){n(O,C.sibling),Z=i(C,D.props.children),Z.return=O,O=Z;break e}}else if(C.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===X&&Cm(ne)===C.type){n(O,C.sibling),Z=i(C,D.props),wi(Z,D),Z.return=O,O=Z;break e}n(O,C);break}else t(O,C);C=C.sibling}D.type===M?(Z=_l(D.props.children,O.mode,Z,D.key),Z.return=O,O=Z):(Z=Sr(D.type,D.key,D.props,null,O.mode,Z),wi(Z,D),Z.return=O,O=Z)}return h(O);case _:e:{for(ne=D.key;C!==null;){if(C.key===ne)if(C.tag===4&&C.stateNode.containerInfo===D.containerInfo&&C.stateNode.implementation===D.implementation){n(O,C.sibling),Z=i(C,D.children||[]),Z.return=O,O=Z;break e}else{n(O,C);break}else t(O,C);C=C.sibling}Z=Ds(D,O.mode,Z),Z.return=O,O=Z}return h(O);case X:return ne=D._init,D=ne(D._payload),qe(O,C,D,Z)}if(de(D))return pe(O,C,D,Z);if(ue(D)){if(ne=ue(D),typeof ne!="function")throw Error(c(150));return D=ne.call(D),he(O,C,D,Z)}if(typeof D.then=="function")return qe(O,C,Lr(D),Z);if(D.$$typeof===U)return qe(O,C,Ar(O,D),Z);Br(O,D)}return typeof D=="string"&&D!==""||typeof D=="number"||typeof D=="bigint"?(D=""+D,C!==null&&C.tag===6?(n(O,C.sibling),Z=i(C,D),Z.return=O,O=Z):(n(O,C),Z=Ms(D,O.mode,Z),Z.return=O,O=Z),h(O)):n(O,C)}return function(O,C,D,Z){try{Si=0;var ne=qe(O,C,D,Z);return pa=null,ne}catch(se){if(se===di||se===Tr)throw se;var Te=Dt(29,se,null,O.mode);return Te.lanes=Z,Te.return=O,Te}finally{}}}var ya=Tm(!0),_m=Tm(!1),Kt=Y(null),hn=null;function Jn(e){var t=e.alternate;P(ct,ct.current&1),P(Kt,e),hn===null&&(t===null||ma.current!==null||t.memoizedState!==null)&&(hn=e)}function jm(e){if(e.tag===22){if(P(ct,ct.current),P(Kt,e),hn===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(hn=e)}}else Wn()}function Wn(){P(ct,ct.current),P(Kt,Kt.current)}function Dn(e){W(Kt),hn===e&&(hn=null),W(ct)}var ct=Y(0);function Gr(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||nu(n)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function mo(e,t,n,l){t=e.memoizedState,n=n(l,t),n=n==null?t:g({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var ho={enqueueSetState:function(e,t,n){e=e._reactInternals;var l=Ht(),i=Fn(l);i.payload=t,n!=null&&(i.callback=n),t=Pn(e,i,l),t!==null&&(Lt(t,e,l),hi(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var l=Ht(),i=Fn(l);i.tag=1,i.payload=t,n!=null&&(i.callback=n),t=Pn(e,i,l),t!==null&&(Lt(t,e,l),hi(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Ht(),l=Fn(n);l.tag=2,t!=null&&(l.callback=t),t=Pn(e,l,n),t!==null&&(Lt(t,e,n),hi(t,e,n))}};function Rm(e,t,n,l,i,o,h){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(l,o,h):t.prototype&&t.prototype.isPureReactComponent?!ai(n,l)||!ai(i,o):!0}function Om(e,t,n,l){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,l),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,l),t.state!==e&&ho.enqueueReplaceState(t,t.state,null)}function Hl(e,t){var n=t;if("ref"in t){n={};for(var l in t)l!=="ref"&&(n[l]=t[l])}if(e=e.defaultProps){n===t&&(n=g({},n));for(var i in e)n[i]===void 0&&(n[i]=e[i])}return n}var qr=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)};function Mm(e){qr(e)}function Dm(e){console.error(e)}function zm(e){qr(e)}function Vr(e,t){try{var n=e.onUncaughtError;n(t.value,{componentStack:t.stack})}catch(l){setTimeout(function(){throw l})}}function km(e,t,n){try{var l=e.onCaughtError;l(n.value,{componentStack:n.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(i){setTimeout(function(){throw i})}}function go(e,t,n){return n=Fn(n),n.tag=3,n.payload={element:null},n.callback=function(){Vr(e,t)},n}function Um(e){return e=Fn(e),e.tag=3,e}function Hm(e,t,n,l){var i=n.type.getDerivedStateFromError;if(typeof i=="function"){var o=l.value;e.payload=function(){return i(o)},e.callback=function(){km(t,n,l)}}var h=n.stateNode;h!==null&&typeof h.componentDidCatch=="function"&&(e.callback=function(){km(t,n,l),typeof i!="function"&&(il===null?il=new Set([this]):il.add(this));var y=l.stack;this.componentDidCatch(l.value,{componentStack:y!==null?y:""})})}function ub(e,t,n,l,i){if(n.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){if(t=n.alternate,t!==null&&oi(t,n,i,!0),n=Kt.current,n!==null){switch(n.tag){case 13:return hn===null?Bo():n.alternate===null&&Fe===0&&(Fe=3),n.flags&=-257,n.flags|=65536,n.lanes=i,l===Ys?n.flags|=16384:(t=n.updateQueue,t===null?n.updateQueue=new Set([l]):t.add(l),qo(e,l,i)),!1;case 22:return n.flags|=65536,l===Ys?n.flags|=16384:(t=n.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([l])},n.updateQueue=t):(n=t.retryQueue,n===null?t.retryQueue=new Set([l]):n.add(l)),qo(e,l,i)),!1}throw Error(c(435,n.tag))}return qo(e,l,i),Bo(),!1}if(ke)return t=Kt.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=i,l!==Us&&(e=Error(c(422),{cause:l}),si(Yt(e,n)))):(l!==Us&&(t=Error(c(423),{cause:l}),si(Yt(t,n))),e=e.current.alternate,e.flags|=65536,i&=-i,e.lanes|=i,l=Yt(l,n),i=go(e.stateNode,l,i),Zs(e,i),Fe!==4&&(Fe=2)),!1;var o=Error(c(520),{cause:l});if(o=Yt(o,n),ji===null?ji=[o]:ji.push(o),Fe!==4&&(Fe=2),t===null)return!0;l=Yt(l,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=i&-i,n.lanes|=e,e=go(n.stateNode,l,e),Zs(n,e),!1;case 1:if(t=n.type,o=n.stateNode,(n.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||o!==null&&typeof o.componentDidCatch=="function"&&(il===null||!il.has(o))))return n.flags|=65536,i&=-i,n.lanes|=i,i=Um(i),Hm(i,e,n,l),Zs(n,i),!1}n=n.return}while(n!==null);return!1}var Lm=Error(c(461)),ft=!1;function gt(e,t,n,l){t.child=e===null?_m(t,null,n,l):ya(t,e.child,n,l)}function Bm(e,t,n,l,i){n=n.render;var o=t.ref;if("ref"in l){var h={};for(var y in l)y!=="ref"&&(h[y]=l[y])}else h=l;return zl(t),l=Is(e,t,n,h,o,i),y=Js(),e!==null&&!ft?(Ws(e,t,i),zn(e,t,i)):(ke&&y&&zs(t),t.flags|=1,gt(e,t,l,i),t.child)}function Gm(e,t,n,l,i){if(e===null){var o=n.type;return typeof o=="function"&&!Os(o)&&o.defaultProps===void 0&&n.compare===null?(t.tag=15,t.type=o,qm(e,t,o,l,i)):(e=Sr(n.type,null,l,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,!No(e,i)){var h=o.memoizedProps;if(n=n.compare,n=n!==null?n:ai,n(h,l)&&e.ref===t.ref)return zn(e,t,i)}return t.flags|=1,e=Tn(o,l),e.ref=t.ref,e.return=t,t.child=e}function qm(e,t,n,l,i){if(e!==null){var o=e.memoizedProps;if(ai(o,l)&&e.ref===t.ref)if(ft=!1,t.pendingProps=l=o,No(e,i))(e.flags&131072)!==0&&(ft=!0);else return t.lanes=e.lanes,zn(e,t,i)}return vo(e,t,n,l,i)}function Vm(e,t,n){var l=t.pendingProps,i=l.children,o=e!==null?e.memoizedState:null;if(l.mode==="hidden"){if((t.flags&128)!==0){if(l=o!==null?o.baseLanes|n:n,e!==null){for(i=t.child=e.child,o=0;i!==null;)o=o|i.lanes|i.childLanes,i=i.sibling;t.childLanes=o&~l}else t.childLanes=0,t.child=null;return Ym(e,t,l,n)}if((n&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Cr(t,o!==null?o.cachePool:null),o!==null?qd(t,o):$s(),jm(t);else return t.lanes=t.childLanes=536870912,Ym(e,t,o!==null?o.baseLanes|n:n,n)}else o!==null?(Cr(t,o.cachePool),qd(t,o),Wn(),t.memoizedState=null):(e!==null&&Cr(t,null),$s(),Wn());return gt(e,t,i,n),t.child}function Ym(e,t,n,l){var i=Vs();return i=i===null?null:{parent:rt._currentValue,pool:i},t.memoizedState={baseLanes:n,cachePool:i},e!==null&&Cr(t,null),$s(),jm(t),e!==null&&oi(e,t,l,!0),null}function Yr(e,t){var n=t.ref;if(n===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof n!="function"&&typeof n!="object")throw Error(c(284));(e===null||e.ref!==n)&&(t.flags|=4194816)}}function vo(e,t,n,l,i){return zl(t),n=Is(e,t,n,l,void 0,i),l=Js(),e!==null&&!ft?(Ws(e,t,i),zn(e,t,i)):(ke&&l&&zs(t),t.flags|=1,gt(e,t,n,i),t.child)}function Xm(e,t,n,l,i,o){return zl(t),t.updateQueue=null,n=Yd(t,l,n,i),Vd(e),l=Js(),e!==null&&!ft?(Ws(e,t,o),zn(e,t,o)):(ke&&l&&zs(t),t.flags|=1,gt(e,t,n,o),t.child)}function Qm(e,t,n,l,i){if(zl(t),t.stateNode===null){var o=sa,h=n.contextType;typeof h=="object"&&h!==null&&(o=wt(h)),o=new n(l,o),t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,o.updater=ho,t.stateNode=o,o._reactInternals=t,o=t.stateNode,o.props=l,o.state=t.memoizedState,o.refs={},Xs(t),h=n.contextType,o.context=typeof h=="object"&&h!==null?wt(h):sa,o.state=t.memoizedState,h=n.getDerivedStateFromProps,typeof h=="function"&&(mo(t,n,h,l),o.state=t.memoizedState),typeof n.getDerivedStateFromProps=="function"||typeof o.getSnapshotBeforeUpdate=="function"||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(h=o.state,typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount(),h!==o.state&&ho.enqueueReplaceState(o,o.state,null),vi(t,l,o,i),gi(),o.state=t.memoizedState),typeof o.componentDidMount=="function"&&(t.flags|=4194308),l=!0}else if(e===null){o=t.stateNode;var y=t.memoizedProps,E=Hl(n,y);o.props=E;var k=o.context,V=n.contextType;h=sa,typeof V=="object"&&V!==null&&(h=wt(V));var $=n.getDerivedStateFromProps;V=typeof $=="function"||typeof o.getSnapshotBeforeUpdate=="function",y=t.pendingProps!==y,V||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(y||k!==h)&&Om(t,o,l,h),$n=!1;var H=t.memoizedState;o.state=H,vi(t,l,o,i),gi(),k=t.memoizedState,y||H!==k||$n?(typeof $=="function"&&(mo(t,n,$,l),k=t.memoizedState),(E=$n||Rm(t,n,E,l,H,k,h))?(V||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount=="function"&&(t.flags|=4194308)):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=l,t.memoizedState=k),o.props=l,o.state=k,o.context=h,l=E):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),l=!1)}else{o=t.stateNode,Qs(e,t),h=t.memoizedProps,V=Hl(n,h),o.props=V,$=t.pendingProps,H=o.context,k=n.contextType,E=sa,typeof k=="object"&&k!==null&&(E=wt(k)),y=n.getDerivedStateFromProps,(k=typeof y=="function"||typeof o.getSnapshotBeforeUpdate=="function")||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(h!==$||H!==E)&&Om(t,o,l,E),$n=!1,H=t.memoizedState,o.state=H,vi(t,l,o,i),gi();var L=t.memoizedState;h!==$||H!==L||$n||e!==null&&e.dependencies!==null&&Er(e.dependencies)?(typeof y=="function"&&(mo(t,n,y,l),L=t.memoizedState),(V=$n||Rm(t,n,V,l,H,L,E)||e!==null&&e.dependencies!==null&&Er(e.dependencies))?(k||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(l,L,E),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(l,L,E)),typeof o.componentDidUpdate=="function"&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof o.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),t.memoizedProps=l,t.memoizedState=L),o.props=l,o.state=L,o.context=E,l=V):(typeof o.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),l=!1)}return o=l,Yr(e,t),l=(t.flags&128)!==0,o||l?(o=t.stateNode,n=l&&typeof n.getDerivedStateFromError!="function"?null:o.render(),t.flags|=1,e!==null&&l?(t.child=ya(t,e.child,null,i),t.child=ya(t,null,n,i)):gt(e,t,n,i),t.memoizedState=o.state,e=t.child):e=zn(e,t,i),e}function Zm(e,t,n,l){return ci(),t.flags|=256,gt(e,t,n,l),t.child}var po={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function yo(e){return{baseLanes:e,cachePool:Dd()}}function xo(e,t,n){return e=e!==null?e.childLanes&~n:0,t&&(e|=$t),e}function Km(e,t,n){var l=t.pendingProps,i=!1,o=(t.flags&128)!==0,h;if((h=o)||(h=e!==null&&e.memoizedState===null?!1:(ct.current&2)!==0),h&&(i=!0,t.flags&=-129),h=(t.flags&32)!==0,t.flags&=-33,e===null){if(ke){if(i?Jn(t):Wn(),ke){var y=$e,E;if(E=y){e:{for(E=y,y=mn;E.nodeType!==8;){if(!y){y=null;break e}if(E=en(E.nextSibling),E===null){y=null;break e}}y=E}y!==null?(t.memoizedState={dehydrated:y,treeContext:jl!==null?{id:_n,overflow:jn}:null,retryLane:536870912,hydrationErrors:null},E=Dt(18,null,null,0),E.stateNode=y,E.return=t,t.child=E,Et=t,$e=null,E=!0):E=!1}E||Ml(t)}if(y=t.memoizedState,y!==null&&(y=y.dehydrated,y!==null))return nu(y)?t.lanes=32:t.lanes=536870912,null;Dn(t)}return y=l.children,l=l.fallback,i?(Wn(),i=t.mode,y=Xr({mode:"hidden",children:y},i),l=_l(l,i,n,null),y.return=t,l.return=t,y.sibling=l,t.child=y,i=t.child,i.memoizedState=yo(n),i.childLanes=xo(e,h,n),t.memoizedState=po,l):(Jn(t),bo(t,y))}if(E=e.memoizedState,E!==null&&(y=E.dehydrated,y!==null)){if(o)t.flags&256?(Jn(t),t.flags&=-257,t=So(e,t,n)):t.memoizedState!==null?(Wn(),t.child=e.child,t.flags|=128,t=null):(Wn(),i=l.fallback,y=t.mode,l=Xr({mode:"visible",children:l.children},y),i=_l(i,y,n,null),i.flags|=2,l.return=t,i.return=t,l.sibling=i,t.child=l,ya(t,e.child,null,n),l=t.child,l.memoizedState=yo(n),l.childLanes=xo(e,h,n),t.memoizedState=po,t=i);else if(Jn(t),nu(y)){if(h=y.nextSibling&&y.nextSibling.dataset,h)var k=h.dgst;h=k,l=Error(c(419)),l.stack="",l.digest=h,si({value:l,source:null,stack:null}),t=So(e,t,n)}else if(ft||oi(e,t,n,!1),h=(n&e.childLanes)!==0,ft||h){if(h=Xe,h!==null&&(l=n&-n,l=(l&42)!==0?1:ns(l),l=(l&(h.suspendedLanes|n))!==0?0:l,l!==0&&l!==E.retryLane))throw E.retryLane=l,ca(e,l),Lt(h,e,l),Lm;y.data==="$?"||Bo(),t=So(e,t,n)}else y.data==="$?"?(t.flags|=192,t.child=e.child,t=null):(e=E.treeContext,$e=en(y.nextSibling),Et=t,ke=!0,Ol=null,mn=!1,e!==null&&(Qt[Zt++]=_n,Qt[Zt++]=jn,Qt[Zt++]=jl,_n=e.id,jn=e.overflow,jl=t),t=bo(t,l.children),t.flags|=4096);return t}return i?(Wn(),i=l.fallback,y=t.mode,E=e.child,k=E.sibling,l=Tn(E,{mode:"hidden",children:l.children}),l.subtreeFlags=E.subtreeFlags&65011712,k!==null?i=Tn(k,i):(i=_l(i,y,n,null),i.flags|=2),i.return=t,l.return=t,l.sibling=i,t.child=l,l=i,i=t.child,y=e.child.memoizedState,y===null?y=yo(n):(E=y.cachePool,E!==null?(k=rt._currentValue,E=E.parent!==k?{parent:k,pool:k}:E):E=Dd(),y={baseLanes:y.baseLanes|n,cachePool:E}),i.memoizedState=y,i.childLanes=xo(e,h,n),t.memoizedState=po,l):(Jn(t),n=e.child,e=n.sibling,n=Tn(n,{mode:"visible",children:l.children}),n.return=t,n.sibling=null,e!==null&&(h=t.deletions,h===null?(t.deletions=[e],t.flags|=16):h.push(e)),t.child=n,t.memoizedState=null,n)}function bo(e,t){return t=Xr({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function Xr(e,t){return e=Dt(22,e,null,t),e.lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function So(e,t,n){return ya(t,e.child,null,n),e=bo(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function $m(e,t,n){e.lanes|=t;var l=e.alternate;l!==null&&(l.lanes|=t),Ls(e.return,t,n)}function wo(e,t,n,l,i){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:l,tail:n,tailMode:i}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=l,o.tail=n,o.tailMode=i)}function Fm(e,t,n){var l=t.pendingProps,i=l.revealOrder,o=l.tail;if(gt(e,t,l.children,n),l=ct.current,(l&2)!==0)l=l&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&$m(e,n,t);else if(e.tag===19)$m(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}l&=1}switch(P(ct,l),i){case"forwards":for(n=t.child,i=null;n!==null;)e=n.alternate,e!==null&&Gr(e)===null&&(i=n),n=n.sibling;n=i,n===null?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),wo(t,!1,i,n,o);break;case"backwards":for(n=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&Gr(e)===null){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}wo(t,!0,n,null,o);break;case"together":wo(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function zn(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),al|=t.lanes,(n&t.childLanes)===0)if(e!==null){if(oi(e,t,n,!1),(n&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(c(153));if(t.child!==null){for(e=t.child,n=Tn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Tn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function No(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Er(e)))}function fb(e,t,n){switch(t.tag){case 3:oe(t,t.stateNode.containerInfo),Kn(t,rt,e.memoizedState.cache),ci();break;case 27:case 5:je(t);break;case 4:oe(t,t.stateNode.containerInfo);break;case 10:Kn(t,t.type,t.memoizedProps.value);break;case 13:var l=t.memoizedState;if(l!==null)return l.dehydrated!==null?(Jn(t),t.flags|=128,null):(n&t.child.childLanes)!==0?Km(e,t,n):(Jn(t),e=zn(e,t,n),e!==null?e.sibling:null);Jn(t);break;case 19:var i=(e.flags&128)!==0;if(l=(n&t.childLanes)!==0,l||(oi(e,t,n,!1),l=(n&t.childLanes)!==0),i){if(l)return Fm(e,t,n);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),P(ct,ct.current),l)break;return null;case 22:case 23:return t.lanes=0,Vm(e,t,n);case 24:Kn(t,rt,e.memoizedState.cache)}return zn(e,t,n)}function Pm(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps)ft=!0;else{if(!No(e,n)&&(t.flags&128)===0)return ft=!1,fb(e,t,n);ft=(e.flags&131072)!==0}else ft=!1,ke&&(t.flags&1048576)!==0&&Cd(t,Nr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var l=t.elementType,i=l._init;if(l=i(l._payload),t.type=l,typeof l=="function")Os(l)?(e=Hl(l,e),t.tag=1,t=Qm(null,t,l,e,n)):(t.tag=0,t=vo(null,t,l,e,n));else{if(l!=null){if(i=l.$$typeof,i===q){t.tag=11,t=Bm(null,t,l,e,n);break e}else if(i===F){t.tag=14,t=Gm(null,t,l,e,n);break e}}throw t=ve(l)||l,Error(c(306,t,""))}}return t;case 0:return vo(e,t,t.type,t.pendingProps,n);case 1:return l=t.type,i=Hl(l,t.pendingProps),Qm(e,t,l,i,n);case 3:e:{if(oe(t,t.stateNode.containerInfo),e===null)throw Error(c(387));l=t.pendingProps;var o=t.memoizedState;i=o.element,Qs(e,t),vi(t,l,null,n);var h=t.memoizedState;if(l=h.cache,Kn(t,rt,l),l!==o.cache&&Bs(t,[rt],n,!0),gi(),l=h.element,o.isDehydrated)if(o={element:l,isDehydrated:!1,cache:h.cache},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){t=Zm(e,t,l,n);break e}else if(l!==i){i=Yt(Error(c(424)),t),si(i),t=Zm(e,t,l,n);break e}else{switch(e=t.stateNode.containerInfo,e.nodeType){case 9:e=e.body;break;default:e=e.nodeName==="HTML"?e.ownerDocument.body:e}for($e=en(e.firstChild),Et=t,ke=!0,Ol=null,mn=!0,n=_m(t,null,l,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(ci(),l===i){t=zn(e,t,n);break e}gt(e,t,l,n)}t=t.child}return t;case 26:return Yr(e,t),e===null?(n=eg(t.type,null,t.pendingProps,null))?t.memoizedState=n:ke||(n=t.type,e=t.pendingProps,l=ac(ce.current).createElement(n),l[St]=t,l[At]=e,pt(l,n,e),ut(l),t.stateNode=l):t.memoizedState=eg(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return je(t),e===null&&ke&&(l=t.stateNode=Ih(t.type,t.pendingProps,ce.current),Et=t,mn=!0,i=$e,sl(t.type)?(lu=i,$e=en(l.firstChild)):$e=i),gt(e,t,t.pendingProps.children,n),Yr(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&ke&&((i=l=$e)&&(l=Bb(l,t.type,t.pendingProps,mn),l!==null?(t.stateNode=l,Et=t,$e=en(l.firstChild),mn=!1,i=!0):i=!1),i||Ml(t)),je(t),i=t.type,o=t.pendingProps,h=e!==null?e.memoizedProps:null,l=o.children,Wo(i,o)?l=null:h!==null&&Wo(i,h)&&(t.flags|=32),t.memoizedState!==null&&(i=Is(e,t,lb,null,null,n),Li._currentValue=i),Yr(e,t),gt(e,t,l,n),t.child;case 6:return e===null&&ke&&((e=n=$e)&&(n=Gb(n,t.pendingProps,mn),n!==null?(t.stateNode=n,Et=t,$e=null,e=!0):e=!1),e||Ml(t)),null;case 13:return Km(e,t,n);case 4:return oe(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=ya(t,null,l,n):gt(e,t,l,n),t.child;case 11:return Bm(e,t,t.type,t.pendingProps,n);case 7:return gt(e,t,t.pendingProps,n),t.child;case 8:return gt(e,t,t.pendingProps.children,n),t.child;case 12:return gt(e,t,t.pendingProps.children,n),t.child;case 10:return l=t.pendingProps,Kn(t,t.type,l.value),gt(e,t,l.children,n),t.child;case 9:return i=t.type._context,l=t.pendingProps.children,zl(t),i=wt(i),l=l(i),t.flags|=1,gt(e,t,l,n),t.child;case 14:return Gm(e,t,t.type,t.pendingProps,n);case 15:return qm(e,t,t.type,t.pendingProps,n);case 19:return Fm(e,t,n);case 31:return l=t.pendingProps,n=t.mode,l={mode:l.mode,children:l.children},e===null?(n=Xr(l,n),n.ref=t.ref,t.child=n,n.return=t,t=n):(n=Tn(e.child,l),n.ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Vm(e,t,n);case 24:return zl(t),l=wt(rt),e===null?(i=Vs(),i===null&&(i=Xe,o=Gs(),i.pooledCache=o,o.refCount++,o!==null&&(i.pooledCacheLanes|=n),i=o),t.memoizedState={parent:l,cache:i},Xs(t),Kn(t,rt,i)):((e.lanes&n)!==0&&(Qs(e,t),vi(t,null,null,n),gi()),i=e.memoizedState,o=t.memoizedState,i.parent!==l?(i={parent:l,cache:l},t.memoizedState=i,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=i),Kn(t,rt,l)):(l=o.cache,Kn(t,rt,l),l!==i.cache&&Bs(t,[rt],n,!0))),gt(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(c(156,t.tag))}function kn(e){e.flags|=4}function Im(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!ig(t)){if(t=Kt.current,t!==null&&((Me&4194048)===Me?hn!==null:(Me&62914560)!==Me&&(Me&536870912)===0||t!==hn))throw mi=Ys,zd;e.flags|=8192}}function Qr(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?jf():536870912,e.lanes|=t,wa|=t)}function Ni(e,t){if(!ke)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var l=null;n!==null;)n.alternate!==null&&(l=n),n=n.sibling;l===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:l.sibling=null}}function Ke(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,l=0;if(t)for(var i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags&65011712,l|=i.flags&65011712,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags,l|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=l,e.childLanes=n,t}function db(e,t,n){var l=t.pendingProps;switch(ks(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ke(t),null;case 1:return Ke(t),null;case 3:return n=t.stateNode,l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),On(rt),De(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ri(t)?kn(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,jd())),Ke(t),null;case 26:return n=t.memoizedState,e===null?(kn(t),n!==null?(Ke(t),Im(t,n)):(Ke(t),t.flags&=-16777217)):n?n!==e.memoizedState?(kn(t),Ke(t),Im(t,n)):(Ke(t),t.flags&=-16777217):(e.memoizedProps!==l&&kn(t),Ke(t),t.flags&=-16777217),null;case 27:Ne(t),n=ce.current;var i=t.type;if(e!==null&&t.stateNode!=null)e.memoizedProps!==l&&kn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return Ke(t),null}e=I.current,ri(t)?Td(t):(e=Ih(i,l,n),t.stateNode=e,kn(t))}return Ke(t),null;case 5:if(Ne(t),n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==l&&kn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return Ke(t),null}if(e=I.current,ri(t))Td(t);else{switch(i=ac(ce.current),e){case 1:e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":e=i.createElement("div"),e.innerHTML=" - + +
diff --git a/frontend/public/data/reproinventory_data.json b/frontend/public/data/reproinventory_data.json index 8544292..0439445 100644 --- a/frontend/public/data/reproinventory_data.json +++ b/frontend/public/data/reproinventory_data.json @@ -12,12 +12,17 @@ "Beginner" ], "platform": [ - "Mac" + "Mac", + "Windows" ], "keywords": [ "Git", "Version Control", - "GitHub" + "GitHub", + "GitHub Desktop", + "Branching", + "Collaboration", + "Merge Conflicts" ], "course_length": "1-4 hrs", "instruction_medium": [ @@ -40,9 +45,8 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2023", - "functionality": null, "assessment": false, "prerequisite": null, "source": [ @@ -50,13 +54,12 @@ "Johanna Bayer", "Fellow-22" ], - "review": null, - "alias_links": null, "notes": null, "quadrants": [ "problem-oriented (how to guides)", "learning-oriented (tutorials)" - ] + ], + "description": "A beginner-friendly course introducing Git and GitHub for version control and collaboration, covering online GitHub workflows and local machine setup with GitHub Desktop, progressing from basic concepts to managing merge conflicts." }, { "id": 5, @@ -104,23 +107,26 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2023", "functionality": null, "assessment": true, - "prerequisite": null, + "prerequisite": [ + "Basic Python", + "Introductory statistics" + ], "source": [ "ReproNim", "Yibei Chen", "Fellow-22", "UCSB" ], - "review": "JupyterHub no longer accessible. Need to link GitHubClassroom to GitHub (uclear if links work once you do that)", "alias_links": null, "notes": null, "quadrants": [ "learning-oriented (tutorials)" - ] + ], + "description": "JupyterHub no longer accessible. Need to link GitHubClassroom to GitHub (uclear if links work once you do that)" }, { "id": 7, @@ -162,23 +168,25 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2022", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic Git" + ], "source": [ "ReproNim", "Julian Kosciessa", "Fellow-22", "Donders Institute" ], - "review": "Short slide deck, very clear", "alias_links": null, "notes": "link does not work for me (JB) can someone double check", "quadrants": [ "understanding-oriented (explanation)" - ] + ], + "description": "Short slide deck, very clear" }, { "id": 8, @@ -220,7 +228,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2022", "functionality": null, "assessment": false, @@ -233,13 +241,13 @@ "Fellow-22", "Donders Institute" ], - "review": "Relatively quick overview - more just what is DataLad vs detailed how to use", "alias_links": null, "notes": null, "quadrants": [ "information-oriented (reference)", "understanding-oriented (explanation)" - ] + ], + "description": "Relatively quick overview - more just what is DataLad vs detailed how to use" }, { "id": 9, @@ -282,24 +290,26 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2022", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic Git" + ], "source": [ "ReproNim", "Julian Kosciessa", "Fellow-22", "Donders Institute" ], - "review": "Very short slide deck on GIT", "alias_links": null, "notes": null, "quadrants": [ "understanding-oriented (explanation)", "information-oriented (reference)" - ] + ], + "description": "Very short slide deck on GIT" }, { "id": 10, @@ -340,7 +350,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2023", "functionality": null, "assessment": false, @@ -351,12 +361,12 @@ "Fellow-22", "Donders Institute" ], - "review": "Practical intro to bash and git", "alias_links": null, "notes": null, "quadrants": [ "understanding-oriented (explanation)" - ] + ], + "description": "Practical intro to bash and git" }, { "id": 11, @@ -407,7 +417,7 @@ "imaging_modality": [ "MRI" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2022", "functionality": null, "assessment": true, @@ -421,12 +431,12 @@ "Celine Provins", "Fellow-22" ], - "review": "Focuses on QC in reference to MRIQC; has lots of big picture info about QC/QA in general", "alias_links": null, "notes": null, "quadrants": [ "learning-oriented (tutorials)" - ] + ], + "description": "Focuses on QC in reference to MRIQC; has lots of big picture info about QC/QA in general" }, { "id": 16, @@ -467,7 +477,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2022", "functionality": null, "assessment": false, @@ -479,12 +489,12 @@ "Avery Van De Water", "Fellow-22" ], - "review": "labeled as part 1 - unclear where part 2 is", "alias_links": null, "notes": null, "quadrants": [ "learning-oriented (tutorials)" - ] + ], + "description": "labeled as part 1 - unclear where part 2 is" }, { "id": 18, @@ -526,19 +536,25 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2021", "functionality": "NA", "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic Python", + "Unix" + ], "source": [ "ReproNim", "Karolina Finc" ], - "review": "Some sections are under-developed", "alias_links": null, "notes": "Reproducible Neuroimaging, tutorial guide, for cog sci students audience", - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "information-oriented (reference)" + ], + "description": "Some sections are under-developed" }, { "id": 21, @@ -583,7 +599,7 @@ "imaging_modality": [ "MRI" ], - "open_dataset": "True", + "open_dataset": true, "last_updated": "2024", "functionality": null, "assessment": true, @@ -596,10 +612,13 @@ "MIchael Joseph", "Fellow-20" ], - "review": "Basic Imaging Overview. Focus on BIDS", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Basic Imaging Overview. Focus on BIDS" }, { "id": 22, @@ -645,7 +664,7 @@ "imaging_modality": [ "Functional" ], - "open_dataset": "True", + "open_dataset": true, "last_updated": "2024", "functionality": null, "assessment": true, @@ -657,13 +676,13 @@ "MIchael Joseph", "Fellow-20" ], - "review": "Tutorial on functional neuroimaging in Python", "alias_links": null, "notes": null, "quadrants": [ "learning-oriented (tutorials)", "problem-oriented (how to guides)" - ] + ], + "description": "Tutorial on functional neuroimaging in Python" }, { "id": 23, @@ -702,7 +721,7 @@ "imaging_modality": [ "DWI" ], - "open_dataset": "True", + "open_dataset": true, "last_updated": "2024", "functionality": null, "assessment": true, @@ -715,10 +734,13 @@ "MIchael Joseph", "Fellow-20" ], - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "A Carpentries Incubator lesson introducing diffusion MRI concepts and data organization using BIDS, with hands-on analysis using Python-based tools like Dipy and Nibabel." }, { "id": 25, @@ -759,7 +781,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2020", "functionality": null, "assessment": false, @@ -772,10 +794,14 @@ "Jennifer Legault", "Fellow-20" ], - "review": "example syllabus for hackathon/course", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "understanding-oriented (explanation)", + "learning-oriented (tutorials)", + "information-oriented (reference)" + ], + "description": "example syllabus for hackathon/course" }, { "id": 26, @@ -803,28 +829,37 @@ "language": [ "English" ], - "programming_language": null, + "programming_language": [ + "R", + "Python" + ], "neuroimaging_software": [ "NA" ], "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2023", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic statistics", + "Basic research methods" + ], "source": [ "ReproNim", "Sook-Lei Liew", "Fellow-20", "ReproRehab" ], - "review": "Entire first year bootcamp videos online", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Entire first year bootcamp videos online" }, { "id": 28, @@ -861,7 +896,7 @@ "imaging_modality": [ "Functional" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2020", "functionality": null, "assessment": false, @@ -874,10 +909,13 @@ "Fellow-20", "Princeton" ], - "review": "Jupyter tutorials from the basics to advanced machine learning analyses on fMRI data", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "Jupyter tutorials from the basics to advanced machine learning analyses on fMRI data" }, { "id": 29, @@ -905,27 +943,36 @@ "language": [ "English" ], - "programming_language": null, + "programming_language": [ + "Python", + "R" + ], "neuroimaging_software": [ "Multiple" ], "imaging_modality": [ "Functional" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2020", "functionality": null, "assessment": true, - "prerequisite": null, + "prerequisite": [ + "Basic neuroscience knowledge", + "Basic statistics" + ], "source": [ "ReproNim", "Chris Rorden", "Fellow-20" ], - "review": "Syllabus for course on fMRI, including slides, from collection to inferencing", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Syllabus for course on fMRI, including slides, from collection to inferencing" }, { "id": 30, @@ -953,14 +1000,18 @@ "language": [ "English" ], - "programming_language": null, + "programming_language": [ + "Python", + "shell scripting", + "Git" + ], "neuroimaging_software": [ "Multiple" ], "imaging_modality": [ "Functional" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "NA", "functionality": null, "assessment": true, @@ -973,10 +1024,13 @@ "Julie Schneider", "Fellow-20" ], - "review": "Syllabus for reproducible neuroimaging multi-week course", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "Syllabus for reproducible neuroimaging multi-week course" }, { "id": 31, @@ -1014,7 +1068,7 @@ "imaging_modality": [ "MRI" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2020", "functionality": null, "assessment": false, @@ -1025,10 +1079,13 @@ "source": [ "ReproNim" ], - "review": "syllabus for tutorial; details unclear. Might be unfinished.", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "information-oriented (reference)" + ], + "description": "syllabus for tutorial; details unclear. Might be unfinished." }, { "id": 32, @@ -1069,7 +1126,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2024", "functionality": "2025", "assessment": false, @@ -1080,10 +1137,14 @@ "ReproNim", "Adina Wagner" ], - "review": "very good resource for data provenance", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "information-oriented (reference)", + "problem-oriented (how to guides)" + ], + "description": "very good resource for data provenance" }, { "id": 33, @@ -1122,7 +1183,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2024", "functionality": null, "assessment": false, @@ -1130,10 +1191,13 @@ "source": [ "AI campus" ], - "review": "Nice videos and course material on AI", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Nice videos and course material on AI" }, { "id": 34, @@ -1172,7 +1236,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2021", "functionality": null, "assessment": false, @@ -1182,10 +1246,13 @@ "Lennart Wittkuhn", "Adina Wagner" ], - "review": "Good video", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Good video" }, { "id": 35, @@ -1224,16 +1291,22 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2020", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic Git", + "Unix" + ], "source": null, - "review": "Course outline for Data Lad Course", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "Course outline for Data Lad Course" }, { "id": 36, @@ -1271,7 +1344,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2024", "functionality": null, "assessment": false, @@ -1280,10 +1353,13 @@ "ReproNim", "Lennart Wittkuhn" ], - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "information-oriented (reference)" + ], + "description": "An open-access online book that teaches version control using Git, designed for researchers with no prior experience. It covers core Git concepts and workflows through hands-on exercises and practical examples relevant to scientific work." }, { "id": 38, @@ -1315,26 +1391,33 @@ "language": [ "English" ], - "programming_language": null, + "programming_language": [ + "Python" + ], "neuroimaging_software": [ "NA" ], "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2021", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic familiarity with Python recommended" + ], "source": [ "ReproNim", "Xihe Xie" ], - "review": "Review of previous materials, full course", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Review of previous materials, full course" }, { "id": 39, @@ -1376,20 +1459,26 @@ "imaging_modality": [ "MRI" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2019", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic Python", + "Unix shell" + ], "source": [ "ReproNim", "Michael Dayan", "Fellow-19" ], - "review": "Syllabus for ReproNim workshop", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "information-oriented (reference)" + ], + "description": "Syllabus for ReproNim workshop" }, { "id": 40, @@ -1427,7 +1516,7 @@ "imaging_modality": [ "MRI" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2019", "functionality": null, "assessment": false, @@ -1440,10 +1529,13 @@ "Aaron Kemp", "Fellow-19" ], - "review": "Syllabus for Research Imaging Informatics course. Overview of neuroimaging methods and basic processing", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "information-oriented (reference)", + "understanding-oriented (explanation)" + ], + "description": "Syllabus for Research Imaging Informatics course. Overview of neuroimaging methods and basic processing" }, { "id": 43, @@ -1482,18 +1574,25 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2020", "functionality": null, "assessment": true, - "prerequisite": null, + "prerequisite": [ + "Basic Python", + "Basic Git", + "Unix" + ], "source": [ "ReproNim" ], - "review": "Syllabus for workshop that has been given", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "Syllabus for workshop that has been given" }, { "id": 46, @@ -1502,7 +1601,7 @@ "SS", "JB" ], - "course_name": "The Princeton Handbook for Reproducible Neuroimaging¶", + "course_name": "The Princeton Handbook for Reproducible Neuroimaging\u00b6", "url": "https://brainhack-princeton.github.io/handbook/", "level": [ "Beginner" @@ -1522,28 +1621,34 @@ "language": [ "English" ], - "programming_language": null, + "programming_language": [ + "Python", + "shell scripting" + ], "neuroimaging_software": [ "Multiple" ], "imaging_modality": [ "Functional" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": "2021", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic familiarity with neuroimaging concepts", + "Some experience with command-line tools" + ], "source": [ "ReproNim", "Princeton" ], - "review": "Very nice overview of different fMRI topics", "alias_links": null, "notes": null, "quadrants": [ "information-oriented (reference)" - ] + ], + "description": "Very nice overview of different fMRI topics" }, { "id": 47, @@ -1582,23 +1687,26 @@ "imaging_modality": [ "Functional" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2019", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic MRI knowledge", + "Introductory neuroimaging experience" + ], "source": [ "ReproNim", "Etienne Roesch" ], - "review": "Pretty good if you want to teach fMRI analysis from scratch", "alias_links": null, "notes": null, "quadrants": [ "learning-oriented (tutorials)", "understanding-oriented (explanation)", "information-oriented (reference)" - ] + ], + "description": "Pretty good if you want to teach fMRI analysis from scratch" }, { "id": 50, @@ -1637,22 +1745,24 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": null, "last_updated": "2019", "functionality": null, "assessment": false, - "prerequisite": null, + "prerequisite": [ + "Basic neuroimaging knowledge" + ], "source": [ "ReproNim", "Sebastien Tourbier" ], - "review": "Single presentation, good for an intro class to data management and data version control", "alias_links": null, "notes": null, "quadrants": [ "information-oriented (reference)", "understanding-oriented (explanation)" - ] + ], + "description": "Single presentation, good for an intro class to data management and data version control" }, { "id": 51, @@ -1680,14 +1790,16 @@ "language": [ "English" ], - "programming_language": null, + "programming_language": [ + "shell scripting" + ], "neuroimaging_software": [ "NA" ], "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "2024", "functionality": null, "assessment": false, @@ -1695,13 +1807,13 @@ "source": [ "Carpentries" ], - "review": "If you want to teach carpentries use this tool - not only shell scripting, but also intro to R, Python and HPC", "alias_links": "https://github.com/jdkent/incf-fellow-jdkent/blob/gh-pages/index.md", "notes": null, "quadrants": [ "learning-oriented (tutorials)", "problem-oriented (how to guides)" - ] + ], + "description": "If you want to teach carpentries use this tool - not only shell scripting, but also intro to R, Python and HPC" }, { "id": 52, @@ -1738,7 +1850,7 @@ "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": false, "last_updated": "NA", "functionality": null, "assessment": false, @@ -1747,10 +1859,13 @@ "ReproNim", "David Warren" ], - "review": "For internal usage", "alias_links": null, "notes": "Link to Github Importer broken", - "quadrants": null + "quadrants": [ + "information-oriented (reference)", + "understanding-oriented (explanation)" + ], + "description": "For internal usage" }, { "id": 53, @@ -1758,7 +1873,7 @@ "JB" ], "course_name": "Introduction to Machine Learning part 1", - "url": ":https://neurodatascience.github.io/QLS612-Overview/lectures-materials/2024/intro_ml_part_1.html", + "url": "https://neurodatascience.github.io/QLS612-Overview/lectures-materials/2024/intro_ml_part_1.html", "level": [ "Beginner" ], @@ -1793,17 +1908,26 @@ "neuroimaging_software": [ "Python" ], - "imaging_modality": null, - "open_dataset": "NA", + "imaging_modality": [ + "MRI" + ], + "open_dataset": true, "last_updated": null, "functionality": null, "assessment": null, - "prerequisite": null, + "prerequisite": [ + "Basic Python", + "Introductory statistics", + "Basic neuroimaging knowledge" + ], "source": null, - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "An introduction to machine learning concepts and methods in the context of neuroimaging data, covering supervised learning, model evaluation, and practical implementation in Python. Part of the QLS612 multi-week curriculum at McGill University." }, { "id": 54, @@ -1819,26 +1943,52 @@ "platform": [ "Windows" ], - "keywords": null, + "keywords": [ + "brainhack", + "open science", + "reproducibility", + "neuroimaging", + "data science", + "machine learning", + "open-source", + "collaboration", + "Python", + "version control" + ], "course_length": "NA", "instruction_medium": null, "delivery": null, "language": null, - "programming_language": null, - "neuroimaging_software": null, + "programming_language": [ + "Python", + "shell scripting", + "Git" + ], + "neuroimaging_software": [ + "FSL", + "Freesurfer", + "Python", + "Multiple" + ], "imaging_modality": [ "NA" ], - "open_dataset": "NA", + "open_dataset": true, "last_updated": null, "functionality": null, "assessment": null, - "prerequisite": null, + "prerequisite": [ + "Basic Python programming", + "Familiarity with neuroimaging concepts" + ], "source": null, - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "Brainhack School is an intensive, project-based training program run by a consortium of Canadian universities that teaches open and reproducible neuroscience. Participants work on collaborative projects while learning modern data science tools applied to neuroimaging." }, { "id": 55, @@ -1856,24 +2006,56 @@ "Windows", "Linux" ], - "keywords": null, + "keywords": [ + "data science", + "open neuroscience", + "reproducibility", + "machine learning", + "neuroimaging", + "fMRI", + "open data", + "Python", + "summer institute", + "collaborative" + ], "course_length": "NA", "instruction_medium": null, "delivery": null, "language": null, - "programming_language": null, - "neuroimaging_software": null, - "imaging_modality": null, - "open_dataset": "NA", + "programming_language": [ + "Python", + "R", + "shell scripting", + "Git" + ], + "neuroimaging_software": [ + "FSL", + "Freesurfer", + "Python", + "Multiple" + ], + "imaging_modality": [ + "Functional", + "Structural", + "Resting-State" + ], + "open_dataset": true, "last_updated": null, "functionality": null, "assessment": null, - "prerequisite": null, + "prerequisite": [ + "Basic Python or programming experience", + "Graduate-level neuroscience or related field" + ], "source": null, - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)", + "problem-oriented (how to guides)" + ], + "description": "NeuroHackademy is a summer institute at the University of Washington focused on data science and open neuroscience, combining lectures and hands-on tutorials covering neuroimaging analysis, machine learning, and reproducible research practices." }, { "id": 56, @@ -1882,26 +2064,55 @@ ], "course_name": "Neuromatchacademy", "url": "https://github.com/NeuromatchAcademy", - "level": null, - "platform": null, - "keywords": null, + "level": [ + "Intermediate", + "Advanced" + ], + "platform": [ + "Jupyter" + ], + "keywords": [ + "computational neuroscience", + "deep learning", + "neural data", + "modeling", + "data analysis", + "machine learning", + "online course", + "open science", + "tutorials" + ], "course_length": "NA", "instruction_medium": null, "delivery": null, "language": null, - "programming_language": null, + "programming_language": [ + "Python" + ], "neuroimaging_software": null, - "imaging_modality": null, - "open_dataset": "NA", + "imaging_modality": [ + "Functional", + "Resting-State", + "Behavioral" + ], + "open_dataset": true, "last_updated": null, "functionality": null, "assessment": null, - "prerequisite": null, + "prerequisite": [ + "Linear algebra", + "Basic calculus", + "Python programming", + "Introductory neuroscience" + ], "source": null, - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)" + ], + "description": "Neuromatch Academy offers intensive online computational neuroscience and deep learning courses through lectures, tutorials, and projects designed to build skills in quantitative analysis of neural data. The curriculum covers modeling, data analysis, and machine learning applied to neuroscience." }, { "id": 57, @@ -1952,7 +2163,7 @@ "Resting-State", "MRI" ], - "open_dataset": "True", + "open_dataset": true, "last_updated": "2024", "functionality": "2024", "assessment": false, @@ -1960,10 +2171,12 @@ "source": [ "Github Repo added by Charlotte Fraze" ], - "review": "Great resource", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "information-oriented (reference)" + ], + "description": "Great resource" }, { "id": 58, @@ -1977,8 +2190,56 @@ "blog post", "Hands-on tutorial / notebooks" ], - "open_dataset": "NA", - "last_updated": 2026 + "open_dataset": true, + "last_updated": 2026, + "description": "Andy's Brain Book is a comprehensive, beginner-friendly online textbook covering neuroimaging analysis with major software packages including FSL, SPM, AFNI, and Freesurfer, using real datasets and step-by-step tutorials. It is widely used as an introductory reference for fMRI and structural MRI analysis.", + "level": [ + "Beginner", + "Intermediate" + ], + "platform": [ + "Mac", + "Windows", + "Linux" + ], + "keywords": [ + "fMRI", + "neuroimaging", + "FSL", + "SPM", + "AFNI", + "Freesurfer", + "tutorial", + "beginner", + "structural MRI", + "connectivity", + "tractography" + ], + "prerequisite": null, + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)", + "information-oriented (reference)" + ], + "programming_language": [ + "shell scripting", + "Python", + "Matlab" + ], + "imaging_modality": [ + "Functional", + "Structural", + "DWI", + "Resting-State", + "Task-based" + ], + "neuroimaging_software": [ + "FSL", + "SPM", + "AFNI", + "Freesurfer", + "Multiple" + ] }, { "id": 59, @@ -1987,26 +2248,59 @@ ], "course_name": "ABCD Repronim course", "url": "https://www.abcd-repronim.org/", - "level": null, - "platform": null, - "keywords": null, + "level": [ + "Intermediate", + "Advanced" + ], + "platform": [ + "Linux", + "Docker" + ], + "keywords": [ + "ABCD", + "reproducibility", + "neuroimaging", + "developmental", + "ReproNim", + "large-scale data", + "open data" + ], "course_length": "NA", "instruction_medium": null, "delivery": null, "language": null, - "programming_language": null, - "neuroimaging_software": null, - "imaging_modality": null, - "open_dataset": "NA", + "programming_language": [ + "Python", + "R", + "shell scripting" + ], + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "Structural", + "Functional", + "Resting-State", + "DWI" + ], + "open_dataset": true, "last_updated": null, "functionality": null, "assessment": null, - "prerequisite": null, + "prerequisite": [ + "Basic Python or R programming", + "Introductory neuroimaging knowledge", + "Familiarity with MRI data" + ], "source": null, - "review": null, "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)", + "problem-oriented (how to guides)" + ], + "description": "A comprehensive course on reproducible neuroimaging using the Adolescent Brain Cognitive Development (ABCD) dataset, covering data access, processing pipelines, and ReproNim reproducibility principles. Designed for researchers working with large-scale developmental neuroimaging data." }, { "id": 60, @@ -2018,7 +2312,11 @@ "level": [ "Intermediate" ], - "platform": null, + "platform": [ + "Linux", + "Docker", + "Jupyter" + ], "keywords": [ "Machine Learning" ], @@ -2026,19 +2324,34 @@ "instruction_medium": null, "delivery": null, "language": null, - "programming_language": null, - "neuroimaging_software": null, - "imaging_modality": null, - "open_dataset": "NA", + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "Structural", + "Functional", + "Resting-State" + ], + "open_dataset": true, "last_updated": 2025, "functionality": null, "assessment": true, - "prerequisite": null, + "prerequisite": [ + "ABCD ReproNim course or equivalent", + "Basic Python programming", + "Introductory machine learning concepts" + ], "source": null, - "review": "3 week machone learning course", "alias_links": null, "notes": null, - "quadrants": null + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ], + "description": "3 week machone learning course" }, { "id": 61, @@ -2047,8 +2360,14 @@ ], "course_name": "Reproducible Pipelines for Neuroimaging Research", "url": "https://sina-mansour.github.io/ohbm2025-reproducible-research/intro.html", - "level": null, - "platform": null, + "level": [ + "Intermediate", + "Advanced" + ], + "platform": [ + "Linux", + "Docker" + ], "keywords": [ "Reproducible Pipelines", "Best Practices", @@ -2063,33 +2382,30 @@ "programming_language": [ "Python" ], - "neuroimaging_software": null, - "imaging_modality": null, - "open_dataset": "NA", + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "Structural", + "Functional" + ], + "open_dataset": true, "last_updated": 2025, "functionality": null, "assessment": null, - "prerequisite": null, + "prerequisite": [ + "Basic neuroimaging experience", + "Familiarity with command-line tools", + "Basic Python or shell scripting" + ], "source": null, - "review": "Comprehensive website describing the necessity of reproducible research and how to achieve it (notebooks, visualisation)", "alias_links": null, "notes": null, - "quadrants": null - }, - { - "id": 62, - "course_name": "test course", - "platform": [ - "Mac" - ], - "instruction_medium": [ - "blog post" - ], - "delivery": [ - "instructor" + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)", + "understanding-oriented (explanation)" ], - "imaging_modality": [ - "Behavioral" - ] + "description": "Comprehensive website describing the necessity of reproducible research and how to achieve it (notebooks, visualisation)" } ] \ No newline at end of file diff --git a/frontend/src/components/AddMaterialDialog.tsx b/frontend/src/components/AddMaterialDialog.tsx index 1e252ff..337702b 100644 --- a/frontend/src/components/AddMaterialDialog.tsx +++ b/frontend/src/components/AddMaterialDialog.tsx @@ -17,11 +17,10 @@ import type { ProgrammingLanguageEnum, NeuroimagingSoftwareEnum, ImagingModalityEnum, - OpenDatasetEnum, QuadrantsEnum, } from "@/types/reproinventory"; -const GITHUB_REPO = "https://github.com/ReproNim/ReproInventory"; +const GITHUB_REPO = "https://github.comlikeajumprope/ReproInventory"; const levelOptions: LevelEnum[] = ["Beginner", "Intermediate", "Advanced", "NA"]; const platformOptions: PlatformEnum[] = ["Mac", "Windows", "Linux", "Docker", "Jupyter", "NA"]; @@ -32,7 +31,6 @@ const languageOptions: LanguageEnum[] = ["English", "French", "Spanish", "Chines const programmingLanguageOptions: ProgrammingLanguageEnum[] = ["Python", "R", "shell scripting", "Matlab", "Git", "NA"]; const neuroimagingSoftwareOptions: NeuroimagingSoftwareEnum[] = ["AFNI", "SPM", "FSL", "Freesurfer", "Python", "Multiple", "NA"]; const imagingModalityOptions: ImagingModalityEnum[] = ["DWI", "Structural", "Functional", "Task-based", "Resting-State", "EEG", "Behavioral", "MEG", "MRI", "NA"]; -const openDatasetOptions: OpenDatasetEnum[] = ["True", "False", "NA"]; const quadrantsOptions: QuadrantsEnum[] = ["information-oriented (reference)", "understanding-oriented (explanation)", "learning-oriented (tutorials)", "problem-oriented (how to guides)", "NA"]; function formatAsYaml(material: ReproInventoryEntry): string { @@ -65,7 +63,7 @@ function formatAsYaml(material: ReproInventoryEntry): string { addList("neuroimaging_software", material.neuroimaging_software); addList("imaging_modality", material.imaging_modality); addScalar("open_dataset", material.open_dataset); - addScalar("review", material.review); + addScalar("description", material.description); addScalar("notes", material.notes); addList("quadrants", material.quadrants); @@ -103,7 +101,7 @@ const AddMaterialDialog: React.FC = ({ onClose }) => { neuroimaging_software: [], imaging_modality: [], open_dataset: undefined, - review: "", + description: "", notes: "", quadrants: [], }); @@ -175,11 +173,11 @@ const AddMaterialDialog: React.FC = ({ onClose }) => {
- + handleChange("review", e.target.value)} + id="description" + value={material.description || ""} + onChange={(e) => handleChange("description", e.target.value)} className="col-span-3" placeholder="Brief description of the material" /> @@ -368,19 +366,14 @@ const AddMaterialDialog: React.FC = ({ onClose }) => { {/* Open Dataset */}
- +
+ handleChange("open_dataset", checked === true ? true : null)} + /> + +
{/* Quadrants */} diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index c0a5f54..caff601 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -17,11 +17,10 @@ import type { ProgrammingLanguageEnum, NeuroimagingSoftwareEnum, ImagingModalityEnum, - OpenDatasetEnum, QuadrantsEnum, } from "@/types/reproinventory"; -const GITHUB_REPO = "https://github.com/ReproNim/ReproInventory"; +const GITHUB_REPO = "https://github.com/likeajumprope/ReproInventory"; function formatAsYaml(material: ReproInventoryEntry): string { const lines: string[] = []; @@ -55,13 +54,9 @@ function formatAsYaml(material: ReproInventoryEntry): string { addList("imaging_modality", material.imaging_modality); addScalar("open_dataset", material.open_dataset); addScalar("last_updated", material.last_updated); - addScalar("functionality", material.functionality); - addScalar("assessment", material.assessment); addList("prerequisite", material.prerequisite); addList("source", material.source); - addScalar("review", material.review); - addScalar("exclude_from_repro_inventory", material.exclude_from_repro_inventory); - addScalar("alias_links", material.alias_links); + addScalar("description", material.description); addScalar("notes", material.notes); addList("quadrants", material.quadrants); @@ -93,7 +88,6 @@ const languageOptions: LanguageEnum[] = ["English", "French", "Spanish", "Chines const programmingLanguageOptions: ProgrammingLanguageEnum[] = ["Python", "R", "shell scripting", "Matlab", "Git", "NA"]; const neuroimagingSoftwareOptions: NeuroimagingSoftwareEnum[] = ["AFNI", "SPM", "FSL", "Freesurfer", "Python", "Multiple", "NA"]; const imagingModalityOptions: ImagingModalityEnum[] = ["DWI", "Structural", "Functional", "Task-based", "Resting-State", "EEG", "Behavioral", "MEG", "MRI", "NA"]; -const openDatasetOptions: OpenDatasetEnum[] = ["True", "False", "NA"]; const quadrantsOptions: QuadrantsEnum[] = ["information-oriented (reference)", "understanding-oriented (explanation)", "learning-oriented (tutorials)", "problem-oriented (how to guides)", "NA"]; const ARRAY_FIELDS: (keyof ReproInventoryEntry)[] = [ @@ -212,14 +206,6 @@ const EditMaterialDialog: React.FC = ({ material, onClo
handleChange("last_updated", e.target.value)} className="col-span-3" /> -
-
- - handleChange("functionality", e.target.value)} className="col-span-3" /> -
-
- - handleChange("assessment", e.target.value)} className="col-span-3" />
{/* Dynamic Prerequisite fields */}
@@ -284,22 +270,8 @@ const EditMaterialDialog: React.FC = ({ material, onClo
- - handleChange("review", e.target.value)} className="col-span-3" /> -
-
- - handleChange("exclude_from_repro_inventory", e.target.value)} className="col-span-3" /> -
- {/* Reverted Alias Links to single input */} -
- - handleChange("alias_links", e.target.value)} - className="col-span-3" - /> + + handleChange("description", e.target.value)} className="col-span-3" />
{/* Dynamic Keywords fields */}
@@ -496,19 +468,14 @@ const EditMaterialDialog: React.FC = ({ material, onClo
- +
+ handleChange("open_dataset", checked === true ? true : null)} + /> + +
diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index fba7826..046d988 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -25,7 +25,6 @@ import { type ProgrammingLanguageEnum, type NeuroimagingSoftwareEnum, type ImagingModalityEnum, - type OpenDatasetEnum, type QuadrantsEnum, } from "./types/reproinventory" // Import generated types @@ -67,10 +66,9 @@ export default function TrainingMaterialsBrowser() { const [selectedProgrammingLanguages, setSelectedProgrammingLanguages] = useState([]) const [selectedNeuroimagingSoftware, setSelectedNeuroimagingSoftware] = useState([]) const [selectedImagingModalities, setSelectedImagingModalities] = useState([]) - const [selectedOpenDataset, setSelectedOpenDataset] = useState("") + const [selectedOpenDataset, setSelectedOpenDataset] = useState(null) const [selectedQuadrants, setSelectedQuadrants] = useState([]) - const [showAssessmentOnly, setShowAssessmentOnly] = useState(false) - const [showFeaturedOnly, setShowFeaturedOnly] = useState(false) // Assuming a 'featured' concept will be derived or added + const [showFeaturedOnly, setShowFeaturedOnly] = useState(false) // Helper function to handle multi-select filters const handleMultiSelectFilterChange = (setter: React.Dispatch>, value: T, checked: boolean) => { @@ -87,18 +85,21 @@ export default function TrainingMaterialsBrowser() { const programmingLanguageOptions: ProgrammingLanguageEnum[] = ["Python", "R", "shell scripting", "Matlab", "Git", "NA"]; const neuroimagingSoftwareOptions: NeuroimagingSoftwareEnum[] = ["AFNI", "SPM", "FSL", "Freesurfer", "Python", "Multiple", "NA"]; const imagingModalityOptions: ImagingModalityEnum[] = ["DWI", "Structural", "Functional", "Task-based", "Resting-State", "EEG", "Behavioral", "MEG", "MRI", "NA"]; - const openDatasetOptions: OpenDatasetEnum[] = ["True", "False", "NA"]; + const openDatasetOptions: { label: string; value: boolean }[] = [ + { label: "Yes", value: true }, + { label: "No", value: false }, + ]; const quadrantsOptions: QuadrantsEnum[] = ["information-oriented (reference)", "understanding-oriented (explanation)", "learning-oriented (tutorials)", "problem-oriented (how to guides)", "NA"]; const filteredMaterials = useMemo(() => { let filtered = reproInventoryData return filtered.filter((material) => { - // Search query filter: course_name, url, keywords, notes, review + // Search query filter: course_name, url, keywords, notes, description const searchFields = [ material.course_name, material.url, - material.review, + material.description, material.notes, ...(material.keywords || []), ].filter(Boolean).map(String).join(" ").toLowerCase(); @@ -153,7 +154,7 @@ export default function TrainingMaterialsBrowser() { } // Open Dataset filter - if (selectedOpenDataset && material.open_dataset !== selectedOpenDataset) { + if (selectedOpenDataset !== null && material.open_dataset !== selectedOpenDataset) { return false; } @@ -163,11 +164,6 @@ export default function TrainingMaterialsBrowser() { } - // Assessment filter (boolean) - if (showAssessmentOnly && !material.assessment) { - return false - } - // Featured filter (assuming 'featured' will be part of the schema or derived) // Currently, 'featured' is not in the schema. This filter will always return true // or needs to be adapted once 'featured' status is defined for ReproInventoryEntry. @@ -197,7 +193,6 @@ export default function TrainingMaterialsBrowser() { selectedImagingModalities, selectedOpenDataset, selectedQuadrants, - showAssessmentOnly, showFeaturedOnly, ]) @@ -212,9 +207,8 @@ export default function TrainingMaterialsBrowser() { setSelectedProgrammingLanguages([]) setSelectedNeuroimagingSoftware([]) setSelectedImagingModalities([]) - setSelectedOpenDataset("") + setSelectedOpenDataset(null) setSelectedQuadrants([]) - setShowAssessmentOnly(false) setShowFeaturedOnly(false) } @@ -544,14 +538,16 @@ export default function TrainingMaterialsBrowser() {
{openDatasetOptions.map((option) => ( -
+
setSelectedOpenDataset(option)} + id={`open-dataset-${option.value}`} + checked={selectedOpenDataset === option.value} + onCheckedChange={() => + setSelectedOpenDataset(selectedOpenDataset === option.value ? null : option.value) + } /> -
))} @@ -559,21 +555,6 @@ export default function TrainingMaterialsBrowser() { - - Assessment Available - -
- setShowAssessmentOnly(checked as boolean)} - /> - -
-
-
@@ -611,10 +592,9 @@ export default function TrainingMaterialsBrowser() { {material.instruction_medium?.[0] || "N/A"}
- {material.assessment && Assessment}
{material.course_name} - {material.review} + {material.description}
@@ -716,7 +696,7 @@ export default function TrainingMaterialsBrowser() { const body = `## Delete Training Material Request\n\n` + `Please remove entry **ID: ${material.id}** ("${material.course_name}") from \`model/reproinventory_data.yaml\`.`; - const url = `https://github.com/ReproNim/ReproInventory/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + const url = `https://github.com/ReproNim/likeajumprope/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; window.open(url, "_blank"); }} > diff --git a/frontend/src/types/reproinventory.ts b/frontend/src/types/reproinventory.ts index d46241a..83bb330 100644 --- a/frontend/src/types/reproinventory.ts +++ b/frontend/src/types/reproinventory.ts @@ -18,7 +18,7 @@ export type NeuroimagingSoftwareEnum = "AFNI" | "SPM" | "FSL" | "Freesurfer" | " export type ImagingModalityEnum = "DWI" | "Structural" | "Functional" | "Task-based" | "Resting-State" | "EEG" | "Behavioral" | "MEG" | "MRI" | "NA"; -export type OpenDatasetEnum = "True" | "False" | "NA"; +export type OpenDatasetEnum = boolean; export type QuadrantsEnum = "information-oriented (reference)" | "understanding-oriented (explanation)" | "learning-oriented (tutorials)" | "problem-oriented (how to guides)" | "NA"; @@ -42,10 +42,10 @@ export interface ReproInventoryEntry { open_dataset?: OpenDatasetEnum, last_updated?: string, functionality?: string, - assessment?: string, + assessment?: boolean, prerequisite?: string[], source?: string[], - review?: string, + description?: string, exclude_from_repro_inventory?: string, alias_links?: string, notes?: string, @@ -81,7 +81,7 @@ export function toReproInventoryEntry(o: ReproInventoryEntry): ReproInventoryEnt assessment: o.assessment ?? undefined, prerequisite: Array.isArray(o.prerequisite) ? o.prerequisite : (o.prerequisite ? [o.prerequisite] : undefined), source: Array.isArray(o.source) ? o.source : (o.source ? [o.source] : undefined), - review: o.review ?? undefined, + description: o.description ?? undefined, exclude_from_repro_inventory: o.exclude_from_repro_inventory ?? undefined, alias_links: o.alias_links ?? undefined, notes: o.notes ?? undefined, diff --git a/model/model.yaml b/model/model.yaml index 3c13e7b..4c28b81 100644 --- a/model/model.yaml +++ b/model/model.yaml @@ -90,14 +90,12 @@ enums: NA: Open_dataset_enum: permissible_values: - Yes: - No: - NA: + "true": + "false": Assessment_enum: permissible_values: - Yes: - No: - NA: + "true": + "false": Exclude_from_ReproInventory_enum: permissible_values: Yes: @@ -180,8 +178,8 @@ classes: Source: description: Source range: string - Review: - description: Review + Description: + description: Public description of the course range: string Exclude_from_ReproInventory: description: Exclude from ReproInventory diff --git a/model/reproinventory_data.yaml b/model/reproinventory_data.yaml index 86b7b96..c721f26 100644 --- a/model/reproinventory_data.yaml +++ b/model/reproinventory_data.yaml @@ -9,10 +9,15 @@ - Beginner platform: - Mac + - Windows keywords: - Git - Version Control - GitHub + - GitHub Desktop + - Branching + - Collaboration + - Merge Conflicts course_length: 1-4 hrs instruction_medium: - Hands-on tutorial / notebooks @@ -28,17 +33,17 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2023' - functionality: null assessment: false prerequisite: null source: - ReproNim - Johanna Bayer - Fellow-22 - review: null - alias_links: null + description: A beginner-friendly course introducing Git and GitHub for version control + and collaboration, covering online GitHub workflows and local machine setup with + GitHub Desktop, progressing from basic concepts to managing merge conflicts. notes: null quadrants: - problem-oriented (how to guides) @@ -79,17 +84,19 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: true last_updated: '2023' functionality: null assessment: true - prerequisite: null + prerequisite: + - Basic Python + - Introductory statistics source: - ReproNim - Yibei Chen - Fellow-22 - UCSB - review: JupyterHub no longer accessible. Need to link GitHubClassroom to GitHub + description: JupyterHub no longer accessible. Need to link GitHubClassroom to GitHub (uclear if links work once you do that) alias_links: null notes: null @@ -124,17 +131,18 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2022' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic Git source: - ReproNim - Julian Kosciessa - Fellow-22 - Donders Institute - review: Short slide deck, very clear + description: Short slide deck, very clear alias_links: null notes: link does not work for me (JB) can someone double check quadrants: @@ -168,7 +176,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2022' functionality: null assessment: false @@ -179,8 +187,8 @@ - Julian Kosciessa - Fellow-22 - Donders Institute - review: Relatively quick overview - more just what is DataLad vs detailed how to - use + description: Relatively quick overview - more just what is DataLad vs detailed how + to use alias_links: null notes: null quadrants: @@ -216,17 +224,18 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2022' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic Git source: - ReproNim - Julian Kosciessa - Fellow-22 - Donders Institute - review: Very short slide deck on GIT + description: Very short slide deck on GIT alias_links: null notes: null quadrants: @@ -260,7 +269,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2023' functionality: null assessment: false @@ -270,7 +279,7 @@ - Julian Kosciessa - Fellow-22 - Donders Institute - review: Practical intro to bash and git + description: Practical intro to bash and git alias_links: null notes: null quadrants: @@ -313,7 +322,7 @@ - NA imaging_modality: - MRI - open_dataset: NA + open_dataset: true last_updated: '2022' functionality: null assessment: true @@ -325,7 +334,7 @@ - ReproNim - Celine Provins - Fellow-22 - review: Focuses on QC in reference to MRIQC; has lots of big picture info about + description: Focuses on QC in reference to MRIQC; has lots of big picture info about QC/QA in general alias_links: null notes: null @@ -359,7 +368,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2022' functionality: null assessment: false @@ -369,7 +378,7 @@ - ReproNim - Avery Van De Water - Fellow-22 - review: labeled as part 1 - unclear where part 2 is + description: labeled as part 1 - unclear where part 2 is alias_links: null notes: null quadrants: @@ -403,18 +412,22 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2021' functionality: NA assessment: false - prerequisite: null + prerequisite: + - Basic Python + - Unix source: - ReproNim - Karolina Finc - review: Some sections are under-developed + description: Some sections are under-developed alias_links: null notes: Reproducible Neuroimaging, tutorial guide, for cog sci students audience - quadrants: null + quadrants: + - learning-oriented (tutorials) + - information-oriented (reference) - id: 21 tag_team: - CW @@ -447,7 +460,7 @@ - NA imaging_modality: - MRI - open_dataset: 'True' + open_dataset: true last_updated: '2024' functionality: null assessment: true @@ -458,10 +471,12 @@ - ReproNim - MIchael Joseph - Fellow-20 - review: Basic Imaging Overview. Focus on BIDS + description: Basic Imaging Overview. Focus on BIDS alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 22 tag_team: - CW @@ -495,7 +510,7 @@ - Python imaging_modality: - Functional - open_dataset: 'True' + open_dataset: true last_updated: '2024' functionality: null assessment: true @@ -505,7 +520,7 @@ - ReproNim - MIchael Joseph - Fellow-20 - review: Tutorial on functional neuroimaging in Python + description: Tutorial on functional neuroimaging in Python alias_links: null notes: null quadrants: @@ -538,7 +553,7 @@ - Python imaging_modality: - DWI - open_dataset: 'True' + open_dataset: true last_updated: '2024' functionality: null assessment: true @@ -549,10 +564,14 @@ - ReproNim - MIchael Joseph - Fellow-20 - review: null + description: A Carpentries Incubator lesson introducing diffusion MRI concepts and + data organization using BIDS, with hands-on analysis using Python-based tools + like Dipy and Nibabel. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 25 tag_team: - CW @@ -582,7 +601,7 @@ - Multiple imaging_modality: - NA - open_dataset: NA + open_dataset: null last_updated: '2020' functionality: null assessment: false @@ -593,10 +612,13 @@ - ReproNim - Jennifer Legault - Fellow-20 - review: example syllabus for hackathon/course + description: example syllabus for hackathon/course alias_links: null notes: null - quadrants: null + quadrants: + - understanding-oriented (explanation) + - learning-oriented (tutorials) + - information-oriented (reference) - id: 26 tag_team: - ELB @@ -616,25 +638,31 @@ delivery: null language: - English - programming_language: null + programming_language: + - R + - Python neuroimaging_software: - NA imaging_modality: - NA - open_dataset: NA + open_dataset: true last_updated: '2023' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic statistics + - Basic research methods source: - ReproNim - Sook-Lei Liew - Fellow-20 - ReproRehab - review: Entire first year bootcamp videos online + description: Entire first year bootcamp videos online alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 28 tag_team: - ELB @@ -660,7 +688,7 @@ - Python imaging_modality: - Functional - open_dataset: NA + open_dataset: true last_updated: '2020' functionality: null assessment: false @@ -671,11 +699,13 @@ - Elizabeth McDevitt - Fellow-20 - Princeton - review: Jupyter tutorials from the basics to advanced machine learning analyses + description: Jupyter tutorials from the basics to advanced machine learning analyses on fMRI data alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 29 tag_team: - ELB @@ -695,24 +725,30 @@ delivery: null language: - English - programming_language: null + programming_language: + - Python + - R neuroimaging_software: - Multiple imaging_modality: - Functional - open_dataset: NA + open_dataset: true last_updated: '2020' functionality: null assessment: true - prerequisite: null + prerequisite: + - Basic neuroscience knowledge + - Basic statistics source: - ReproNim - Chris Rorden - Fellow-20 - review: Syllabus for course on fMRI, including slides, from collection to inferencing + description: Syllabus for course on fMRI, including slides, from collection to inferencing alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 30 tag_team: - ELB @@ -732,12 +768,15 @@ delivery: null language: - English - programming_language: null + programming_language: + - Python + - shell scripting + - Git neuroimaging_software: - Multiple imaging_modality: - Functional - open_dataset: NA + open_dataset: null last_updated: NA functionality: null assessment: true @@ -748,10 +787,12 @@ - ReproNim - Julie Schneider - Fellow-20 - review: Syllabus for reproducible neuroimaging multi-week course + description: Syllabus for reproducible neuroimaging multi-week course alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 31 tag_team: - CW @@ -778,7 +819,7 @@ - Freesurfer imaging_modality: - MRI - open_dataset: NA + open_dataset: null last_updated: '2020' functionality: null assessment: false @@ -787,10 +828,12 @@ - Basic Python source: - ReproNim - review: syllabus for tutorial; details unclear. Might be unfinished. + description: syllabus for tutorial; details unclear. Might be unfinished. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - information-oriented (reference) - id: 32 tag_team: - CW @@ -819,7 +862,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: null last_updated: '2024' functionality: '2025' assessment: false @@ -828,10 +871,13 @@ source: - ReproNim - Adina Wagner - review: very good resource for data provenance + description: very good resource for data provenance alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - information-oriented (reference) + - problem-oriented (how to guides) - id: 33 tag_team: - CF @@ -859,17 +905,19 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: null last_updated: '2024' functionality: null assessment: false prerequisite: null source: - AI campus - review: Nice videos and course material on AI + description: Nice videos and course material on AI alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 34 tag_team: - CF @@ -897,7 +945,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2021' functionality: null assessment: false @@ -906,10 +954,12 @@ - ReproNim - Lennart Wittkuhn - Adina Wagner - review: Good video + description: Good video alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 35 tag_team: - MH @@ -936,16 +986,20 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2020' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic Git + - Unix source: null - review: Course outline for Data Lad Course + description: Course outline for Data Lad Course alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 36 tag_team: - CF @@ -972,7 +1026,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: null last_updated: '2024' functionality: null assessment: false @@ -980,10 +1034,15 @@ source: - ReproNim - Lennart Wittkuhn - review: null + description: An open-access online book that teaches version control using Git, + designed for researchers with no prior experience. It covers core Git concepts + and workflows through hands-on exercises and practical examples relevant to scientific + work. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - information-oriented (reference) - id: 38 tag_team: - CF @@ -1007,23 +1066,27 @@ delivery: null language: - English - programming_language: null + programming_language: + - Python neuroimaging_software: - NA imaging_modality: - NA - open_dataset: NA + open_dataset: true last_updated: '2021' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic familiarity with Python recommended source: - ReproNim - Xihe Xie - review: Review of previous materials, full course + description: Review of previous materials, full course alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 39 tag_team: - CW @@ -1054,19 +1117,23 @@ - Python imaging_modality: - MRI - open_dataset: NA + open_dataset: null last_updated: '2019' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic Python + - Unix shell source: - ReproNim - Michael Dayan - Fellow-19 - review: Syllabus for ReproNim workshop + description: Syllabus for ReproNim workshop alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - information-oriented (reference) - id: 40 tag_team: - CW @@ -1093,7 +1160,7 @@ - NA imaging_modality: - MRI - open_dataset: NA + open_dataset: null last_updated: '2019' functionality: null assessment: false @@ -1104,11 +1171,13 @@ - ReproNim - Aaron Kemp - Fellow-19 - review: Syllabus for Research Imaging Informatics course. Overview of neuroimaging + description: Syllabus for Research Imaging Informatics course. Overview of neuroimaging methods and basic processing alias_links: null notes: null - quadrants: null + quadrants: + - information-oriented (reference) + - understanding-oriented (explanation) - id: 43 tag_team: - CF @@ -1136,17 +1205,22 @@ - Python imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2020' functionality: null assessment: true - prerequisite: null + prerequisite: + - Basic Python + - Basic Git + - Unix source: - ReproNim - review: Syllabus for workshop that has been given + description: Syllabus for workshop that has been given alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 46 tag_team: - CF @@ -1167,20 +1241,24 @@ delivery: null language: - English - programming_language: null + programming_language: + - Python + - shell scripting neuroimaging_software: - Multiple imaging_modality: - Functional - open_dataset: NA + open_dataset: true last_updated: '2021' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic familiarity with neuroimaging concepts + - Some experience with command-line tools source: - ReproNim - Princeton - review: Very nice overview of different fMRI topics + description: Very nice overview of different fMRI topics alias_links: null notes: null quadrants: @@ -1212,15 +1290,17 @@ - NA imaging_modality: - Functional - open_dataset: NA + open_dataset: null last_updated: '2019' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic MRI knowledge + - Introductory neuroimaging experience source: - ReproNim - Etienne Roesch - review: Pretty good if you want to teach fMRI analysis from scratch + description: Pretty good if you want to teach fMRI analysis from scratch alias_links: null notes: null quadrants: @@ -1254,16 +1334,17 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: null last_updated: '2019' functionality: null assessment: false - prerequisite: null + prerequisite: + - Basic neuroimaging knowledge source: - ReproNim - Sebastien Tourbier - review: Single presentation, good for an intro class to data management and data - version control + description: Single presentation, good for an intro class to data management and + data version control alias_links: null notes: null quadrants: @@ -1288,19 +1369,20 @@ delivery: null language: - English - programming_language: null + programming_language: + - shell scripting neuroimaging_software: - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: '2024' functionality: null assessment: false prerequisite: null source: - Carpentries - review: If you want to teach carpentries use this tool - not only shell scripting, + description: If you want to teach carpentries use this tool - not only shell scripting, but also intro to R, Python and HPC alias_links: https://github.com/jdkent/incf-fellow-jdkent/blob/gh-pages/index.md notes: null @@ -1332,7 +1414,7 @@ - NA imaging_modality: - NA - open_dataset: NA + open_dataset: false last_updated: NA functionality: null assessment: false @@ -1340,15 +1422,17 @@ source: - ReproNim - David Warren - review: For internal usage + description: For internal usage alias_links: null notes: Link to Github Importer broken - quadrants: null + quadrants: + - information-oriented (reference) + - understanding-oriented (explanation) - id: 53 tag_team: - JB course_name: Introduction to Machine Learning part 1 - url: :https://neurodatascience.github.io/QLS612-Overview/lectures-materials/2024/intro_ml_part_1.html + url: https://neurodatascience.github.io/QLS612-Overview/lectures-materials/2024/intro_ml_part_1.html level: - Beginner platform: @@ -1375,17 +1459,25 @@ - Git neuroimaging_software: - Python - imaging_modality: null - open_dataset: NA + imaging_modality: + - MRI + open_dataset: true last_updated: null functionality: null assessment: null - prerequisite: null + prerequisite: + - Basic Python + - Introductory statistics + - Basic neuroimaging knowledge source: null - review: null + description: An introduction to machine learning concepts and methods in the context + of neuroimaging data, covering supervised learning, model evaluation, and practical + implementation in Python. Part of the QLS612 multi-week curriculum at McGill University. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 54 tag_team: - JB @@ -1396,25 +1488,49 @@ - Intermediate platform: - Windows - keywords: null + keywords: + - brainhack + - open science + - reproducibility + - neuroimaging + - data science + - machine learning + - open-source + - collaboration + - Python + - version control course_length: NA instruction_medium: null delivery: null language: null - programming_language: null - neuroimaging_software: null + programming_language: + - Python + - shell scripting + - Git + neuroimaging_software: + - FSL + - Freesurfer + - Python + - Multiple imaging_modality: - NA - open_dataset: NA + open_dataset: true last_updated: null functionality: null assessment: null - prerequisite: null + prerequisite: + - Basic Python programming + - Familiarity with neuroimaging concepts source: null - review: null + description: Brainhack School is an intensive, project-based training program run + by a consortium of Canadian universities that teaches open and reproducible neuroscience. + Participants work on collaborative projects while learning modern data science + tools applied to neuroimaging. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 55 tag_team: - JB @@ -1427,49 +1543,103 @@ - Mac - Windows - Linux - keywords: null + keywords: + - data science + - open neuroscience + - reproducibility + - machine learning + - neuroimaging + - fMRI + - open data + - Python + - summer institute + - collaborative course_length: NA instruction_medium: null delivery: null language: null - programming_language: null - neuroimaging_software: null - imaging_modality: null - open_dataset: NA + programming_language: + - Python + - R + - shell scripting + - Git + neuroimaging_software: + - FSL + - Freesurfer + - Python + - Multiple + imaging_modality: + - Functional + - Structural + - Resting-State + open_dataset: true last_updated: null functionality: null assessment: null - prerequisite: null + prerequisite: + - Basic Python or programming experience + - Graduate-level neuroscience or related field source: null - review: null + description: NeuroHackademy is a summer institute at the University of Washington + focused on data science and open neuroscience, combining lectures and hands-on + tutorials covering neuroimaging analysis, machine learning, and reproducible research + practices. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) + - problem-oriented (how to guides) - id: 56 tag_team: - CF course_name: Neuromatchacademy url: https://github.com/NeuromatchAcademy - level: null - platform: null - keywords: null + level: + - Intermediate + - Advanced + platform: + - Jupyter + keywords: + - computational neuroscience + - deep learning + - neural data + - modeling + - data analysis + - machine learning + - online course + - open science + - tutorials course_length: NA instruction_medium: null delivery: null language: null - programming_language: null + programming_language: + - Python neuroimaging_software: null - imaging_modality: null - open_dataset: NA + imaging_modality: + - Functional + - Resting-State + - Behavioral + open_dataset: true last_updated: null functionality: null assessment: null - prerequisite: null + prerequisite: + - Linear algebra + - Basic calculus + - Python programming + - Introductory neuroscience source: null - review: null + description: Neuromatch Academy offers intensive online computational neuroscience + and deep learning courses through lectures, tutorials, and projects designed to + build skills in quantitative analysis of neural data. The curriculum covers modeling, + data analysis, and machine learning applied to neuroscience. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) - id: 57 tag_team: - CF @@ -1508,17 +1678,18 @@ - Behavioral - Resting-State - MRI - open_dataset: 'True' + open_dataset: true last_updated: '2024' functionality: '2024' assessment: false prerequisite: null source: - Github Repo added by Charlotte Fraze - review: Great resource + description: Great resource alias_links: null notes: null - quadrants: null + quadrants: + - information-oriented (reference) - id: 58 tag_team: - JB @@ -1528,33 +1699,104 @@ instruction_medium: - blog post - Hands-on tutorial / notebooks - open_dataset: NA + open_dataset: true last_updated: 2026 + description: Andy's Brain Book is a comprehensive, beginner-friendly online textbook + covering neuroimaging analysis with major software packages including FSL, SPM, + AFNI, and Freesurfer, using real datasets and step-by-step tutorials. It is widely + used as an introductory reference for fMRI and structural MRI analysis. + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) + - information-oriented (reference) + programming_language: + - shell scripting + - Python + - Matlab + neuroimaging_software: + - FSL + - SPM + - AFNI + - Freesurfer + - Multiple + imaging_modality: + - Functional + - Structural + - DWI + - Resting-State + - Task-based + platform: + - Mac + - Windows + - Linux + keywords: + - fMRI + - neuroimaging + - FSL + - SPM + - AFNI + - Freesurfer + - tutorial + - beginner + - structural MRI + - connectivity + - tractography + level: + - Beginner + - Intermediate - id: 59 tag_team: - JB course_name: ABCD Repronim course url: https://www.abcd-repronim.org/ - level: null - platform: null - keywords: null + level: + - Intermediate + - Advanced + platform: + - Linux + - Docker + keywords: + - ABCD + - reproducibility + - neuroimaging + - developmental + - ReproNim + - large-scale data + - open data course_length: NA instruction_medium: null delivery: null language: null - programming_language: null - neuroimaging_software: null - imaging_modality: null - open_dataset: NA + programming_language: + - Python + - R + - shell scripting + neuroimaging_software: + - Multiple + imaging_modality: + - Structural + - Functional + - Resting-State + - DWI + open_dataset: true last_updated: null functionality: null assessment: null - prerequisite: null + prerequisite: + - Basic Python or R programming + - Introductory neuroimaging knowledge + - Familiarity with MRI data source: null - review: null + description: A comprehensive course on reproducible neuroimaging using the Adolescent + Brain Cognitive Development (ABCD) dataset, covering data access, processing pipelines, + and ReproNim reproducibility principles. Designed for researchers working with + large-scale developmental neuroimaging data. alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - understanding-oriented (explanation) + - problem-oriented (how to guides) - id: 60 tag_team: - JB @@ -1562,33 +1804,50 @@ url: https://www.abcd-repronim.org/ml.html level: - Intermediate - platform: null + platform: + - Linux + - Docker + - Jupyter keywords: - Machine Learning course_length: NA instruction_medium: null delivery: null language: null - programming_language: null - neuroimaging_software: null - imaging_modality: null - open_dataset: NA + programming_language: + - Python + neuroimaging_software: + - Multiple + imaging_modality: + - Structural + - Functional + - Resting-State + open_dataset: true last_updated: 2025 functionality: null assessment: true - prerequisite: null + prerequisite: + - ABCD ReproNim course or equivalent + - Basic Python programming + - Introductory machine learning concepts source: null - review: 3 week machone learning course + description: 3 week machone learning course alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) - id: 61 tag_team: - JB course_name: Reproducible Pipelines for Neuroimaging Research url: https://sina-mansour.github.io/ohbm2025-reproducible-research/intro.html - level: null - platform: null + level: + - Intermediate + - Advanced + platform: + - Linux + - Docker keywords: - Reproducible Pipelines - Best Practices @@ -1600,19 +1859,28 @@ - English programming_language: - Python - neuroimaging_software: null - imaging_modality: null - open_dataset: NA + neuroimaging_software: + - Multiple + imaging_modality: + - Structural + - Functional + open_dataset: true last_updated: 2025 functionality: null assessment: null - prerequisite: null + prerequisite: + - Basic neuroimaging experience + - Familiarity with command-line tools + - Basic Python or shell scripting source: null - review: Comprehensive website describing the necessity of reproducible research + description: Comprehensive website describing the necessity of reproducible research and how to achieve it (notebooks, visualisation) alias_links: null notes: null - quadrants: null + quadrants: + - learning-oriented (tutorials) + - problem-oriented (how to guides) + - understanding-oriented (explanation) - id: 62 course_name: test course platform: From 8c5275977f62c26c20e27acc757330c091a6609a Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Thu, 16 Apr 2026 15:24:30 -0400 Subject: [PATCH 2/4] update the local encoding of the repo url to a general solution --- .gitignore | 3 +- .../{index-BRkoL4m2.js => index-BfAUm7qF.js} | 76 +++++++++---------- frontend/dist/index.html | 2 +- frontend/src/components/AddMaterialDialog.tsx | 3 +- .../src/components/EditMaterialDialog.tsx | 3 +- frontend/src/lib/github.ts | 14 ++++ frontend/src/training-materials-browser.tsx | 5 +- 7 files changed, 62 insertions(+), 44 deletions(-) rename frontend/dist/assets/{index-BRkoL4m2.js => index-BfAUm7qF.js} (61%) create mode 100644 frontend/src/lib/github.ts diff --git a/.gitignore b/.gitignore index b512c09..fe29bc8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +.squad diff --git a/frontend/dist/assets/index-BRkoL4m2.js b/frontend/dist/assets/index-BfAUm7qF.js similarity index 61% rename from frontend/dist/assets/index-BRkoL4m2.js rename to frontend/dist/assets/index-BfAUm7qF.js index af6f49d..3a21422 100644 --- a/frontend/dist/assets/index-BRkoL4m2.js +++ b/frontend/dist/assets/index-BfAUm7qF.js @@ -1,4 +1,4 @@ -function d0(a,r){for(var o=0;oc[f]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const v of d.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&c(v)}).observe(document,{childList:!0,subtree:!0});function o(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=o(f);fetch(f.href,d)}})();function av(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var ru={exports:{}},Gi={};/** +function m0(a,r){for(var o=0;oc[f]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const v of d.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&c(v)}).observe(document,{childList:!0,subtree:!0});function o(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=o(f);fetch(f.href,d)}})();function iv(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var ru={exports:{}},Gi={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ function d0(a,r){for(var o=0;o>>1,A=j[re];if(0>>1;ref(P,B))eef(ye,P)?(j[re]=ye,j[ee]=B,re=ee):(j[re]=P,j[I]=B,re=I);else if(eef(ye,B))j[re]=ye,j[ee]=B,re=ee;else break e}}return K}function f(j,K){var B=j.sortIndex-K.sortIndex;return B!==0?B:j.id-K.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var v=Date,p=v.now();a.unstable_now=function(){return v.now()-p}}var x=[],m=[],g=1,b=null,w=3,_=!1,M=!1,N=!1,T=!1,z=typeof setTimeout=="function"?setTimeout:null,R=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;function Y(j){for(var K=o(m);K!==null;){if(K.callback===null)c(m);else if(K.startTime<=j)c(m),K.sortIndex=K.expirationTime,r(x,K);else break;K=o(m)}}function q(j){if(N=!1,Y(j),!M)if(o(x)!==null)M=!0,J||(J=!0,ue());else{var K=o(m);K!==null&&de(q,K.startTime-j)}}var J=!1,F=-1,Q=5,ie=-1;function me(){return T?!0:!(a.unstable_now()-iej&&me());){var re=b.callback;if(typeof re=="function"){b.callback=null,w=b.priorityLevel;var A=re(b.expirationTime<=j);if(j=a.unstable_now(),typeof A=="function"){b.callback=A,Y(j),K=!0;break t}b===o(x)&&c(x),Y(j)}else c(x);b=o(x)}if(b!==null)K=!0;else{var X=o(m);X!==null&&de(q,X.startTime-j),K=!1}}break e}finally{b=null,w=B,_=!1}K=void 0}}finally{K?ue():J=!1}}}var ue;if(typeof U=="function")ue=function(){U(xe)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,ve=be.port2;be.port1.onmessage=xe,ue=function(){ve.postMessage(null)}}else ue=function(){z(xe,0)};function de(j,K){F=z(function(){j(a.unstable_now())},K)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(j){j.callback=null},a.unstable_forceFrameRate=function(j){0>j||125re?(j.sortIndex=B,r(m,j),o(x)===null&&j===o(m)&&(N?(R(F),F=-1):N=!0,de(q,B-re))):(j.sortIndex=A,r(x,j),M||_||(M=!0,J||(J=!0,ue()))),j},a.unstable_shouldYield=me,a.unstable_wrapCallback=function(j){var K=w;return function(){var B=w;w=K;try{return j.apply(this,arguments)}finally{w=B}}}}(uu)),uu}var yg;function p0(){return yg||(yg=1,su.exports=v0()),su.exports}var fu={exports:{}},St={};/** + */var yg;function p0(){return yg||(yg=1,function(a){function r(j,K){var B=j.length;j.push(K);e:for(;0>>1,A=j[re];if(0>>1;ref(P,B))eef(ye,P)?(j[re]=ye,j[ee]=B,re=ee):(j[re]=P,j[I]=B,re=I);else if(eef(ye,B))j[re]=ye,j[ee]=B,re=ee;else break e}}return K}function f(j,K){var B=j.sortIndex-K.sortIndex;return B!==0?B:j.id-K.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var v=Date,p=v.now();a.unstable_now=function(){return v.now()-p}}var x=[],m=[],g=1,b=null,w=3,_=!1,M=!1,N=!1,T=!1,z=typeof setTimeout=="function"?setTimeout:null,R=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;function Y(j){for(var K=o(m);K!==null;){if(K.callback===null)c(m);else if(K.startTime<=j)c(m),K.sortIndex=K.expirationTime,r(x,K);else break;K=o(m)}}function q(j){if(N=!1,Y(j),!M)if(o(x)!==null)M=!0,J||(J=!0,ue());else{var K=o(m);K!==null&&de(q,K.startTime-j)}}var J=!1,F=-1,Q=5,ie=-1;function me(){return T?!0:!(a.unstable_now()-iej&&me());){var re=b.callback;if(typeof re=="function"){b.callback=null,w=b.priorityLevel;var A=re(b.expirationTime<=j);if(j=a.unstable_now(),typeof A=="function"){b.callback=A,Y(j),K=!0;break t}b===o(x)&&c(x),Y(j)}else c(x);b=o(x)}if(b!==null)K=!0;else{var X=o(m);X!==null&&de(q,X.startTime-j),K=!1}}break e}finally{b=null,w=B,_=!1}K=void 0}}finally{K?ue():J=!1}}}var ue;if(typeof U=="function")ue=function(){U(xe)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,ve=be.port2;be.port1.onmessage=xe,ue=function(){ve.postMessage(null)}}else ue=function(){z(xe,0)};function de(j,K){F=z(function(){j(a.unstable_now())},K)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(j){j.callback=null},a.unstable_forceFrameRate=function(j){0>j||125re?(j.sortIndex=B,r(m,j),o(x)===null&&j===o(m)&&(N?(R(F),F=-1):N=!0,de(q,B-re))):(j.sortIndex=A,r(x,j),M||_||(M=!0,J||(J=!0,ue()))),j},a.unstable_shouldYield=me,a.unstable_wrapCallback=function(j){var K=w;return function(){var B=w;w=K;try{return j.apply(this,arguments)}finally{w=B}}}}(uu)),uu}var xg;function y0(){return xg||(xg=1,su.exports=p0()),su.exports}var fu={exports:{}},St={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ function d0(a,r){for(var o=0;o"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),fu.exports=y0(),fu.exports}/** + */var bg;function x0(){if(bg)return St;bg=1;var a=Qu();function r(x){var m="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),fu.exports=x0(),fu.exports}/** * @license React * react-dom-client.production.js * @@ -38,106 +38,106 @@ function d0(a,r){for(var o=0;oA||(e.current=re[A],re[A]=null,A--)}function P(e,t){A++,re[A]=e.current,e.current=t}var ee=X(null),ye=X(null),ce=X(null),W=X(null);function se(e,t){switch(P(ce,t),P(ye,e),P(ee,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Gh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Gh(t),e=Yh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}I(ee),P(ee,e)}function De(){I(ee),I(ye),I(ce)}function Re(e){e.memoizedState!==null&&P(W,e);var t=ee.current,n=Yh(t,e.type);t!==n&&(P(ye,e),P(ee,n))}function Ne(e){ye.current===e&&(I(ee),I(ye)),W.current===e&&(I(W),Ui._currentValue=B)}var Ee=Object.prototype.hasOwnProperty,lt=a.unstable_scheduleCallback,ct=a.unstable_cancelCallback,rn=a.unstable_shouldYield,Sn=a.unstable_requestPaint,G=a.unstable_now,fe=a.unstable_getCurrentPriorityLevel,pt=a.unstable_ImmediatePriority,Ft=a.unstable_UserBlockingPriority,Bt=a.unstable_NormalPriority,bl=a.unstable_LowPriority,ot=a.unstable_IdlePriority,Ql=a.log,Zl=a.unstable_setDisableYieldValue,Yn=null,yt=null;function Pt(e){if(typeof Ql=="function"&&Zl(e),yt&&typeof yt.setStrictMode=="function")try{yt.setStrictMode(Yn,e)}catch{}}var Ue=Math.clz32?Math.clz32:Jy,Py=Math.log,Iy=Math.LN2;function Jy(e){return e>>>=0,e===0?32:31-(Py(e)/Iy|0)|0}var Wi=256,er=4194304;function Sl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tr(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,s=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var y=l&134217727;return y!==0?(l=y&~s,l!==0?i=Sl(l):(h&=y,h!==0?i=Sl(h):n||(n=y&~e,n!==0&&(i=Sl(n))))):(y=l&~s,y!==0?i=Sl(y):h!==0?i=Sl(h):n||(n=l&~e,n!==0&&(i=Sl(n)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,n=t&-t,s>=n||s===32&&(n&4194048)!==0)?t:i}function Qa(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Wy(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ef(){var e=Wi;return Wi<<=1,(Wi&4194048)===0&&(Wi=256),e}function Af(){var e=er;return er<<=1,(er&62914560)===0&&(er=4194304),e}function $c(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Za(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ex(e,t,n,l,i,s){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,E=e.expirationTimes,k=e.hiddenUpdates;for(n=h&~n;0A||(e.current=re[A],re[A]=null,A--)}function P(e,t){A++,re[A]=e.current,e.current=t}var ee=X(null),ye=X(null),ce=X(null),W=X(null);function se(e,t){switch(P(ce,t),P(ye,e),P(ee,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Yh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Yh(t),e=Vh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}I(ee),P(ee,e)}function De(){I(ee),I(ye),I(ce)}function Re(e){e.memoizedState!==null&&P(W,e);var t=ee.current,n=Vh(t,e.type);t!==n&&(P(ye,e),P(ee,n))}function Ne(e){ye.current===e&&(I(ee),I(ye)),W.current===e&&(I(W),Ui._currentValue=B)}var Ee=Object.prototype.hasOwnProperty,lt=a.unstable_scheduleCallback,ct=a.unstable_cancelCallback,rn=a.unstable_shouldYield,Sn=a.unstable_requestPaint,G=a.unstable_now,fe=a.unstable_getCurrentPriorityLevel,pt=a.unstable_ImmediatePriority,Ft=a.unstable_UserBlockingPriority,Bt=a.unstable_NormalPriority,bl=a.unstable_LowPriority,ot=a.unstable_IdlePriority,Ql=a.log,Zl=a.unstable_setDisableYieldValue,Yn=null,yt=null;function Pt(e){if(typeof Ql=="function"&&Zl(e),yt&&typeof yt.setStrictMode=="function")try{yt.setStrictMode(Yn,e)}catch{}}var Ue=Math.clz32?Math.clz32:Wy,Iy=Math.log,Jy=Math.LN2;function Wy(e){return e>>>=0,e===0?32:31-(Iy(e)/Jy|0)|0}var Wi=256,er=4194304;function Sl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tr(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,s=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var y=l&134217727;return y!==0?(l=y&~s,l!==0?i=Sl(l):(h&=y,h!==0?i=Sl(h):n||(n=y&~e,n!==0&&(i=Sl(n))))):(y=l&~s,y!==0?i=Sl(y):h!==0?i=Sl(h):n||(n=l&~e,n!==0&&(i=Sl(n)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,n=t&-t,s>=n||s===32&&(n&4194048)!==0)?t:i}function Qa(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function ex(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Af(){var e=Wi;return Wi<<=1,(Wi&4194048)===0&&(Wi=256),e}function Cf(){var e=er;return er<<=1,(er&62914560)===0&&(er=4194304),e}function $c(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Za(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function tx(e,t,n,l,i,s){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,E=e.expirationTimes,k=e.hiddenUpdates;for(n=h&~n;0)":-1i||E[l]!==k[i]){var V=` -`+E[l].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=l&&0<=i);break}}}finally{eo=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Jl(n):""}function rx(e){switch(e.tag){case 26:case 27:case 5:return Jl(e.type);case 16:return Jl("Lazy");case 13:return Jl("Suspense");case 19:return Jl("SuspenseList");case 0:case 15:return to(e.type,!1);case 11:return to(e.type.render,!1);case 1:return to(e.type,!0);case 31:return Jl("Activity");default:return""}}function kf(e){try{var t="";do t+=rx(e),e=e.return;while(e);return t}catch(n){return` +`+E[l].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=l&&0<=i);break}}}finally{eo=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Jl(n):""}function cx(e){switch(e.tag){case 26:case 27:case 5:return Jl(e.type);case 16:return Jl("Lazy");case 13:return Jl("Suspense");case 19:return Jl("SuspenseList");case 0:case 15:return to(e.type,!1);case 11:return to(e.type.render,!1);case 1:return to(e.type,!0);case 31:return Jl("Activity");default:return""}}function Uf(e){try{var t="";do t+=cx(e),e=e.return;while(e);return t}catch(n){return` Error generating stack: `+n.message+` -`+n.stack}}function qt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Uf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function cx(e){var t=Uf(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),l=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(h){l=""+h,s.call(this,h)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return l},setValue:function(h){l=""+h},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ar(e){e._valueTracker||(e._valueTracker=cx(e))}function Hf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),l="";return e&&(l=Uf(e)?e.checked?"true":"false":e.value),e=l,e!==n?(t.setValue(e),!0):!1}function ir(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var ox=/[\n"\\]/g;function Gt(e){return e.replace(ox,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function no(e,t,n,l,i,s,h,y){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+qt(t)):e.value!==""+qt(t)&&(e.value=""+qt(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?lo(e,h,qt(t)):n!=null?lo(e,h,qt(n)):l!=null&&e.removeAttribute("value"),i==null&&s!=null&&(e.defaultChecked=!!s),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.name=""+qt(y):e.removeAttribute("name")}function Lf(e,t,n,l,i,s,h,y){if(s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.type=s),t!=null||n!=null){if(!(s!=="submit"&&s!=="reset"||t!=null))return;n=n!=null?""+qt(n):"",t=t!=null?""+qt(t):n,y||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=y?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h)}function lo(e,t,n){t==="number"&&ir(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Wl(e,t,n,l){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),oo=!1;if(Nn)try{var Pa={};Object.defineProperty(Pa,"passive",{get:function(){oo=!0}}),window.addEventListener("test",Pa,Pa),window.removeEventListener("test",Pa,Pa)}catch{oo=!1}var Xn=null,so=null,cr=null;function Qf(){if(cr)return cr;var e,t=so,n=t.length,l,i="value"in Xn?Xn.value:Xn.textContent,s=i.length;for(e=0;e=Wa),If=" ",Jf=!1;function Wf(e,t){switch(e){case"keyup":return Ux.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ed(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var la=!1;function Lx(e,t){switch(e){case"compositionend":return ed(t);case"keypress":return t.which!==32?null:(Jf=!0,If);case"textInput":return e=t.data,e===If&&Jf?null:e;default:return null}}function Bx(e,t){if(la)return e==="compositionend"||!go&&Wf(e,t)?(e=Qf(),cr=so=Xn=null,la=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=od(n)}}function ud(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ud(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function fd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ir(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ir(e.document)}return t}function yo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Kx=Nn&&"documentMode"in document&&11>=document.documentMode,aa=null,xo=null,li=null,bo=!1;function dd(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;bo||aa==null||aa!==ir(l)||(l=aa,"selectionStart"in l&&yo(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),li&&ni(li,l)||(li=l,l=Ir(xo,"onSelect"),0>=h,i-=h,An=1<<32-Ue(t)+i|n<s?s:8;var h=j.T,y={};j.T=y,is(e,!1,t,n);try{var E=i(),k=j.S;if(k!==null&&k(y,E),E!==null&&typeof E=="object"&&typeof E.then=="function"){var V=nb(E,l);yi(e,t,V,kt(e))}else yi(e,t,l,kt(e))}catch($){yi(e,t,{then:function(){},status:"rejected",reason:$},kt())}finally{K.p=s,j.T=h}}function cb(){}function ls(e,t,n,l){if(e.tag!==5)throw Error(c(476));var i=mm(e).queue;dm(e,i,t,B,n===null?cb:function(){return hm(e),n(l)})}function mm(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:B,baseState:B,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Rn,lastRenderedState:B},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Rn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function hm(e){var t=mm(e).next.queue;yi(e,t,{},kt())}function as(){return bt(Ui)}function gm(){return tt().memoizedState}function vm(){return tt().memoizedState}function ob(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=kt();e=Kn(n);var l=$n(t,e,n);l!==null&&(Ut(l,t,n),di(l,t,n)),t={cache:zo()},e.payload=t;return}t=t.return}}function sb(e,t,n){var l=kt();n={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Or(e)?ym(t,n):(n=Eo(e,t,n,l),n!==null&&(Ut(n,e,l),xm(n,t,l)))}function pm(e,t,n){var l=kt();yi(e,t,n,l)}function yi(e,t,n,l){var i={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Or(e))ym(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var h=t.lastRenderedState,y=s(h,n);if(i.hasEagerState=!0,i.eagerState=y,jt(y,h))return hr(e,t,i,0),Qe===null&&mr(),!1}catch{}finally{}if(n=Eo(e,t,i,l),n!==null)return Ut(n,e,l),xm(n,t,l),!0}return!1}function is(e,t,n,l){if(l={lane:2,revertLane:Hs(),action:l,hasEagerState:!1,eagerState:null,next:null},Or(e)){if(t)throw Error(c(479))}else t=Eo(e,n,l,2),t!==null&&Ut(t,e,2)}function Or(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function ym(e,t){ha=Ar=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function xm(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,Tf(e,n)}}var Mr={readContext:bt,use:Tr,useCallback:Ie,useContext:Ie,useEffect:Ie,useImperativeHandle:Ie,useLayoutEffect:Ie,useInsertionEffect:Ie,useMemo:Ie,useReducer:Ie,useRef:Ie,useState:Ie,useDebugValue:Ie,useDeferredValue:Ie,useTransition:Ie,useSyncExternalStore:Ie,useId:Ie,useHostTransitionStatus:Ie,useFormState:Ie,useActionState:Ie,useOptimistic:Ie,useMemoCache:Ie,useCacheRefresh:Ie},bm={readContext:bt,use:Tr,useCallback:function(e,t){return Ct().memoizedState=[e,t===void 0?null:t],e},useContext:bt,useEffect:lm,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,jr(4194308,4,cm.bind(null,t,e),n)},useLayoutEffect:function(e,t){return jr(4194308,4,e,t)},useInsertionEffect:function(e,t){jr(4,2,e,t)},useMemo:function(e,t){var n=Ct();t=t===void 0?null:t;var l=e();if(zl){Pt(!0);try{e()}finally{Pt(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=Ct();if(n!==void 0){var i=n(t);if(zl){Pt(!0);try{n(t)}finally{Pt(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=sb.bind(null,Ae,e),[l.memoizedState,e]},useRef:function(e){var t=Ct();return e={current:e},t.memoizedState=e},useState:function(e){e=Wo(e);var t=e.queue,n=pm.bind(null,Ae,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ts,useDeferredValue:function(e,t){var n=Ct();return ns(n,e,t)},useTransition:function(){var e=Wo(!1);return e=dm.bind(null,Ae,e.queue,!0,!1),Ct().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=Ae,i=Ct();if(He){if(n===void 0)throw Error(c(407));n=n()}else{if(n=t(),Qe===null)throw Error(c(349));(Me&124)!==0||Gd(l,t,n)}i.memoizedState=n;var s={value:n,getSnapshot:t};return i.queue=s,lm(Vd.bind(null,l,s,e),[e]),l.flags|=2048,va(9,Rr(),Yd.bind(null,l,s,n,t),null),n},useId:function(){var e=Ct(),t=Qe.identifierPrefix;if(He){var n=Cn,l=An;n=(l&~(1<<32-Ue(l)-1)).toString(32)+n,t="«"+t+"R"+n,n=Cr++,0ge?(dt=oe,oe=null):dt=oe.sibling;var ze=H(O,oe,D[ge],Z);if(ze===null){oe===null&&(oe=dt);break}e&&oe&&ze.alternate===null&&t(O,oe),C=s(ze,C,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze,oe=dt}if(ge===D.length)return n(O,oe),He&&_l(O,ge),ne;if(oe===null){for(;gege?(dt=oe,oe=null):dt=oe.sibling;var fl=H(O,oe,ze.value,Z);if(fl===null){oe===null&&(oe=dt);break}e&&oe&&fl.alternate===null&&t(O,oe),C=s(fl,C,ge),Te===null?ne=fl:Te.sibling=fl,Te=fl,oe=dt}if(ze.done)return n(O,oe),He&&_l(O,ge),ne;if(oe===null){for(;!ze.done;ge++,ze=D.next())ze=$(O,ze.value,Z),ze!==null&&(C=s(ze,C,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return He&&_l(O,ge),ne}for(oe=l(oe);!ze.done;ge++,ze=D.next())ze=L(oe,O,ge,ze.value,Z),ze!==null&&(e&&ze.alternate!==null&&oe.delete(ze.key===null?ge:ze.key),C=s(ze,C,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return e&&oe.forEach(function(f0){return t(O,f0)}),He&&_l(O,ge),ne}function Ye(O,C,D,Z){if(typeof D=="object"&&D!==null&&D.type===M&&D.key===null&&(D=D.props.children),typeof D=="object"&&D!==null){switch(D.$$typeof){case w:e:{for(var ne=D.key;C!==null;){if(C.key===ne){if(ne=D.type,ne===M){if(C.tag===7){n(O,C.sibling),Z=i(C,D.props.children),Z.return=O,O=Z;break e}}else if(C.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===Q&&wm(ne)===C.type){n(O,C.sibling),Z=i(C,D.props),bi(Z,D),Z.return=O,O=Z;break e}n(O,C);break}else t(O,C);C=C.sibling}D.type===M?(Z=Cl(D.props.children,O.mode,Z,D.key),Z.return=O,O=Z):(Z=vr(D.type,D.key,D.props,null,O.mode,Z),bi(Z,D),Z.return=O,O=Z)}return h(O);case _:e:{for(ne=D.key;C!==null;){if(C.key===ne)if(C.tag===4&&C.stateNode.containerInfo===D.containerInfo&&C.stateNode.implementation===D.implementation){n(O,C.sibling),Z=i(C,D.children||[]),Z.return=O,O=Z;break e}else{n(O,C);break}else t(O,C);C=C.sibling}Z=To(D,O.mode,Z),Z.return=O,O=Z}return h(O);case Q:return ne=D._init,D=ne(D._payload),Ye(O,C,D,Z)}if(de(D))return pe(O,C,D,Z);if(ue(D)){if(ne=ue(D),typeof ne!="function")throw Error(c(150));return D=ne.call(D),he(O,C,D,Z)}if(typeof D.then=="function")return Ye(O,C,Dr(D),Z);if(D.$$typeof===U)return Ye(O,C,br(O,D),Z);zr(O,D)}return typeof D=="string"&&D!==""||typeof D=="number"||typeof D=="bigint"?(D=""+D,C!==null&&C.tag===6?(n(O,C.sibling),Z=i(C,D),Z.return=O,O=Z):(n(O,C),Z=Co(D,O.mode,Z),Z.return=O,O=Z),h(O)):n(O,C)}return function(O,C,D,Z){try{xi=0;var ne=Ye(O,C,D,Z);return pa=null,ne}catch(oe){if(oe===ui||oe===wr)throw oe;var Te=Ot(29,oe,null,O.mode);return Te.lanes=Z,Te.return=O,Te}finally{}}}var ya=Nm(!0),Em=Nm(!1),Zt=X(null),on=null;function Pn(e){var t=e.alternate;P(it,it.current&1),P(Zt,e),on===null&&(t===null||ma.current!==null||t.memoizedState!==null)&&(on=e)}function Am(e){if(e.tag===22){if(P(it,it.current),P(Zt,e),on===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(on=e)}}else In()}function In(){P(it,it.current),P(Zt,Zt.current)}function jn(e){I(Zt),on===e&&(on=null),I(it)}var it=X(0);function kr(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||Fs(n)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function rs(e,t,n,l){t=e.memoizedState,n=n(l,t),n=n==null?t:g({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var cs={enqueueSetState:function(e,t,n){e=e._reactInternals;var l=kt(),i=Kn(l);i.payload=t,n!=null&&(i.callback=n),t=$n(e,i,l),t!==null&&(Ut(t,e,l),di(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var l=kt(),i=Kn(l);i.tag=1,i.payload=t,n!=null&&(i.callback=n),t=$n(e,i,l),t!==null&&(Ut(t,e,l),di(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=kt(),l=Kn(n);l.tag=2,t!=null&&(l.callback=t),t=$n(e,l,n),t!==null&&(Ut(t,e,n),di(t,e,n))}};function Cm(e,t,n,l,i,s,h){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(l,s,h):t.prototype&&t.prototype.isPureReactComponent?!ni(n,l)||!ni(i,s):!0}function Tm(e,t,n,l){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,l),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,l),t.state!==e&&cs.enqueueReplaceState(t,t.state,null)}function kl(e,t){var n=t;if("ref"in t){n={};for(var l in t)l!=="ref"&&(n[l]=t[l])}if(e=e.defaultProps){n===t&&(n=g({},n));for(var i in e)n[i]===void 0&&(n[i]=e[i])}return n}var Ur=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)};function _m(e){Ur(e)}function Rm(e){console.error(e)}function jm(e){Ur(e)}function Hr(e,t){try{var n=e.onUncaughtError;n(t.value,{componentStack:t.stack})}catch(l){setTimeout(function(){throw l})}}function Om(e,t,n){try{var l=e.onCaughtError;l(n.value,{componentStack:n.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(i){setTimeout(function(){throw i})}}function os(e,t,n){return n=Kn(n),n.tag=3,n.payload={element:null},n.callback=function(){Hr(e,t)},n}function Mm(e){return e=Kn(e),e.tag=3,e}function Dm(e,t,n,l){var i=n.type.getDerivedStateFromError;if(typeof i=="function"){var s=l.value;e.payload=function(){return i(s)},e.callback=function(){Om(t,n,l)}}var h=n.stateNode;h!==null&&typeof h.componentDidCatch=="function"&&(e.callback=function(){Om(t,n,l),typeof i!="function"&&(ll===null?ll=new Set([this]):ll.add(this));var y=l.stack;this.componentDidCatch(l.value,{componentStack:y!==null?y:""})})}function fb(e,t,n,l,i){if(n.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){if(t=n.alternate,t!==null&&ci(t,n,i,!0),n=Zt.current,n!==null){switch(n.tag){case 13:return on===null?Ms():n.alternate===null&&Pe===0&&(Pe=3),n.flags&=-257,n.flags|=65536,n.lanes=i,l===Ho?n.flags|=16384:(t=n.updateQueue,t===null?n.updateQueue=new Set([l]):t.add(l),zs(e,l,i)),!1;case 22:return n.flags|=65536,l===Ho?n.flags|=16384:(t=n.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([l])},n.updateQueue=t):(n=t.retryQueue,n===null?t.retryQueue=new Set([l]):n.add(l)),zs(e,l,i)),!1}throw Error(c(435,n.tag))}return zs(e,l,i),Ms(),!1}if(He)return t=Zt.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=i,l!==jo&&(e=Error(c(422),{cause:l}),ri(Yt(e,n)))):(l!==jo&&(t=Error(c(423),{cause:l}),ri(Yt(t,n))),e=e.current.alternate,e.flags|=65536,i&=-i,e.lanes|=i,l=Yt(l,n),i=os(e.stateNode,l,i),qo(e,i),Pe!==4&&(Pe=2)),!1;var s=Error(c(520),{cause:l});if(s=Yt(s,n),Ti===null?Ti=[s]:Ti.push(s),Pe!==4&&(Pe=2),t===null)return!0;l=Yt(l,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=i&-i,n.lanes|=e,e=os(n.stateNode,l,e),qo(n,e),!1;case 1:if(t=n.type,s=n.stateNode,(n.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||s!==null&&typeof s.componentDidCatch=="function"&&(ll===null||!ll.has(s))))return n.flags|=65536,i&=-i,n.lanes|=i,i=Mm(i),Dm(i,e,n,l),qo(n,i),!1}n=n.return}while(n!==null);return!1}var zm=Error(c(461)),ut=!1;function mt(e,t,n,l){t.child=e===null?Em(t,null,n,l):ya(t,e.child,n,l)}function km(e,t,n,l,i){n=n.render;var s=t.ref;if("ref"in l){var h={};for(var y in l)y!=="ref"&&(h[y]=l[y])}else h=l;return Ml(t),l=Qo(e,t,n,h,s,i),y=Zo(),e!==null&&!ut?(Ko(e,t,i),On(e,t,i)):(He&&y&&_o(t),t.flags|=1,mt(e,t,l,i),t.child)}function Um(e,t,n,l,i){if(e===null){var s=n.type;return typeof s=="function"&&!Ao(s)&&s.defaultProps===void 0&&n.compare===null?(t.tag=15,t.type=s,Hm(e,t,s,l,i)):(e=vr(n.type,null,l,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!vs(e,i)){var h=s.memoizedProps;if(n=n.compare,n=n!==null?n:ni,n(h,l)&&e.ref===t.ref)return On(e,t,i)}return t.flags|=1,e=En(s,l),e.ref=t.ref,e.return=t,t.child=e}function Hm(e,t,n,l,i){if(e!==null){var s=e.memoizedProps;if(ni(s,l)&&e.ref===t.ref)if(ut=!1,t.pendingProps=l=s,vs(e,i))(e.flags&131072)!==0&&(ut=!0);else return t.lanes=e.lanes,On(e,t,i)}return ss(e,t,n,l,i)}function Lm(e,t,n){var l=t.pendingProps,i=l.children,s=e!==null?e.memoizedState:null;if(l.mode==="hidden"){if((t.flags&128)!==0){if(l=s!==null?s.baseLanes|n:n,e!==null){for(i=t.child=e.child,s=0;i!==null;)s=s|i.lanes|i.childLanes,i=i.sibling;t.childLanes=s&~l}else t.childLanes=0,t.child=null;return Bm(e,t,l,n)}if((n&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Sr(t,s!==null?s.cachePool:null),s!==null?Hd(t,s):Yo(),Am(t);else return t.lanes=t.childLanes=536870912,Bm(e,t,s!==null?s.baseLanes|n:n,n)}else s!==null?(Sr(t,s.cachePool),Hd(t,s),In(),t.memoizedState=null):(e!==null&&Sr(t,null),Yo(),In());return mt(e,t,i,n),t.child}function Bm(e,t,n,l){var i=Uo();return i=i===null?null:{parent:at._currentValue,pool:i},t.memoizedState={baseLanes:n,cachePool:i},e!==null&&Sr(t,null),Yo(),Am(t),e!==null&&ci(e,t,l,!0),null}function Lr(e,t){var n=t.ref;if(n===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof n!="function"&&typeof n!="object")throw Error(c(284));(e===null||e.ref!==n)&&(t.flags|=4194816)}}function ss(e,t,n,l,i){return Ml(t),n=Qo(e,t,n,l,void 0,i),l=Zo(),e!==null&&!ut?(Ko(e,t,i),On(e,t,i)):(He&&l&&_o(t),t.flags|=1,mt(e,t,n,i),t.child)}function qm(e,t,n,l,i,s){return Ml(t),t.updateQueue=null,n=Bd(t,l,n,i),Ld(e),l=Zo(),e!==null&&!ut?(Ko(e,t,s),On(e,t,s)):(He&&l&&_o(t),t.flags|=1,mt(e,t,n,s),t.child)}function Gm(e,t,n,l,i){if(Ml(t),t.stateNode===null){var s=oa,h=n.contextType;typeof h=="object"&&h!==null&&(s=bt(h)),s=new n(l,s),t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,s.updater=cs,t.stateNode=s,s._reactInternals=t,s=t.stateNode,s.props=l,s.state=t.memoizedState,s.refs={},Lo(t),h=n.contextType,s.context=typeof h=="object"&&h!==null?bt(h):oa,s.state=t.memoizedState,h=n.getDerivedStateFromProps,typeof h=="function"&&(rs(t,n,h,l),s.state=t.memoizedState),typeof n.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(h=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),h!==s.state&&cs.enqueueReplaceState(s,s.state,null),hi(t,l,s,i),mi(),s.state=t.memoizedState),typeof s.componentDidMount=="function"&&(t.flags|=4194308),l=!0}else if(e===null){s=t.stateNode;var y=t.memoizedProps,E=kl(n,y);s.props=E;var k=s.context,V=n.contextType;h=oa,typeof V=="object"&&V!==null&&(h=bt(V));var $=n.getDerivedStateFromProps;V=typeof $=="function"||typeof s.getSnapshotBeforeUpdate=="function",y=t.pendingProps!==y,V||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(y||k!==h)&&Tm(t,s,l,h),Zn=!1;var H=t.memoizedState;s.state=H,hi(t,l,s,i),mi(),k=t.memoizedState,y||H!==k||Zn?(typeof $=="function"&&(rs(t,n,$,l),k=t.memoizedState),(E=Zn||Cm(t,n,E,l,H,k,h))?(V||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount()),typeof s.componentDidMount=="function"&&(t.flags|=4194308)):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=l,t.memoizedState=k),s.props=l,s.state=k,s.context=h,l=E):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),l=!1)}else{s=t.stateNode,Bo(e,t),h=t.memoizedProps,V=kl(n,h),s.props=V,$=t.pendingProps,H=s.context,k=n.contextType,E=oa,typeof k=="object"&&k!==null&&(E=bt(k)),y=n.getDerivedStateFromProps,(k=typeof y=="function"||typeof s.getSnapshotBeforeUpdate=="function")||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(h!==$||H!==E)&&Tm(t,s,l,E),Zn=!1,H=t.memoizedState,s.state=H,hi(t,l,s,i),mi();var L=t.memoizedState;h!==$||H!==L||Zn||e!==null&&e.dependencies!==null&&xr(e.dependencies)?(typeof y=="function"&&(rs(t,n,y,l),L=t.memoizedState),(V=Zn||Cm(t,n,V,l,H,L,E)||e!==null&&e.dependencies!==null&&xr(e.dependencies))?(k||typeof s.UNSAFE_componentWillUpdate!="function"&&typeof s.componentWillUpdate!="function"||(typeof s.componentWillUpdate=="function"&&s.componentWillUpdate(l,L,E),typeof s.UNSAFE_componentWillUpdate=="function"&&s.UNSAFE_componentWillUpdate(l,L,E)),typeof s.componentDidUpdate=="function"&&(t.flags|=4),typeof s.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof s.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),t.memoizedProps=l,t.memoizedState=L),s.props=l,s.state=L,s.context=E,l=V):(typeof s.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),l=!1)}return s=l,Lr(e,t),l=(t.flags&128)!==0,s||l?(s=t.stateNode,n=l&&typeof n.getDerivedStateFromError!="function"?null:s.render(),t.flags|=1,e!==null&&l?(t.child=ya(t,e.child,null,i),t.child=ya(t,null,n,i)):mt(e,t,n,i),t.memoizedState=s.state,e=t.child):e=On(e,t,i),e}function Ym(e,t,n,l){return ii(),t.flags|=256,mt(e,t,n,l),t.child}var us={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function fs(e){return{baseLanes:e,cachePool:Rd()}}function ds(e,t,n){return e=e!==null?e.childLanes&~n:0,t&&(e|=Kt),e}function Vm(e,t,n){var l=t.pendingProps,i=!1,s=(t.flags&128)!==0,h;if((h=s)||(h=e!==null&&e.memoizedState===null?!1:(it.current&2)!==0),h&&(i=!0,t.flags&=-129),h=(t.flags&32)!==0,t.flags&=-33,e===null){if(He){if(i?Pn(t):In(),He){var y=Fe,E;if(E=y){e:{for(E=y,y=cn;E.nodeType!==8;){if(!y){y=null;break e}if(E=Wt(E.nextSibling),E===null){y=null;break e}}y=E}y!==null?(t.memoizedState={dehydrated:y,treeContext:Tl!==null?{id:An,overflow:Cn}:null,retryLane:536870912,hydrationErrors:null},E=Ot(18,null,null,0),E.stateNode=y,E.return=t,t.child=E,Nt=t,Fe=null,E=!0):E=!1}E||jl(t)}if(y=t.memoizedState,y!==null&&(y=y.dehydrated,y!==null))return Fs(y)?t.lanes=32:t.lanes=536870912,null;jn(t)}return y=l.children,l=l.fallback,i?(In(),i=t.mode,y=Br({mode:"hidden",children:y},i),l=Cl(l,i,n,null),y.return=t,l.return=t,y.sibling=l,t.child=y,i=t.child,i.memoizedState=fs(n),i.childLanes=ds(e,h,n),t.memoizedState=us,l):(Pn(t),ms(t,y))}if(E=e.memoizedState,E!==null&&(y=E.dehydrated,y!==null)){if(s)t.flags&256?(Pn(t),t.flags&=-257,t=hs(e,t,n)):t.memoizedState!==null?(In(),t.child=e.child,t.flags|=128,t=null):(In(),i=l.fallback,y=t.mode,l=Br({mode:"visible",children:l.children},y),i=Cl(i,y,n,null),i.flags|=2,l.return=t,i.return=t,l.sibling=i,t.child=l,ya(t,e.child,null,n),l=t.child,l.memoizedState=fs(n),l.childLanes=ds(e,h,n),t.memoizedState=us,t=i);else if(Pn(t),Fs(y)){if(h=y.nextSibling&&y.nextSibling.dataset,h)var k=h.dgst;h=k,l=Error(c(419)),l.stack="",l.digest=h,ri({value:l,source:null,stack:null}),t=hs(e,t,n)}else if(ut||ci(e,t,n,!1),h=(n&e.childLanes)!==0,ut||h){if(h=Qe,h!==null&&(l=n&-n,l=(l&42)!==0?1:Fc(l),l=(l&(h.suspendedLanes|n))!==0?0:l,l!==0&&l!==E.retryLane))throw E.retryLane=l,ca(e,l),Ut(h,e,l),zm;y.data==="$?"||Ms(),t=hs(e,t,n)}else y.data==="$?"?(t.flags|=192,t.child=e.child,t=null):(e=E.treeContext,Fe=Wt(y.nextSibling),Nt=t,He=!0,Rl=null,cn=!1,e!==null&&(Xt[Qt++]=An,Xt[Qt++]=Cn,Xt[Qt++]=Tl,An=e.id,Cn=e.overflow,Tl=t),t=ms(t,l.children),t.flags|=4096);return t}return i?(In(),i=l.fallback,y=t.mode,E=e.child,k=E.sibling,l=En(E,{mode:"hidden",children:l.children}),l.subtreeFlags=E.subtreeFlags&65011712,k!==null?i=En(k,i):(i=Cl(i,y,n,null),i.flags|=2),i.return=t,l.return=t,l.sibling=i,t.child=l,l=i,i=t.child,y=e.child.memoizedState,y===null?y=fs(n):(E=y.cachePool,E!==null?(k=at._currentValue,E=E.parent!==k?{parent:k,pool:k}:E):E=Rd(),y={baseLanes:y.baseLanes|n,cachePool:E}),i.memoizedState=y,i.childLanes=ds(e,h,n),t.memoizedState=us,l):(Pn(t),n=e.child,e=n.sibling,n=En(n,{mode:"visible",children:l.children}),n.return=t,n.sibling=null,e!==null&&(h=t.deletions,h===null?(t.deletions=[e],t.flags|=16):h.push(e)),t.child=n,t.memoizedState=null,n)}function ms(e,t){return t=Br({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function Br(e,t){return e=Ot(22,e,null,t),e.lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function hs(e,t,n){return ya(t,e.child,null,n),e=ms(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Xm(e,t,n){e.lanes|=t;var l=e.alternate;l!==null&&(l.lanes|=t),Mo(e.return,t,n)}function gs(e,t,n,l,i){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:l,tail:n,tailMode:i}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=l,s.tail=n,s.tailMode=i)}function Qm(e,t,n){var l=t.pendingProps,i=l.revealOrder,s=l.tail;if(mt(e,t,l.children,n),l=it.current,(l&2)!==0)l=l&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Xm(e,n,t);else if(e.tag===19)Xm(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}l&=1}switch(P(it,l),i){case"forwards":for(n=t.child,i=null;n!==null;)e=n.alternate,e!==null&&kr(e)===null&&(i=n),n=n.sibling;n=i,n===null?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),gs(t,!1,i,n,s);break;case"backwards":for(n=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&kr(e)===null){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}gs(t,!0,n,null,s);break;case"together":gs(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function On(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),nl|=t.lanes,(n&t.childLanes)===0)if(e!==null){if(ci(e,t,n,!1),(n&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(c(153));if(t.child!==null){for(e=t.child,n=En(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=En(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function vs(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&xr(e)))}function db(e,t,n){switch(t.tag){case 3:se(t,t.stateNode.containerInfo),Qn(t,at,e.memoizedState.cache),ii();break;case 27:case 5:Re(t);break;case 4:se(t,t.stateNode.containerInfo);break;case 10:Qn(t,t.type,t.memoizedProps.value);break;case 13:var l=t.memoizedState;if(l!==null)return l.dehydrated!==null?(Pn(t),t.flags|=128,null):(n&t.child.childLanes)!==0?Vm(e,t,n):(Pn(t),e=On(e,t,n),e!==null?e.sibling:null);Pn(t);break;case 19:var i=(e.flags&128)!==0;if(l=(n&t.childLanes)!==0,l||(ci(e,t,n,!1),l=(n&t.childLanes)!==0),i){if(l)return Qm(e,t,n);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),P(it,it.current),l)break;return null;case 22:case 23:return t.lanes=0,Lm(e,t,n);case 24:Qn(t,at,e.memoizedState.cache)}return On(e,t,n)}function Zm(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps)ut=!0;else{if(!vs(e,n)&&(t.flags&128)===0)return ut=!1,db(e,t,n);ut=(e.flags&131072)!==0}else ut=!1,He&&(t.flags&1048576)!==0&&wd(t,yr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var l=t.elementType,i=l._init;if(l=i(l._payload),t.type=l,typeof l=="function")Ao(l)?(e=kl(l,e),t.tag=1,t=Gm(null,t,l,e,n)):(t.tag=0,t=ss(null,t,l,e,n));else{if(l!=null){if(i=l.$$typeof,i===Y){t.tag=11,t=km(null,t,l,e,n);break e}else if(i===F){t.tag=14,t=Um(null,t,l,e,n);break e}}throw t=ve(l)||l,Error(c(306,t,""))}}return t;case 0:return ss(e,t,t.type,t.pendingProps,n);case 1:return l=t.type,i=kl(l,t.pendingProps),Gm(e,t,l,i,n);case 3:e:{if(se(t,t.stateNode.containerInfo),e===null)throw Error(c(387));l=t.pendingProps;var s=t.memoizedState;i=s.element,Bo(e,t),hi(t,l,null,n);var h=t.memoizedState;if(l=h.cache,Qn(t,at,l),l!==s.cache&&Do(t,[at],n,!0),mi(),l=h.element,s.isDehydrated)if(s={element:l,isDehydrated:!1,cache:h.cache},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){t=Ym(e,t,l,n);break e}else if(l!==i){i=Yt(Error(c(424)),t),ri(i),t=Ym(e,t,l,n);break e}else{switch(e=t.stateNode.containerInfo,e.nodeType){case 9:e=e.body;break;default:e=e.nodeName==="HTML"?e.ownerDocument.body:e}for(Fe=Wt(e.firstChild),Nt=t,He=!0,Rl=null,cn=!0,n=Em(t,null,l,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(ii(),l===i){t=On(e,t,n);break e}mt(e,t,l,n)}t=t.child}return t;case 26:return Lr(e,t),e===null?(n=Ph(t.type,null,t.pendingProps,null))?t.memoizedState=n:He||(n=t.type,e=t.pendingProps,l=Wr(ce.current).createElement(n),l[xt]=t,l[Et]=e,gt(l,n,e),st(l),t.stateNode=l):t.memoizedState=Ph(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return Re(t),e===null&&He&&(l=t.stateNode=Kh(t.type,t.pendingProps,ce.current),Nt=t,cn=!0,i=Fe,rl(t.type)?(Ps=i,Fe=Wt(l.firstChild)):Fe=i),mt(e,t,t.pendingProps.children,n),Lr(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&He&&((i=l=Fe)&&(l=qb(l,t.type,t.pendingProps,cn),l!==null?(t.stateNode=l,Nt=t,Fe=Wt(l.firstChild),cn=!1,i=!0):i=!1),i||jl(t)),Re(t),i=t.type,s=t.pendingProps,h=e!==null?e.memoizedProps:null,l=s.children,Zs(i,s)?l=null:h!==null&&Zs(i,h)&&(t.flags|=32),t.memoizedState!==null&&(i=Qo(e,t,ab,null,null,n),Ui._currentValue=i),Lr(e,t),mt(e,t,l,n),t.child;case 6:return e===null&&He&&((e=n=Fe)&&(n=Gb(n,t.pendingProps,cn),n!==null?(t.stateNode=n,Nt=t,Fe=null,e=!0):e=!1),e||jl(t)),null;case 13:return Vm(e,t,n);case 4:return se(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=ya(t,null,l,n):mt(e,t,l,n),t.child;case 11:return km(e,t,t.type,t.pendingProps,n);case 7:return mt(e,t,t.pendingProps,n),t.child;case 8:return mt(e,t,t.pendingProps.children,n),t.child;case 12:return mt(e,t,t.pendingProps.children,n),t.child;case 10:return l=t.pendingProps,Qn(t,t.type,l.value),mt(e,t,l.children,n),t.child;case 9:return i=t.type._context,l=t.pendingProps.children,Ml(t),i=bt(i),l=l(i),t.flags|=1,mt(e,t,l,n),t.child;case 14:return Um(e,t,t.type,t.pendingProps,n);case 15:return Hm(e,t,t.type,t.pendingProps,n);case 19:return Qm(e,t,n);case 31:return l=t.pendingProps,n=t.mode,l={mode:l.mode,children:l.children},e===null?(n=Br(l,n),n.ref=t.ref,t.child=n,n.return=t,t=n):(n=En(e.child,l),n.ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Lm(e,t,n);case 24:return Ml(t),l=bt(at),e===null?(i=Uo(),i===null&&(i=Qe,s=zo(),i.pooledCache=s,s.refCount++,s!==null&&(i.pooledCacheLanes|=n),i=s),t.memoizedState={parent:l,cache:i},Lo(t),Qn(t,at,i)):((e.lanes&n)!==0&&(Bo(e,t),hi(t,null,null,n),mi()),i=e.memoizedState,s=t.memoizedState,i.parent!==l?(i={parent:l,cache:l},t.memoizedState=i,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=i),Qn(t,at,l)):(l=s.cache,Qn(t,at,l),l!==i.cache&&Do(t,[at],n,!0))),mt(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(c(156,t.tag))}function Mn(e){e.flags|=4}function Km(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!tg(t)){if(t=Zt.current,t!==null&&((Me&4194048)===Me?on!==null:(Me&62914560)!==Me&&(Me&536870912)===0||t!==on))throw fi=Ho,jd;e.flags|=8192}}function qr(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?Af():536870912,e.lanes|=t,wa|=t)}function Si(e,t){if(!He)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var l=null;n!==null;)n.alternate!==null&&(l=n),n=n.sibling;l===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:l.sibling=null}}function $e(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,l=0;if(t)for(var i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags&65011712,l|=i.flags&65011712,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags,l|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=l,e.childLanes=n,t}function mb(e,t,n){var l=t.pendingProps;switch(Ro(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return $e(t),null;case 1:return $e(t),null;case 3:return n=t.stateNode,l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),_n(at),De(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ai(t)?Mn(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Ad())),$e(t),null;case 26:return n=t.memoizedState,e===null?(Mn(t),n!==null?($e(t),Km(t,n)):($e(t),t.flags&=-16777217)):n?n!==e.memoizedState?(Mn(t),$e(t),Km(t,n)):($e(t),t.flags&=-16777217):(e.memoizedProps!==l&&Mn(t),$e(t),t.flags&=-16777217),null;case 27:Ne(t),n=ce.current;var i=t.type;if(e!==null&&t.stateNode!=null)e.memoizedProps!==l&&Mn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return $e(t),null}e=ee.current,ai(t)?Nd(t):(e=Kh(i,l,n),t.stateNode=e,Mn(t))}return $e(t),null;case 5:if(Ne(t),n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==l&&Mn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return $e(t),null}if(e=ee.current,ai(t))Nd(t);else{switch(i=Wr(ce.current),e){case 1:e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":e=i.createElement("div"),e.innerHTML=" + diff --git a/frontend/src/components/AddMaterialDialog.tsx b/frontend/src/components/AddMaterialDialog.tsx index 337702b..ce56c72 100644 --- a/frontend/src/components/AddMaterialDialog.tsx +++ b/frontend/src/components/AddMaterialDialog.tsx @@ -1,4 +1,5 @@ import React, { useState } from "react"; +import { getGitHubRepoUrl } from "@/lib/github"; import { DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -20,7 +21,7 @@ import type { QuadrantsEnum, } from "@/types/reproinventory"; -const GITHUB_REPO = "https://github.comlikeajumprope/ReproInventory"; +const GITHUB_REPO = getGitHubRepoUrl(); const levelOptions: LevelEnum[] = ["Beginner", "Intermediate", "Advanced", "NA"]; const platformOptions: PlatformEnum[] = ["Mac", "Windows", "Linux", "Docker", "Jupyter", "NA"]; diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index caff601..cf42225 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from "react"; +import { getGitHubRepoUrl } from "@/lib/github"; import { DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -20,7 +21,7 @@ import type { QuadrantsEnum, } from "@/types/reproinventory"; -const GITHUB_REPO = "https://github.com/likeajumprope/ReproInventory"; +const GITHUB_REPO = getGitHubRepoUrl(); function formatAsYaml(material: ReproInventoryEntry): string { const lines: string[] = []; diff --git a/frontend/src/lib/github.ts b/frontend/src/lib/github.ts new file mode 100644 index 0000000..08fb5cd --- /dev/null +++ b/frontend/src/lib/github.ts @@ -0,0 +1,14 @@ +/** + * Derives the GitHub repository URL from the current hostname at runtime. + * Works for any fork deployed to GitHub Pages (*.github.io) + * and falls back to the canonical upstream repo for local dev. + */ +export function getGitHubRepoUrl(): string { + const hostname = window.location.hostname; + const match = hostname.match(/^([^.]+)\.github\.io$/); + if (match) { + return `https://github.com/${match[1]}/ReproInventory`; + } + // Local dev fallback + return "https://github.com/ReproNim/ReproInventory"; +} diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index 046d988..699573e 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -1,6 +1,7 @@ "use client" import Footer from "@/components/Footer" +import { getGitHubRepoUrl } from "@/lib/github" import { useState, useMemo, useEffect } from "react" import { Search, BookOpen, Video, FileText, Clock, ExternalLink } from "lucide-react" // Added ExternalLink import { Badge } from "@/components/ui/badge" @@ -39,7 +40,7 @@ export default function TrainingMaterialsBrowser() { useEffect(() => { const fetchData = async () => { try { - const response = await fetch("/ReproInventory/data/reproinventory_data.json") + const response = await fetch(`${import.meta.env.BASE_URL}data/reproinventory_data.json`) if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`) } @@ -696,7 +697,7 @@ export default function TrainingMaterialsBrowser() { const body = `## Delete Training Material Request\n\n` + `Please remove entry **ID: ${material.id}** ("${material.course_name}") from \`model/reproinventory_data.yaml\`.`; - const url = `https://github.com/ReproNim/likeajumprope/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + const url = `${getGitHubRepoUrl()}/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; window.open(url, "_blank"); }} > From f484ae63bf420bb71d4f1442cba219834cfb8110 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Thu, 16 Apr 2026 15:36:28 -0400 Subject: [PATCH 3/4] Update frontend/src/components/AddMaterialDialog.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- frontend/src/components/AddMaterialDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/AddMaterialDialog.tsx b/frontend/src/components/AddMaterialDialog.tsx index ce56c72..ba6a50f 100644 --- a/frontend/src/components/AddMaterialDialog.tsx +++ b/frontend/src/components/AddMaterialDialog.tsx @@ -371,7 +371,7 @@ const AddMaterialDialog: React.FC = ({ onClose }) => { handleChange("open_dataset", checked === true ? true : null)} + onCheckedChange={(checked) => handleChange("open_dataset", checked === true)} />
From 70baf1c07763870ce852fef2208490e3db7d593d Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Thu, 16 Apr 2026 15:36:46 -0400 Subject: [PATCH 4/4] Update frontend/src/components/EditMaterialDialog.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- frontend/src/components/EditMaterialDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index cf42225..877ade9 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -473,7 +473,7 @@ const EditMaterialDialog: React.FC = ({ material, onClo handleChange("open_dataset", checked === true ? true : null)} + onCheckedChange={(checked) => handleChange("open_dataset", checked === true)} />