@jeremyckahn/farmhand 1.24.0 → 1.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{index-BZUcLFKn.js → index-B03HVYBS.js} +3 -3
- package/dist/assets/{index-BZUcLFKn.js.map → index-B03HVYBS.js.map} +1 -1
- package/dist/index.html +1 -1
- package/dist/service-worker.js +1 -1
- package/dist/service-worker.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Farmhand/Farmhand.tsx +8 -1
- package/src/components/Farmhand/useFarmhand.ts +16 -4
- package/src/shell/bootup.test.ts +31 -0
|
@@ -261,7 +261,7 @@ ${Oe.join(`
|
|
|
261
261
|
animation: ${0} 1.4s linear infinite;
|
|
262
262
|
`,circularRotateKeyframe)),CircularProgressSVG=styled(`svg`,{name:`MuiCircularProgress`,slot:`Svg`,overridesResolver:(F,I)=>I.svg})({display:`block`}),CircularProgressCircle=styled(`circle`,{name:`MuiCircularProgress`,slot:`Circle`,overridesResolver:(F,I)=>{let{ownerState:L}=F;return[I.circle,I[`circle${capitalize_default(L.variant)}`],L.disableShrink&&I.circleDisableShrink]}})(({ownerState:F,theme:I})=>_extends$3({stroke:`currentColor`},F.variant===`determinate`&&{transition:I.transitions.create(`stroke-dashoffset`)},F.variant===`indeterminate`&&{strokeDasharray:`80px, 200px`,strokeDashoffset:0}),({ownerState:F})=>F.variant===`indeterminate`&&!F.disableShrink&&css$1(_t4||=_$1`
|
|
263
263
|
animation: ${0} 1.4s ease-in-out infinite;
|
|
264
|
-
`,circularDashKeyframe)),CircularProgress=import_react$10.forwardRef(function(F,I){let L=useDefaultProps({props:F,name:`MuiCircularProgress`}),{className:R,color:z=`primary`,disableShrink:De=!1,size:Oe=40,style:ke,thickness:Ae=3.6,value:je=0,variant:Me=`indeterminate`}=L,Ne=_objectWithoutPropertiesLoose$2(L,_excluded$5),Pe=_extends$3({},L,{color:z,disableShrink:De,size:Oe,thickness:Ae,value:je,variant:Me}),Fe=useUtilityClasses$5(Pe),Ie={},Le={},Re={};if(Me===`determinate`){let F=2*Math.PI*((SIZE-Ae)/2);Ie.strokeDasharray=F.toFixed(3),Re[`aria-valuenow`]=Math.round(je),Ie.strokeDashoffset=`${((100-je)/100*F).toFixed(3)}px`,Le.transform=`rotate(-90deg)`}return(0,import_jsx_runtime$2.jsx)(CircularProgressRoot,_extends$3({className:clsx$1(Fe.root,R),style:_extends$3({width:Oe,height:Oe},Le,ke),ownerState:Pe,ref:I,role:`progressbar`},Re,Ne,{children:(0,import_jsx_runtime$2.jsx)(CircularProgressSVG,{className:Fe.svg,ownerState:Pe,viewBox:`${SIZE/2} ${SIZE/2} ${SIZE} ${SIZE}`,children:(0,import_jsx_runtime$2.jsx)(CircularProgressCircle,{className:Fe.circle,style:Ie,ownerState:Pe,cx:SIZE,cy:SIZE,r:(SIZE-Ae)/2,fill:`none`,strokeWidth:Ae})})}))});function DayAndProgressContainer({dayCount:F,experience:I,itemsSold:L}){let R=levelAchieved(I),z=scaleNumber(I,experienceNeededForLevel(R),experienceNeededForLevel(R+1),0,100),De=experienceNeededForLevel(R+1)-I,Oe=R+1;return(0,import_jsx_runtime$2.jsxs)(`h2`,{className:`day-and-progress-container`,children:[(0,import_jsx_runtime$2.jsxs)(`span`,{children:[`Day `,integerString(F),`, level:`]}),(0,import_jsx_runtime$2.jsx)(Tooltip,{placement:`top`,title:EXPERIENCE_GAUGE_TOOLTIP_LABEL`${De}${Oe}`,children:(0,import_jsx_runtime$2.jsxs)(Box,{children:[(0,import_jsx_runtime$2.jsx)(CircularProgress,{value:z,variant:`determinate`}),(0,import_jsx_runtime$2.jsx)(`span`,{className:`current-level`,children:integerString(R)})]})})]})}function Consumer$15(F){return(0,import_jsx_runtime$2.jsx)(FarmhandContext.Consumer,{children:({gameState:I,handlers:L})=>(0,import_jsx_runtime$2.jsx)(DayAndProgressContainer,{...I,...L,...F})})}var FarmNameDisplay=({farmName:F,handleFarmNameUpdate:I})=>{let[L,R]=(0,import_react$10.useState)(F);return(0,import_react$10.useEffect)(()=>{R(F)},[F,R]),(0,import_jsx_runtime$2.jsxs)(`h2`,{className:`farm-name`,children:[(0,import_jsx_runtime$2.jsx)(TextField,{variant:`standard`,inputProps:{maxLength:12},onChange:({target:{value:F}})=>{R(F)},onBlur:({target:{value:F}})=>{I(F)},placeholder:`Farm Name`,value:L}),` `,`Farm`]})},OnlineControls=({activePlayers:F,handleActivePlayerButtonClick:I,handleChatRoomOpenStateChange:L,handleOnlineToggleChange:R,handleRoomChange:z,isChatAvailable:De,isOnline:Oe,room:ke})=>{let[Ae,je]=(0,import_react$10.useState)(ke);(0,import_react$10.useEffect)(()=>{je(ke)},[ke,je]);let Me=()=>{L(!0)},Ne=()=>{z(Ae)},Pe=F=>{Ne(),R(F)};return(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsxs)(FormControl,{variant:`standard`,className:`online-control-container`,component:`fieldset`,children:[(0,import_jsx_runtime$2.jsx)(FormGroup,{className:`toggle-container`,children:(0,import_jsx_runtime$2.jsx)(FormControlLabel,{control:(0,import_jsx_runtime$2.jsx)(Switch,{color:`primary`,checked:Oe,onChange:(F,I)=>{Pe(I)},name:`play-online`}),label:`Play online`})}),(0,import_jsx_runtime$2.jsx)(TextField,{className:`room-name`,inputProps:{maxLength:25},label:`Room name`,onChange:({target:{value:F}})=>{je(F)},onKeyUp:({key:F})=>{F===`Enter`&&Ne()},value:Ae,variant:`outlined`})]}),F&&(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsxs)(Button,{color:`primary`,onClick:I,variant:`contained`,children:[`Connected players: `,integerString(F)]}),De?(0,import_jsx_runtime$2.jsx)(Button,{variant:`contained`,color:`primary`,onClick:Me,children:`Open chat`}):(0,import_jsx_runtime$2.jsxs)(Typography,{className:`chat-placeholder`,children:[`Chat is available for online rooms other than "`,`global`,`"`]})]})]})},{FARMERS_LOG,PRICE_EVENTS,STATS,ACHIEVEMENTS,ACCOUNTING,SETTINGS,ONLINE_PEERS,KEYBINDINGS}=dialogView,dialogTriggerTextMap={[FARMERS_LOG]:`Open Farmer's Log (l)`,[PRICE_EVENTS]:`See Price Events (e)`,[STATS]:`View your stats (s)`,[ACHIEVEMENTS]:`View Achievements (a)`,[ACCOUNTING]:`View Bank Account (b)`,[SETTINGS]:`View Settings (comma)`},dialogTitleMap={[FARMERS_LOG]:`Farmer's Log`,[PRICE_EVENTS]:`Price Events`,[STATS]:`Farm Stats`,[ACHIEVEMENTS]:`Achievements`,[ACCOUNTING]:`Bank Account`,[SETTINGS]:`Settings`,[ONLINE_PEERS]:`Active Players`,[KEYBINDINGS]:`Keyboard Shortcuts`},dialogContentMap={[FARMERS_LOG]:(0,import_jsx_runtime$2.jsx)(Consumer$20,{}),[PRICE_EVENTS]:(0,import_jsx_runtime$2.jsx)(Consumer$18,{}),[STATS]:(0,import_jsx_runtime$2.jsx)(Consumer$16,{}),[ACHIEVEMENTS]:(0,import_jsx_runtime$2.jsx)(Consumer$21,{}),[ACCOUNTING]:(0,import_jsx_runtime$2.jsx)(Consumer$23,{}),[SETTINGS]:(0,import_jsx_runtime$2.jsx)(Consumer$17,{}),[ONLINE_PEERS]:(0,import_jsx_runtime$2.jsx)(Consumer$19,{}),[KEYBINDINGS]:(0,import_jsx_runtime$2.jsx)(KeybindingsView,{})},Navigation=({activePlayers:F,blockInput:I,currentDialogView:L,farmName:R,handleActivePlayerButtonClick:z,handleChatRoomOpenStateChange:De,handleClickDialogViewButton:Oe,handleCloseDialogView:ke,handleDialogViewExited:Ae,handleFarmNameUpdate:je,handleOnlineToggleChange:Me,handleRoomChange:Ne,handleViewChange:Pe,inventory:Fe,inventoryLimit:Ie,isChatAvailable:Le,isDialogViewOpen:Re,isOnline:ze,room:Be,stageFocus:Ge,viewList:rt,currentDialogViewLowerCase:it=(L||``).toLowerCase(),modalTitleId:at=`${it}-modal-title`,modalContentId:ot=`${it}-modal-content`})=>(0,import_jsx_runtime$2.jsxs)(Header,{className:`Navigation`,sx:{flexDirection:`column`,flexShrink:0,display:`flex`,"& .version":{fontFamily:fonts.display,textAlign:`center`},"& .farm-name":{lineHeight:`1.3em`,margin:`0.25em 0`,"& .MuiInput-root":{background:`none`,margin:0,"& input":{fontFamily:fonts.display,paddingLeft:`0.5em`,paddingRight:`0.5em`,textAlign:`center`}}},"& .online-control-container":{alignItems:`center`,display:`flex`,flexDirection:`row`,margin:`1em 0`,"& .toggle-container":{minWidth:`155px`}},"& .button-array":{marginLeft:`3em`,marginRight:`3em`,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{marginLeft:`2em`,marginRight:`2em`}},"& .current-level":{alignItems:`center`,bottom:0,display:`flex`,justifyContent:`center`,left:0,position:`absolute`,right:0,top:0,userSelect:`none`},"& h1":{fontSize:`3em`,fontWeight:`bold`,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{fontSize:`2.5em`}},"& button":{fontSize:`1.3em`,margin:`0.3em`,minWidth:`56px`},"& h1, & h2, & h3":{textAlign:`center`},"& .day-and-progress-container":{alignItems:`center`,display:`flex`,fontSize:`1.5em`,margin:`0.5em auto`,"& .MuiBox-root":{display:`inline-flex`,marginLeft:`0.5em`,position:`relative`}},"& .inventory-info":{fontSize:`1em`},"& .MuiSelect-select":{padding:`1em`},"& .chat-placeholder":{fontSize:`0.75em`,padding:`0.5em 0`,textAlign:`center`}},children:[(0,import_jsx_runtime$2.jsx)(`h1`,{children:`Farmhand`}),(0,import_jsx_runtime$2.jsxs)(`p`,{className:`version`,children:[`v`,`1.24.0`]}),(0,import_jsx_runtime$2.jsx)(FarmNameDisplay,{farmName:R,handleFarmNameUpdate:je}),(0,import_jsx_runtime$2.jsx)(Consumer$15,{}),(0,import_jsx_runtime$2.jsx)(OnlineControls,{activePlayers:F,handleActivePlayerButtonClick:z,handleChatRoomOpenStateChange:De,handleOnlineToggleChange:Me,handleRoomChange:Ne,isChatAvailable:Le,isOnline:ze,room:Be}),Ie>-1&&(0,import_jsx_runtime$2.jsxs)(H3,{className:(0,import_classnames.default)(`inventory-info`,{"is-inventory-full":!doesInventorySpaceRemain({inventory:Fe,inventoryLimit:Ie})}),sx:{color:doesInventorySpaceRemain({inventory:Fe,inventoryLimit:Ie})?void 0:colors.error},children:[`Inventory: `,integerString(inventorySpaceConsumed(Fe)),` /`,` `,integerString(Ie)]}),(0,import_jsx_runtime$2.jsx)(Select,{variant:`standard`,className:`view-select`,onChange:Pe,value:Ge,children:rt.map((F,I)=>(0,import_jsx_runtime$2.jsxs)(MenuItem,{value:F,children:[I+1,`: `,STAGE_TITLE_MAP[F]]},F))}),(0,import_jsx_runtime$2.jsx)(`div`,{className:`button-array`,children:[{dialogView:FARMERS_LOG,Icon:BookIcon},{dialogView:PRICE_EVENTS,Icon:FlashOnIcon},{dialogView:STATS,Icon:AssessmentIcon},{dialogView:ACHIEVEMENTS,Icon:BeenhereIcon},{dialogView:ACCOUNTING,Icon:AccountBalanceIcon},{dialogView:SETTINGS,Icon:SettingsIcon}].map(({dialogView:F,Icon:I})=>(0,import_jsx_runtime$2.jsx)(Tooltip,{placement:`top`,title:dialogTriggerTextMap[F],children:(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":dialogTriggerTextMap[F],color:`primary`,onClick:()=>Oe(F),children:(0,import_jsx_runtime$2.jsx)(I,{})})},F))}),(0,import_jsx_runtime$2.jsxs)(Dialog,{className:(0,import_classnames.default)(`Farmhand`,{"block-input":I}),fullWidth:!0,maxWidth:`xs`,onClose:ke,open:Re,TransitionProps:{onExited:Ae},"aria-describedby":at,"aria-labelledby":ot,children:[(0,import_jsx_runtime$2.jsx)(DialogTitle,{id:at,children:L?dialogTitleMap[L]:``}),(0,import_jsx_runtime$2.jsx)(DialogContent,{id:ot,children:L?dialogContentMap[L]:null}),(0,import_jsx_runtime$2.jsx)(DialogActions,{children:(0,import_jsx_runtime$2.jsx)(Button,{onClick:ke,color:`primary`,autoFocus:!0,children:`Close`})})]})]});function Consumer$14(F){return(0,import_jsx_runtime$2.jsx)(FarmhandContext.Consumer,{children:({gameState:I,handlers:L})=>(0,import_jsx_runtime$2.jsx)(Navigation,{...I,...L,...F})})}var extendStatics$1=function(F,I){return extendStatics$1=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(F,I){F.__proto__=I}||function(F,I){for(var L in I)I.hasOwnProperty(L)&&(F[L]=I[L])},extendStatics$1(F,I)};function __extends$1(F,I){extendStatics$1(F,I);function L(){this.constructor=F}F.prototype=I===null?Object.create(I):(L.prototype=I.prototype,new L)}var __assign$1=function(){return __assign$1=Object.assign||function(F){for(var I,L=1,R=arguments.length;L<R;L++)for(var z in I=arguments[L],I)Object.prototype.hasOwnProperty.call(I,z)&&(F[z]=I[z]);return F},__assign$1.apply(this,arguments)};function __rest$1(F,I){var L={};for(var R in F)Object.prototype.hasOwnProperty.call(F,R)&&I.indexOf(R)<0&&(L[R]=F[R]);if(F!=null&&typeof Object.getOwnPropertySymbols==`function`)for(var z=0,R=Object.getOwnPropertySymbols(F);z<R.length;z++)I.indexOf(R[z])<0&&Object.prototype.propertyIsEnumerable.call(F,R[z])&&(L[R[z]]=F[R[z]]);return L}var initialState={wrapperComponent:null,contentComponent:null,previousScale:1,scale:1,positionX:0,positionY:0,options:{disabled:!1,transformEnabled:!0,minPositionX:null,maxPositionX:null,minPositionY:null,maxPositionY:null,minScale:1,maxScale:8,limitToBounds:!0,limitToWrapper:!1,centerContent:!0,wrapperClass:``,contentClass:``},wheel:{disabled:!1,step:5,wheelEnabled:!0,touchPadEnabled:!0,limitsOnWheel:!1},pan:{disabled:!1,panAnimationType:`linear`,lockAxisX:!1,lockAxisY:!1,velocity:!0,velocityEqualToMove:!0,velocitySensitivity:2,velocityActiveScale:1,velocityMinSpeed:1,velocityBaseTime:1600,velocityAnimationType:`easeOutQuart`,padding:!0,paddingSize:30,panReturnAnimationTime:400,panReturnAnimationType:`easeOut`,disableOnTarget:[]},pinch:{disabled:!1},zoomIn:{disabled:!1,step:20,animation:!0,animationType:`easeOut`,animationTime:200},zoomOut:{disabled:!1,step:20,animation:!0,animationType:`easeOut`,animationTime:200},doubleClick:{disabled:!1,step:20,mode:`zoomIn`,animation:!0,animationType:`easeOut`,animationTime:200},reset:{disabled:!1,animation:!0,animationType:`easeOut`,animationTime:200},scalePadding:{disabled:!1,size:.2,animationTime:200,animationType:`easeOut`}},roundNumber=function(F,I){return Number(F.toFixed(I))},checkIsNumber=function(F,I){return typeof F==`number`?F:I},boundLimiter=function(F,I,L,R){return roundNumber(R?F<I?I:F>L?L:F:F,2)},calculateBoundingArea=function(F,I,L,R,z,De,Oe){var ke=F>I?L*(Oe?1:.5):0,Ae=R>z?De*(Oe?1:.5):0;return{minPositionX:F-I-ke,maxPositionX:ke,minPositionY:R-z-Ae,maxPositionY:Ae}},getDistance=function(F,I){return Math.sqrt((F.pageX-I.pageX)**2+(F.pageY-I.pageY)**2)},deleteUndefinedProps=function(F){var I=__assign$1({},F);return Object.keys(I).forEach(function(F){return I[F]===void 0&&delete I[F]}),I},handleCallback=function(F,I){F&&typeof F==`function`&&F(I)},handleWheelStop=function(F,I,L){var R=L.scale,z=L.options,De=z.maxScale,Oe=z.minScale;return F?R<De||R>Oe||Math.sign(F.deltaY)!==Math.sign(I.deltaY)||F.deltaY>0&&F.deltaY<I.deltaY||F.deltaY<0&&F.deltaY>I.deltaY||Math.sign(F.deltaY)!==Math.sign(I.deltaY):!1},mergeProps=function(F,I){return Object.keys(F).reduce(function(L,R){return typeof I[R]==`object`&&I[R]!==null?L[R]=__assign$1(__assign$1({},F[R]),I[R]):L[R]=I[R]===void 0?F[R]:I[R],L},{})};function getWindowScaleY(F){return F?window.innerHeight/F.offsetHeight:0}function getWindowScaleX(F){return F?window.innerWidth/F.offsetWidth:0}var easeOut=function(F){return-Math.cos(F*Math.PI)/2+.5},linear=function(F){return F},easeInQuad=function(F){return F*F},easeOutQuad=function(F){return F*(2-F)},easeInOutQuad=function(F){return F<.5?2*F*F:-1+(4-2*F)*F},easeInCubic=function(F){return F*F*F},easeOutCubic=function(F){return--F*F*F+1},easeInOutCubic=function(F){return F<.5?4*F*F*F:(F-1)*(2*F-2)*(2*F-2)+1},easeInQuart=function(F){return F*F*F*F},easeOutQuart=function(F){return 1- --F*F*F*F},easeInOutQuart=function(F){return F<.5?8*F*F*F*F:1-8*--F*F*F*F},easeInQuint=function(F){return F*F*F*F*F},easeOutQuint=function(F){return 1+--F*F*F*F*F},easeInOutQuint=function(F){return F<.5?16*F*F*F*F*F:1+16*--F*F*F*F*F},availableAnimations={easeOut,linear,easeInQuad,easeOutQuad,easeInOutQuad,easeInCubic,easeOutCubic,easeInOutCubic,easeInQuart,easeOutQuart,easeInOutQuart,easeInQuint,easeOutQuint,easeInOutQuint};function handleDisableAnimation(){this.mounted&&(this.animation&&cancelAnimationFrame(this.animation),this.animate=!1,this.animation=!1,this.velocity=!1)}function animate(F,I,L){var R=this;if(this.mounted){var z=new Date().getTime(),De=1;handleDisableAnimation.call(this),this.animation=function(){if(!(!R.animation||!R.mounted)){var Oe=new Date().getTime()-z,ke=Oe/I,Ae=availableAnimations[F],je=Ae(ke);Oe>=I?(L(De),R.animation=null):(L(je),requestAnimationFrame(R.animation))}},requestAnimationFrame(this.animation)}}function animateComponent(F){var I=this,L=F.targetState,R=F.speed,z=F.type,De=this.stateProvider,Oe=De.scale,ke=De.positionX,Ae=De.positionY,je=L.scale-Oe,Me=L.positionX-ke,Ne=L.positionY-Ae;R===0?(this.stateProvider.previousScale=this.stateProvider.scale,this.stateProvider.scale=L.scale,this.stateProvider.positionX=L.positionX,this.stateProvider.positionY=L.positionY,this.applyTransformation()):animate.call(this,z,R,function(F){I.stateProvider.previousScale=I.stateProvider.scale,I.stateProvider.scale=Oe+je*F,I.stateProvider.positionX=ke+Me*F,I.stateProvider.positionY=Ae+Ne*F,I.applyTransformation()})}function checkZoomBounds(F,I,L,R,z){var De=I-(z?R:0);return!isNaN(L)&&F>=L?L:!isNaN(I)&&F<=De?De:F}function checkPositionBounds(F,I,L,R,z,De){var Oe=L.minPositionX,ke=L.minPositionY,Ae=L.maxPositionX,je=L.maxPositionY,Me=De?z*De.offsetWidth/100:0,Ne=De?z*De.offsetHeight/100:0;return{x:boundLimiter(F,Oe-Me,Ae+Me,R),y:boundLimiter(I,ke-Ne,je+Ne,R)}}function getDelta(F,I){return checkIsNumber(I,F?F.deltaY<0?1:-1:0)}function wheelMousePosition(F,I,L){var R=I.getBoundingClientRect(),z=(F.clientX-R.left)/L,De=(F.clientY-R.top)/L;return(isNaN(z)||isNaN(De))&&console.error(`No mouse or touch offset found`),{mouseX:z,mouseY:De}}function getComponentsSizes(F,I,L){var R=F.offsetWidth,z=F.offsetHeight,De=I.offsetWidth,Oe=I.offsetHeight,ke=De*L,Ae=Oe*L;return{wrapperWidth:R,wrapperHeight:z,newContentWidth:ke,newDiffWidth:R-ke,newContentHeight:Ae,newDiffHeight:z-Ae}}function handleCalculatePositions(F,I,L,R,z){var De=this.stateProvider,Oe=De.scale,ke=De.positionX,Ae=De.positionY,je=De.options.transformEnabled,Me=L-Oe;return typeof F!=`number`||typeof I!=`number`?console.error(`Mouse X and Y position were not provided!`):je?checkPositionBounds(ke-F*Me,Ae-I*Me,R,z,0,null):{newPositionX:ke,newPositionY:Ae}}function getClientPosition(F){var I=F.touches;return I&&I.length===1?{clientX:I[0].clientX,clientY:I[0].clientY}:I?null:{clientX:F.clientX,clientY:F.clientY}}function handlePanning(F){var I=this.stateProvider,L=I.scale,R=I.positionX,z=I.positionY,De=I.options,Oe=De.limitToBounds,ke=De.minScale,Ae=I.pan,je=Ae.lockAxisX,Me=Ae.lockAxisY,Ne=Ae.padding,Pe=Ae.paddingSize,Fe=I.wrapperComponent;if(this.startCoords){var Ie=this.startCoords,Le=Ie.x,Re=Ie.y,ze=getClientPosition(F);if(!ze)return console.error(`Cannot find mouse client positions`);var Be=ze.clientX,Ge=ze.clientY,rt=Be-Le,it=Ge-Re,at=je?R:rt,ot=Me?z:it,st=Ne&&L>=ke?Pe:0;if(!(at===R&&ot===z)){var ct=checkPositionBounds(at,ot,this.bounds,Oe,st,Fe);handlePaddingAnimation.call(this,ct.x,ct.y)}}}function handlePanningAnimation(){var F=this.stateProvider,I=F.scale,L=F.options.minScale,R=F.pan,z=R.disabled,De=R.padding,Oe=R.panReturnAnimationTime,ke=R.panReturnAnimationType;if(!(z||I<L||!De)){var Ae=handlePanToBounds.call(this);animateComponent.call(this,{targetState:Ae,speed:Oe,type:ke})}}function handlePanToBounds(){var F=this.stateProvider,I=F.positionX,L=F.positionY,R=F.scale,z=F.options,De=z.disabled,Oe=z.limitToBounds,ke=z.limitToWrapper,Ae=this.state.wrapperComponent;if(!De){var je=this.bounds,Me=je.maxPositionX,Ne=je.minPositionX,Pe=je.maxPositionY,Fe=je.minPositionY,Ie=I>Me||I<Ne,Le=L>Pe||L<Fe,Re=I>Me?Ae.offsetWidth:this.stateProvider.minPositionX||0,ze=L>Pe?Ae.offsetHeight:this.stateProvider.minPositionY||0,Be=Re,Ge=ze,rt=handleCalculatePositions.call(this,Be,Ge,R,this.bounds,Oe||ke),it=rt.x,at=rt.y;return{scale:R,positionX:Ie?it:I,positionY:Le?at:L}}}function handlePaddingAnimation(F,I){this.stateProvider.pan.padding&&(this.stateProvider.positionX=F,this.stateProvider.positionY=I,this.applyTransformation())}function handleCalculateZoom(F,I,L,R,z){var De=this.stateProvider,Oe=De.scale,ke=De.options,Ae=ke.maxScale,je=ke.minScale,Me=De.scalePadding,Ne=Me.size,Pe=Me.disabled,Fe=De.wrapperComponent,Ie=null;if(z){var Le=window.innerWidth*1e-4,Re=F<0?30:20;Ie=Oe+(I-I*Le)*F*(Oe/Re)}else{var ze=2-window.innerWidth/Fe.offsetWidth,Le=Math.max(.2,Math.min(.99,ze)),Re=20;Ie=Oe+I*F*((Oe-Oe*Le)/Re)}if(R)return Ie;var Be=!L&&!Pe;return checkZoomBounds(roundNumber(Ie,3),je,Ae,Ne,Be)}function handleCalculateBounds(F,I){var L=this.stateProvider,R=L.wrapperComponent,z=L.contentComponent,De=getComponentsSizes(R,z,F),Oe=De.wrapperWidth,ke=De.wrapperHeight,Ae=De.newContentWidth,je=De.newDiffWidth,Me=De.newContentHeight,Ne=De.newDiffHeight,Pe=calculateBoundingArea(Oe,Ae,je,ke,Me,Ne,I);return this.bounds=Pe,Pe}function handleWheelZoom(F){var I=this.stateProvider,L=I.scale,R=I.contentComponent,z=I.options.limitToBounds,De=I.scalePadding,Oe=De.size,ke=De.disabled,Ae=I.wheel,je=Ae.step,Me=Ae.limitsOnWheel;F.preventDefault(),F.stopPropagation();var Ne=getDelta(F,null),Pe=handleCalculateZoom.call(this,Ne,je,!F.ctrlKey);if(L!==Pe){var Fe=handleCalculateBounds.call(this,Pe,!Me),Ie=wheelMousePosition(F,R,L),Le=Ie.mouseX,Re=Ie.mouseY,ze=z&&(ke||Oe===0||Me),Be=handleCalculatePositions.call(this,Le,Re,Pe,Fe,ze),Ge=Be.x,rt=Be.y;this.bounds=Fe,this.stateProvider.previousScale=L,this.stateProvider.scale=Pe,this.stateProvider.positionX=Ge,this.stateProvider.positionY=rt,this.applyTransformation()}}function handleZoomToPoint(F,I,L,R,z){var De=this.stateProvider,Oe=De.contentComponent,ke=De.options,Ae=ke.disabled,je=ke.minScale,Me=ke.maxScale,Ne=ke.limitToBounds,Pe=ke.limitToWrapper;if(!(Ae||F)){var Fe=checkZoomBounds(roundNumber(I,2),je,Me,null,null),Ie=handleCalculateBounds.call(this,Fe,Pe),Le=L,Re=R;if(z){var ze=wheelMousePosition(z,Oe,I);Le=ze.mouseX,Re=ze.mouseY}var Be=handleCalculatePositions.call(this,Le,Re,Fe,Ie,Ne);return{scale:Fe,positionX:Be.x,positionY:Be.y}}}function handlePaddingAnimation$1(){var F=this.stateProvider,I=F.scale,L=F.wrapperComponent,R=F.options,z=R.minScale,De=R.limitToBounds,Oe=F.scalePadding,ke=Oe.disabled,Ae=Oe.animationTime,je=Oe.animationType,Me=ke||I>=z;if((I>=1||De)&&handlePanningAnimation.call(this),!Me){var Ne=L.offsetWidth/2,Pe=L.offsetHeight/2,Fe=handleZoomToPoint.call(this,!1,z,Ne,Pe,null);animateComponent.call(this,{targetState:Fe,speed:Ae,type:je})}}function handleDoubleClick(F){F.preventDefault(),F.stopPropagation();var I=this.stateProvider,L=I.contentComponent,R=I.scale,z=I.doubleClick,De=z.disabled,Oe=z.mode,ke=z.step,Ae=z.animationTime,je=z.animationType;if(Oe===`reset`)return resetTransformations.call(this,F,Ae);var Me=Oe===`zoomOut`?-1:1,Ne=handleCalculateZoom.call(this,Me,ke,void 0,void 0,!0),Pe=wheelMousePosition(F,L,R),Fe=Pe.mouseX,Ie=Pe.mouseY,Le=handleZoomToPoint.call(this,De,Ne,Fe,Ie);if(Le.scale!==R){var Re=getButtonAnimationTime(handleCalculateZoom.call(this,Me,ke,!0,void 0,!0),Ne,Ae);animateComponent.call(this,{targetState:Le,speed:Re,type:je})}}function handleZoomControls(F,I){var L=this.stateProvider,R=L.scale,z=L.positionX,De=L.positionY,Oe=L.wrapperComponent,ke=L.zoomIn,Ae=L.zoomOut,je=Oe.offsetWidth,Me=Oe.offsetHeight,Ne=(je/2-z)/R,Pe=(Me/2-De)/R,Fe=handleCalculateZoom.call(this,F,I,void 0,void 0,!0),Ie=Fe>R,Le=Ie?ke.animationTime:Ae.animationTime,Re=Ie?ke.animationType:Ae.animationType,ze=Ie?ke.disabled:Ae.disabled,Be=handleZoomToPoint.call(this,ze,Fe,Ne,Pe);if(Be.scale!==R){var Ge=getButtonAnimationTime(handleCalculateZoom.call(this,F,I,!0,void 0,!0),Fe,Le);animateComponent.call(this,{targetState:Be,speed:Ge,type:Re})}}function resetTransformations(F){var I=this.props.defaultValues,L=I.defaultScale,R=I.defaultPositionX,z=I.defaultPositionY,De=this.stateProvider,Oe=De.scale,ke=De.positionX,Ae=De.positionY,je=De.reset,Me=De.options,Ne=Me.disabled,Pe=Me.limitToBounds,Fe=Me.centerContent,Ie=Me.limitToWrapper;if(!(Ne||je.disabled)&&!(Oe===L&&ke===R&&Ae===z)){var Le=typeof F==`number`?F:je.animationTime,Re=checkIsNumber(L,initialState.scale),ze=checkIsNumber(R,initialState.positionX),Be=checkIsNumber(z,initialState.positionY);if(Pe&&!Ie||Fe){var Ge=handleCalculateBounds.call(this,Re,Ie);ze=Ge.minPositionX,Be=Ge.minPositionY}var rt={scale:Re,positionX:ze,positionY:Be};animateComponent.call(this,{targetState:rt,speed:Le,type:je.animationType})}}function getButtonAnimationTime(F,I,L){return I/F*L}function round(F,I){var L=10**I;return Math.round(F*L)/L}function getCurrentDistance(F){return getDistance(F.touches[0],F.touches[1])}function checkIfInfinite(F){return F===1/0||F===-1/0}function calculatePinchZoom(F,I){var L=this.stateProvider,R=L.options,z=R.minScale,De=R.maxScale,Oe=L.scalePadding,ke=Oe.size,Ae=Oe.disabled;if(typeof I!=`number`||typeof F!=`number`)return console.error(`Pinch touches distance was not provided`);if(!(F<0))return checkZoomBounds(roundNumber(F/I*this.pinchStartScale,2),z,De,ke,!Ae)}function calculateMidpoint(F,I,L){var R=L.getBoundingClientRect(),z=F.touches,De=round(z[0].clientX-R.left,5),Oe=round(z[0].clientY-R.top,5),ke=round(z[1].clientX-R.left,5),Ae=round(z[1].clientY-R.top,5);return{mouseX:(De+ke)/2/I,mouseY:(Oe+Ae)/2/I}}function handleZoomPinch(F){var I=this.stateProvider,L=I.scale,R=I.options,z=R.limitToBounds,De=R.limitToWrapper,Oe=I.scalePadding,ke=Oe.disabled,Ae=Oe.size,je=I.wheel.limitsOnWheel,Me=I.pinch,Ne=this.state.contentComponent;if(!(Me.disabled||this.stateProvider.options.disabled)&&(F.cancelable&&(F.preventDefault(),F.stopPropagation()),this.pinchStartDistance!==null)){var Pe=calculateMidpoint(F,L,Ne),Fe=Pe.mouseX,Ie=Pe.mouseY;if(!(checkIfInfinite(Fe)||checkIfInfinite(Ie))){var Le=getCurrentDistance(F),Re=calculatePinchZoom.call(this,Le,this.pinchStartDistance);if(!(checkIfInfinite(Re)||Re===L)){var ze=handleCalculateBounds.call(this,Re,De),Be=z&&(ke||Ae===0||je),Ge=handleCalculatePositions.call(this,Fe,Ie,Re,ze,Be),rt=Ge.x,it=Ge.y;this.lastDistance=Le,this.stateProvider.positionX=rt,this.stateProvider.positionY=it,this.stateProvider.scale=Re,this.stateProvider.previousScale=L,this.applyTransformation()}}}}var throttleTime=30;function velocityTimeSpeed(F,I){return this.stateProvider.pan.velocityEqualToMove?I-I/Math.max(1,F):I}function handleEnableVelocity(){this.setState({startAnimation:!1})}function handleFireVelocity(){this.setState({startAnimation:!0})}function animateVelocity(){var F=this,I=this.stateProvider,L=I.positionX,R=I.positionY,z=I.options.limitToBounds,De=I.pan,Oe=De.velocityBaseTime,ke=De.lockAxisX,Ae=De.lockAxisY,je=De.velocityAnimationType,Me=De.panReturnAnimationTime,Ne=De.panReturnAnimationType,Pe=De.padding,Fe=De.paddingSize,Ie=I.wrapperComponent;if(this.mounted){if(!this.velocity||!this.bounds)return handleDisableAnimation.call(this);var Le=this.bounds,Re=Le.maxPositionX,ze=Le.minPositionX,Be=Le.maxPositionY,Ge=Le.minPositionY,rt=this.velocity,it=rt.velocityX,at=rt.velocityY,ot=rt.velocity,st=velocityTimeSpeed.call(this,ot,Oe);if(!st){handlePanningAnimation.call(this);return}var ct=it,lt=at,ut=st>Me?st:Me,dt=Pe?Fe:0,ft=Ie?dt*Ie.offsetWidth/100:0,pt=Ie?dt*Ie.offsetHeight/100:0,mt=Re+ft,ht=ze-ft,gt=Be+pt,vt=Ge-pt,yt=checkPositionBounds(L,R,this.bounds,z,dt,Ie),yr=new Date().getTime();animate.call(this,je,ut,function(I){var De=new Date().getTime()-yr,Oe=De/Me,je=availableAnimations[Ne],Pe=je(Oe);(De>Me||Pe>1||Pe===1/0||Pe===-1/0)&&(Pe=1);var Fe=getPosition(ke,ct,I,Pe,ze,Re,z,L,yt.x,ht,mt),Ie=getPosition(Ae,lt,I,Pe,Ge,Be,z,R,yt.y,vt,gt);(L!==Fe||R!==Ie)&&(F.stateProvider.positionX=Fe,F.stateProvider.positionY=Ie,F.applyTransformation())})}}function calculateVelocityStart(F){var I=this,L=this.stateProvider,R=L.scale,z=L.options.disabled,De=L.pan,Oe=De.velocity,ke=De.velocitySensitivity,Ae=De.velocityActiveScale,je=De.velocityMinSpeed,Me=L.wrapperComponent;if(!(!Oe||Ae>=R||z)){handleEnableVelocity.call(this);var Ne=Date.now();if(this.lastMousePosition){var Pe=getClientPosition(F);if(!Pe)return console.error(`No mouse or touch position detected`);var Fe=Pe.clientX,Ie=Pe.clientY,Le=Fe-this.lastMousePosition.clientX,Re=Ie-this.lastMousePosition.clientY,ze=Ne-this.velocityTime,Be=2-Me.offsetWidth/window.innerWidth,Ge=2-Me.offsetHeight/window.innerHeight,rt=20*Math.max(je,Math.min(2,Be)),it=20*Math.max(je,Math.min(2,Ge)),at=Le/ze*ke*R*rt,ot=Re/ze*ke*R*it,st=Le*Le+Re*Re,ct=Math.sqrt(st)/ze*ke;if(this.velocity&&ct<this.velocity.velocity&&this.throttle)return;this.velocity={velocityX:at,velocityY:ot,velocity:ct},this.throttle&&clearTimeout(this.throttle),this.throttle=setTimeout(function(){I.mounted&&(I.throttle=!1)},throttleTime)}var lt=getClientPosition(F);this.lastMousePosition=lt,this.velocityTime=Ne}}function getPosition(F,I,L,R,z,De,Oe,ke,Ae,je,Me){if(Oe){if(Ae>z&&ke>De){var Ne=Ae-(Ae-De)*R;return Ne>Me?Me:Ne<De?De:Ne}if(Ae<z&&ke<z){var Ne=Ae-(Ae-z)*R;return Ne<je?je:Ne>z?z:Ne}}return F?Ae:boundLimiter(ke+I*L,z,De,Oe)}function makePassiveEventOption(F){return F}var propsList=`previousScale.scale.positionX.positionY.defaultPositionX.defaultPositionY.defaultScale.onWheelStart.onWheel.onWheelStop.onPanningStart.onPanning.onPanningStop.onPinchingStart.onPinching.onPinchingStop.onZoomChange.options.wheel.scalePadding.pan.pinch.zoomIn.zoomOut.doubleClick.reset`.split(`.`),getValidPropsFromObject=function(F){return Object.keys(F).reduce(function(I,L){return propsList.includes(L)&&(I[L]=F[L]),I},{})},Context=import_react$10.createContext({}),wheelStopEventTimer=null,wheelStopEventTime=180,wheelAnimationTimer=null,wheelAnimationTime=100,StateProvider=function(F){__extends$1(I,F);function I(){var I=F!==null&&F.apply(this,arguments)||this;return I.mounted=!0,I.state={wrapperComponent:void 0,contentComponent:void 0},I.stateProvider=__assign$1(__assign$1(__assign$1(__assign$1({},initialState),mergeProps(initialState,I.props.dynamicValues)),I.props.defaultValues),{previousScale:I.props.dynamicValues.scale||I.props.defaultValues.scale||initialState.scale}),I.windowToWrapperScaleX=0,I.windowToWrapperScaleY=0,I.startCoords=null,I.isDown=!1,I.pinchStartDistance=null,I.lastDistance=null,I.pinchStartScale=null,I.distance=null,I.bounds=null,I.velocityTime=null,I.lastMousePosition=null,I.velocity=null,I.offsetX=null,I.offsetY=null,I.throttle=!1,I.previousWheelEvent=null,I.lastScale=null,I.animate=null,I.animation=null,I.maxBounds=null,I.handleWheel=function(F){var L=I.stateProvider,R=L.scale,z=L.wheel,De=z.disabled,Oe=z.wheelEnabled,ke=z.touchPadEnabled,Ae=I.props,je=Ae.onWheelStart,Me=Ae.onWheel,Ne=Ae.onWheelStop,Pe=I.state,Fe=Pe.wrapperComponent,Ie=Pe.contentComponent;I.isDown||De||I.stateProvider.options.disabled||!Fe||!Ie||!Oe&&!F.ctrlKey||!ke&&F.ctrlKey||(wheelStopEventTimer||(I.lastScale=R,handleDisableAnimation.call(I),handleCallback(je,I.getCallbackProps())),handleWheelZoom.call(I,F),handleCallback(Me,I.getCallbackProps()),I.applyTransformation(null,null,null),I.previousWheelEvent=F,handleWheelStop(I.previousWheelEvent,F,I.stateProvider)&&(clearTimeout(wheelStopEventTimer),wheelStopEventTimer=setTimeout(function(){I.mounted&&(handleCallback(Ne,I.getCallbackProps()),wheelStopEventTimer=null)},wheelStopEventTime)),I.animate=!1,I.lastScale=I.stateProvider.scale,clearTimeout(wheelAnimationTimer),wheelAnimationTimer=setTimeout(function(){I.mounted&&handlePaddingAnimation$1.call(I,F)},wheelAnimationTime))},I.checkPanningTarget=function(F){var L=I.stateProvider.pan.disableOnTarget;return L.map(function(F){return F.toUpperCase()}).includes(F.target.tagName)||L.find(function(I){return F.target.classList.value.includes(I)})},I.checkIsPanningActive=function(F){var L=I.stateProvider.pan.disabled,R=I.state,z=R.wrapperComponent,De=R.contentComponent;return!I.isDown||L||I.stateProvider.options.disabled||F.touches&&(F.touches.length!==1||Math.abs(I.startCoords.x-F.touches[0].clientX)<1||Math.abs(I.startCoords.y-F.touches[0].clientY)<1)||!z||!De},I.handleSetUpPanning=function(F,L){var R=I.stateProvider,z=R.positionX,De=R.positionY;I.isDown=!0,I.startCoords={x:F-z,y:L-De},handleCallback(I.props.onPanningStart,I.getCallbackProps())},I.handleStartPanning=function(F){var L=I.stateProvider,R=L.wrapperComponent,z=L.scale,De=L.options,Oe=De.minScale,ke=De.maxScale,Ae=De.limitToWrapper,je=L.pan.disabled,Me=F.target,Ne=F.touches;je||I.stateProvider.options.disabled||R&&!R.contains(Me)||I.checkPanningTarget(F)||z<Oe||z>ke||(handleDisableAnimation.call(I),I.bounds=handleCalculateBounds.call(I,z,Ae),Ne&&Ne.length===1&&I.handleSetUpPanning(Ne[0].clientX,Ne[0].clientY),Ne||I.handleSetUpPanning(F.clientX,F.clientY))},I.handlePanning=function(F){I.isDown&&F.preventDefault(),!I.checkIsPanningActive(F)&&(F.stopPropagation(),calculateVelocityStart.call(I,F),handlePanning.call(I,F),handleCallback(I.props.onPanning,I.getCallbackProps()))},I.handleStopPanning=function(){if(I.isDown){I.isDown=!1,I.animate=!1,I.animation=!1,handleFireVelocity.call(I),handleCallback(I.props.onPanningStop,I.getCallbackProps());var F=I.stateProvider,L=F.pan.velocity,R=F.scale;I.velocity&&L&&R>1?animateVelocity.call(I):handlePanningAnimation.call(I)}},I.handlePinchStart=function(F){var L=I.stateProvider.scale;F.preventDefault(),F.stopPropagation(),handleDisableAnimation.call(I);var R=getDistance(F.touches[0],F.touches[1]);I.pinchStartDistance=R,I.lastDistance=R,I.pinchStartScale=L,I.isDown=!1,handleCallback(I.props.onPinchingStart,I.getCallbackProps())},I.handlePinch=function(F){I.isDown=!1,handleZoomPinch.call(I,F),handleCallback(I.props.onPinching,I.getCallbackProps())},I.handlePinchStop=function(){typeof I.pinchStartScale==`number`&&(I.isDown=!1,I.velocity=null,I.lastDistance=null,I.pinchStartScale=null,I.pinchStartDistance=null,handlePaddingAnimation$1.call(I),handleCallback(I.props.onPinchingStop,I.getCallbackProps()))},I.handleTouchStart=function(F){var L=I.stateProvider,R=L.wrapperComponent,z=L.contentComponent,De=L.scale,Oe=L.options,ke=Oe.disabled,Ae=Oe.minScale,je=F.touches;if(!(ke||!R||!z||De<Ae)){if(handleDisableAnimation.call(I),je&&je.length===1)return I.handleStartPanning(F);if(je&&je.length===2)return I.handlePinchStart(F)}},I.handleTouch=function(F){var L=I.stateProvider,R=L.pan,z=L.pinch;if(!L.options.disabled){if(!R.disabled&&F.touches.length===1)return I.handlePanning(F);if(!z.disabled&&F.touches.length===2)return I.handlePinch(F)}},I.handleTouchStop=function(){I.handleStopPanning(),I.handlePinchStop()},I.zoomIn=function(F){var L=I.stateProvider,R=L.zoomIn,z=R.disabled,De=R.step,Oe=L.options,ke=I.state,Ae=ke.wrapperComponent,je=ke.contentComponent;if(!F)throw Error(`Zoom in function requires event prop`);z||Oe.disabled||!Ae||!je||handleZoomControls.call(I,1,De)},I.zoomOut=function(F){var L=I.stateProvider,R=L.zoomOut,z=R.disabled,De=R.step,Oe=L.options,ke=I.state,Ae=ke.wrapperComponent,je=ke.contentComponent;if(!F)throw Error(`Zoom out function requires event prop`);z||Oe.disabled||!Ae||!je||handleZoomControls.call(I,-1,De)},I.handleDbClick=function(F){var L=I.stateProvider,R=L.options,z=L.doubleClick,De=z.disabled,Oe=z.step,ke=I.state,Ae=ke.wrapperComponent,je=ke.contentComponent;if(!F)throw Error(`Double click function requires event prop`);De||R.disabled||!Ae||!je||handleDoubleClick.call(I,F,1,Oe)},I.setScale=function(F,L,R){L===void 0&&(L=200),R===void 0&&(R=`easeOut`);var z=I.stateProvider,De=z.positionX,Oe=z.positionY,ke=z.scale,Ae=z.options.disabled,je=I.state,Me=je.wrapperComponent,Ne=je.contentComponent;if(!(Ae||!Me||!Ne)){var Pe={positionX:De,positionY:Oe,scale:isNaN(F)?ke:F};animateComponent.call(I,{targetState:Pe,speed:L,type:R})}},I.setPositionX=function(F,L,R){L===void 0&&(L=200),R===void 0&&(R=`easeOut`);var z=I.stateProvider,De=z.positionX,Oe=z.positionY,ke=z.scale,Ae=z.options,je=Ae.disabled,Me=Ae.transformEnabled,Ne=I.state,Pe=Ne.wrapperComponent,Fe=Ne.contentComponent;if(!(je||!Me||!Pe||!Fe)){var Ie={positionX:isNaN(F)?De:F,positionY:Oe,scale:ke};animateComponent.call(I,{targetState:Ie,speed:L,type:R})}},I.setPositionY=function(F,L,R){L===void 0&&(L=200),R===void 0&&(R=`easeOut`);var z=I.stateProvider,De=z.positionX,Oe=z.scale,ke=z.positionY,Ae=z.options,je=Ae.disabled,Me=Ae.transformEnabled,Ne=I.state,Pe=Ne.wrapperComponent,Fe=Ne.contentComponent;if(!(je||!Me||!Pe||!Fe)){var Ie={positionX:De,positionY:isNaN(F)?ke:F,scale:Oe};animateComponent.call(I,{targetState:Ie,speed:L,type:R})}},I.setTransform=function(F,L,R,z,De){z===void 0&&(z=200),De===void 0&&(De=`easeOut`);var Oe=I.stateProvider,ke=Oe.positionX,Ae=Oe.positionY,je=Oe.scale,Me=Oe.options,Ne=Me.disabled,Pe=Me.transformEnabled,Fe=I.state,Ie=Fe.wrapperComponent,Le=Fe.contentComponent;if(!(Ne||!Pe||!Ie||!Le)){var Re={positionX:isNaN(F)?ke:F,positionY:isNaN(L)?Ae:L,scale:isNaN(R)?je:R};animateComponent.call(I,{targetState:Re,speed:z,type:De})}},I.resetTransform=function(){var F=I.stateProvider.options,L=F.disabled,R=F.transformEnabled;L||!R||resetTransformations.call(I)},I.setDefaultState=function(){I.animation=null,I.stateProvider=__assign$1(__assign$1(__assign$1({},I.stateProvider),{scale:initialState.scale,positionX:initialState.positionX,positionY:initialState.positionY}),I.props.defaultValues),I.forceUpdate()},I.setWrapperComponent=function(F){I.setState({wrapperComponent:F})},I.setContentComponent=function(F){I.setState({contentComponent:F},function(){var L=I.stateProvider,R=L.wrapperComponent,z=L.options,De=z.centerContent,Oe=z.limitToBounds,ke=z.limitToWrapper,Ae=L.scale,je=I.props.defaultValues,Me=je.positionX,Ne=je.positionY;if(Oe&&!ke||De&&!Me&&!Ne){var Pe=`translate(25%, 25%) scale(`+Ae+`)`;F.style.transform=Pe,F.style.WebkitTransform=Pe,I.forceUpdate();var Fe=new Date().getTime(),Ie=2e3,Le=setInterval(function(){if(R.offsetWidth){var F=handleCalculateBounds.call(I,Ae,!1);I.stateProvider.positionX=F.minPositionX,I.stateProvider.positionY=F.minPositionY,I.applyTransformation(null,null,null),clearInterval(Le),Le=null}else new Date().getTime()-Fe>Ie&&(clearInterval(Le),Le=null)},20)}else I.applyTransformation(null,null,null)})},I.applyTransformation=function(F,L,R){if(I.mounted){var z=I.state.contentComponent,De=I.props.onZoomChange,Oe=I.stateProvider,ke=Oe.previousScale,Ae=Oe.scale,je=Oe.positionX,Me=Oe.positionY;if(!z)return console.error(`There is no content component`);var Ne=`translate(`+(L||je)+`px, `+(R||Me)+`px) scale(`+(F||Ae)+`)`;z.style.transform=Ne,z.style.WebkitTransform=Ne,I.forceUpdate(),De&&ke!==Ae&&handleCallback(De,I.getCallbackProps())}},I.getCallbackProps=function(){return getValidPropsFromObject(I.stateProvider)},I}return I.prototype.componentDidMount=function(){var F=makePassiveEventOption(!1);window.addEventListener(`mousedown`,this.handleStartPanning,F),window.addEventListener(`mousemove`,this.handlePanning,F),window.addEventListener(`mouseup`,this.handleStopPanning,F)},I.prototype.componentWillUnmount=function(){var F=makePassiveEventOption(!1);window.removeEventListener(`mousedown`,this.handleStartPanning,F),window.removeEventListener(`mousemove`,this.handlePanning,F),window.removeEventListener(`mouseup`,this.handleStopPanning,F),handleDisableAnimation.call(this)},I.prototype.componentDidUpdate=function(F,I){var L=this.state,R=L.wrapperComponent,z=L.contentComponent,De=this.props.dynamicValues;if(!I.contentComponent&&z&&(this.stateProvider.contentComponent=z),!I.wrapperComponent&&R&&R!==void 0){this.stateProvider.wrapperComponent=R,this.windowToWrapperScaleX=getWindowScaleX(R),this.windowToWrapperScaleY=getWindowScaleY(R);var Oe=makePassiveEventOption(!1);R.addEventListener(`wheel`,this.handleWheel,Oe),R.addEventListener(`dblclick`,this.handleDbClick,Oe),R.addEventListener(`touchstart`,this.handleTouchStart,Oe),R.addEventListener(`touchmove`,this.handleTouch,Oe),R.addEventListener(`touchend`,this.handleTouchStop,Oe)}(R&&z||F.dynamicValues!==De)&&(this.maxBounds=handleCalculateBounds.call(this,this.stateProvider.scale,this.stateProvider.options.limitToWrapper)),F.dynamicValues&&F.dynamicValues!==De&&(this.animation=null,this.stateProvider=__assign$1(__assign$1({},this.stateProvider),mergeProps(this.stateProvider,De)),this.applyTransformation(null,null,null))},I.prototype.render=function(){var F=this.state,I=F.wrapperComponent,L=F.contentComponent,R={loaded:!!(I&&L),state:this.getCallbackProps(),dispatch:{setScale:this.setScale,setPositionX:this.setPositionX,setPositionY:this.setPositionY,zoomIn:this.zoomIn,zoomOut:this.zoomOut,setTransform:this.setTransform,resetTransform:this.resetTransform,setDefaultState:this.setDefaultState},nodes:{setWrapperComponent:this.setWrapperComponent,setContentComponent:this.setContentComponent}},z=this.props.children,De=typeof z==`function`?z(__assign$1(__assign$1({},R.state),R.dispatch)):z;return import_react$10.createElement(Context.Provider,{value:R},De)},I}(import_react$10.Component),TransformWrapper=function(F){var I=F.children,L=F.defaultPositionX,R=F.defaultPositionY,z=F.defaultScale,De=F.onWheelStart,Oe=F.onWheel,ke=F.onWheelStop,Ae=F.onPanningStart,je=F.onPanning,Me=F.onPanningStop,Ne=F.onPinchingStart,Pe=F.onPinching,Fe=F.onPinchingStop,Ie=F.onZoomChange,Le=__rest$1(F,[`children`,`defaultPositionX`,`defaultPositionY`,`defaultScale`,`onWheelStart`,`onWheel`,`onWheelStop`,`onPanningStart`,`onPanning`,`onPanningStop`,`onPinchingStart`,`onPinching`,`onPinchingStop`,`onZoomChange`]),Re=__assign$1({},Le);return Re.options&&Re.options.limitToWrapper&&(Re.options.limitToBounds=!0),import_react$10.createElement(StateProvider,{defaultValues:deleteUndefinedProps({positionX:L,positionY:R,scale:z}),dynamicValues:deleteUndefinedProps(getValidPropsFromObject(Re)),onWheelStart:De,onWheel:Oe,onWheelStop:ke,onPanningStart:Ae,onPanning:je,onPanningStop:Me,onPinchingStart:Ne,onPinching:Pe,onPinchingStop:Fe,onZoomChange:Ie},I)};function styleInject(F,I){I===void 0&&(I={});var L=I.insertAt;if(!(!F||typeof document>`u`)){var R=document.head||document.getElementsByTagName(`head`)[0],z=document.createElement(`style`);z.type=`text/css`,L===`top`&&R.firstChild?R.insertBefore(z,R.firstChild):R.appendChild(z),z.styleSheet?z.styleSheet.cssText=F:z.appendChild(document.createTextNode(F))}}var css=`.TransformComponent-module_container__3NwNd {
|
|
264
|
+
`,circularDashKeyframe)),CircularProgress=import_react$10.forwardRef(function(F,I){let L=useDefaultProps({props:F,name:`MuiCircularProgress`}),{className:R,color:z=`primary`,disableShrink:De=!1,size:Oe=40,style:ke,thickness:Ae=3.6,value:je=0,variant:Me=`indeterminate`}=L,Ne=_objectWithoutPropertiesLoose$2(L,_excluded$5),Pe=_extends$3({},L,{color:z,disableShrink:De,size:Oe,thickness:Ae,value:je,variant:Me}),Fe=useUtilityClasses$5(Pe),Ie={},Le={},Re={};if(Me===`determinate`){let F=2*Math.PI*((SIZE-Ae)/2);Ie.strokeDasharray=F.toFixed(3),Re[`aria-valuenow`]=Math.round(je),Ie.strokeDashoffset=`${((100-je)/100*F).toFixed(3)}px`,Le.transform=`rotate(-90deg)`}return(0,import_jsx_runtime$2.jsx)(CircularProgressRoot,_extends$3({className:clsx$1(Fe.root,R),style:_extends$3({width:Oe,height:Oe},Le,ke),ownerState:Pe,ref:I,role:`progressbar`},Re,Ne,{children:(0,import_jsx_runtime$2.jsx)(CircularProgressSVG,{className:Fe.svg,ownerState:Pe,viewBox:`${SIZE/2} ${SIZE/2} ${SIZE} ${SIZE}`,children:(0,import_jsx_runtime$2.jsx)(CircularProgressCircle,{className:Fe.circle,style:Ie,ownerState:Pe,cx:SIZE,cy:SIZE,r:(SIZE-Ae)/2,fill:`none`,strokeWidth:Ae})})}))});function DayAndProgressContainer({dayCount:F,experience:I,itemsSold:L}){let R=levelAchieved(I),z=scaleNumber(I,experienceNeededForLevel(R),experienceNeededForLevel(R+1),0,100),De=experienceNeededForLevel(R+1)-I,Oe=R+1;return(0,import_jsx_runtime$2.jsxs)(`h2`,{className:`day-and-progress-container`,children:[(0,import_jsx_runtime$2.jsxs)(`span`,{children:[`Day `,integerString(F),`, level:`]}),(0,import_jsx_runtime$2.jsx)(Tooltip,{placement:`top`,title:EXPERIENCE_GAUGE_TOOLTIP_LABEL`${De}${Oe}`,children:(0,import_jsx_runtime$2.jsxs)(Box,{children:[(0,import_jsx_runtime$2.jsx)(CircularProgress,{value:z,variant:`determinate`}),(0,import_jsx_runtime$2.jsx)(`span`,{className:`current-level`,children:integerString(R)})]})})]})}function Consumer$15(F){return(0,import_jsx_runtime$2.jsx)(FarmhandContext.Consumer,{children:({gameState:I,handlers:L})=>(0,import_jsx_runtime$2.jsx)(DayAndProgressContainer,{...I,...L,...F})})}var FarmNameDisplay=({farmName:F,handleFarmNameUpdate:I})=>{let[L,R]=(0,import_react$10.useState)(F);return(0,import_react$10.useEffect)(()=>{R(F)},[F,R]),(0,import_jsx_runtime$2.jsxs)(`h2`,{className:`farm-name`,children:[(0,import_jsx_runtime$2.jsx)(TextField,{variant:`standard`,inputProps:{maxLength:12},onChange:({target:{value:F}})=>{R(F)},onBlur:({target:{value:F}})=>{I(F)},placeholder:`Farm Name`,value:L}),` `,`Farm`]})},OnlineControls=({activePlayers:F,handleActivePlayerButtonClick:I,handleChatRoomOpenStateChange:L,handleOnlineToggleChange:R,handleRoomChange:z,isChatAvailable:De,isOnline:Oe,room:ke})=>{let[Ae,je]=(0,import_react$10.useState)(ke);(0,import_react$10.useEffect)(()=>{je(ke)},[ke,je]);let Me=()=>{L(!0)},Ne=()=>{z(Ae)},Pe=F=>{Ne(),R(F)};return(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsxs)(FormControl,{variant:`standard`,className:`online-control-container`,component:`fieldset`,children:[(0,import_jsx_runtime$2.jsx)(FormGroup,{className:`toggle-container`,children:(0,import_jsx_runtime$2.jsx)(FormControlLabel,{control:(0,import_jsx_runtime$2.jsx)(Switch,{color:`primary`,checked:Oe,onChange:(F,I)=>{Pe(I)},name:`play-online`}),label:`Play online`})}),(0,import_jsx_runtime$2.jsx)(TextField,{className:`room-name`,inputProps:{maxLength:25},label:`Room name`,onChange:({target:{value:F}})=>{je(F)},onKeyUp:({key:F})=>{F===`Enter`&&Ne()},value:Ae,variant:`outlined`})]}),F&&(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsxs)(Button,{color:`primary`,onClick:I,variant:`contained`,children:[`Connected players: `,integerString(F)]}),De?(0,import_jsx_runtime$2.jsx)(Button,{variant:`contained`,color:`primary`,onClick:Me,children:`Open chat`}):(0,import_jsx_runtime$2.jsxs)(Typography,{className:`chat-placeholder`,children:[`Chat is available for online rooms other than "`,`global`,`"`]})]})]})},{FARMERS_LOG,PRICE_EVENTS,STATS,ACHIEVEMENTS,ACCOUNTING,SETTINGS,ONLINE_PEERS,KEYBINDINGS}=dialogView,dialogTriggerTextMap={[FARMERS_LOG]:`Open Farmer's Log (l)`,[PRICE_EVENTS]:`See Price Events (e)`,[STATS]:`View your stats (s)`,[ACHIEVEMENTS]:`View Achievements (a)`,[ACCOUNTING]:`View Bank Account (b)`,[SETTINGS]:`View Settings (comma)`},dialogTitleMap={[FARMERS_LOG]:`Farmer's Log`,[PRICE_EVENTS]:`Price Events`,[STATS]:`Farm Stats`,[ACHIEVEMENTS]:`Achievements`,[ACCOUNTING]:`Bank Account`,[SETTINGS]:`Settings`,[ONLINE_PEERS]:`Active Players`,[KEYBINDINGS]:`Keyboard Shortcuts`},dialogContentMap={[FARMERS_LOG]:(0,import_jsx_runtime$2.jsx)(Consumer$20,{}),[PRICE_EVENTS]:(0,import_jsx_runtime$2.jsx)(Consumer$18,{}),[STATS]:(0,import_jsx_runtime$2.jsx)(Consumer$16,{}),[ACHIEVEMENTS]:(0,import_jsx_runtime$2.jsx)(Consumer$21,{}),[ACCOUNTING]:(0,import_jsx_runtime$2.jsx)(Consumer$23,{}),[SETTINGS]:(0,import_jsx_runtime$2.jsx)(Consumer$17,{}),[ONLINE_PEERS]:(0,import_jsx_runtime$2.jsx)(Consumer$19,{}),[KEYBINDINGS]:(0,import_jsx_runtime$2.jsx)(KeybindingsView,{})},Navigation=({activePlayers:F,blockInput:I,currentDialogView:L,farmName:R,handleActivePlayerButtonClick:z,handleChatRoomOpenStateChange:De,handleClickDialogViewButton:Oe,handleCloseDialogView:ke,handleDialogViewExited:Ae,handleFarmNameUpdate:je,handleOnlineToggleChange:Me,handleRoomChange:Ne,handleViewChange:Pe,inventory:Fe,inventoryLimit:Ie,isChatAvailable:Le,isDialogViewOpen:Re,isOnline:ze,room:Be,stageFocus:Ge,viewList:rt,currentDialogViewLowerCase:it=(L||``).toLowerCase(),modalTitleId:at=`${it}-modal-title`,modalContentId:ot=`${it}-modal-content`})=>(0,import_jsx_runtime$2.jsxs)(Header,{className:`Navigation`,sx:{flexDirection:`column`,flexShrink:0,display:`flex`,"& .version":{fontFamily:fonts.display,textAlign:`center`},"& .farm-name":{lineHeight:`1.3em`,margin:`0.25em 0`,"& .MuiInput-root":{background:`none`,margin:0,"& input":{fontFamily:fonts.display,paddingLeft:`0.5em`,paddingRight:`0.5em`,textAlign:`center`}}},"& .online-control-container":{alignItems:`center`,display:`flex`,flexDirection:`row`,margin:`1em 0`,"& .toggle-container":{minWidth:`155px`}},"& .button-array":{marginLeft:`3em`,marginRight:`3em`,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{marginLeft:`2em`,marginRight:`2em`}},"& .current-level":{alignItems:`center`,bottom:0,display:`flex`,justifyContent:`center`,left:0,position:`absolute`,right:0,top:0,userSelect:`none`},"& h1":{fontSize:`3em`,fontWeight:`bold`,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{fontSize:`2.5em`}},"& button":{fontSize:`1.3em`,margin:`0.3em`,minWidth:`56px`},"& h1, & h2, & h3":{textAlign:`center`},"& .day-and-progress-container":{alignItems:`center`,display:`flex`,fontSize:`1.5em`,margin:`0.5em auto`,"& .MuiBox-root":{display:`inline-flex`,marginLeft:`0.5em`,position:`relative`}},"& .inventory-info":{fontSize:`1em`},"& .MuiSelect-select":{padding:`1em`},"& .chat-placeholder":{fontSize:`0.75em`,padding:`0.5em 0`,textAlign:`center`}},children:[(0,import_jsx_runtime$2.jsx)(`h1`,{children:`Farmhand`}),(0,import_jsx_runtime$2.jsxs)(`p`,{className:`version`,children:[`v`,`1.24.1`]}),(0,import_jsx_runtime$2.jsx)(FarmNameDisplay,{farmName:R,handleFarmNameUpdate:je}),(0,import_jsx_runtime$2.jsx)(Consumer$15,{}),(0,import_jsx_runtime$2.jsx)(OnlineControls,{activePlayers:F,handleActivePlayerButtonClick:z,handleChatRoomOpenStateChange:De,handleOnlineToggleChange:Me,handleRoomChange:Ne,isChatAvailable:Le,isOnline:ze,room:Be}),Ie>-1&&(0,import_jsx_runtime$2.jsxs)(H3,{className:(0,import_classnames.default)(`inventory-info`,{"is-inventory-full":!doesInventorySpaceRemain({inventory:Fe,inventoryLimit:Ie})}),sx:{color:doesInventorySpaceRemain({inventory:Fe,inventoryLimit:Ie})?void 0:colors.error},children:[`Inventory: `,integerString(inventorySpaceConsumed(Fe)),` /`,` `,integerString(Ie)]}),(0,import_jsx_runtime$2.jsx)(Select,{variant:`standard`,className:`view-select`,onChange:Pe,value:Ge,children:rt.map((F,I)=>(0,import_jsx_runtime$2.jsxs)(MenuItem,{value:F,children:[I+1,`: `,STAGE_TITLE_MAP[F]]},F))}),(0,import_jsx_runtime$2.jsx)(`div`,{className:`button-array`,children:[{dialogView:FARMERS_LOG,Icon:BookIcon},{dialogView:PRICE_EVENTS,Icon:FlashOnIcon},{dialogView:STATS,Icon:AssessmentIcon},{dialogView:ACHIEVEMENTS,Icon:BeenhereIcon},{dialogView:ACCOUNTING,Icon:AccountBalanceIcon},{dialogView:SETTINGS,Icon:SettingsIcon}].map(({dialogView:F,Icon:I})=>(0,import_jsx_runtime$2.jsx)(Tooltip,{placement:`top`,title:dialogTriggerTextMap[F],children:(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":dialogTriggerTextMap[F],color:`primary`,onClick:()=>Oe(F),children:(0,import_jsx_runtime$2.jsx)(I,{})})},F))}),(0,import_jsx_runtime$2.jsxs)(Dialog,{className:(0,import_classnames.default)(`Farmhand`,{"block-input":I}),fullWidth:!0,maxWidth:`xs`,onClose:ke,open:Re,TransitionProps:{onExited:Ae},"aria-describedby":at,"aria-labelledby":ot,children:[(0,import_jsx_runtime$2.jsx)(DialogTitle,{id:at,children:L?dialogTitleMap[L]:``}),(0,import_jsx_runtime$2.jsx)(DialogContent,{id:ot,children:L?dialogContentMap[L]:null}),(0,import_jsx_runtime$2.jsx)(DialogActions,{children:(0,import_jsx_runtime$2.jsx)(Button,{onClick:ke,color:`primary`,autoFocus:!0,children:`Close`})})]})]});function Consumer$14(F){return(0,import_jsx_runtime$2.jsx)(FarmhandContext.Consumer,{children:({gameState:I,handlers:L})=>(0,import_jsx_runtime$2.jsx)(Navigation,{...I,...L,...F})})}var extendStatics$1=function(F,I){return extendStatics$1=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(F,I){F.__proto__=I}||function(F,I){for(var L in I)I.hasOwnProperty(L)&&(F[L]=I[L])},extendStatics$1(F,I)};function __extends$1(F,I){extendStatics$1(F,I);function L(){this.constructor=F}F.prototype=I===null?Object.create(I):(L.prototype=I.prototype,new L)}var __assign$1=function(){return __assign$1=Object.assign||function(F){for(var I,L=1,R=arguments.length;L<R;L++)for(var z in I=arguments[L],I)Object.prototype.hasOwnProperty.call(I,z)&&(F[z]=I[z]);return F},__assign$1.apply(this,arguments)};function __rest$1(F,I){var L={};for(var R in F)Object.prototype.hasOwnProperty.call(F,R)&&I.indexOf(R)<0&&(L[R]=F[R]);if(F!=null&&typeof Object.getOwnPropertySymbols==`function`)for(var z=0,R=Object.getOwnPropertySymbols(F);z<R.length;z++)I.indexOf(R[z])<0&&Object.prototype.propertyIsEnumerable.call(F,R[z])&&(L[R[z]]=F[R[z]]);return L}var initialState={wrapperComponent:null,contentComponent:null,previousScale:1,scale:1,positionX:0,positionY:0,options:{disabled:!1,transformEnabled:!0,minPositionX:null,maxPositionX:null,minPositionY:null,maxPositionY:null,minScale:1,maxScale:8,limitToBounds:!0,limitToWrapper:!1,centerContent:!0,wrapperClass:``,contentClass:``},wheel:{disabled:!1,step:5,wheelEnabled:!0,touchPadEnabled:!0,limitsOnWheel:!1},pan:{disabled:!1,panAnimationType:`linear`,lockAxisX:!1,lockAxisY:!1,velocity:!0,velocityEqualToMove:!0,velocitySensitivity:2,velocityActiveScale:1,velocityMinSpeed:1,velocityBaseTime:1600,velocityAnimationType:`easeOutQuart`,padding:!0,paddingSize:30,panReturnAnimationTime:400,panReturnAnimationType:`easeOut`,disableOnTarget:[]},pinch:{disabled:!1},zoomIn:{disabled:!1,step:20,animation:!0,animationType:`easeOut`,animationTime:200},zoomOut:{disabled:!1,step:20,animation:!0,animationType:`easeOut`,animationTime:200},doubleClick:{disabled:!1,step:20,mode:`zoomIn`,animation:!0,animationType:`easeOut`,animationTime:200},reset:{disabled:!1,animation:!0,animationType:`easeOut`,animationTime:200},scalePadding:{disabled:!1,size:.2,animationTime:200,animationType:`easeOut`}},roundNumber=function(F,I){return Number(F.toFixed(I))},checkIsNumber=function(F,I){return typeof F==`number`?F:I},boundLimiter=function(F,I,L,R){return roundNumber(R?F<I?I:F>L?L:F:F,2)},calculateBoundingArea=function(F,I,L,R,z,De,Oe){var ke=F>I?L*(Oe?1:.5):0,Ae=R>z?De*(Oe?1:.5):0;return{minPositionX:F-I-ke,maxPositionX:ke,minPositionY:R-z-Ae,maxPositionY:Ae}},getDistance=function(F,I){return Math.sqrt((F.pageX-I.pageX)**2+(F.pageY-I.pageY)**2)},deleteUndefinedProps=function(F){var I=__assign$1({},F);return Object.keys(I).forEach(function(F){return I[F]===void 0&&delete I[F]}),I},handleCallback=function(F,I){F&&typeof F==`function`&&F(I)},handleWheelStop=function(F,I,L){var R=L.scale,z=L.options,De=z.maxScale,Oe=z.minScale;return F?R<De||R>Oe||Math.sign(F.deltaY)!==Math.sign(I.deltaY)||F.deltaY>0&&F.deltaY<I.deltaY||F.deltaY<0&&F.deltaY>I.deltaY||Math.sign(F.deltaY)!==Math.sign(I.deltaY):!1},mergeProps=function(F,I){return Object.keys(F).reduce(function(L,R){return typeof I[R]==`object`&&I[R]!==null?L[R]=__assign$1(__assign$1({},F[R]),I[R]):L[R]=I[R]===void 0?F[R]:I[R],L},{})};function getWindowScaleY(F){return F?window.innerHeight/F.offsetHeight:0}function getWindowScaleX(F){return F?window.innerWidth/F.offsetWidth:0}var easeOut=function(F){return-Math.cos(F*Math.PI)/2+.5},linear=function(F){return F},easeInQuad=function(F){return F*F},easeOutQuad=function(F){return F*(2-F)},easeInOutQuad=function(F){return F<.5?2*F*F:-1+(4-2*F)*F},easeInCubic=function(F){return F*F*F},easeOutCubic=function(F){return--F*F*F+1},easeInOutCubic=function(F){return F<.5?4*F*F*F:(F-1)*(2*F-2)*(2*F-2)+1},easeInQuart=function(F){return F*F*F*F},easeOutQuart=function(F){return 1- --F*F*F*F},easeInOutQuart=function(F){return F<.5?8*F*F*F*F:1-8*--F*F*F*F},easeInQuint=function(F){return F*F*F*F*F},easeOutQuint=function(F){return 1+--F*F*F*F*F},easeInOutQuint=function(F){return F<.5?16*F*F*F*F*F:1+16*--F*F*F*F*F},availableAnimations={easeOut,linear,easeInQuad,easeOutQuad,easeInOutQuad,easeInCubic,easeOutCubic,easeInOutCubic,easeInQuart,easeOutQuart,easeInOutQuart,easeInQuint,easeOutQuint,easeInOutQuint};function handleDisableAnimation(){this.mounted&&(this.animation&&cancelAnimationFrame(this.animation),this.animate=!1,this.animation=!1,this.velocity=!1)}function animate(F,I,L){var R=this;if(this.mounted){var z=new Date().getTime(),De=1;handleDisableAnimation.call(this),this.animation=function(){if(!(!R.animation||!R.mounted)){var Oe=new Date().getTime()-z,ke=Oe/I,Ae=availableAnimations[F],je=Ae(ke);Oe>=I?(L(De),R.animation=null):(L(je),requestAnimationFrame(R.animation))}},requestAnimationFrame(this.animation)}}function animateComponent(F){var I=this,L=F.targetState,R=F.speed,z=F.type,De=this.stateProvider,Oe=De.scale,ke=De.positionX,Ae=De.positionY,je=L.scale-Oe,Me=L.positionX-ke,Ne=L.positionY-Ae;R===0?(this.stateProvider.previousScale=this.stateProvider.scale,this.stateProvider.scale=L.scale,this.stateProvider.positionX=L.positionX,this.stateProvider.positionY=L.positionY,this.applyTransformation()):animate.call(this,z,R,function(F){I.stateProvider.previousScale=I.stateProvider.scale,I.stateProvider.scale=Oe+je*F,I.stateProvider.positionX=ke+Me*F,I.stateProvider.positionY=Ae+Ne*F,I.applyTransformation()})}function checkZoomBounds(F,I,L,R,z){var De=I-(z?R:0);return!isNaN(L)&&F>=L?L:!isNaN(I)&&F<=De?De:F}function checkPositionBounds(F,I,L,R,z,De){var Oe=L.minPositionX,ke=L.minPositionY,Ae=L.maxPositionX,je=L.maxPositionY,Me=De?z*De.offsetWidth/100:0,Ne=De?z*De.offsetHeight/100:0;return{x:boundLimiter(F,Oe-Me,Ae+Me,R),y:boundLimiter(I,ke-Ne,je+Ne,R)}}function getDelta(F,I){return checkIsNumber(I,F?F.deltaY<0?1:-1:0)}function wheelMousePosition(F,I,L){var R=I.getBoundingClientRect(),z=(F.clientX-R.left)/L,De=(F.clientY-R.top)/L;return(isNaN(z)||isNaN(De))&&console.error(`No mouse or touch offset found`),{mouseX:z,mouseY:De}}function getComponentsSizes(F,I,L){var R=F.offsetWidth,z=F.offsetHeight,De=I.offsetWidth,Oe=I.offsetHeight,ke=De*L,Ae=Oe*L;return{wrapperWidth:R,wrapperHeight:z,newContentWidth:ke,newDiffWidth:R-ke,newContentHeight:Ae,newDiffHeight:z-Ae}}function handleCalculatePositions(F,I,L,R,z){var De=this.stateProvider,Oe=De.scale,ke=De.positionX,Ae=De.positionY,je=De.options.transformEnabled,Me=L-Oe;return typeof F!=`number`||typeof I!=`number`?console.error(`Mouse X and Y position were not provided!`):je?checkPositionBounds(ke-F*Me,Ae-I*Me,R,z,0,null):{newPositionX:ke,newPositionY:Ae}}function getClientPosition(F){var I=F.touches;return I&&I.length===1?{clientX:I[0].clientX,clientY:I[0].clientY}:I?null:{clientX:F.clientX,clientY:F.clientY}}function handlePanning(F){var I=this.stateProvider,L=I.scale,R=I.positionX,z=I.positionY,De=I.options,Oe=De.limitToBounds,ke=De.minScale,Ae=I.pan,je=Ae.lockAxisX,Me=Ae.lockAxisY,Ne=Ae.padding,Pe=Ae.paddingSize,Fe=I.wrapperComponent;if(this.startCoords){var Ie=this.startCoords,Le=Ie.x,Re=Ie.y,ze=getClientPosition(F);if(!ze)return console.error(`Cannot find mouse client positions`);var Be=ze.clientX,Ge=ze.clientY,rt=Be-Le,it=Ge-Re,at=je?R:rt,ot=Me?z:it,st=Ne&&L>=ke?Pe:0;if(!(at===R&&ot===z)){var ct=checkPositionBounds(at,ot,this.bounds,Oe,st,Fe);handlePaddingAnimation.call(this,ct.x,ct.y)}}}function handlePanningAnimation(){var F=this.stateProvider,I=F.scale,L=F.options.minScale,R=F.pan,z=R.disabled,De=R.padding,Oe=R.panReturnAnimationTime,ke=R.panReturnAnimationType;if(!(z||I<L||!De)){var Ae=handlePanToBounds.call(this);animateComponent.call(this,{targetState:Ae,speed:Oe,type:ke})}}function handlePanToBounds(){var F=this.stateProvider,I=F.positionX,L=F.positionY,R=F.scale,z=F.options,De=z.disabled,Oe=z.limitToBounds,ke=z.limitToWrapper,Ae=this.state.wrapperComponent;if(!De){var je=this.bounds,Me=je.maxPositionX,Ne=je.minPositionX,Pe=je.maxPositionY,Fe=je.minPositionY,Ie=I>Me||I<Ne,Le=L>Pe||L<Fe,Re=I>Me?Ae.offsetWidth:this.stateProvider.minPositionX||0,ze=L>Pe?Ae.offsetHeight:this.stateProvider.minPositionY||0,Be=Re,Ge=ze,rt=handleCalculatePositions.call(this,Be,Ge,R,this.bounds,Oe||ke),it=rt.x,at=rt.y;return{scale:R,positionX:Ie?it:I,positionY:Le?at:L}}}function handlePaddingAnimation(F,I){this.stateProvider.pan.padding&&(this.stateProvider.positionX=F,this.stateProvider.positionY=I,this.applyTransformation())}function handleCalculateZoom(F,I,L,R,z){var De=this.stateProvider,Oe=De.scale,ke=De.options,Ae=ke.maxScale,je=ke.minScale,Me=De.scalePadding,Ne=Me.size,Pe=Me.disabled,Fe=De.wrapperComponent,Ie=null;if(z){var Le=window.innerWidth*1e-4,Re=F<0?30:20;Ie=Oe+(I-I*Le)*F*(Oe/Re)}else{var ze=2-window.innerWidth/Fe.offsetWidth,Le=Math.max(.2,Math.min(.99,ze)),Re=20;Ie=Oe+I*F*((Oe-Oe*Le)/Re)}if(R)return Ie;var Be=!L&&!Pe;return checkZoomBounds(roundNumber(Ie,3),je,Ae,Ne,Be)}function handleCalculateBounds(F,I){var L=this.stateProvider,R=L.wrapperComponent,z=L.contentComponent,De=getComponentsSizes(R,z,F),Oe=De.wrapperWidth,ke=De.wrapperHeight,Ae=De.newContentWidth,je=De.newDiffWidth,Me=De.newContentHeight,Ne=De.newDiffHeight,Pe=calculateBoundingArea(Oe,Ae,je,ke,Me,Ne,I);return this.bounds=Pe,Pe}function handleWheelZoom(F){var I=this.stateProvider,L=I.scale,R=I.contentComponent,z=I.options.limitToBounds,De=I.scalePadding,Oe=De.size,ke=De.disabled,Ae=I.wheel,je=Ae.step,Me=Ae.limitsOnWheel;F.preventDefault(),F.stopPropagation();var Ne=getDelta(F,null),Pe=handleCalculateZoom.call(this,Ne,je,!F.ctrlKey);if(L!==Pe){var Fe=handleCalculateBounds.call(this,Pe,!Me),Ie=wheelMousePosition(F,R,L),Le=Ie.mouseX,Re=Ie.mouseY,ze=z&&(ke||Oe===0||Me),Be=handleCalculatePositions.call(this,Le,Re,Pe,Fe,ze),Ge=Be.x,rt=Be.y;this.bounds=Fe,this.stateProvider.previousScale=L,this.stateProvider.scale=Pe,this.stateProvider.positionX=Ge,this.stateProvider.positionY=rt,this.applyTransformation()}}function handleZoomToPoint(F,I,L,R,z){var De=this.stateProvider,Oe=De.contentComponent,ke=De.options,Ae=ke.disabled,je=ke.minScale,Me=ke.maxScale,Ne=ke.limitToBounds,Pe=ke.limitToWrapper;if(!(Ae||F)){var Fe=checkZoomBounds(roundNumber(I,2),je,Me,null,null),Ie=handleCalculateBounds.call(this,Fe,Pe),Le=L,Re=R;if(z){var ze=wheelMousePosition(z,Oe,I);Le=ze.mouseX,Re=ze.mouseY}var Be=handleCalculatePositions.call(this,Le,Re,Fe,Ie,Ne);return{scale:Fe,positionX:Be.x,positionY:Be.y}}}function handlePaddingAnimation$1(){var F=this.stateProvider,I=F.scale,L=F.wrapperComponent,R=F.options,z=R.minScale,De=R.limitToBounds,Oe=F.scalePadding,ke=Oe.disabled,Ae=Oe.animationTime,je=Oe.animationType,Me=ke||I>=z;if((I>=1||De)&&handlePanningAnimation.call(this),!Me){var Ne=L.offsetWidth/2,Pe=L.offsetHeight/2,Fe=handleZoomToPoint.call(this,!1,z,Ne,Pe,null);animateComponent.call(this,{targetState:Fe,speed:Ae,type:je})}}function handleDoubleClick(F){F.preventDefault(),F.stopPropagation();var I=this.stateProvider,L=I.contentComponent,R=I.scale,z=I.doubleClick,De=z.disabled,Oe=z.mode,ke=z.step,Ae=z.animationTime,je=z.animationType;if(Oe===`reset`)return resetTransformations.call(this,F,Ae);var Me=Oe===`zoomOut`?-1:1,Ne=handleCalculateZoom.call(this,Me,ke,void 0,void 0,!0),Pe=wheelMousePosition(F,L,R),Fe=Pe.mouseX,Ie=Pe.mouseY,Le=handleZoomToPoint.call(this,De,Ne,Fe,Ie);if(Le.scale!==R){var Re=getButtonAnimationTime(handleCalculateZoom.call(this,Me,ke,!0,void 0,!0),Ne,Ae);animateComponent.call(this,{targetState:Le,speed:Re,type:je})}}function handleZoomControls(F,I){var L=this.stateProvider,R=L.scale,z=L.positionX,De=L.positionY,Oe=L.wrapperComponent,ke=L.zoomIn,Ae=L.zoomOut,je=Oe.offsetWidth,Me=Oe.offsetHeight,Ne=(je/2-z)/R,Pe=(Me/2-De)/R,Fe=handleCalculateZoom.call(this,F,I,void 0,void 0,!0),Ie=Fe>R,Le=Ie?ke.animationTime:Ae.animationTime,Re=Ie?ke.animationType:Ae.animationType,ze=Ie?ke.disabled:Ae.disabled,Be=handleZoomToPoint.call(this,ze,Fe,Ne,Pe);if(Be.scale!==R){var Ge=getButtonAnimationTime(handleCalculateZoom.call(this,F,I,!0,void 0,!0),Fe,Le);animateComponent.call(this,{targetState:Be,speed:Ge,type:Re})}}function resetTransformations(F){var I=this.props.defaultValues,L=I.defaultScale,R=I.defaultPositionX,z=I.defaultPositionY,De=this.stateProvider,Oe=De.scale,ke=De.positionX,Ae=De.positionY,je=De.reset,Me=De.options,Ne=Me.disabled,Pe=Me.limitToBounds,Fe=Me.centerContent,Ie=Me.limitToWrapper;if(!(Ne||je.disabled)&&!(Oe===L&&ke===R&&Ae===z)){var Le=typeof F==`number`?F:je.animationTime,Re=checkIsNumber(L,initialState.scale),ze=checkIsNumber(R,initialState.positionX),Be=checkIsNumber(z,initialState.positionY);if(Pe&&!Ie||Fe){var Ge=handleCalculateBounds.call(this,Re,Ie);ze=Ge.minPositionX,Be=Ge.minPositionY}var rt={scale:Re,positionX:ze,positionY:Be};animateComponent.call(this,{targetState:rt,speed:Le,type:je.animationType})}}function getButtonAnimationTime(F,I,L){return I/F*L}function round(F,I){var L=10**I;return Math.round(F*L)/L}function getCurrentDistance(F){return getDistance(F.touches[0],F.touches[1])}function checkIfInfinite(F){return F===1/0||F===-1/0}function calculatePinchZoom(F,I){var L=this.stateProvider,R=L.options,z=R.minScale,De=R.maxScale,Oe=L.scalePadding,ke=Oe.size,Ae=Oe.disabled;if(typeof I!=`number`||typeof F!=`number`)return console.error(`Pinch touches distance was not provided`);if(!(F<0))return checkZoomBounds(roundNumber(F/I*this.pinchStartScale,2),z,De,ke,!Ae)}function calculateMidpoint(F,I,L){var R=L.getBoundingClientRect(),z=F.touches,De=round(z[0].clientX-R.left,5),Oe=round(z[0].clientY-R.top,5),ke=round(z[1].clientX-R.left,5),Ae=round(z[1].clientY-R.top,5);return{mouseX:(De+ke)/2/I,mouseY:(Oe+Ae)/2/I}}function handleZoomPinch(F){var I=this.stateProvider,L=I.scale,R=I.options,z=R.limitToBounds,De=R.limitToWrapper,Oe=I.scalePadding,ke=Oe.disabled,Ae=Oe.size,je=I.wheel.limitsOnWheel,Me=I.pinch,Ne=this.state.contentComponent;if(!(Me.disabled||this.stateProvider.options.disabled)&&(F.cancelable&&(F.preventDefault(),F.stopPropagation()),this.pinchStartDistance!==null)){var Pe=calculateMidpoint(F,L,Ne),Fe=Pe.mouseX,Ie=Pe.mouseY;if(!(checkIfInfinite(Fe)||checkIfInfinite(Ie))){var Le=getCurrentDistance(F),Re=calculatePinchZoom.call(this,Le,this.pinchStartDistance);if(!(checkIfInfinite(Re)||Re===L)){var ze=handleCalculateBounds.call(this,Re,De),Be=z&&(ke||Ae===0||je),Ge=handleCalculatePositions.call(this,Fe,Ie,Re,ze,Be),rt=Ge.x,it=Ge.y;this.lastDistance=Le,this.stateProvider.positionX=rt,this.stateProvider.positionY=it,this.stateProvider.scale=Re,this.stateProvider.previousScale=L,this.applyTransformation()}}}}var throttleTime=30;function velocityTimeSpeed(F,I){return this.stateProvider.pan.velocityEqualToMove?I-I/Math.max(1,F):I}function handleEnableVelocity(){this.setState({startAnimation:!1})}function handleFireVelocity(){this.setState({startAnimation:!0})}function animateVelocity(){var F=this,I=this.stateProvider,L=I.positionX,R=I.positionY,z=I.options.limitToBounds,De=I.pan,Oe=De.velocityBaseTime,ke=De.lockAxisX,Ae=De.lockAxisY,je=De.velocityAnimationType,Me=De.panReturnAnimationTime,Ne=De.panReturnAnimationType,Pe=De.padding,Fe=De.paddingSize,Ie=I.wrapperComponent;if(this.mounted){if(!this.velocity||!this.bounds)return handleDisableAnimation.call(this);var Le=this.bounds,Re=Le.maxPositionX,ze=Le.minPositionX,Be=Le.maxPositionY,Ge=Le.minPositionY,rt=this.velocity,it=rt.velocityX,at=rt.velocityY,ot=rt.velocity,st=velocityTimeSpeed.call(this,ot,Oe);if(!st){handlePanningAnimation.call(this);return}var ct=it,lt=at,ut=st>Me?st:Me,dt=Pe?Fe:0,ft=Ie?dt*Ie.offsetWidth/100:0,pt=Ie?dt*Ie.offsetHeight/100:0,mt=Re+ft,ht=ze-ft,gt=Be+pt,vt=Ge-pt,yt=checkPositionBounds(L,R,this.bounds,z,dt,Ie),yr=new Date().getTime();animate.call(this,je,ut,function(I){var De=new Date().getTime()-yr,Oe=De/Me,je=availableAnimations[Ne],Pe=je(Oe);(De>Me||Pe>1||Pe===1/0||Pe===-1/0)&&(Pe=1);var Fe=getPosition(ke,ct,I,Pe,ze,Re,z,L,yt.x,ht,mt),Ie=getPosition(Ae,lt,I,Pe,Ge,Be,z,R,yt.y,vt,gt);(L!==Fe||R!==Ie)&&(F.stateProvider.positionX=Fe,F.stateProvider.positionY=Ie,F.applyTransformation())})}}function calculateVelocityStart(F){var I=this,L=this.stateProvider,R=L.scale,z=L.options.disabled,De=L.pan,Oe=De.velocity,ke=De.velocitySensitivity,Ae=De.velocityActiveScale,je=De.velocityMinSpeed,Me=L.wrapperComponent;if(!(!Oe||Ae>=R||z)){handleEnableVelocity.call(this);var Ne=Date.now();if(this.lastMousePosition){var Pe=getClientPosition(F);if(!Pe)return console.error(`No mouse or touch position detected`);var Fe=Pe.clientX,Ie=Pe.clientY,Le=Fe-this.lastMousePosition.clientX,Re=Ie-this.lastMousePosition.clientY,ze=Ne-this.velocityTime,Be=2-Me.offsetWidth/window.innerWidth,Ge=2-Me.offsetHeight/window.innerHeight,rt=20*Math.max(je,Math.min(2,Be)),it=20*Math.max(je,Math.min(2,Ge)),at=Le/ze*ke*R*rt,ot=Re/ze*ke*R*it,st=Le*Le+Re*Re,ct=Math.sqrt(st)/ze*ke;if(this.velocity&&ct<this.velocity.velocity&&this.throttle)return;this.velocity={velocityX:at,velocityY:ot,velocity:ct},this.throttle&&clearTimeout(this.throttle),this.throttle=setTimeout(function(){I.mounted&&(I.throttle=!1)},throttleTime)}var lt=getClientPosition(F);this.lastMousePosition=lt,this.velocityTime=Ne}}function getPosition(F,I,L,R,z,De,Oe,ke,Ae,je,Me){if(Oe){if(Ae>z&&ke>De){var Ne=Ae-(Ae-De)*R;return Ne>Me?Me:Ne<De?De:Ne}if(Ae<z&&ke<z){var Ne=Ae-(Ae-z)*R;return Ne<je?je:Ne>z?z:Ne}}return F?Ae:boundLimiter(ke+I*L,z,De,Oe)}function makePassiveEventOption(F){return F}var propsList=`previousScale.scale.positionX.positionY.defaultPositionX.defaultPositionY.defaultScale.onWheelStart.onWheel.onWheelStop.onPanningStart.onPanning.onPanningStop.onPinchingStart.onPinching.onPinchingStop.onZoomChange.options.wheel.scalePadding.pan.pinch.zoomIn.zoomOut.doubleClick.reset`.split(`.`),getValidPropsFromObject=function(F){return Object.keys(F).reduce(function(I,L){return propsList.includes(L)&&(I[L]=F[L]),I},{})},Context=import_react$10.createContext({}),wheelStopEventTimer=null,wheelStopEventTime=180,wheelAnimationTimer=null,wheelAnimationTime=100,StateProvider=function(F){__extends$1(I,F);function I(){var I=F!==null&&F.apply(this,arguments)||this;return I.mounted=!0,I.state={wrapperComponent:void 0,contentComponent:void 0},I.stateProvider=__assign$1(__assign$1(__assign$1(__assign$1({},initialState),mergeProps(initialState,I.props.dynamicValues)),I.props.defaultValues),{previousScale:I.props.dynamicValues.scale||I.props.defaultValues.scale||initialState.scale}),I.windowToWrapperScaleX=0,I.windowToWrapperScaleY=0,I.startCoords=null,I.isDown=!1,I.pinchStartDistance=null,I.lastDistance=null,I.pinchStartScale=null,I.distance=null,I.bounds=null,I.velocityTime=null,I.lastMousePosition=null,I.velocity=null,I.offsetX=null,I.offsetY=null,I.throttle=!1,I.previousWheelEvent=null,I.lastScale=null,I.animate=null,I.animation=null,I.maxBounds=null,I.handleWheel=function(F){var L=I.stateProvider,R=L.scale,z=L.wheel,De=z.disabled,Oe=z.wheelEnabled,ke=z.touchPadEnabled,Ae=I.props,je=Ae.onWheelStart,Me=Ae.onWheel,Ne=Ae.onWheelStop,Pe=I.state,Fe=Pe.wrapperComponent,Ie=Pe.contentComponent;I.isDown||De||I.stateProvider.options.disabled||!Fe||!Ie||!Oe&&!F.ctrlKey||!ke&&F.ctrlKey||(wheelStopEventTimer||(I.lastScale=R,handleDisableAnimation.call(I),handleCallback(je,I.getCallbackProps())),handleWheelZoom.call(I,F),handleCallback(Me,I.getCallbackProps()),I.applyTransformation(null,null,null),I.previousWheelEvent=F,handleWheelStop(I.previousWheelEvent,F,I.stateProvider)&&(clearTimeout(wheelStopEventTimer),wheelStopEventTimer=setTimeout(function(){I.mounted&&(handleCallback(Ne,I.getCallbackProps()),wheelStopEventTimer=null)},wheelStopEventTime)),I.animate=!1,I.lastScale=I.stateProvider.scale,clearTimeout(wheelAnimationTimer),wheelAnimationTimer=setTimeout(function(){I.mounted&&handlePaddingAnimation$1.call(I,F)},wheelAnimationTime))},I.checkPanningTarget=function(F){var L=I.stateProvider.pan.disableOnTarget;return L.map(function(F){return F.toUpperCase()}).includes(F.target.tagName)||L.find(function(I){return F.target.classList.value.includes(I)})},I.checkIsPanningActive=function(F){var L=I.stateProvider.pan.disabled,R=I.state,z=R.wrapperComponent,De=R.contentComponent;return!I.isDown||L||I.stateProvider.options.disabled||F.touches&&(F.touches.length!==1||Math.abs(I.startCoords.x-F.touches[0].clientX)<1||Math.abs(I.startCoords.y-F.touches[0].clientY)<1)||!z||!De},I.handleSetUpPanning=function(F,L){var R=I.stateProvider,z=R.positionX,De=R.positionY;I.isDown=!0,I.startCoords={x:F-z,y:L-De},handleCallback(I.props.onPanningStart,I.getCallbackProps())},I.handleStartPanning=function(F){var L=I.stateProvider,R=L.wrapperComponent,z=L.scale,De=L.options,Oe=De.minScale,ke=De.maxScale,Ae=De.limitToWrapper,je=L.pan.disabled,Me=F.target,Ne=F.touches;je||I.stateProvider.options.disabled||R&&!R.contains(Me)||I.checkPanningTarget(F)||z<Oe||z>ke||(handleDisableAnimation.call(I),I.bounds=handleCalculateBounds.call(I,z,Ae),Ne&&Ne.length===1&&I.handleSetUpPanning(Ne[0].clientX,Ne[0].clientY),Ne||I.handleSetUpPanning(F.clientX,F.clientY))},I.handlePanning=function(F){I.isDown&&F.preventDefault(),!I.checkIsPanningActive(F)&&(F.stopPropagation(),calculateVelocityStart.call(I,F),handlePanning.call(I,F),handleCallback(I.props.onPanning,I.getCallbackProps()))},I.handleStopPanning=function(){if(I.isDown){I.isDown=!1,I.animate=!1,I.animation=!1,handleFireVelocity.call(I),handleCallback(I.props.onPanningStop,I.getCallbackProps());var F=I.stateProvider,L=F.pan.velocity,R=F.scale;I.velocity&&L&&R>1?animateVelocity.call(I):handlePanningAnimation.call(I)}},I.handlePinchStart=function(F){var L=I.stateProvider.scale;F.preventDefault(),F.stopPropagation(),handleDisableAnimation.call(I);var R=getDistance(F.touches[0],F.touches[1]);I.pinchStartDistance=R,I.lastDistance=R,I.pinchStartScale=L,I.isDown=!1,handleCallback(I.props.onPinchingStart,I.getCallbackProps())},I.handlePinch=function(F){I.isDown=!1,handleZoomPinch.call(I,F),handleCallback(I.props.onPinching,I.getCallbackProps())},I.handlePinchStop=function(){typeof I.pinchStartScale==`number`&&(I.isDown=!1,I.velocity=null,I.lastDistance=null,I.pinchStartScale=null,I.pinchStartDistance=null,handlePaddingAnimation$1.call(I),handleCallback(I.props.onPinchingStop,I.getCallbackProps()))},I.handleTouchStart=function(F){var L=I.stateProvider,R=L.wrapperComponent,z=L.contentComponent,De=L.scale,Oe=L.options,ke=Oe.disabled,Ae=Oe.minScale,je=F.touches;if(!(ke||!R||!z||De<Ae)){if(handleDisableAnimation.call(I),je&&je.length===1)return I.handleStartPanning(F);if(je&&je.length===2)return I.handlePinchStart(F)}},I.handleTouch=function(F){var L=I.stateProvider,R=L.pan,z=L.pinch;if(!L.options.disabled){if(!R.disabled&&F.touches.length===1)return I.handlePanning(F);if(!z.disabled&&F.touches.length===2)return I.handlePinch(F)}},I.handleTouchStop=function(){I.handleStopPanning(),I.handlePinchStop()},I.zoomIn=function(F){var L=I.stateProvider,R=L.zoomIn,z=R.disabled,De=R.step,Oe=L.options,ke=I.state,Ae=ke.wrapperComponent,je=ke.contentComponent;if(!F)throw Error(`Zoom in function requires event prop`);z||Oe.disabled||!Ae||!je||handleZoomControls.call(I,1,De)},I.zoomOut=function(F){var L=I.stateProvider,R=L.zoomOut,z=R.disabled,De=R.step,Oe=L.options,ke=I.state,Ae=ke.wrapperComponent,je=ke.contentComponent;if(!F)throw Error(`Zoom out function requires event prop`);z||Oe.disabled||!Ae||!je||handleZoomControls.call(I,-1,De)},I.handleDbClick=function(F){var L=I.stateProvider,R=L.options,z=L.doubleClick,De=z.disabled,Oe=z.step,ke=I.state,Ae=ke.wrapperComponent,je=ke.contentComponent;if(!F)throw Error(`Double click function requires event prop`);De||R.disabled||!Ae||!je||handleDoubleClick.call(I,F,1,Oe)},I.setScale=function(F,L,R){L===void 0&&(L=200),R===void 0&&(R=`easeOut`);var z=I.stateProvider,De=z.positionX,Oe=z.positionY,ke=z.scale,Ae=z.options.disabled,je=I.state,Me=je.wrapperComponent,Ne=je.contentComponent;if(!(Ae||!Me||!Ne)){var Pe={positionX:De,positionY:Oe,scale:isNaN(F)?ke:F};animateComponent.call(I,{targetState:Pe,speed:L,type:R})}},I.setPositionX=function(F,L,R){L===void 0&&(L=200),R===void 0&&(R=`easeOut`);var z=I.stateProvider,De=z.positionX,Oe=z.positionY,ke=z.scale,Ae=z.options,je=Ae.disabled,Me=Ae.transformEnabled,Ne=I.state,Pe=Ne.wrapperComponent,Fe=Ne.contentComponent;if(!(je||!Me||!Pe||!Fe)){var Ie={positionX:isNaN(F)?De:F,positionY:Oe,scale:ke};animateComponent.call(I,{targetState:Ie,speed:L,type:R})}},I.setPositionY=function(F,L,R){L===void 0&&(L=200),R===void 0&&(R=`easeOut`);var z=I.stateProvider,De=z.positionX,Oe=z.scale,ke=z.positionY,Ae=z.options,je=Ae.disabled,Me=Ae.transformEnabled,Ne=I.state,Pe=Ne.wrapperComponent,Fe=Ne.contentComponent;if(!(je||!Me||!Pe||!Fe)){var Ie={positionX:De,positionY:isNaN(F)?ke:F,scale:Oe};animateComponent.call(I,{targetState:Ie,speed:L,type:R})}},I.setTransform=function(F,L,R,z,De){z===void 0&&(z=200),De===void 0&&(De=`easeOut`);var Oe=I.stateProvider,ke=Oe.positionX,Ae=Oe.positionY,je=Oe.scale,Me=Oe.options,Ne=Me.disabled,Pe=Me.transformEnabled,Fe=I.state,Ie=Fe.wrapperComponent,Le=Fe.contentComponent;if(!(Ne||!Pe||!Ie||!Le)){var Re={positionX:isNaN(F)?ke:F,positionY:isNaN(L)?Ae:L,scale:isNaN(R)?je:R};animateComponent.call(I,{targetState:Re,speed:z,type:De})}},I.resetTransform=function(){var F=I.stateProvider.options,L=F.disabled,R=F.transformEnabled;L||!R||resetTransformations.call(I)},I.setDefaultState=function(){I.animation=null,I.stateProvider=__assign$1(__assign$1(__assign$1({},I.stateProvider),{scale:initialState.scale,positionX:initialState.positionX,positionY:initialState.positionY}),I.props.defaultValues),I.forceUpdate()},I.setWrapperComponent=function(F){I.setState({wrapperComponent:F})},I.setContentComponent=function(F){I.setState({contentComponent:F},function(){var L=I.stateProvider,R=L.wrapperComponent,z=L.options,De=z.centerContent,Oe=z.limitToBounds,ke=z.limitToWrapper,Ae=L.scale,je=I.props.defaultValues,Me=je.positionX,Ne=je.positionY;if(Oe&&!ke||De&&!Me&&!Ne){var Pe=`translate(25%, 25%) scale(`+Ae+`)`;F.style.transform=Pe,F.style.WebkitTransform=Pe,I.forceUpdate();var Fe=new Date().getTime(),Ie=2e3,Le=setInterval(function(){if(R.offsetWidth){var F=handleCalculateBounds.call(I,Ae,!1);I.stateProvider.positionX=F.minPositionX,I.stateProvider.positionY=F.minPositionY,I.applyTransformation(null,null,null),clearInterval(Le),Le=null}else new Date().getTime()-Fe>Ie&&(clearInterval(Le),Le=null)},20)}else I.applyTransformation(null,null,null)})},I.applyTransformation=function(F,L,R){if(I.mounted){var z=I.state.contentComponent,De=I.props.onZoomChange,Oe=I.stateProvider,ke=Oe.previousScale,Ae=Oe.scale,je=Oe.positionX,Me=Oe.positionY;if(!z)return console.error(`There is no content component`);var Ne=`translate(`+(L||je)+`px, `+(R||Me)+`px) scale(`+(F||Ae)+`)`;z.style.transform=Ne,z.style.WebkitTransform=Ne,I.forceUpdate(),De&&ke!==Ae&&handleCallback(De,I.getCallbackProps())}},I.getCallbackProps=function(){return getValidPropsFromObject(I.stateProvider)},I}return I.prototype.componentDidMount=function(){var F=makePassiveEventOption(!1);window.addEventListener(`mousedown`,this.handleStartPanning,F),window.addEventListener(`mousemove`,this.handlePanning,F),window.addEventListener(`mouseup`,this.handleStopPanning,F)},I.prototype.componentWillUnmount=function(){var F=makePassiveEventOption(!1);window.removeEventListener(`mousedown`,this.handleStartPanning,F),window.removeEventListener(`mousemove`,this.handlePanning,F),window.removeEventListener(`mouseup`,this.handleStopPanning,F),handleDisableAnimation.call(this)},I.prototype.componentDidUpdate=function(F,I){var L=this.state,R=L.wrapperComponent,z=L.contentComponent,De=this.props.dynamicValues;if(!I.contentComponent&&z&&(this.stateProvider.contentComponent=z),!I.wrapperComponent&&R&&R!==void 0){this.stateProvider.wrapperComponent=R,this.windowToWrapperScaleX=getWindowScaleX(R),this.windowToWrapperScaleY=getWindowScaleY(R);var Oe=makePassiveEventOption(!1);R.addEventListener(`wheel`,this.handleWheel,Oe),R.addEventListener(`dblclick`,this.handleDbClick,Oe),R.addEventListener(`touchstart`,this.handleTouchStart,Oe),R.addEventListener(`touchmove`,this.handleTouch,Oe),R.addEventListener(`touchend`,this.handleTouchStop,Oe)}(R&&z||F.dynamicValues!==De)&&(this.maxBounds=handleCalculateBounds.call(this,this.stateProvider.scale,this.stateProvider.options.limitToWrapper)),F.dynamicValues&&F.dynamicValues!==De&&(this.animation=null,this.stateProvider=__assign$1(__assign$1({},this.stateProvider),mergeProps(this.stateProvider,De)),this.applyTransformation(null,null,null))},I.prototype.render=function(){var F=this.state,I=F.wrapperComponent,L=F.contentComponent,R={loaded:!!(I&&L),state:this.getCallbackProps(),dispatch:{setScale:this.setScale,setPositionX:this.setPositionX,setPositionY:this.setPositionY,zoomIn:this.zoomIn,zoomOut:this.zoomOut,setTransform:this.setTransform,resetTransform:this.resetTransform,setDefaultState:this.setDefaultState},nodes:{setWrapperComponent:this.setWrapperComponent,setContentComponent:this.setContentComponent}},z=this.props.children,De=typeof z==`function`?z(__assign$1(__assign$1({},R.state),R.dispatch)):z;return import_react$10.createElement(Context.Provider,{value:R},De)},I}(import_react$10.Component),TransformWrapper=function(F){var I=F.children,L=F.defaultPositionX,R=F.defaultPositionY,z=F.defaultScale,De=F.onWheelStart,Oe=F.onWheel,ke=F.onWheelStop,Ae=F.onPanningStart,je=F.onPanning,Me=F.onPanningStop,Ne=F.onPinchingStart,Pe=F.onPinching,Fe=F.onPinchingStop,Ie=F.onZoomChange,Le=__rest$1(F,[`children`,`defaultPositionX`,`defaultPositionY`,`defaultScale`,`onWheelStart`,`onWheel`,`onWheelStop`,`onPanningStart`,`onPanning`,`onPanningStop`,`onPinchingStart`,`onPinching`,`onPinchingStop`,`onZoomChange`]),Re=__assign$1({},Le);return Re.options&&Re.options.limitToWrapper&&(Re.options.limitToBounds=!0),import_react$10.createElement(StateProvider,{defaultValues:deleteUndefinedProps({positionX:L,positionY:R,scale:z}),dynamicValues:deleteUndefinedProps(getValidPropsFromObject(Re)),onWheelStart:De,onWheel:Oe,onWheelStop:ke,onPanningStart:Ae,onPanning:je,onPanningStop:Me,onPinchingStart:Ne,onPinching:Pe,onPinchingStop:Fe,onZoomChange:Ie},I)};function styleInject(F,I){I===void 0&&(I={});var L=I.insertAt;if(!(!F||typeof document>`u`)){var R=document.head||document.getElementsByTagName(`head`)[0],z=document.createElement(`style`);z.type=`text/css`,L===`top`&&R.firstChild?R.insertBefore(z,R.firstChild):R.appendChild(z),z.styleSheet?z.styleSheet.cssText=F:z.appendChild(document.createTextNode(F))}}var css=`.TransformComponent-module_container__3NwNd {
|
|
265
265
|
position: relative;
|
|
266
266
|
width: fit-content;
|
|
267
267
|
height: fit-content;
|
|
@@ -409,5 +409,5 @@ Kegs that contain wine compound in value at a rate of ${WINE_INTEREST_RATE}% for
|
|
|
409
409
|
`}),L}function dy(F){let I=0,L=F.charCodeAt(I);for(;L===9||L===32;)I++,L=F.charCodeAt(I);return F.slice(I)}function fy(F,I){let L=oy(F,I),R=L.one(F,void 0),z=Gv(L),De=Array.isArray(R)?{type:`root`,children:R}:R||{type:`root`,children:[]};return z&&(`children`in De,De.children.push({type:`text`,value:`
|
|
410
410
|
`},z)),De}function py(F,I){return F&&`run`in F?async function(L,R){let z=fy(L,{file:R,...I});await F.run(z,R)}:function(L,R){return fy(L,{file:R,...F||I})}}function my(F){if(F)throw F}var hy=s(((F,I)=>{var L=Object.prototype.hasOwnProperty,R=Object.prototype.toString,z=Object.defineProperty,De=Object.getOwnPropertyDescriptor,Oe=function(F){return typeof Array.isArray==`function`?Array.isArray(F):R.call(F)===`[object Array]`},ke=function(F){if(!F||R.call(F)!==`[object Object]`)return!1;var I=L.call(F,`constructor`),z=F.constructor&&F.constructor.prototype&&L.call(F.constructor.prototype,`isPrototypeOf`);if(F.constructor&&!I&&!z)return!1;for(var De in F);return De===void 0||L.call(F,De)},Ae=function(F,I){z&&I.name===`__proto__`?z(F,I.name,{enumerable:!0,configurable:!0,value:I.newValue,writable:!0}):F[I.name]=I.newValue},je=function(F,I){if(I===`__proto__`){if(!L.call(F,I))return;if(De)return De(F,I).value}return F[I]};I.exports=function F(){var I,L,R,z,De,Me,Ne=arguments[0],Pe=1,Fe=arguments.length,Ie=!1;for(typeof Ne==`boolean`&&(Ie=Ne,Ne=arguments[1]||{},Pe=2),(Ne==null||typeof Ne!=`object`&&typeof Ne!=`function`)&&(Ne={});Pe<Fe;++Pe)if(I=arguments[Pe],I!=null)for(L in I)R=je(Ne,L),z=je(I,L),Ne!==z&&(Ie&&z&&(ke(z)||(De=Oe(z)))?(De?(De=!1,Me=R&&Oe(R)?R:[]):Me=R&&ke(R)?R:{},Ae(Ne,{name:L,newValue:F(Ie,Me,z)})):z!==void 0&&Ae(Ne,{name:L,newValue:z}));return Ne}}));function gy(F){if(typeof F!=`object`||!F)return!1;let I=Object.getPrototypeOf(F);return(I===null||I===Object.prototype||Object.getPrototypeOf(I)===null)&&!(Symbol.toStringTag in F)&&!(Symbol.iterator in F)}function _y(){let F=[],I={run:L,use:R};return I;function L(...I){let L=-1,R=I.pop();if(typeof R!=`function`)throw TypeError(`Expected function as last argument, not `+R);z(null,...I);function z(De,...Oe){let ke=F[++L],Ae=-1;if(De){R(De);return}for(;++Ae<I.length;)(Oe[Ae]===null||Oe[Ae]===void 0)&&(Oe[Ae]=I[Ae]);I=Oe,ke?vy(ke,z)(...Oe):R(null,...Oe)}}function R(L){if(typeof L!=`function`)throw TypeError("Expected `middelware` to be a function, not "+L);return F.push(L),I}}function vy(F,I){let L;return R;function R(...I){let R=F.length>I.length,Oe;R&&I.push(z);try{Oe=F.apply(this,I)}catch(F){let I=F;if(R&&L)throw I;return z(I)}R||(Oe&&Oe.then&&typeof Oe.then==`function`?Oe.then(De,z):Oe instanceof Error?z(Oe):De(Oe))}function z(F,...R){L||(L=!0,I(F,...R))}function De(F){z(null,F)}}var yy={basename:by,dirname:xy,extname:Sy,join:Cy,sep:`/`};function by(F,I){if(I!==void 0&&typeof I!=`string`)throw TypeError(`"ext" argument must be a string`);Ey(F);let L=0,R=-1,z=F.length,De;if(I===void 0||I.length===0||I.length>F.length){for(;z--;)if(F.codePointAt(z)===47){if(De){L=z+1;break}}else R<0&&(De=!0,R=z+1);return R<0?``:F.slice(L,R)}if(I===F)return``;let Oe=-1,ke=I.length-1;for(;z--;)if(F.codePointAt(z)===47){if(De){L=z+1;break}}else Oe<0&&(De=!0,Oe=z+1),ke>-1&&(F.codePointAt(z)===I.codePointAt(ke--)?ke<0&&(R=z):(ke=-1,R=Oe));return L===R?R=Oe:R<0&&(R=F.length),F.slice(L,R)}function xy(F){if(Ey(F),F.length===0)return`.`;let I=-1,L=F.length,R;for(;--L;)if(F.codePointAt(L)===47){if(R){I=L;break}}else R||=!0;return I<0?F.codePointAt(0)===47?`/`:`.`:I===1&&F.codePointAt(0)===47?`//`:F.slice(0,I)}function Sy(F){Ey(F);let I=F.length,L=-1,R=0,z=-1,De=0,Oe;for(;I--;){let ke=F.codePointAt(I);if(ke===47){if(Oe){R=I+1;break}continue}L<0&&(Oe=!0,L=I+1),ke===46?z<0?z=I:De!==1&&(De=1):z>-1&&(De=-1)}return z<0||L<0||De===0||De===1&&z===L-1&&z===R+1?``:F.slice(z,L)}function Cy(...F){let I=-1,L;for(;++I<F.length;)Ey(F[I]),F[I]&&(L=L===void 0?F[I]:L+`/`+F[I]);return L===void 0?`.`:wy(L)}function wy(F){Ey(F);let I=F.codePointAt(0)===47,L=Ty(F,!I);return L.length===0&&!I&&(L=`.`),L.length>0&&F.codePointAt(F.length-1)===47&&(L+=`/`),I?`/`+L:L}function Ty(F,I){let L=``,R=0,z=-1,De=0,Oe=-1,ke,Ae;for(;++Oe<=F.length;){if(Oe<F.length)ke=F.codePointAt(Oe);else if(ke===47)break;else ke=47;if(ke===47){if(!(z===Oe-1||De===1))if(z!==Oe-1&&De===2){if(L.length<2||R!==2||L.codePointAt(L.length-1)!==46||L.codePointAt(L.length-2)!==46){if(L.length>2){if(Ae=L.lastIndexOf(`/`),Ae!==L.length-1){Ae<0?(L=``,R=0):(L=L.slice(0,Ae),R=L.length-1-L.lastIndexOf(`/`)),z=Oe,De=0;continue}}else if(L.length>0){L=``,R=0,z=Oe,De=0;continue}}I&&(L=L.length>0?L+`/..`:`..`,R=2)}else L.length>0?L+=`/`+F.slice(z+1,Oe):L=F.slice(z+1,Oe),R=Oe-z-1;z=Oe,De=0}else ke===46&&De>-1?De++:De=-1}return L}function Ey(F){if(typeof F!=`string`)throw TypeError(`Path must be a string. Received `+JSON.stringify(F))}var Dy={cwd:Oy};function Oy(){return`/`}function ky(F){return!!(typeof F==`object`&&F&&`href`in F&&F.href&&`protocol`in F&&F.protocol&&F.auth===void 0)}function Ay(F){if(typeof F==`string`)F=new URL(F);else if(!ky(F)){let I=TypeError('The "path" argument must be of type string or an instance of URL. Received `'+F+"`");throw I.code=`ERR_INVALID_ARG_TYPE`,I}if(F.protocol!==`file:`){let F=TypeError(`The URL must be of scheme file`);throw F.code=`ERR_INVALID_URL_SCHEME`,F}return jy(F)}function jy(F){if(F.hostname!==``){let F=TypeError(`File URL host must be "localhost" or empty on darwin`);throw F.code=`ERR_INVALID_FILE_URL_HOST`,F}let I=F.pathname,L=-1;for(;++L<I.length;)if(I.codePointAt(L)===37&&I.codePointAt(L+1)===50){let F=I.codePointAt(L+2);if(F===70||F===102){let F=TypeError(`File URL path must not include encoded / characters`);throw F.code=`ERR_INVALID_FILE_URL_PATH`,F}}return decodeURIComponent(I)}var My=[`history`,`path`,`basename`,`stem`,`extname`,`dirname`],Ny=class{constructor(F){let I;I=F?ky(F)?{path:F}:typeof F==`string`||Ly(F)?{value:F}:F:{},this.cwd=`cwd`in I?``:Dy.cwd(),this.data={},this.history=[],this.messages=[],this.value,this.map,this.result,this.stored;let L=-1;for(;++L<My.length;){let F=My[L];F in I&&I[F]!==void 0&&I[F]!==null&&(this[F]=F===`history`?[...I[F]]:I[F])}let R;for(R in I)My.includes(R)||(this[R]=I[R])}get basename(){return typeof this.path==`string`?yy.basename(this.path):void 0}set basename(F){Fy(F,`basename`),Py(F,`basename`),this.path=yy.join(this.dirname||``,F)}get dirname(){return typeof this.path==`string`?yy.dirname(this.path):void 0}set dirname(F){Iy(this.basename,`dirname`),this.path=yy.join(F||``,this.basename)}get extname(){return typeof this.path==`string`?yy.extname(this.path):void 0}set extname(F){if(Py(F,`extname`),Iy(this.dirname,`extname`),F){if(F.codePointAt(0)!==46)throw Error("`extname` must start with `.`");if(F.includes(`.`,1))throw Error("`extname` cannot contain multiple dots")}this.path=yy.join(this.dirname,this.stem+(F||``))}get path(){return this.history[this.history.length-1]}set path(F){ky(F)&&(F=Ay(F)),Fy(F,`path`),this.path!==F&&this.history.push(F)}get stem(){return typeof this.path==`string`?yy.basename(this.path,this.extname):void 0}set stem(F){Fy(F,`stem`),Py(F,`stem`),this.path=yy.join(this.dirname||``,F+(this.extname||``))}fail(F,I,L){let R=this.message(F,I,L);throw R.fatal=!0,R}info(F,I,L){let R=this.message(F,I,L);return R.fatal=void 0,R}message(F,I,L){let R=new Tm(F,I,L);return this.path&&(R.name=this.path+`:`+R.name,R.file=this.path),R.fatal=!1,this.messages.push(R),R}toString(F){return this.value===void 0?``:typeof this.value==`string`?this.value:new TextDecoder(F||void 0).decode(this.value)}};function Py(F,I){if(F&&F.includes(yy.sep))throw Error("`"+I+"` cannot be a path: did not expect `"+yy.sep+"`")}function Fy(F,I){if(!F)throw Error("`"+I+"` cannot be empty")}function Iy(F,I){if(!F)throw Error("Setting `"+I+"` requires `path` to be set too")}function Ly(F){return!!(F&&typeof F==`object`&&`byteLength`in F&&`byteOffset`in F)}var Ry=(function(F){let I=this.constructor.prototype,L=I[F],R=function(){return L.apply(R,arguments)};return Object.setPrototypeOf(R,I),R}),zy=u(hy(),1),By={}.hasOwnProperty,Vy=new class F extends Ry{constructor(){super(`copy`),this.Compiler=void 0,this.Parser=void 0,this.attachers=[],this.compiler=void 0,this.freezeIndex=-1,this.frozen=void 0,this.namespace={},this.parser=void 0,this.transformers=_y()}copy(){let I=new F,L=-1;for(;++L<this.attachers.length;){let F=this.attachers[L];I.use(...F)}return I.data((0,zy.default)(!0,{},this.namespace)),I}data(F,I){return typeof F==`string`?arguments.length===2?(Wy(`data`,this.frozen),this.namespace[F]=I,this):By.call(this.namespace,F)&&this.namespace[F]||void 0:F?(Wy(`data`,this.frozen),this.namespace=F,this):this.namespace}freeze(){if(this.frozen)return this;let F=this;for(;++this.freezeIndex<this.attachers.length;){let[I,...L]=this.attachers[this.freezeIndex];if(L[0]===!1)continue;L[0]===!0&&(L[0]=void 0);let R=I.call(F,...L);typeof R==`function`&&this.transformers.use(R)}return this.frozen=!0,this.freezeIndex=1/0,this}parse(F){this.freeze();let I=qy(F),L=this.parser||this.Parser;return Hy(`parse`,L),L(String(I),I)}process(F,I){let L=this;return this.freeze(),Hy(`process`,this.parser||this.Parser),Uy(`process`,this.compiler||this.Compiler),I?R(void 0,I):new Promise(R);function R(R,z){let De=qy(F),Oe=L.parse(De);L.run(Oe,De,function(F,I,R){if(F||!I||!R)return ke(F);let z=I,De=L.stringify(z,R);Yy(De)?R.value=De:R.result=De,ke(F,R)});function ke(F,L){F||!L?z(F):R?R(L):I(void 0,L)}}}processSync(F){let I=!1,L;return this.freeze(),Hy(`processSync`,this.parser||this.Parser),Uy(`processSync`,this.compiler||this.Compiler),this.process(F,R),Ky(`processSync`,`process`,I),L;function R(F,R){I=!0,my(F),L=R}}run(F,I,L){Gy(F),this.freeze();let R=this.transformers;return!L&&typeof I==`function`&&(L=I,I=void 0),L?z(void 0,L):new Promise(z);function z(z,De){let Oe=qy(I);R.run(F,Oe,ke);function ke(I,R,Oe){let ke=R||F;I?De(I):z?z(ke):L(void 0,ke,Oe)}}}runSync(F,I){let L=!1,R;return this.run(F,I,z),Ky(`runSync`,`run`,L),R;function z(F,I){my(F),R=I,L=!0}}stringify(F,I){this.freeze();let L=qy(I),R=this.compiler||this.Compiler;return Uy(`stringify`,R),Gy(F),R(F,L)}use(F,...I){let L=this.attachers,R=this.namespace;if(Wy(`use`,this.frozen),F!=null)if(typeof F==`function`)ke(F,I);else if(typeof F==`object`)Array.isArray(F)?Oe(F):De(F);else throw TypeError("Expected usable value, not `"+F+"`");return this;function z(F){if(typeof F==`function`)ke(F,[]);else if(typeof F==`object`)if(Array.isArray(F)){let[I,...L]=F;ke(I,L)}else De(F);else throw TypeError("Expected usable value, not `"+F+"`")}function De(F){if(!(`plugins`in F)&&!(`settings`in F))throw Error("Expected usable value but received an empty preset, which is probably a mistake: presets typically come with `plugins` and sometimes with `settings`, but this has neither");Oe(F.plugins),F.settings&&(R.settings=(0,zy.default)(!0,R.settings,F.settings))}function Oe(F){let I=-1;if(F!=null)if(Array.isArray(F))for(;++I<F.length;){let L=F[I];z(L)}else throw TypeError("Expected a list of plugins, not `"+F+"`")}function ke(F,I){let R=-1,z=-1;for(;++R<L.length;)if(L[R][0]===F){z=R;break}if(z===-1)L.push([F,...I]);else if(I.length>0){let[R,...De]=I,Oe=L[z][1];gy(Oe)&&gy(R)&&(R=(0,zy.default)(!0,Oe,R)),L[z]=[F,R,...De]}}}}().freeze();function Hy(F,I){if(typeof I!=`function`)throw TypeError("Cannot `"+F+"` without `parser`")}function Uy(F,I){if(typeof I!=`function`)throw TypeError("Cannot `"+F+"` without `compiler`")}function Wy(F,I){if(I)throw Error("Cannot call `"+F+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function Gy(F){if(!gy(F)||typeof F.type!=`string`)throw TypeError("Expected node, got `"+F+"`")}function Ky(F,I,L){if(!L)throw Error("`"+F+"` finished async. Use `"+I+"` instead")}function qy(F){return Jy(F)?F:new Ny(F)}function Jy(F){return!!(F&&typeof F==`object`&&`message`in F&&`messages`in F)}function Yy(F){return typeof F==`string`||Xy(F)}function Xy(F){return!!(F&&typeof F==`object`&&`byteLength`in F&&`byteOffset`in F)}var Zy=[],Qy={allowDangerousHtml:!0},$y=/^(https?|ircs?|mailto|xmpp)$/i,eb=[{from:`astPlugins`,id:`remove-buggy-html-in-markdown-parser`},{from:`allowDangerousHtml`,id:`remove-buggy-html-in-markdown-parser`},{from:`allowNode`,id:`replace-allownode-allowedtypes-and-disallowedtypes`,to:`allowElement`},{from:`allowedTypes`,id:`replace-allownode-allowedtypes-and-disallowedtypes`,to:`allowedElements`},{from:`className`,id:`remove-classname`},{from:`disallowedTypes`,id:`replace-allownode-allowedtypes-and-disallowedtypes`,to:`disallowedElements`},{from:`escapeHtml`,id:`remove-buggy-html-in-markdown-parser`},{from:`includeElementIndex`,id:`#remove-includeelementindex`},{from:`includeNodeIndex`,id:`change-includenodeindex-to-includeelementindex`},{from:`linkTarget`,id:`remove-linktarget`},{from:`plugins`,id:`change-plugins-to-remarkplugins`,to:`remarkPlugins`},{from:`rawSourcePos`,id:`#remove-rawsourcepos`},{from:`renderers`,id:`change-renderers-to-components`,to:`components`},{from:`source`,id:`change-source-to-children`,to:`children`},{from:`sourcePos`,id:`#remove-sourcepos`},{from:`transformImageUri`,id:`#add-urltransform`,to:`urlTransform`},{from:`transformLinkUri`,id:`#add-urltransform`,to:`urlTransform`}];function tb(F){let I=nb(F),L=rb(F);return ib(I.runSync(I.parse(L),L),F)}function nb(F){let I=F.rehypePlugins||Zy,L=F.remarkPlugins||Zy,R=F.remarkRehypeOptions?{...F.remarkRehypeOptions,...Qy}:Qy;return Vy().use($_).use(L).use(py,R).use(I)}function rb(F){let I=F.children||``,L=new Ny;return typeof I==`string`?L.value=I:``+I,L}function ib(F,I){let L=I.allowedElements,R=I.allowElement,z=I.components,De=I.disallowedElements,Oe=I.skipHtml,ke=I.unwrapDisallowed,Ae=I.urlTransform||ab;for(let F of eb)Object.hasOwn(I,F.from)&&``+F.from+(F.to?"use `"+F.to+"` instead":`remove it`)+F.id;return ry(F,je),Mm(F,{Fragment:import_jsx_runtime$2.Fragment,components:z,ignoreInvalidStyle:!0,jsx:import_jsx_runtime$2.jsx,jsxs:import_jsx_runtime$2.jsxs,passKeys:!0,passNode:!0});function je(F,I,z){if(F.type===`raw`&&z&&typeof I==`number`)return Oe?z.children.splice(I,1):z.children[I]={type:`text`,value:F.value},I;if(F.type===`element`){let I;for(I in eh)if(Object.hasOwn(eh,I)&&Object.hasOwn(F.properties,I)){let L=F.properties[I],R=eh[I];(R===null||R.includes(F.tagName))&&(F.properties[I]=Ae(String(L||``),I,F))}}if(F.type===`element`){let Oe=L?!L.includes(F.tagName):De?De.includes(F.tagName):!1;if(!Oe&&R&&typeof I==`number`&&(Oe=!R(F,I,z)),Oe&&z&&typeof I==`number`)return ke&&F.children?z.children.splice(I,1,...F.children):z.children.splice(I,1),I}}}function ab(F){let I=F.indexOf(`:`),L=F.indexOf(`?`),R=F.indexOf(`#`),z=F.indexOf(`/`);return I===-1||z!==-1&&I>z||L!==-1&&I>L||R!==-1&&I>R||$y.test(F.slice(0,I))?F:``}var ob=({crop:F,playedCrop:I})=>I?(0,import_jsx_runtime$2.jsxs)(Typography,{children:[`Water cards attached: `,I.waterCards,`/`,F.waterToMature]}):(0,import_jsx_runtime$2.jsxs)(Typography,{children:[`Water needed to mature: `,F.waterToMature]}),sb=import_react$10.useLayoutEffect;function cb(){return typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:{}}function lb(){let F=cb();if(F.__xstate__)return F.__xstate__}var ub=F=>{if(typeof window>`u`)return;let I=lb();I&&I.register(F)},db$1=class{constructor(F){this._process=F,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}enqueue(F){let I={value:F,next:null};if(this._current){this._last.next=I,this._last=I;return}this._current=I,this._last=I,this._active&&this.flush()}flush(){for(;this._current;){let F=this._current;this._process(F.value),this._current=F.next}this._last=null}},fb=``,pb=`#`,mb=`*`,hb=`xstate.init`,gb=`xstate.stop`;function _b(F,I){return{type:`xstate.after.${F}.${I}`}}function vb(F,I){return{type:`xstate.done.state.${F}`,output:I}}function yb(F,I){return{type:`xstate.done.actor.${F}`,output:I,actorId:F}}function bb(F,I){return{type:`xstate.error.actor.${F}`,error:I,actorId:F}}function xb(F){return{type:hb,input:F}}function Sb(F){setTimeout(()=>{throw F})}var Cb=typeof Symbol==`function`&&Symbol.observable||`@@observable`;function wb(F,I){let L=Eb(F),R=Eb(I);return typeof R==`string`?typeof L==`string`&&R===L:typeof L==`string`?L in R:Object.keys(L).every(F=>F in R&&wb(L[F],R[F]))}function Tb(F){if(Mb(F))return F;let I=[],L=``;for(let R=0;R<F.length;R++){switch(F.charCodeAt(R)){case 92:L+=F[R+1],R++;continue;case 46:I.push(L),L=``;continue}L+=F[R]}return I.push(L),I}function Eb(F){return eS(F)?F.value:typeof F==`string`?Db(Tb(F)):F}function Db(F){if(F.length===1)return F[0];let I={},L=I;for(let I=0;I<F.length-1;I++)if(I===F.length-2)L[F[I]]=F[I+1];else{let R=L;L={},R[F[I]]=L}return I}function Ob(F,I){let L={},R=Object.keys(F);for(let z=0;z<R.length;z++){let De=R[z];L[De]=I(F[De],De,F,z)}return L}function kb(F){return Mb(F)?F:[F]}function Ab(F){return F===void 0?[]:kb(F)}function jb(F,I,L,R){return typeof F==`function`?F({context:I,event:L,self:R}):F}function Mb(F){return Array.isArray(F)}function Nb(F){return F.type.startsWith(`xstate.error.actor`)}function Pb(F){return kb(F).map(F=>F===void 0||typeof F==`string`?{target:F}:F)}function Fb(F){if(!(F===void 0||F===fb))return Ab(F)}function Ib(F,I,L){let R=typeof F==`object`,z=R?F:void 0;return{next:(R?F.next:F)?.bind(z),error:(R?F.error:I)?.bind(z),complete:(R?F.complete:L)?.bind(z)}}function Lb(F,I){return`${I}.${F}`}function Rb(F,I){let L=I.match(/^xstate\.invoke\.(\d+)\.(.*)/);if(!L)return F.implementations.actors[I];let[,R,z]=L,De=F.getStateNodeById(z).config.invoke;return(Array.isArray(De)?De[R]:De).src}function zb(F,I){return`${F.sessionId}.${I}`}var Bb=0;function Vb(F,I){let L=new Map,R=new Map,z=new WeakMap,De=new Set,Oe={},{clock:ke,logger:Ae}=I,je={schedule:(F,I,L,R,z=Math.random().toString(36).slice(2))=>{let De={source:F,target:I,event:L,delay:R,id:z,startedAt:Date.now()},Ae=zb(F,z);Me._snapshot._scheduledEvents[Ae]=De,Oe[Ae]=ke.setTimeout(()=>{delete Oe[Ae],delete Me._snapshot._scheduledEvents[Ae],Me._relay(F,I,L)},R)},cancel:(F,I)=>{let L=zb(F,I),R=Oe[L];delete Oe[L],delete Me._snapshot._scheduledEvents[L],R!==void 0&&ke.clearTimeout(R)},cancelAll:F=>{for(let I in Me._snapshot._scheduledEvents){let L=Me._snapshot._scheduledEvents[I];L.source===F&&je.cancel(F,L.id)}}},Me={_snapshot:{_scheduledEvents:(I?.snapshot&&I.snapshot.scheduler)??{}},_bookId:()=>`x:${Bb++}`,_register:(F,I)=>(L.set(F,I),F),_unregister:F=>{L.delete(F.sessionId);let I=z.get(F);I!==void 0&&(R.delete(I),z.delete(F))},get:F=>R.get(F),_set:(F,I)=>{let L=R.get(F);if(L&&L!==I)throw Error(`Actor with system ID '${F}' already exists.`);R.set(F,I),z.set(I,F)},inspect:F=>{let I=Ib(F);return De.add(I),{unsubscribe(){De.delete(I)}}},_sendInspectionEvent:I=>{if(!De.size)return;let L={...I,rootId:F.sessionId};De.forEach(F=>F.next?.(L))},_relay:(F,I,L)=>{Me._sendInspectionEvent({type:`@xstate.event`,sourceRef:F,actorRef:I,event:L}),I._send(L)},scheduler:je,getSnapshot:()=>({_scheduledEvents:{...Me._snapshot._scheduledEvents}}),start:()=>{let F=Me._snapshot._scheduledEvents;Me._snapshot._scheduledEvents={};for(let I in F){let{source:L,target:R,event:z,delay:De,id:Oe}=F[I];je.schedule(L,R,z,De,Oe)}},_clock:ke,_logger:Ae};return Me}var Hb=!1,Ub=function(F){return F[F.NotStarted=0]=`NotStarted`,F[F.Running=1]=`Running`,F[F.Stopped=2]=`Stopped`,F}({}),Wb={clock:{setTimeout:(F,I)=>setTimeout(F,I),clearTimeout:F=>clearTimeout(F)},logger:console.log.bind(console),devTools:!1},Gb=class{constructor(F,I){this.logic=F,this._snapshot=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new db$1(this._process.bind(this)),this.observers=new Set,this.eventListeners=new Map,this.logger=void 0,this._processingStatus=Ub.NotStarted,this._parent=void 0,this._syncSnapshot=void 0,this.ref=void 0,this._actorScope=void 0,this._systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];let L={...Wb,...I},{clock:R,logger:z,parent:De,syncSnapshot:Oe,id:ke,systemId:Ae,inspect:je}=L;this.system=De?De.system:Vb(this,{clock:R,logger:z}),je&&!De&&this.system.inspect(Ib(je)),this.sessionId=this.system._bookId(),this.id=ke??this.sessionId,this.logger=I?.logger??this.system._logger,this.clock=I?.clock??this.system._clock,this._parent=De,this._syncSnapshot=Oe,this.options=L,this.src=L.src??F,this.ref=this,this._actorScope={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:F=>{this._deferred.push(F)},system:this.system,stopChild:F=>{if(F._parent!==this)throw Error(`Cannot stop child actor ${F.id} of ${this.id} because it is not a child`);F._stop()},emit:F=>{let I=this.eventListeners.get(F.type),L=this.eventListeners.get(`*`);if(!I&&!L)return;let R=[...I?I.values():[],...L?L.values():[]];for(let I of R)I(F)},actionExecutor:F=>{let I=()=>{if(this._actorScope.system._sendInspectionEvent({type:`@xstate.action`,actorRef:this,action:{type:F.type,params:F.params}}),!F.exec)return;let I=Hb;try{Hb=!0,F.exec(F.info,F.params)}finally{Hb=I}};this._processingStatus===Ub.Running?I():this._deferred.push(I)}},this.send=this.send.bind(this),this.system._sendInspectionEvent({type:`@xstate.actor`,actorRef:this}),Ae&&(this._systemId=Ae,this.system._set(Ae,this)),this._initState(I?.snapshot??I?.state),Ae&&this._snapshot.status!==`active`&&this.system._unregister(this)}_initState(F){try{this._snapshot=F?this.logic.restoreSnapshot?this.logic.restoreSnapshot(F,this._actorScope):F:this.logic.getInitialSnapshot(this._actorScope,this.options?.input)}catch(F){this._snapshot={status:`error`,output:void 0,error:F}}}update(F,I){this._snapshot=F;let L;for(;L=this._deferred.shift();)try{L()}catch(I){this._deferred.length=0,this._snapshot={...F,status:`error`,error:I}}switch(this._snapshot.status){case`active`:for(let I of this.observers)try{I.next?.(F)}catch(F){Sb(F)}break;case`done`:for(let I of this.observers)try{I.next?.(F)}catch(F){Sb(F)}this._stopProcedure(),this._complete(),this._doneEvent=yb(this.id,this._snapshot.output),this._parent&&this.system._relay(this,this._parent,this._doneEvent);break;case`error`:this._error(this._snapshot.error);break}this.system._sendInspectionEvent({type:`@xstate.snapshot`,actorRef:this,event:I,snapshot:F})}subscribe(F,I,L){let R=Ib(F,I,L);if(this._processingStatus!==Ub.Stopped)this.observers.add(R);else switch(this._snapshot.status){case`done`:try{R.complete?.()}catch(F){Sb(F)}break;case`error`:{let F=this._snapshot.error;if(!R.error)Sb(F);else try{R.error(F)}catch(F){Sb(F)}break}}return{unsubscribe:()=>{this.observers.delete(R)}}}on(F,I){let L=this.eventListeners.get(F);L||(L=new Set,this.eventListeners.set(F,L));let R=I.bind(void 0);return L.add(R),{unsubscribe:()=>{L.delete(R)}}}start(){if(this._processingStatus===Ub.Running)return this;this._syncSnapshot&&this.subscribe({next:F=>{F.status===`active`&&this.system._relay(this,this._parent,{type:`xstate.snapshot.${this.id}`,snapshot:F})},error:()=>{}}),this.system._register(this.sessionId,this),this._systemId&&this.system._set(this._systemId,this),this._processingStatus=Ub.Running;let F=xb(this.options.input);switch(this.system._sendInspectionEvent({type:`@xstate.event`,sourceRef:this._parent,actorRef:this,event:F}),this._snapshot.status){case`done`:return this.update(this._snapshot,F),this;case`error`:return this._error(this._snapshot.error),this}if(this._parent||this.system.start(),this.logic.start)try{this.logic.start(this._snapshot,this._actorScope)}catch(F){return this._snapshot={...this._snapshot,status:`error`,error:F},this._error(F),this}return this.update(this._snapshot,F),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(F){let I,L;try{I=this.logic.transition(this._snapshot,F,this._actorScope)}catch(F){L={err:F}}if(L){let{err:F}=L;this._snapshot={...this._snapshot,status:`error`,error:F},this._error(F);return}this.update(I,F),F.type===`xstate.stop`&&(this._stopProcedure(),this._complete())}_stop(){return this._processingStatus===Ub.Stopped?this:(this.mailbox.clear(),this._processingStatus===Ub.NotStarted?(this._processingStatus=Ub.Stopped,this):(this.mailbox.enqueue({type:gb}),this))}stop(){if(this._parent)throw Error(`A non-root actor cannot be stopped directly.`);return this._stop()}_complete(){for(let F of this.observers)try{F.complete?.()}catch(F){Sb(F)}this.observers.clear()}_reportError(F){if(!this.observers.size){this._parent||Sb(F);return}let I=!1;for(let L of this.observers){let R=L.error;I||=!R;try{R?.(F)}catch(F){Sb(F)}}this.observers.clear(),I&&Sb(F)}_error(F){this._stopProcedure(),this._reportError(F),this._parent&&this.system._relay(this,this._parent,bb(this.id,F))}_stopProcedure(){return this._processingStatus===Ub.Running?(this.system.scheduler.cancelAll(this),this.mailbox.clear(),this.mailbox=new db$1(this._process.bind(this)),this._processingStatus=Ub.Stopped,this.system._unregister(this),this):this}_send(F){this._processingStatus!==Ub.Stopped&&this.mailbox.enqueue(F)}send(F){this.system._relay(void 0,this,F)}attachDevTools(){let{devTools:F}=this.options;F&&(typeof F==`function`?F:ub)(this)}toJSON(){return{xstate$$type:1,id:this.id}}getPersistedSnapshot(F){return this.logic.getPersistedSnapshot(this._snapshot,F)}[Cb](){return this}getSnapshot(){return this._snapshot}};function Kb(F,...[I]){return new Gb(F,I)}function qb(F,I,L,R,{sendId:z}){return[I,{sendId:typeof z==`function`?z(L,R):z},void 0]}function Jb(F,I){F.defer(()=>{F.system.scheduler.cancel(F.self,I.sendId)})}function Yb(F){function I(F,I){}return I.type=`xstate.cancel`,I.sendId=F,I.resolve=qb,I.execute=Jb,I}function Xb(F,I,L,R,{id:z,systemId:De,src:Oe,input:ke,syncSnapshot:Ae}){let je=typeof Oe==`string`?Rb(I.machine,Oe):Oe,Me=typeof z==`function`?z(L):z,Ne,Pe;return je&&(Pe=typeof ke==`function`?ke({context:I.context,event:L.event,self:F.self}):ke,Ne=Kb(je,{id:Me,src:Oe,parent:F.self,syncSnapshot:Ae,systemId:De,input:Pe})),[sS(I,{children:{...I.children,[Me]:Ne}}),{id:z,systemId:De,actorRef:Ne,src:Oe,input:Pe},void 0]}function Zb(F,{actorRef:I}){I&&F.defer(()=>{I._processingStatus!==Ub.Stopped&&I.start()})}function Qb(...[F,{id:I,systemId:L,input:R,syncSnapshot:z=!1}={}]){function De(F,I){}return De.type=`xstate.spawnChild`,De.id=I,De.systemId=L,De.src=F,De.input=R,De.syncSnapshot=z,De.resolve=Xb,De.execute=Zb,De}function $b(F,I,L,R,{actorRef:z}){let De=typeof z==`function`?z(L,R):z,Oe=typeof De==`string`?I.children[De]:De,ke=I.children;return Oe&&(ke={...ke},delete ke[Oe.id]),[sS(I,{children:ke}),Oe,void 0]}function ex(F,I){if(I){if(F.system._unregister(I),I._processingStatus!==Ub.Running){F.stopChild(I);return}F.defer(()=>{F.stopChild(I)})}}function tx(F){function I(F,I){}return I.type=`xstate.stopChild`,I.actorRef=F,I.resolve=$b,I.execute=ex,I}function nx(F,I,L,R){let{machine:z}=R,De=typeof F==`function`,Oe=De?F:z.implementations.guards[typeof F==`string`?F:F.type];if(!De&&!Oe)throw Error(`Guard '${typeof F==`string`?F:F.type}' is not implemented.'.`);if(typeof Oe!=`function`)return nx(Oe,I,L,R);let ke={context:I,event:L},Ae=De||typeof F==`string`?void 0:`params`in F?typeof F.params==`function`?F.params({context:I,event:L}):F.params:void 0;return`check`in Oe?Oe.check(R,ke,Oe):Oe(ke,Ae)}var rx=F=>F.type===`atomic`||F.type===`final`;function ix(F){return Object.values(F.states).filter(F=>F.type!==`history`)}function ax(F,I){let L=[];if(I===F)return L;let R=F.parent;for(;R&&R!==I;)L.push(R),R=R.parent;return L}function ox(F){let I=new Set(F),L=cx(I);for(let F of I)if(F.type===`compound`&&(!L.get(F)||!L.get(F).length))bx(F).forEach(F=>I.add(F));else if(F.type===`parallel`){for(let L of ix(F))if(L.type!==`history`&&!I.has(L)){let F=bx(L);for(let L of F)I.add(L)}}for(let F of I){let L=F.parent;for(;L;)I.add(L),L=L.parent}return I}function sx(F,I){let L=I.get(F);if(!L)return{};if(F.type===`compound`){let F=L[0];if(F){if(rx(F))return F.key}else return{}}let R={};for(let F of L)R[F.key]=sx(F,I);return R}function cx(F){let I=new Map;for(let L of F)I.has(L)||I.set(L,[]),L.parent&&(I.has(L.parent)||I.set(L.parent,[]),I.get(L.parent).push(L));return I}function lx(F,I){return sx(F,cx(ox(I)))}function ux(F,I){return I.type===`compound`?ix(I).some(I=>I.type===`final`&&F.has(I)):I.type===`parallel`?ix(I).every(I=>ux(F,I)):I.type===`final`}var dx=F=>F[0]===pb;function fx(F,I){return F.transitions.get(I)||[...F.transitions.keys()].filter(F=>{if(F===mb)return!0;if(!F.endsWith(`.*`))return!1;let L=F.split(`.`),R=I.split(`.`);for(let F=0;F<L.length;F++){let I=L[F],z=R[F];if(I===`*`)return F===L.length-1;if(I!==z)return!1}return!0}).sort((F,I)=>I.length-F.length).flatMap(I=>F.transitions.get(I))}function px(F){let I=F.config.after;if(!I)return[];let L=I=>{let L=_b(I,F.id),R=L.type;return F.entry.push(fS(L,{id:R,delay:I})),F.exit.push(Yb(R)),R};return Object.keys(I).flatMap(F=>{let R=I[F],z=typeof R==`string`?{target:R}:R,De=Number.isNaN(+F)?F:+F,Oe=L(De);return Ab(z).map(F=>({...F,event:Oe,delay:De}))}).map(I=>{let{delay:L}=I;return{...mx(F,I.event,I),delay:L}})}function mx(F,I,L){let R=Fb(L.target),z=L.reenter??!1,De=_x(F,R),Oe={...L,actions:Ab(L.actions),guard:L.guard,target:De,source:F,reenter:z,eventType:I,toJSON:()=>({...Oe,source:`#${F.id}`,target:De?De.map(F=>`#${F.id}`):void 0})};return Oe}function hx(F){let I=new Map;if(F.config.on)for(let L of Object.keys(F.config.on)){if(L===``)throw Error('Null events ("") cannot be specified as a transition key. Use `always: { ... }` instead.');let R=F.config.on[L];I.set(L,Pb(R).map(I=>mx(F,L,I)))}if(F.config.onDone){let L=`xstate.done.state.${F.id}`;I.set(L,Pb(F.config.onDone).map(I=>mx(F,L,I)))}for(let L of F.invoke){if(L.onDone){let R=`xstate.done.actor.${L.id}`;I.set(R,Pb(L.onDone).map(I=>mx(F,R,I)))}if(L.onError){let R=`xstate.error.actor.${L.id}`;I.set(R,Pb(L.onError).map(I=>mx(F,R,I)))}if(L.onSnapshot){let R=`xstate.snapshot.${L.id}`;I.set(R,Pb(L.onSnapshot).map(I=>mx(F,R,I)))}}for(let L of F.after){let F=I.get(L.eventType);F||(F=[],I.set(L.eventType,F)),F.push(L)}return I}function gx(F,I){let L=typeof I==`string`?F.states[I]:I?F.states[I.target]:void 0;if(!L&&I)throw Error(`Initial state node "${I}" not found on parent state node #${F.id}`);let R={source:F,actions:!I||typeof I==`string`?[]:Ab(I.actions),eventType:null,reenter:!1,target:L?[L]:[],toJSON:()=>({...R,source:`#${F.id}`,target:L?[`#${L.id}`]:[]})};return R}function _x(F,I){if(I!==void 0)return I.map(I=>{if(typeof I!=`string`)return I;if(dx(I))return F.machine.getStateNodeById(I);let L=I[0]===`.`;if(L&&!F.parent)return Cx(F,I.slice(1));let R=L?F.key+I:I;if(F.parent)try{return Cx(F.parent,R)}catch(I){throw Error(`Invalid transition definition for state node '${F.id}':\n${I.message}`)}else throw Error(`Invalid target: "${I}" is not a valid target from the root node. Did you mean ".${I}"?`)})}function vx(F){let I=Fb(F.config.target);return I?{target:I.map(I=>typeof I==`string`?Cx(F.parent,I):I)}:F.parent.initial}function yx(F){return F.type===`history`}function bx(F){let I=xx(F);for(let L of I)for(let R of ax(L,F))I.add(R);return I}function xx(F){let I=new Set;function L(F){if(!I.has(F)){if(I.add(F),F.type===`compound`)L(F.initial.target[0]);else if(F.type===`parallel`)for(let I of ix(F))L(I)}}return L(F),I}function Sx(F,I){if(dx(I))return F.machine.getStateNodeById(I);if(!F.states)throw Error(`Unable to retrieve child state '${I}' from '${F.id}'; no child states exist.`);let L=F.states[I];if(!L)throw Error(`Child state '${I}' does not exist on '${F.id}'`);return L}function Cx(F,I){if(typeof I==`string`&&dx(I))try{return F.machine.getStateNodeById(I)}catch{}let L=Tb(I).slice(),R=F;for(;L.length;){let F=L.shift();if(!F.length)break;R=Sx(R,F)}return R}function wx(F,I){if(typeof I==`string`){let L=F.states[I];if(!L)throw Error(`State '${I}' does not exist on '${F.id}'`);return[F,L]}let L=Object.keys(I),R=L.map(I=>Sx(F,I)).filter(Boolean);return[F.machine.root,F].concat(R,L.reduce((L,R)=>{let z=Sx(F,R);if(!z)return L;let De=wx(z,I[R]);return L.concat(De)},[]))}function Tx(F,I,L,R){let z=Sx(F,I).next(L,R);return!z||!z.length?F.next(L,R):z}function Ex(F,I,L,R){let z=Object.keys(I),De=Ox(Sx(F,z[0]),I[z[0]],L,R);return!De||!De.length?F.next(L,R):De}function Dx(F,I,L,R){let z=[];for(let De of Object.keys(I)){let Oe=I[De];if(!Oe)continue;let ke=Ox(Sx(F,De),Oe,L,R);ke&&z.push(...ke)}return z.length?z:F.next(L,R)}function Ox(F,I,L,R){return typeof I==`string`?Tx(F,I,L,R):Object.keys(I).length===1?Ex(F,I,L,R):Dx(F,I,L,R)}function kx(F){return Object.keys(F.states).map(I=>F.states[I]).filter(F=>F.type===`history`)}function Ax(F,I){let L=F;for(;L.parent&&L.parent!==I;)L=L.parent;return L.parent===I}function jx(F,I){let L=new Set(F),R=new Set(I);for(let F of L)if(R.has(F))return!0;for(let F of R)if(L.has(F))return!0;return!1}function Mx(F,I,L){let R=new Set;for(let z of F){let F=!1,De=new Set;for(let Oe of R)if(jx(Ix([z],I,L),Ix([Oe],I,L)))if(Ax(z.source,Oe.source))De.add(Oe);else{F=!0;break}if(!F){for(let F of De)R.delete(F);R.add(z)}}return Array.from(R)}function Nx(F){let[I,...L]=F;for(let F of ax(I,void 0))if(L.every(I=>Ax(I,F)))return F}function Px(F,I){if(!F.target)return[];let L=new Set;for(let R of F.target)if(yx(R))if(I[R.id])for(let F of I[R.id])L.add(F);else for(let F of Px(vx(R),I))L.add(F);else L.add(R);return[...L]}function Fx(F,I){let L=Px(F,I);if(!L)return;if(!F.reenter&&L.every(I=>I===F.source||Ax(I,F.source)))return F.source;let R=Nx(L.concat(F.source));if(R)return R;if(!F.reenter)return F.source.machine.root}function Ix(F,I,L){let R=new Set;for(let z of F)if(z.target?.length){let F=Fx(z,L);z.reenter&&z.source===F&&R.add(F);for(let L of I)Ax(L,F)&&R.add(L)}return[...R]}function Lx(F,I){if(F.length!==I.size)return!1;for(let L of F)if(!I.has(L))return!1;return!0}function Rx(F,I,L,R,z,De){if(!F.length)return I;let Oe=new Set(I._nodes),ke=I.historyValue,Ae=Mx(F,Oe,ke),je=I;z||([je,ke]=Gx(je,R,L,Ae,Oe,ke,De,L.actionExecutor)),je=Jx(je,R,L,Ae.flatMap(F=>F.actions),De,void 0),je=Bx(je,R,L,Ae,Oe,De,ke,z);let Me=[...Oe];je.status===`done`&&(je=Jx(je,R,L,Me.sort((F,I)=>I.order-F.order).flatMap(F=>F.exit),De,void 0));try{return ke===I.historyValue&&Lx(I._nodes,Oe)?je:sS(je,{_nodes:Me,historyValue:ke})}catch(F){throw F}}function zx(F,I,L,R,z){if(R.output===void 0)return;let De=vb(z.id,z.output!==void 0&&z.parent?jb(z.output,F.context,I,L.self):void 0);return jb(R.output,F.context,De,L.self)}function Bx(F,I,L,R,z,De,Oe,ke){let Ae=F,je=new Set,Me=new Set;Vx(R,Oe,Me,je),ke&&Me.add(F.machine.root);let Ne=new Set;for(let F of[...je].sort((F,I)=>F.order-I.order)){z.add(F);let R=[];R.push(...F.entry);for(let I of F.invoke)R.push(Qb(I.src,{...I,syncSnapshot:!!I.onSnapshot}));if(Me.has(F)){let I=F.initial.actions;R.push(...I)}if(Ae=Jx(Ae,I,L,R,De,F.invoke.map(F=>F.id)),F.type===`final`){let R=F.parent,Oe=R?.type===`parallel`?R:R?.parent,ke=Oe||F;for(R?.type===`compound`&&De.push(vb(R.id,F.output===void 0?void 0:jb(F.output,Ae.context,I,L.self)));Oe?.type===`parallel`&&!Ne.has(Oe)&&ux(z,Oe);)Ne.add(Oe),De.push(vb(Oe.id)),ke=Oe,Oe=Oe.parent;if(Oe)continue;Ae=sS(Ae,{status:`done`,output:zx(Ae,I,L,Ae.machine.root,ke)})}}return Ae}function Vx(F,I,L,R){for(let z of F){let F=Fx(z,I);for(let De of z.target||[])!yx(De)&&(z.source!==De||z.source!==F||z.reenter)&&(R.add(De),L.add(De)),Hx(De,I,L,R);let De=Px(z,I);for(let Oe of De){let De=ax(Oe,F);F?.type===`parallel`&&De.push(F),Ux(R,I,L,De,!z.source.parent&&z.reenter?void 0:F)}}}function Hx(F,I,L,R){if(yx(F))if(I[F.id]){let z=I[F.id];for(let F of z)R.add(F),Hx(F,I,L,R);for(let De of z)Wx(De,F.parent,R,I,L)}else{let z=vx(F);for(let De of z.target)R.add(De),z===F.parent?.initial&&L.add(F.parent),Hx(De,I,L,R);for(let De of z.target)Wx(De,F.parent,R,I,L)}else if(F.type===`compound`){let[z]=F.initial.target;yx(z)||(R.add(z),L.add(z)),Hx(z,I,L,R),Wx(z,F,R,I,L)}else if(F.type===`parallel`)for(let z of ix(F).filter(F=>!yx(F)))[...R].some(F=>Ax(F,z))||(yx(z)||(R.add(z),L.add(z)),Hx(z,I,L,R))}function Ux(F,I,L,R,z){for(let De of R)if((!z||Ax(De,z))&&F.add(De),De.type===`parallel`)for(let R of ix(De).filter(F=>!yx(F)))[...F].some(F=>Ax(F,R))||(F.add(R),Hx(R,I,L,F))}function Wx(F,I,L,R,z){Ux(L,R,z,ax(F,I))}function Gx(F,I,L,R,z,De,Oe,ke){let Ae=F,je=Ix(R,z,De);je.sort((F,I)=>I.order-F.order);let Me;for(let F of je)for(let I of kx(F)){let L;L=I.history===`deep`?I=>rx(I)&&Ax(I,F):I=>I.parent===F,Me??={...De},Me[I.id]=Array.from(z).filter(L)}for(let F of je)Ae=Jx(Ae,I,L,[...F.exit,...F.invoke.map(F=>tx(F.id))],Oe,void 0),z.delete(F);return[Ae,Me||De]}function Kx(F,I){return F.implementations.actions[I]}function qx(F,I,L,R,z,De){let{machine:Oe}=F,ke=F;for(let F of R){let R=typeof F==`function`,Ae=R?F:Kx(Oe,typeof F==`string`?F:F.type),je={context:ke.context,event:I,self:L.self,system:L.system},Me=R||typeof F==`string`?void 0:`params`in F?typeof F.params==`function`?F.params({context:ke.context,event:I}):F.params:void 0;if(!Ae||!(`resolve`in Ae)){L.actionExecutor({type:typeof F==`string`?F:typeof F==`object`?F.type:F.name||`(anonymous)`,info:je,params:Me,exec:Ae});continue}let Ne=Ae,[Pe,Fe,Ie]=Ne.resolve(L,ke,je,Me,Ae,z);ke=Pe,`retryResolve`in Ne&&De?.push([Ne,Fe]),`execute`in Ne&&L.actionExecutor({type:Ne.type,info:je,params:Fe,exec:Ne.execute.bind(null,L,Fe)}),Ie&&(ke=qx(ke,I,L,Ie,z,De))}return ke}function Jx(F,I,L,R,z,De){let Oe=De?[]:void 0,ke=qx(F,I,L,R,{internalQueue:z,deferredActorIds:De},Oe);return Oe?.forEach(([F,I])=>{F.retryResolve(L,ke,I)}),ke}function Yx(F,I,L,R){let z=F,De=[];function Oe(F,I,R){L.system._sendInspectionEvent({type:`@xstate.microstep`,actorRef:L.self,event:I,snapshot:F,_transitions:R}),De.push(F)}if(I.type===`xstate.stop`)return z=sS(Xx(z,I,L),{status:`stopped`}),Oe(z,I,[]),{snapshot:z,microstates:De};let ke=I;if(ke.type!==hb){let I=ke,Ae=Nb(I),je=Zx(I,z);if(Ae&&!je.length)return z=sS(F,{status:`error`,error:I.error}),Oe(z,I,[]),{snapshot:z,microstates:De};z=Rx(je,F,L,ke,!1,R),Oe(z,I,je)}let Ae=!0;for(;z.status===`active`;){let F=Ae?Qx(z,ke):[],I=F.length?z:void 0;if(!F.length){if(!R.length)break;ke=R.shift(),F=Zx(ke,z)}z=Rx(F,z,L,ke,!1,R),Ae=z!==I,Oe(z,ke,F)}return z.status!==`active`&&Xx(z,ke,L),{snapshot:z,microstates:De}}function Xx(F,I,L){return Jx(F,I,L,Object.values(F.children).map(F=>tx(F)),[],void 0)}function Zx(F,I){return I.machine.getTransitionData(I,F)}function Qx(F,I){let L=new Set,R=F._nodes.filter(rx);for(let z of R)loop:for(let R of[z].concat(ax(z,void 0)))if(R.always){for(let z of R.always)if(z.guard===void 0||nx(z.guard,F.context,I,F)){L.add(z);break loop}}return Mx(Array.from(L),new Set(F._nodes),F.historyValue)}function $x(F,I){return lx(F,[...ox(wx(F,I))])}function eS(F){return!!F&&typeof F==`object`&&`machine`in F&&`value`in F}var tS=function(F){return wb(F,this.value)},nS=function(F){return this.tags.has(F)},rS=function(F){let I=this.machine.getTransitionData(this,F);return!!I?.length&&I.some(F=>F.target!==void 0||F.actions.length)},iS=function(){let{_nodes:F,tags:I,machine:L,getMeta:R,toJSON:z,can:De,hasTag:Oe,matches:ke,...Ae}=this;return{...Ae,tags:Array.from(I)}},aS=function(){return this._nodes.reduce((F,I)=>(I.meta!==void 0&&(F[I.id]=I.meta),F),{})};function oS(F,I){return{status:F.status,output:F.output,error:F.error,machine:I,context:F.context,_nodes:F._nodes,value:lx(I.root,F._nodes),tags:new Set(F._nodes.flatMap(F=>F.tags)),children:F.children,historyValue:F.historyValue||{},matches:tS,hasTag:nS,can:rS,getMeta:aS,toJSON:iS}}function sS(F,I={}){return oS({...F,...I},F.machine)}function cS(F,I){let{_nodes:L,tags:R,machine:z,children:De,context:Oe,can:ke,hasTag:Ae,matches:je,getMeta:Me,toJSON:Ne,...Pe}=F,Fe={};for(let F in De){let L=De[F];Fe[F]={snapshot:L.getPersistedSnapshot(I),src:L.src,systemId:L._systemId,syncSnapshot:L._syncSnapshot}}return{...Pe,context:lS(Oe),children:Fe}}function lS(F){let I;for(let L in F){let R=F[L];if(R&&typeof R==`object`)if(`sessionId`in R&&`send`in R&&`ref`in R)I??=Array.isArray(F)?F.slice():{...F},I[L]={xstate$$type:1,id:R.id};else{let z=lS(R);z!==R&&(I??=Array.isArray(F)?F.slice():{...F},I[L]=z)}}return I??F}function uS(F,I,L,R,{event:z,id:De,delay:Oe},{internalQueue:ke}){let Ae=I.machine.implementations.delays;if(typeof z==`string`)throw Error(`Only event objects may be used with raise; use raise({ type: "${z}" }) instead`);let je=typeof z==`function`?z(L,R):z,Me;if(typeof Oe==`string`){let F=Ae&&Ae[Oe];Me=typeof F==`function`?F(L,R):F}else Me=typeof Oe==`function`?Oe(L,R):Oe;return typeof Me!=`number`&&ke.push(je),[I,{event:je,id:De,delay:Me},void 0]}function dS(F,I){let{event:L,delay:R,id:z}=I;if(typeof R==`number`){F.defer(()=>{let I=F.self;F.system.scheduler.schedule(I,I,L,R,z)});return}}function fS(F,I){function L(F,I){}return L.type=`xstate.raise`,L.event=F,L.id=I?.id,L.delay=I?.delay,L.resolve=uS,L.execute=dS,L}function pS(F,{machine:I,context:L},R,z){let De=(De,Oe)=>{if(typeof De==`string`){let ke=Rb(I,De);if(!ke)throw Error(`Actor logic '${De}' not implemented in machine '${I.id}'`);let Ae=Kb(ke,{id:Oe?.id,parent:F.self,syncSnapshot:Oe?.syncSnapshot,input:typeof Oe?.input==`function`?Oe.input({context:L,event:R,self:F.self}):Oe?.input,src:De,systemId:Oe?.systemId});return z[Ae.id]=Ae,Ae}else return Kb(De,{id:Oe?.id,parent:F.self,syncSnapshot:Oe?.syncSnapshot,input:Oe?.input,src:De,systemId:Oe?.systemId})};return(I,L)=>{let R=De(I,L);return z[R.id]=R,F.defer(()=>{R._processingStatus!==Ub.Stopped&&R.start()}),R}}function mS(F,I,L,R,{assignment:z}){if(!I.context)throw Error("Cannot assign to undefined `context`. Ensure that `context` is defined in the machine config.");let De={},Oe={context:I.context,event:L.event,spawn:pS(F,I,L.event,De),self:F.self,system:F.system},ke={};if(typeof z==`function`)ke=z(Oe,R);else for(let F of Object.keys(z)){let I=z[F];ke[F]=typeof I==`function`?I(Oe,R):I}return[sS(I,{context:Object.assign({},I.context,ke),children:Object.keys(De).length?{...I.children,...De}:I.children}),void 0,void 0]}function hS(F){function I(F,I){}return I.type=`xstate.assign`,I.assignment=F,I.resolve=mS,I}function gS(F,I,L,R,{event:z}){return[I,{event:typeof z==`function`?z(L,R):z},void 0]}function _S(F,{event:I}){F.defer(()=>F.emit(I))}function vS(F){function I(F,I){}return I.type=`xstate.emit`,I.event=F,I.resolve=gS,I.execute=_S,I}var yS=function(F){return F.Parent=`#_parent`,F.Internal=`#_internal`,F}({});function bS(F,I,L,R,{to:z,event:De,id:Oe,delay:ke},Ae){let je=I.machine.implementations.delays;if(typeof De==`string`)throw Error(`Only event objects may be used with sendTo; use sendTo({ type: "${De}" }) instead`);let Me=typeof De==`function`?De(L,R):De,Ne;if(typeof ke==`string`){let F=je&&je[ke];Ne=typeof F==`function`?F(L,R):F}else Ne=typeof ke==`function`?ke(L,R):ke;let Pe=typeof z==`function`?z(L,R):z,Fe;if(typeof Pe==`string`){if(Fe=Pe===yS.Parent?F.self._parent:Pe===yS.Internal?F.self:Pe.startsWith(`#_`)?I.children[Pe.slice(2)]:Ae.deferredActorIds?.includes(Pe)?Pe:I.children[Pe],!Fe)throw Error(`Unable to send event to actor '${Pe}' from machine '${I.machine.id}'.`)}else Fe=Pe||F.self;return[I,{to:Fe,targetId:typeof Pe==`string`?Pe:void 0,event:Me,id:Oe,delay:Ne},void 0]}function xS(F,I,L){typeof L.to==`string`&&(L.to=I.children[L.to])}function SS(F,I){F.defer(()=>{let{to:L,event:R,delay:z,id:De}=I;if(typeof z==`number`){F.system.scheduler.schedule(F.self,L,R,z,De);return}F.system._relay(F.self,L,R.type===`xstate.error`?bb(F.self.id,R.data):R)})}function CS(F,I,L){function R(F,I){}return R.type=`xstate.sendTo`,R.to=F,R.event=I,R.id=L?.id,R.delay=L?.delay,R.resolve=bS,R.retryResolve=xS,R.execute=SS,R}function wS(F,I){return CS(yS.Parent,F,I)}function TS(F,I,L,R,{collect:z}){let De=[],Oe=function(F){De.push(F)};return Oe.assign=(...F)=>{De.push(hS(...F))},Oe.cancel=(...F)=>{De.push(Yb(...F))},Oe.raise=(...F)=>{De.push(fS(...F))},Oe.sendTo=(...F)=>{De.push(CS(...F))},Oe.sendParent=(...F)=>{De.push(wS(...F))},Oe.spawnChild=(...F)=>{De.push(Qb(...F))},Oe.stopChild=(...F)=>{De.push(tx(...F))},Oe.emit=(...F)=>{De.push(vS(...F))},z({context:L.context,event:L.event,enqueue:Oe,check:F=>nx(F,I.context,L.event,I),self:F.self,system:F.system},R),[I,void 0,De]}function $(F){function I(F,I){}return I.type=`xstate.enqueueActions`,I.collect=F,I.resolve=TS,I}function ES(F,I){let L=Ab(I);if(!L.includes(F.type)){let I=L.length===1?`type "${L[0]}"`:`one of types "${L.join(`", "`)}"`;throw Error(`Expected event ${JSON.stringify(F)} to have ${I}`)}}var DS=new WeakMap;function OS(F,I,L){let R=DS.get(F);return R?I in R||(R[I]=L()):(R={[I]:L()},DS.set(F,R)),R[I]}var kS={},AS=F=>typeof F==`string`?{type:F}:typeof F==`function`?`resolve`in F?{type:F.type}:{type:F.name}:F,jS=class F{constructor(I,L){if(this.config=I,this.key=void 0,this.id=void 0,this.type=void 0,this.path=void 0,this.states=void 0,this.history=void 0,this.entry=void 0,this.exit=void 0,this.parent=void 0,this.machine=void 0,this.meta=void 0,this.output=void 0,this.order=-1,this.description=void 0,this.tags=[],this.transitions=void 0,this.always=void 0,this.parent=L._parent,this.key=L._key,this.machine=L._machine,this.path=this.parent?this.parent.path.concat(this.key):[],this.id=this.config.id||[this.machine.id,...this.path].join(`.`),this.type=this.config.type||(this.config.states&&Object.keys(this.config.states).length?`compound`:this.config.history?`history`:`atomic`),this.description=this.config.description,this.order=this.machine.idMap.size,this.machine.idMap.set(this.id,this),this.states=this.config.states?Ob(this.config.states,(I,L)=>new F(I,{_parent:this,_key:L,_machine:this.machine})):kS,this.type===`compound`&&!this.config.initial)throw Error(`No initial state specified for compound state node "#${this.id}". Try adding { initial: "${Object.keys(this.states)[0]}" } to the state config.`);this.history=this.config.history===!0?`shallow`:this.config.history||!1,this.entry=Ab(this.config.entry).slice(),this.exit=Ab(this.config.exit).slice(),this.meta=this.config.meta,this.output=this.type===`final`||!this.parent?this.config.output:void 0,this.tags=Ab(I.tags).slice()}_initialize(){this.transitions=hx(this),this.config.always&&(this.always=Pb(this.config.always).map(F=>mx(this,``,F))),Object.keys(this.states).forEach(F=>{this.states[F]._initialize()})}get definition(){return{id:this.id,key:this.key,version:this.machine.version,type:this.type,initial:this.initial?{target:this.initial.target,source:this,actions:this.initial.actions.map(AS),eventType:null,reenter:!1,toJSON:()=>({target:this.initial.target.map(F=>`#${F.id}`),source:`#${this.id}`,actions:this.initial.actions.map(AS),eventType:null})}:void 0,history:this.history,states:Ob(this.states,F=>F.definition),on:this.on,transitions:[...this.transitions.values()].flat().map(F=>({...F,actions:F.actions.map(AS)})),entry:this.entry.map(AS),exit:this.exit.map(AS),meta:this.meta,order:this.order||-1,output:this.output,invoke:this.invoke,description:this.description,tags:this.tags}}toJSON(){return this.definition}get invoke(){return OS(this,`invoke`,()=>Ab(this.config.invoke).map((F,I)=>{let{src:L,systemId:R}=F,z=F.id??Lb(this.id,I),De=typeof L==`string`?L:`xstate.invoke.${Lb(this.id,I)}`;return{...F,src:De,id:z,systemId:R,toJSON(){let{onDone:I,onError:L,...R}=F;return{...R,type:`xstate.invoke`,src:De,id:z}}}}))}get on(){return OS(this,`on`,()=>[...this.transitions].flatMap(([F,I])=>I.map(I=>[F,I])).reduce((F,[I,L])=>(F[I]=F[I]||[],F[I].push(L),F),{}))}get after(){return OS(this,`delayedTransitions`,()=>px(this))}get initial(){return OS(this,`initial`,()=>gx(this,this.config.initial))}next(F,I){let L=I.type,R=[],z,De=OS(this,`candidates-${L}`,()=>fx(this,L));for(let Oe of De){let{guard:De}=Oe,ke=F.context,Ae=!1;try{Ae=!De||nx(De,ke,I,F)}catch(F){let I=typeof De==`string`?De:typeof De==`object`?De.type:void 0;throw Error(`Unable to evaluate guard ${I?`'${I}' `:``}in transition for event '${L}' in state node '${this.id}':\n${F.message}`)}if(Ae){R.push(...Oe.actions),z=Oe;break}}return z?[z]:void 0}get events(){return OS(this,`events`,()=>{let{states:F}=this,I=new Set(this.ownEvents);if(F)for(let L of Object.keys(F)){let R=F[L];if(R.states)for(let F of R.events)I.add(`${F}`)}return Array.from(I)})}get ownEvents(){let F=new Set([...this.transitions.keys()].filter(F=>this.transitions.get(F).some(F=>!(!F.target&&!F.actions.length&&!F.reenter))));return Array.from(F)}},MS=class F{constructor(F,I){this.config=F,this.version=void 0,this.schemas=void 0,this.implementations=void 0,this.__xstatenode=!0,this.idMap=new Map,this.root=void 0,this.id=void 0,this.states=void 0,this.events=void 0,this.id=F.id||`(machine)`,this.implementations={actors:I?.actors??{},actions:I?.actions??{},delays:I?.delays??{},guards:I?.guards??{}},this.version=this.config.version,this.schemas=this.config.schemas,this.transition=this.transition.bind(this),this.getInitialSnapshot=this.getInitialSnapshot.bind(this),this.getPersistedSnapshot=this.getPersistedSnapshot.bind(this),this.restoreSnapshot=this.restoreSnapshot.bind(this),this.start=this.start.bind(this),this.root=new jS(F,{_key:this.id,_machine:this}),this.root._initialize(),this.states=this.root.states,this.events=this.root.events}provide(I){let{actions:L,guards:R,actors:z,delays:De}=this.implementations;return new F(this.config,{actions:{...L,...I.actions},guards:{...R,...I.guards},actors:{...z,...I.actors},delays:{...De,...I.delays}})}resolveState(F){let I=$x(this.root,F.value),L=ox(wx(this.root,I));return oS({_nodes:[...L],context:F.context||{},children:{},status:ux(L,this.root)?`done`:F.status||`active`,output:F.output,error:F.error,historyValue:F.historyValue},this)}transition(F,I,L){return Yx(F,I,L,[]).snapshot}microstep(F,I,L){return Yx(F,I,L,[]).microstates}getTransitionData(F,I){return Ox(this.root,F.value,F,I)||[]}getPreInitialState(F,I,L){let{context:R}=this.config,z=oS({context:typeof R!=`function`&&R?R:{},_nodes:[this.root],children:{},status:`active`},this);return typeof R==`function`?Jx(z,I,F,[hS(({spawn:F,event:I,self:L})=>R({spawn:F,input:I.input,self:L}))],L,void 0):z}getInitialSnapshot(F,I){let L=xb(I),R=[],z=this.getPreInitialState(F,L,R),{snapshot:De}=Yx(Rx([{target:[...xx(this.root)],source:this.root,reenter:!0,actions:[],eventType:null,toJSON:null}],z,F,L,!0,R),L,F,R);return De}start(F){Object.values(F.children).forEach(F=>{F.getSnapshot().status===`active`&&F.start()})}getStateNodeById(F){let I=Tb(F),L=I.slice(1),R=dx(I[0])?I[0].slice(1):I[0],z=this.idMap.get(R);if(!z)throw Error(`Child state node '#${R}' does not exist on machine '${this.id}'`);return Cx(z,L)}get definition(){return this.root.definition}toJSON(){return this.definition}getPersistedSnapshot(F,I){return cS(F,I)}restoreSnapshot(F,I){let L={},R=F.children;Object.keys(R).forEach(F=>{let z=R[F],De=z.snapshot,Oe=z.src,ke=typeof Oe==`string`?Rb(this,Oe):Oe;ke&&(L[F]=Kb(ke,{id:F,parent:I.self,syncSnapshot:z.syncSnapshot,snapshot:De,src:Oe,systemId:z.systemId}))});let z=oS({...F,children:L,_nodes:Array.from(ox(wx(this.root,F.value)))},this),De=new Set;function Oe(F,I){if(!De.has(F)){De.add(F);for(let L in F){let R=F[L];if(R&&typeof R==`object`){if(`xstate$$type`in R&&R.xstate$$type===1){F[L]=I[R.id];continue}Oe(R,I)}}}}return Oe(z.context,L),z}};function NS(F,I){return new MS(F,I)}function PS({schemas:F,actors:I,actions:L,guards:R,delays:z}){return{createMachine:De=>NS({...De,schemas:F},{actors:I,actions:L,guards:R,delays:z})}}var FS=(F,I)=>{I(F);let L=F.getSnapshot().children;L&&Object.values(L).forEach(F=>{FS(F,I)})};function IS(F){let I=[];FS(F,F=>{I.push([F,F.getSnapshot()]),F.observers=new Set});let L=F.system.getSnapshot?.();F.stop(),F.system._snapshot=L,I.forEach(([F,I])=>{F._processingStatus=0,F._snapshot=I})}function LS(F,...[I]){let[[L,R],z]=(0,import_react$10.useState)(()=>{let L=Kb(F,I);return[F.config,L]});if(F.config!==L){let L=Kb(F,{...I,snapshot:R.getPersistedSnapshot({__unsafeAllowInlineActors:!0})});z([F.config,L]),R=L}return sb(()=>{R.logic.implementations=F.implementations}),R}function RS(F,...[I,L]){let R=LS(F,I);return(0,import_react$10.useEffect)(()=>{if(!L)return;let F=R.subscribe(Ib(L));return()=>{F.unsubscribe()}},[L]),(0,import_react$10.useEffect)(()=>(R.start(),()=>{IS(R)}),[R]),R}function zS(F,I){return F===I}function BS(F,I,L=zS){let R=(0,import_react$10.useCallback)(I=>{if(!F)return()=>{};let{unsubscribe:L}=F.subscribe(I);return L},[F]),z=(0,import_react$10.useCallback)(()=>F?.getSnapshot(),[F]);return(0,import_with_selector.useSyncExternalStoreWithSelector)(R,z,z,I,L)}function VS(F,I){let L=import_react$10.createContext(null),R=L.Provider;function z({children:L,logic:z=F,machine:De,options:Oe}){if(De)throw Error(`The "machine" prop has been deprecated. Please use "logic" instead.`);let ke=RS(z,{...I,...Oe});return import_react$10.createElement(R,{value:ke,children:L})}z.displayName=`ActorProvider`;function De(){let F=import_react$10.useContext(L);if(!F)throw Error(`You used a hook from "${z.displayName}" but it's not inside a <${z.displayName}> component.`);return F}function Oe(F,I){return BS(De(),F,I)}return{Provider:z,useActorRef:De,useSelector:Oe}}var HS=()=>({botState:{cropCardIndicesToHarvest:[],cropsToPlayDuringTurn:0,fieldCropIndicesToWaterDuringTurn:[],toolCardsThatCanBePlayed:0},match:We.buildMatch({cardsToDrawAtTurnStart:1,eventCardsThatCanBePlayed:1,selectedWaterCardInHandIdx:-1,winner:null}),shell:{triggerNotification:()=>{}}}),US=new class{getNumberOfCropCardsToPlay(F,I,{minimumCropsToPlay:L=0}={}){let R=P.getPlayer(F,I),z=P.findCropIndexesInPlayerHand(F,I),De=Math.max(L,B$1.chooseIntegerBetween(0,z.length)),Oe=6-R.field.cards.filter(F=>!!F).length;return Math.min(Oe,De,z.length)}getNumberOfEventCardsToPlay(F,I){return+(P.findEventIndexesInPlayerHand(F,I).length>0)}getNumberOfToolCardsToPlay(F,I){let L=P.findToolIndexesInPlayerHand(F,I);return B$1.chooseIntegerBetween(0,L.length)}getEventCardIndexToPlay(F,I){let L=P.findEventIndexesInPlayerHand(F,I);return B$1.chooseElement(L)}getToolCardIndexToPlay(F,I){let L=P.findToolIndexesInPlayerHand(F,I);return B$1.chooseElement(L)}getCropCardIndicesToWater(F,I){let{field:{cards:L},hand:R}=P.getPlayer(F,I),z=[],{length:De}=R.filter(F=>p(F));for(let F=0;F<L.length&&z.length!==De;F++){let I=L[F];J$1(I)&&I.waterCards<I.instance.waterToMature&&I.wasWateredDuringTurn===!1&&(z=[...z,F])}return z}getCropCardIndicesToHarvest(F,I){let{field:{cards:L}}=P.getPlayer(F,I),R=[];for(let F=0;F<L.length;F++){let I=L[F];J$1(I)&&I.waterCards>=I.instance.waterToMature&&(R=[...R,F])}return R}getOpenFieldPosition(F,I){let{field:L}=P.getPlayer(F,I),{cards:R}=L,z=[];for(let F=0;F<Math.max(6,R.length);F++)R[F]===void 0&&(z=[...z,F]);return B$1.chooseElement(z)}},WS=(F,I,L)=>{let R=P.getPlayer(F,I),z=[...L,...R.cardsPlayedDuringTurn];return F=L$1(F,I,{cardsPlayedDuringTurn:z}),F},GS=(F,I)=>{let L=(I,L)=>{let R=P.getPlayer(F,I).hand[L];return N(R),WS(F,I,[R])};switch(I.type){case g.SELECT_CARD_POSITION:{let{currentPlayerId:R}=F;N(R),F=L(R,I.cardIdxInHand);break}case g.PLAY_EVENT:case g.PLAY_TOOL:case g.PLAY_WATER:{let{currentPlayerId:R}=F;N(R);let z=P.getPlayer(F,R).hand[I.cardIdxInHand];if(N(z),h(z)&&z.isPlantable)break;F=L(R,I.cardIdxInHand);break}default:}return F},KS={[v.CHOOSING_CARD_POSITION]:{on:{[g.SELECT_CARD_POSITION]:v.PLANTING_CARD,[g.OPERATION_ABORTED]:[{guard:y.IS_SETUP_PHASE,target:v.WAITING_FOR_PLAYER_SETUP_ACTION},{target:v.WAITING_FOR_PLAYER_TURN_ACTION}]},entry:$(({event:F,enqueue:I,context:{match:L}})=>{switch(F.type){case g.PLAY_PLANTABLE_TOOL:{let{currentPlayerId:R,sessionOwnerPlayerId:z}=L,{playerId:De,cardIdxInHand:Oe}=F;if(N(R),R!==z){let F=US.getOpenFieldPosition(L,R);N(F),I.raise({type:g.SELECT_CARD_POSITION,cardIdxInHand:Oe,fieldIdxToPlace:F,playerId:De})}break}}I.assign({match:L})}),exit:$(({event:F,enqueue:I,context:{match:L}})=>{switch(F.type){case g.SELECT_CARD_POSITION:L=GS(L,F);break}I.assign({match:L})})}},qS={[v.GAME_OVER]:{on:{[g.INIT]:{actions:$(({event:F,enqueue:I})=>{ES(F,g.INIT);let{playerSeeds:L,userPlayerId:R}=F,z=We.buildMatchForSession(L,R),De=HS();I.assign({...De,match:z}),I.raise({type:g.PROMPT_PLAYER_FOR_SETUP_ACTION})})},[g.PROMPT_PLAYER_FOR_SETUP_ACTION]:v.WAITING_FOR_PLAYER_SETUP_ACTION},entry:$(({event:F,enqueue:I,context:{match:L}})=>{ES(F,g.PLAYER_RAN_OUT_OF_FUNDS);let R=Object.keys(L.table.players).find(I=>I!==F.playerId);if(R===void 0)throw new j(`Winner could not be determined`);I.assign({match:{...L,winner:R}})})}},JS=F=>{let I=P.playerIds(F),L=P.nextPlayerIndex(F);return F=F$1(F,{currentPlayerId:I[L]}),F},YS=new class{removeAt(F,I){if(I>=F.length)throw Error(`removeAt: Index ${I} out of bounds`);return F.filter((F,L)=>L!==I)}replaceAt(F,I,L){let R=F.slice(0,I),z=F.slice(I+1);return[...Array.from({length:I},(F,I)=>R[I]),L,...z]}},XS=(F,I,L,R)=>{let{field:z}=P.getPlayer(F,I),{cards:De}=z;if(P.fullPlots(F,I).length>=6)throw new se(I);if(R===-1)throw new oe(`fieldIdxToPlace must not be -1`);return De=YS.replaceAt(De,R,L),F=R$1(F,I,{cards:De}),F},ZS=(F,I,L,R)=>{let{hand:z}=P.getPlayer(F,I),De=z[L];if(!De)throw new M(L,I);let Oe=YS.removeAt(z,L),ke;if(q$1(De))ke={instance:De,wasWateredDuringTurn:!1,waterCards:0};else if(h(De))ke={instance:De};else throw new ce(`${De.id} is not a plantable card.`);return F=XS(F,I,ke,R),F=L$1(F,I,{hand:Oe}),F},QS={[v.PERFORMING_BOT_SETUP_ACTION]:{on:{[g.START_TURN]:{target:v.WAITING_FOR_PLAYER_TURN_ACTION,guard:y.IS_SETUP_PHASE},[g.PROMPT_BOT_FOR_SETUP_ACTION]:{actions:$(({event:F,context:{match:I,botState:L,botState:{cropsToPlayDuringTurn:R}},enqueue:z})=>{ES(F,g.PROMPT_BOT_FOR_SETUP_ACTION);let{currentPlayerId:De}=I;if(N(De),P.getPlayer(I,De).field.cards.length>0&&R===0)z.raise({type:g.START_TURN});else{R===0&&(R=US.getNumberOfCropCardsToPlay(I,De,{minimumCropsToPlay:1}));let F=P.findCropIndexesInPlayerHand(I,De),L=B$1.chooseElement(F);if(L===void 0)throw new j(`Expected crops in hand but none were found for bot player ${De}`);z.raise({type:g.PLAY_CROP,playerId:De,cardIdxInHand:L},{delay:750})}z.assign({match:I,botState:{...L,cropsToPlayDuringTurn:R}})})},[g.PLAY_CROP]:{actions:$(({event:F,context:{match:I},enqueue:L})=>{ES(F,g.PLAY_CROP);let{cardIdxInHand:R}=F,{currentPlayerId:z}=I;N(z),I=GS(I,F);let De=US.getOpenFieldPosition(I,z);if(De===void 0)throw new oe(`${g.PLAY_CROP} event occurred for a full field`);L.raise({type:g.SELECT_CARD_POSITION,playerId:z,cardIdxInHand:R,fieldIdxToPlace:De}),L.assign({match:I})})},[g.SELECT_CARD_POSITION]:{actions:$(({event:F,context:{match:I,botState:L,botState:{cropsToPlayDuringTurn:R}},enqueue:z})=>{ES(F,g.SELECT_CARD_POSITION);let{cardIdxInHand:De,playerId:Oe,fieldIdxToPlace:ke}=F,{currentPlayerId:Ae}=I;N(Ae),I=GS(I,F),I=ZS(I,Oe,De,ke),R--,z.raise({type:g.PROMPT_BOT_FOR_SETUP_ACTION}),z.assign({match:I,botState:{...L,cropsToPlayDuringTurn:R}})})}},entry:$(({context:{match:F},enqueue:I})=>{let{currentPlayerId:L}=F;N(L),F=JS(F),I.raise({type:g.PROMPT_BOT_FOR_SETUP_ACTION}),I.assign({match:F})})}},$S=new class{constructor(){this.getCropBaseValue=F=>F.waterToMature*2,this.getCropSaleValue=(F,I)=>{let L=this.getCropBaseValue(I);return I.id===F.buffedCrop?.crop.id&&(L*=F.buffedCrop.multiplier),I.id===F.nerfedCrop?.crop.id&&(L*=F.nerfedCrop.multiplier),L=Math.floor(L),Math.min(L,F.table.communityFund)}}},eC=(F,I)=>{let{communityFund:L}=F.table,R=Math.max(0,L+I);return F=I$1(F,{communityFund:R}),F},tC=(F,I,L)=>{let{funds:R}=P.getPlayer(F,I),z=Math.max(0,R+L);return F=L$1(F,I,{funds:z}),F},nC=(F,I,L)=>{let R=[L,...P.getPlayer(F,I).discardPile];return F=L$1(F,I,{discardPile:R}),F},rC=(F,I,L)=>{let{field:R}=P.getPlayer(F,I),z=R.cards[L];if(!z)throw new M(L,I);let{cards:De}=R;return De=YS.replaceAt(De,L,void 0),F=R$1(F,I,{cards:De}),F=nC(F,I,z.instance),F},iC=(F,I,L)=>{let R=P.getPlayedCardFromField(F,I,L);ge(R);let z=$S.getCropSaleValue(F,R.instance);return F=tC(F,I,z),F=eC(F,-z),F=rC(F,I,L),F},aC=(F,I,L)=>{let{hand:R}=P.getPlayer(F,I),z=R[L];if(!z)throw new M(L,I);let De=YS.removeAt(R,L);return F=L$1(F,I,{hand:De}),F=nC(F,I,z),F},oC=u(s(((F,I)=>{var L=NaN,R=`[object Symbol]`,z=/^\s+|\s+$/g,De=/^[-+]0x[0-9a-f]+$/i,Oe=/^0b[01]+$/i,ke=/^0o[0-7]+$/i,Ae=parseInt,je=Object.prototype.toString;function Me(F,I,L){return F===F&&(L!==void 0&&(F=F<=L?F:L),I!==void 0&&(F=F>=I?F:I)),F}function Ne(F){var I=typeof F;return!!F&&(I==`object`||I==`function`)}function Pe(F){return!!F&&typeof F==`object`}function Fe(F){return typeof F==`symbol`||Pe(F)&&je.call(F)==`[object Symbol]`}function Ie(F){if(typeof F==`number`)return F;if(Fe(F))return L;if(Ne(F)){var I=typeof F.valueOf==`function`?F.valueOf():F;F=Ne(I)?I+``:I}if(typeof F!=`string`)return F===0?F:+F;F=F.replace(z,``);var R=Oe.test(F);return R||ke.test(F)?Ae(F.slice(2),R?2:8):De.test(F)?L:+F}function Le(F,I,L){return L===void 0&&(L=I,I=void 0),L!==void 0&&(L=Ie(L),L=L===L?L:0),I!==void 0&&(I=Ie(I),I=I===I?I:0),Me(Ie(F),I,L)}I.exports=Le}))()),sC=(F,I,L)=>{let{funds:R}=P.getPlayer(F,L),{communityFund:z}=F.table,De=(0,oC.default)(I,-z,R);return F=tC(F,L,-De),F=eC(F,De),F},cC=F=>{let I=Object.values(F.table.players).reduce((F,I)=>[...F,...I.deck,...I.hand,...I.discardPile,...I.field.cards.filter(F=>F!==void 0).map(F=>F.instance)],[]),L=new Set(I.filter(q$1).map(F=>F.id)),R=Object.values(ie).filter(F=>L.has(F.id)),[z,De]=B$1.shuffle(R);return F=F$1(F,{buffedCrop:z?{crop:z,multiplier:2}:null,nerfedCrop:De?{crop:De,multiplier:.5}:null}),F},lC=(F,I,L=1)=>{if(F=F$1(F,{turn:F.turn+1}),F=L$1(F,I,{cardsPlayedDuringTurn:[]}),F=sC(F,5,I),P.getPlayer(F,I).funds===0)throw new ae(I);F=V$1(F,I,L);let R=P.getPlayer(F,I).field.cards;for(let L=0;L<R.length;L++){let z=R[L];J$1(z)&&(F=De$1(F,I,L,{wasWateredDuringTurn:!1}))}return F=cC(F),F},uC=F=>I=>{try{return F(I)}catch(F){if(F instanceof ae){let{enqueue:L}=I;L.raise({type:g.PLAYER_RAN_OUT_OF_FUNDS,playerId:F.playerId})}else throw console.error(F),new j(`Unexpected bot logic error`)}},dC={[v.PERFORMING_BOT_TURN_ACTION]:{initial:_.INITIALIZING,exit:$(({event:F,context:{botState:I,match:L},enqueue:R})=>{L=GS(L,F);let{currentBotTurnPhase:z}=I;switch(F.type){case g.SELECT_CARD_POSITION:z=_.PLAYING_CROPS;break;case g.PLAY_EVENT:z=_.PLAYING_EVENTS;break;case g.PLAY_TOOL:z=_.PLAYING_TOOLS;break;default:}R.assign({match:L,botState:{...I,currentBotTurnPhase:z}})}),on:{[g.PLAYER_RAN_OUT_OF_FUNDS]:v.GAME_OVER,[g.SELECT_CARD_POSITION]:v.PLANTING_CARD,[g.PLAY_EVENT]:v.PLAYING_EVENT,[g.PLAY_TOOL]:v.PLAYING_TOOL,[g.START_TURN]:v.WAITING_FOR_PLAYER_TURN_ACTION},states:{[_.INITIALIZING]:{on:{[g.BOT_TURN_INITIALIZED]:[{guard:y.IS_BOT_PHASE_PLAYING_EVENTS,target:_.PLAYING_EVENTS},{guard:y.IS_BOT_PHASE_PLAYING_TOOLS,target:_.PLAYING_TOOLS},{target:_.PLAYING_CROPS}]},entry:$(uC(({event:F,context:I,context:{botState:L,match:R},enqueue:z})=>{switch(F.type){case g.START_TURN:{let F=R;R=JS(R);let{currentPlayerId:z}=R;N(z);let De=F.table.players[z];if(De)for(let F of De.cardsPlayedDuringTurn)h(F)&&F.onStartFollowingTurn&&(R=F.onStartFollowingTurn({...I,match:R}).match);R=lC(R,z,R.cardsToDrawAtTurnStart),I=SC.applyDailyEffects({...I,match:R}),R=I.match,R={...R,eventCardsThatCanBePlayed:US.getNumberOfEventCardsToPlay(R,z)},L={...L,cropsToPlayDuringTurn:US.getNumberOfCropCardsToPlay(R,z),currentBotTurnPhase:void 0,toolCardsThatCanBePlayed:US.getNumberOfToolCardsToPlay(R,z)};break}default:}z.assign({botState:L,match:R}),z.raise({type:g.BOT_TURN_INITIALIZED})}))},[_.PLAYING_CROPS]:{on:{[g.PLAY_CROP]:_.PLACING_CROP,[g.BOT_TURN_PHASE_COMPLETE]:_.WATERING_CROPS},entry:$(uC(({context:{botState:{cropsToPlayDuringTurn:F},match:I},enqueue:L})=>{if(F>0){let{currentPlayerId:F}=I;N(F);let R=P.findCropIndexesInPlayerHand(I,F),z=B$1.chooseElement(R);if(z===void 0)throw new j(`areCropsToPlay is true but there are no crops in the hand of bot player ${F}`);L.raise({type:g.PLAY_CROP,playerId:F,cardIdxInHand:z},{delay:750})}else L.raise({type:g.BOT_TURN_PHASE_COMPLETE})}))},[_.PLACING_CROP]:{on:{[g.BOT_TURN_PHASE_COMPLETE]:_.PLAYING_CROPS},entry:$(uC(({context:{botState:F,match:I},enqueue:L})=>{let{cropsToPlayDuringTurn:R}=F;if(R>0){let{currentPlayerId:F}=I;N(F);let R=P.findCropIndexesInPlayerHand(I,F),z=B$1.chooseElement(R);if(z===void 0)throw new j(`areCropsToPlay is true but there are no crops in the hand of bot player ${F}`);let De=US.getOpenFieldPosition(I,F);if(De===void 0)throw new oe(`${g.BOT_TURN_PHASE_COMPLETE} event occurred for a full field`);L.raise({type:g.SELECT_CARD_POSITION,playerId:F,cardIdxInHand:z,fieldIdxToPlace:De},{delay:750})}else L.raise({type:g.BOT_TURN_PHASE_COMPLETE})}))},[_.WATERING_CROPS]:{on:{[g.PLAY_WATER]:_.WATERING_CROP,[g.BOT_TURN_PHASE_COMPLETE]:_.PLAYING_EVENTS},entry:$(uC(({context:{botState:F,match:I},enqueue:L})=>{let{currentPlayerId:R}=I;N(R);let z=US.getCropCardIndicesToWater(I,R);if(z.length>0){let F=P.findWaterIndexesInPlayerHand(I,R);F[0]!==void 0&&L.raise({type:g.PLAY_WATER,cardIdxInHand:F[0],playerId:R},{delay:750})}else L.raise({type:g.BOT_TURN_PHASE_COMPLETE});L.assign({botState:{...F,fieldCropIndicesToWaterDuringTurn:z}})}))},[_.WATERING_CROP]:{on:{[g.BOT_TURN_PHASE_COMPLETE]:_.WATERING_CROPS},entry:$(({event:F,context:{match:I,botState:{fieldCropIndicesToWaterDuringTurn:L},shell:{triggerNotification:R}},enqueue:z})=>{I=GS(I,F);let{currentPlayerId:De}=I;N(De);let Oe=P.getPlayer(I,De),ke=Oe.hand.findIndex(F=>p(F)),[Ae]=L;N(Ae,`fieldCropIndicesToWaterDuringTurn is empty in ${_.WATERING_CROP}`);let je=Oe.field.cards[Ae];ge(je);let Me={...je,wasWateredDuringTurn:!0,waterCards:je.waterCards+1};I=De$1(I,De,Ae,Me),I=aC(I,De,ke),R({type:b.CROP_WATERED,payload:{cropWatered:je.instance}}),z.raise({type:g.BOT_TURN_PHASE_COMPLETE}),z.assign({match:I})})},[_.PLAYING_EVENTS]:{on:{[g.BOT_TURN_PHASE_COMPLETE]:_.PLAYING_TOOLS},entry:$(uC(({context:{match:F},enqueue:I})=>{if(F.eventCardsThatCanBePlayed>0){let{currentPlayerId:L}=F;N(L);let R=US.getEventCardIndexToPlay(F,L);if(R===void 0)throw new j(`areEventCardsToPlay is true but there are no events in the hand of bot player ${L}`);I.raise({type:g.PLAY_EVENT,cardIdxInHand:R,playerId:L},{delay:750})}else I.raise({type:g.BOT_TURN_PHASE_COMPLETE})}))},[_.PLAYING_TOOLS]:{on:{[g.BOT_TURN_PHASE_COMPLETE]:_.HARVESTING_CROPS},entry:$(uC(({context:{botState:F,match:I},enqueue:L})=>{if(F.toolCardsThatCanBePlayed>0){let{currentPlayerId:F}=I;N(F);let R=US.getToolCardIndexToPlay(I,F);if(R===void 0)throw new j(`areToolsToPlay is true but there are no tools in the hand of bot player ${F}`);let z=I.table.players[F]?.hand[R];N(z,`toolCardInstance is undefined`),de(z.id);let De=W$1[z.id],Oe=De.isPlantable&&P.fullPlots(I,F).length<6;if(!De.isPlantable||Oe){L.raise({type:g.PLAY_TOOL,cardIdxInHand:R,playerId:F},{delay:750});return}}L.raise({type:g.BOT_TURN_PHASE_COMPLETE})}))},[_.HARVESTING_CROPS]:{on:{[g.HARVEST_CROP]:_.HARVESTING_CROP,[g.BOT_TURN_PHASE_COMPLETE]:_.DONE},entry:$(uC(({context:{botState:F,match:I},enqueue:L})=>{let{currentPlayerId:R}=I;N(R);let z=US.getCropCardIndicesToHarvest(I,R);z.length>0?z[0]!==void 0&&L.raise({type:g.HARVEST_CROP,playerId:R,cropIdxInFieldToHarvest:z[0]},{delay:750}):L.raise({type:g.BOT_TURN_PHASE_COMPLETE}),L.assign({botState:{...F,cropCardIndicesToHarvest:z}})}))},[_.HARVESTING_CROP]:{on:{[g.BOT_TURN_PHASE_COMPLETE]:_.HARVESTING_CROPS},entry:$(({context:{match:F,botState:{cropCardIndicesToHarvest:[I]},shell:{triggerNotification:L}},enqueue:R})=>{let{currentPlayerId:z}=F;if(N(z),I!==void 0){let R=P.getPlayer(F,z).field.cards[I];ge(R),F=iC(F,z,I),L({type:b.CROP_HARVESTED,payload:{cropHarvested:R.instance}})}R.raise({type:g.BOT_TURN_PHASE_COMPLETE}),R.assign({match:F})})},[_.DONE]:{entry:$(({enqueue:F})=>{F.raise({type:g.START_TURN})}),type:`final`}}}},fC={[v.PLANTING_CARD]:{on:{[g.PROMPT_PLAYER_FOR_TURN_ACTION]:[{guard:y.IS_SETUP_PHASE,target:v.WAITING_FOR_PLAYER_SETUP_ACTION},{target:v.WAITING_FOR_PLAYER_TURN_ACTION}],[g.PROMPT_BOT_FOR_TURN_ACTION]:v.PERFORMING_BOT_TURN_ACTION,[g.OPERATION_ABORTED]:v.WAITING_FOR_PLAYER_TURN_ACTION},entry:$(({event:F,context:{botState:I,botState:{cropsToPlayDuringTurn:L,toolCardsThatCanBePlayed:R},match:z,shell:{triggerNotification:De}},enqueue:Oe})=>{ES(F,g.SELECT_CARD_POSITION);let{playerId:ke,cardIdxInHand:Ae,fieldIdxToPlace:je}=F;try{let F=P.getCardInstanceFromHand(z,ke,Ae);z=ZS(z,ke,Ae,je);let{currentPlayerId:I,sessionOwnerPlayerId:Me}=z;if(I===Me)h(F)&&De({type:b.TOOL_CARD_PLAYED,payload:{toolCard:F}}),Oe.raise({type:g.PROMPT_PLAYER_FOR_TURN_ACTION});else{switch(F.type){case f.CROP:L>0&&L--;break;case f.TOOL:R>0&&R--}Oe.raise({type:g.PROMPT_BOT_FOR_TURN_ACTION})}}catch(F){console.error(F),Oe.raise({type:g.OPERATION_ABORTED});return}Oe.assign({match:z,botState:{...I,cropsToPlayDuringTurn:L,toolCardsThatCanBePlayed:R}})}),exit:$(({event:F,context:I,enqueue:L})=>{let{match:R}=I;switch(F.type){case g.OPERATION_ABORTED:R={...R,selectedWaterCardInHandIdx:-1};break;default:}L.assign({match:R})})}},pC={[v.PLAYER_WATERING_CROP]:{on:{[g.SELECT_CROP_TO_WATER]:{target:v.WAITING_FOR_PLAYER_TURN_ACTION,guard:y.IS_SELECTED_IDX_VALID},[g.OPERATION_ABORTED]:v.WAITING_FOR_PLAYER_TURN_ACTION},entry:$(({event:F,context:{match:I},enqueue:L})=>{switch(F.type){case g.PLAY_WATER:{let{cardIdxInHand:L}=F;I={...I,selectedWaterCardInHandIdx:L};break}default:}L.assign({match:I})}),exit:$(({event:F,context:{match:I,shell:{triggerNotification:L}},enqueue:R})=>{let{selectedWaterCardInHandIdx:z}=I;switch(F.type){case g.SELECT_CROP_TO_WATER:{let{playerId:R,waterCardInHandIdx:De,cropIdxInFieldToWater:Oe}=F,ke=P.getPlayer(I,R).field.cards[Oe];ge(ke);let Ae={...ke,wasWateredDuringTurn:!0,waterCards:ke.waterCards+1};I=De$1(I,R,Oe,Ae),I=aC(I,R,De),z=-1,L({type:b.CROP_WATERED,payload:{cropWatered:ke.instance}});break}case g.OPERATION_ABORTED:z=-1;break;default:}R.assign({match:{...I,selectedWaterCardInHandIdx:z}})})}},mC={[v.PLAYING_EVENT]:{on:{[g.PROMPT_PLAYER_FOR_TURN_ACTION]:v.WAITING_FOR_PLAYER_TURN_ACTION,[g.PROMPT_BOT_FOR_TURN_ACTION]:v.PERFORMING_BOT_TURN_ACTION},entry:$(({event:F,context:I,context:{match:L,shell:{triggerNotification:R}},enqueue:z})=>{ES(F,g.PLAY_EVENT);let{currentPlayerId:De,sessionOwnerPlayerId:Oe}=L,{playerId:ke,cardIdxInHand:Ae}=F,je=P.getCardInstanceFromHand(L,ke,Ae);fe(je),N(De),R({type:b.EVENT_CARD_PLAYED,payload:{eventCard:je}}),L=je.applyEffect(I).match,L=aC(L,De,Ae),De===Oe?z.raise({type:g.PROMPT_PLAYER_FOR_TURN_ACTION}):z.raise({type:g.PROMPT_BOT_FOR_TURN_ACTION}),L={...L,eventCardsThatCanBePlayed:L.eventCardsThatCanBePlayed-1},z.assign({...I,match:L})})}},hC={[v.PLAYING_TOOL]:{on:{[g.PROMPT_PLAYER_FOR_TURN_ACTION]:v.WAITING_FOR_PLAYER_TURN_ACTION,[g.PROMPT_BOT_FOR_TURN_ACTION]:v.PERFORMING_BOT_TURN_ACTION,[g.PLAY_PLANTABLE_TOOL]:v.CHOOSING_CARD_POSITION},entry:$(({event:F,context:I,context:{botState:L,match:R,shell:{triggerNotification:z}},enqueue:De})=>{ES(F,g.PLAY_TOOL);let{currentPlayerId:Oe,sessionOwnerPlayerId:ke}=R,{playerId:Ae,cardIdxInHand:je}=F,Me=P.getCardInstanceFromHand(R,Ae,je);pe(Me),N(Oe),(!Me.isPlantable||Oe!==ke)&&z({type:b.TOOL_CARD_PLAYED,payload:{toolCard:Me}}),R=Me.applyEffect?.(I).match??R,Me.isPlantable?De.raise({type:g.PLAY_PLANTABLE_TOOL,cardIdxInHand:je,playerId:Oe}):(R=aC(R,Oe,je),Oe===ke?De.raise({type:g.PROMPT_PLAYER_FOR_TURN_ACTION}):(De.raise({type:g.PROMPT_BOT_FOR_TURN_ACTION}),L={...L,toolCardsThatCanBePlayed:L.toolCardsThatCanBePlayed-1})),De.assign({match:R,botState:L})})}},gC={[v.UNINITIALIZED]:{on:{[g.INIT]:{actions:$(({event:F,enqueue:I})=>{ES(F,g.INIT);let{playerSeeds:L,userPlayerId:R}=F,z=We.buildMatchForSession(L,R);I.assign({match:z}),I.raise({type:g.PROMPT_PLAYER_FOR_SETUP_ACTION})})},[g.RESUME]:{actions:$(({event:F,enqueue:I})=>{ES(F,g.RESUME);let{match:L,botState:R,matchState:z,userPlayerId:De}=F;I.assign({match:{...L,sessionOwnerPlayerId:De},botState:R}),z===v.WAITING_FOR_PLAYER_SETUP_ACTION?I.raise({type:g.PROMPT_PLAYER_FOR_SETUP_ACTION}):I.raise({type:g.PROMPT_PLAYER_FOR_TURN_ACTION})})},[g.PROMPT_PLAYER_FOR_SETUP_ACTION]:v.WAITING_FOR_PLAYER_SETUP_ACTION,[g.PROMPT_PLAYER_FOR_TURN_ACTION]:v.WAITING_FOR_PLAYER_TURN_ACTION}}},_C={[v.WAITING_FOR_PLAYER_SETUP_ACTION]:{on:{[g.PROMPT_BOT_FOR_SETUP_ACTION]:v.PERFORMING_BOT_SETUP_ACTION,[g.PLAY_CROP]:v.CHOOSING_CARD_POSITION}}},vC=(F,I,L=1/0)=>{let R=P.getPlayer(F,I).cardsPlayedDuringTurn.slice(L);return F=L$1(F,I,{cardsPlayedDuringTurn:R}),F},yC={[v.WAITING_FOR_PLAYER_TURN_ACTION]:{on:{[g.PLAYER_RAN_OUT_OF_FUNDS]:v.GAME_OVER,[g.PLAY_CROP]:v.CHOOSING_CARD_POSITION,[g.PLAY_EVENT]:v.PLAYING_EVENT,[g.PLAY_WATER]:v.PLAYER_WATERING_CROP,[g.PLAY_TOOL]:v.PLAYING_TOOL,[g.START_TURN]:v.PERFORMING_BOT_TURN_ACTION,[g.HARVEST_CROP]:{actions:$(({event:F,enqueue:I,context:{match:L,shell:{triggerNotification:R}}})=>{let{playerId:z,cropIdxInFieldToHarvest:De}=F,Oe=P.getPlayedCardFromField(L,z,De);ge(Oe),L=iC(L,z,De),R({type:b.CROP_HARVESTED,payload:{cropHarvested:Oe.instance}}),I.assign({match:L})})},[g.DISCARD_CARD_FROM_FIELD]:{actions:$(({event:F,enqueue:I,context:{match:L,shell:{triggerNotification:R}}})=>{let{playerId:z,cardIdxInField:De}=F,Oe=P.getPlayedCardFromField(L,z,De);L=rC(L,z,De),R({type:b.CARD_DISCARDED,payload:{cardDiscarded:Oe.instance}}),I.assign({match:L})})}},entry:$(({event:F,context:I,context:{match:L},enqueue:R})=>{try{switch(F.type){case g.START_TURN:{L={...L,cardsToDrawAtTurnStart:1};let F=L;L=JS(L);let{currentPlayerId:R}=L;N(R);let z=P.getPlayer(F,R);for(let F of z.cardsPlayedDuringTurn)h(F)&&F.onStartFollowingTurn&&(L=F.onStartFollowingTurn({...I,match:L}).match);L={...L,eventCardsThatCanBePlayed:1},L=lC(L,R,L.cardsToDrawAtTurnStart),I=SC.applyDailyEffects({...I,match:L}),L=I.match;break}case g.OPERATION_ABORTED:{let{currentPlayerId:F}=L;N(F),L=vC(L,F,1);break}default:}}catch(F){if(F instanceof ae){let{currentPlayerId:F}=L;N(F),R.raise({type:g.PLAYER_RAN_OUT_OF_FUNDS,playerId:F})}else console.error(F)}R.assign({...I,match:L})}),exit:$(({event:F,context:{match:I},enqueue:L})=>{I=GS(I,F),L.assign({match:I})})}},bC={initial:v.UNINITIALIZED,on:{[g.DANGEROUSLY_SET_CONTEXT]:{actions:$(({event:F,enqueue:I})=>{ES(F,g.DANGEROUSLY_SET_CONTEXT);let{type:L,...R}=F;I.assign(R)})},[g.SET_SHELL]:{actions:$(({event:F,enqueue:I})=>{ES(F,g.SET_SHELL);let{shell:L}=F;I.assign({shell:L})})}},states:{...gC,...qS,...KS,...QS,...dC,...fC,...pC,...mC,...hC,..._C,...yC}},{createMachine:xC}=PS({types:{context:{},events:{}},guards:{[y.IS_BOT_PHASE_PLAYING_EVENTS]:({context:{botState:{currentBotTurnPhase:F}}})=>F===_.PLAYING_EVENTS,[y.IS_BOT_PHASE_PLAYING_TOOLS]:({context:{botState:{currentBotTurnPhase:F}}})=>F===_.PLAYING_TOOLS,[y.IS_SELECTED_IDX_VALID]:({event:F,context:{match:I}})=>{let{currentPlayerId:L}=I;switch(N(L),F.type){case g.SELECT_CROP_TO_WATER:{let{cards:R}=P.getPlayer(I,L).field;return R[F.cropIdxInFieldToWater]!==void 0}default:}return!0},[y.IS_SETUP_PHASE]:({context:{match:F}})=>F.turn===0}}),SC=new class{constructor(){this.createMatchStateMachine=()=>xC({context:HS(),...bC}),this.startMatch=()=>Kb(this.createMatchStateMachine()).start(),this.applyDailyEffects=F=>{let{match:I}=F,{currentPlayerId:L}=I;N(L);let R=I.table.players[L];N(R);for(let L=0;L<R.field.cards.length;L++){let z=R.field.cards[L];z&&h(z.instance)&&z.instance.applyDailyEffect&&(F=z.instance.applyDailyEffect({...F,match:I},L),I=F.match)}return F}}},CC=VS(SC.createMatchStateMachine()),wC=()=>{let{match:F,matchState:I}=CC.useSelector(({context:{match:F},value:I})=>({match:F,matchState:I})),L=I,R=null;if(ze$1(I))if(v.PERFORMING_BOT_TURN_ACTION in I){L=v.PERFORMING_BOT_TURN_ACTION;let F=I[v.PERFORMING_BOT_TURN_ACTION];N(F),he(F),R=F}else throw TypeError(`Unexpected matchState shape`);if(typeof L!=`string`)throw TypeError(`Actor state is not a string`);return me(L),{match:F,matchState:L,botTurnActionState:R}},TC=F=>{let{cardInstance:I,cardIdxInHand:L,cropIdxInFieldToWater:R,cropIdxInFieldToHarvest:z,cardIdxInField:De,playerId:Oe,onBeforePlay:ke,canBeWatered:Ae=!1,canBeHarvested:je=!1,isFocused:Me=!1,isInField:Ne=!1}=F,{useActorRef:Pe}=CC,Fe=Pe(),{match:Ie,matchState:Le}=wC(),{setIsHandInViewport:Re,setSelectedHandCardIdx:ze}=(0,import_react$10.useContext)(Ep),{eventCardsThatCanBePlayed:Be,selectedWaterCardInHandIdx:Ge}=Ie,rt=Be>0,it=async()=>{let F=Pe$1(I);switch(F||ze(-1),ke&&await ke(),N(L,`cardIdxInHand is not a valid hand index`),I.type){case f.CROP:Fe.send({type:g.PLAY_CROP,cardIdxInHand:L,playerId:Oe}),Re(!1);break;case f.WATER:Fe.send({type:g.PLAY_WATER,cardIdxInHand:L,playerId:Oe}),Re(!1);break;case f.EVENT:Fe.send({type:g.PLAY_EVENT,cardIdxInHand:L,playerId:Oe});break;case f.TOOL:Fe.send({type:g.PLAY_TOOL,cardIdxInHand:L,playerId:Oe}),F&&Re(!1);break;default:}},at=()=>{N(R,`cropIdxInFieldToWater is not a valid field index`),Fe.send({type:g.SELECT_CROP_TO_WATER,playerId:Oe,cropIdxInFieldToWater:R,waterCardInHandIdx:Ge})},ot=()=>{N(z,`cropIdxInFieldToHarvest is not a valid field index`),Fe.send({type:g.HARVEST_CROP,playerId:Oe,cropIdxInFieldToHarvest:z})},st=()=>{N(De,`cardIdxInField is not a valid field index`),Fe.send({type:g.DISCARD_CARD_FROM_FIELD,playerId:Oe,cardIdxInField:De})},ct=Oe===Ie.sessionOwnerPlayerId,lt=!1,ut=!1,dt=!1,ft=!1,pt=!1,mt=!1;switch(I.type){case f.CROP:mt=I.id===Ie.buffedCrop?.crop.id,ct&&Me&&!Ne&&[v.WAITING_FOR_PLAYER_TURN_ACTION,v.WAITING_FOR_PLAYER_SETUP_ACTION].includes(Le)&&(lt=!0,P.getPlayer(Ie,Oe).field.cards.filter(F=>F!==void 0).length>=6&&(ut=!0)),ct&&Me&&Ne&&Ae&&[v.PLAYER_WATERING_CROP].includes(Le)&&(dt=!0),ct&&Me&&Ne&&je&&[v.WAITING_FOR_PLAYER_TURN_ACTION].includes(Le)&&(ft=!0);break;case f.EVENT:ct&&Me&&rt&&Le===v.WAITING_FOR_PLAYER_TURN_ACTION&&(lt=!0);break;case f.TOOL:ct&&Me&&!Ne&&Le===v.WAITING_FOR_PLAYER_TURN_ACTION&&(lt=!0),ct&&Ne&&Me&&(pt=!0);break;case f.WATER:ct&&Me&&Le===v.WAITING_FOR_PLAYER_TURN_ACTION&&(lt=!0);break;default:}let ht=Ne&&Ae&&Le===v.PLAYER_WATERING_CROP&&Ie.currentPlayerId===Oe&&q$1(I),gt=Ne&&je&&q$1(I)&&Le!==v.PLAYER_WATERING_CROP,vt=``;return ct&&(ht?vt=`Needs water`:gt&&(vt=`Ready to be harvested`)),{isBuffedCrop:mt,showPlayCardButton:lt,playButtonDisabled:ut,showWaterCropButton:dt,showHarvestCropButton:ft,showWaterableState:ht,showHarvestableState:gt,showDiscardButton:pt,tooltipTitle:vt,onPlayCard:it,onWaterCrop:at,onHarvestCrop:ot,onDiscardCard:st,isSessionOwnersCard:ct}},EC=F=>q$1(F.cardInstance),DC=F=>p(F.cardInstance),OC=F=>m(F.cardInstance),kC=F=>h(F.cardInstance),AC=(0,import_react$10.forwardRef)(function({playedCrop:F,...I},L){let R=TC({playedCrop:F,...I}),{canBeHarvested:z,canBeWatered:De,isFocused:Oe,isInField:ke,onBeforePlay:Ae,...je}=I;return(0,import_jsx_runtime$2.jsx)(Sp,{...je,...R,ref:L,children:Ne$1(I.cardInstance)?(0,import_jsx_runtime$2.jsx)(ob,{crop:I.cardInstance,playedCrop:F}):null})}),jC=(0,import_react$10.forwardRef)(function(F,I){let L=TC(F),{canBeHarvested:R,canBeWatered:z,isFocused:De,isInField:Oe,onBeforePlay:ke,...Ae}=F;return(0,import_jsx_runtime$2.jsx)(Sp,{...Ae,...L,ref:I})}),MC=(0,import_react$10.forwardRef)(function(F,I){let L=TC(F),{canBeHarvested:R,canBeWatered:z,isFocused:De,isInField:Oe,onBeforePlay:ke,...Ae}=F;return(0,import_jsx_runtime$2.jsx)(Sp,{...Ae,...L,ref:I,children:(0,import_jsx_runtime$2.jsx)(tb,{children:F.cardInstance.description})})}),NC=(0,import_react$10.forwardRef)(function(F,I){let L=TC(F),{canBeHarvested:R,canBeWatered:z,isFocused:De,isInField:Oe,onBeforePlay:ke,...Ae}=F;return(0,import_jsx_runtime$2.jsx)(Sp,{...Ae,...L,ref:I,children:(0,import_jsx_runtime$2.jsx)(tb,{children:F.cardInstance.description})})}),PC=(0,import_react$10.forwardRef)(function(F,I){if(EC(F))return(0,import_jsx_runtime$2.jsx)(AC,{...F,ref:I});if(DC(F))return(0,import_jsx_runtime$2.jsx)(jC,{...F,ref:I});if(OC(F))return(0,import_jsx_runtime$2.jsx)(MC,{...F,ref:I});if(kC(F))return(0,import_jsx_runtime$2.jsx)(NC,{...F,ref:I});throw new ue(`Unexpected CardType`)}),FC=({playedCard:F})=>{let I=F.instance,L=0,R=!1,z=!1;return Fe$1(F)||h(I)||(L=Math.max(F.waterCards,I.waterToMature),R=F.wasWateredDuringTurn===!1,z=F.waterCards>=I.waterToMature),{canBeWatered:R,canBeHarvested:z,waterIconsToRender:L}},IC=.25,LC=`PlayedCard`,RC=({isInBackground:F,playedCard:I,cardProps:{ref:L,...R},...z})=>{let De=useTheme$1(),{size:Oe=B.MEDIUM}=R,{canBeWatered:ke,canBeHarvested:Ae,waterIconsToRender:je}=FC({playedCard:I}),Me=J$1(I)?Array.from({length:je},(L,R)=>F?0:R<I.waterCards?1:IC):[];return(0,import_jsx_runtime$2.jsxs)(Box,{className:LC,maxWidth:V[Oe].width,...z,children:[(0,import_jsx_runtime$2.jsx)(PC,{size:Oe,canBeWatered:ke,canBeHarvested:Ae,...R}),J$1(I)&&(Oe===B.COMPACT?(0,import_jsx_runtime$2.jsx)(Box,{display:`flex`,gap:De.spacing(.25),pt:.5,"aria-label":`Water card indicator`,position:`relative`,zIndex:-1,children:Me.map((F,I)=>(0,import_jsx_runtime$2.jsx)(Box,{sx:{flex:1,height:`4px`,background:`#0072ff`,opacity:F,transition:De.transitions.create([`opacity`])}},I))}):(0,import_jsx_runtime$2.jsx)(Grid,{container:!0,spacing:1,pt:2.5,width:V[Oe].width,ml:De.spacing(-.5),justifyContent:`flex-start`,position:`relative`,zIndex:-1,children:Me.map((F,I)=>(0,import_jsx_runtime$2.jsx)(Grid,{item:!0,sx:{pt:`${De.spacing(0)} !important`},children:(0,import_jsx_runtime$2.jsx)(up,{src:An.water,alt:`Water card indicator`,sx:{imageRendering:`pixelated`,opacity:F,transition:De.transitions.create([`opacity`])}})},I))}))]})},zC=({cardSize:F=B.SMALL,playerId:I,fieldIdx:L})=>{let R=useTheme$1(),{useActorRef:z}=CC,De=z(),{matchState:Oe,match:{currentPlayerId:ke,sessionOwnerPlayerId:Ae}}=wC(),{selectedHandCardIdx:je}=(0,import_react$10.useContext)(Ep),Me=ke===Ae&&ke===I&&Oe===v.CHOOSING_CARD_POSITION;return(0,import_jsx_runtime$2.jsx)(Box,{height:V[F].height,width:V[F].width,onClick:()=>{Me&&De.send({type:g.SELECT_CARD_POSITION,playerId:I,cardIdxInHand:je,fieldIdxToPlace:L})},sx:{flexShrink:0,mx:`auto`,outlineStyle:`solid`,outlineWidth:Nn(1),outlineColor:Me?R.palette.primary.light:cn(R.palette.divider),borderRadius:`${R.shape.borderRadius}px`,transition:R.transitions.create([`background`,`transform`]),boxShadow:Me?`0 0 12px 4px ${R.palette.primary.light}`:`none`,alignContent:`center`,...Me&&{cursor:`pointer`,":hover":{transform:`scale(1.2)`,background:R.palette.mode===`light`?darken$7(R.palette.primary.light,.1):lighten$7(R.palette.primary.light,.5),"> p":{opacity:1}}}},children:Me&&(0,import_jsx_runtime$2.jsx)(Typography,{variant:`caption`,component:`p`,sx:{color:R.palette.primary.contrastText,fontWeight:R.typography.fontWeightBold,opacity:0,textAlign:`center`,textTransform:`uppercase`,transition:R.transitions.create([`opacity`])},children:`Place card`})})},BC=B.MEDIUM,VC=1.25,HC=`Selected field card`,UC=`Unselected field card`,WC=({playerId:F,match:I,cardSize:L=B.SMALL,onSelectedCardIdxChange:R,...z})=>{let De=P.getPlayer(I,F),Oe=F===I.sessionOwnerPlayerId,{isNarrowViewport:ke,fieldContainerRef:Ae}=(0,import_react$10.useContext)(Ep),je=(0,import_react$10.useRef)(null),Me=Cp(je,Oe?Ae:void 0),Ne=useTheme$1(),[Pe,Fe]=(0,import_react$10.useState)(-1),[Ie,Le]=(0,import_react$10.useState)(``),{width:Re,height:ze}=Mt({debounceDelay:1}),Be=Re/2,Ge=ze/2,rt=()=>{Fe(-1),R?.(-1),document.activeElement instanceof HTMLElement&&document.activeElement.blur()},it=At(()=>{rt()},void 0,{leading:!0});(0,import_react$10.useEffect)(()=>(window.addEventListener(`resize`,it),()=>{window.removeEventListener(`resize`,it)}),[it]),(0,import_react$10.useEffect)(()=>{Fe(-1),R?.(-1)},[De.field,R]);let at=(F,I)=>{let{target:z}=F;if(!z.classList.contains(`PlayedCard`))return;let De=z.getBoundingClientRect();if(L===B.COMPACT){let F=V[BC].width,I=V[BC].height;Le(`translateX(calc(${Be}px - ${De.left}px - (${F} / 2))) translateY(calc(${Ge}px - ${De.top}px - (${I} / 2)))`)}else Le(`translateX(${Be-(De.left+De.width/2)}px) translateY(${Ge-(De.top+De.height/2)}px) scale(${VC})`);Fe(I),R?.(I)},ot=F=>{switch(F.key){case`Escape`:rt();break}},st=F=>{je.current&&!je.current.contains(F.relatedTarget)&&rt()},ct=[,,,,,,].fill(void 0).map((F,I)=>De.field.cards[I]),lt=Oe?ct:[...ct].reverse();return(0,import_jsx_runtime$2.jsx)(Box,{...z,"data-testid":`field_${F}`,ref:Me,onKeyDown:ot,onBlur:st,children:(0,import_jsx_runtime$2.jsx)(Box,{display:`flex`,flexWrap:`nowrap`,overflow:`visible`,gap:L===B.COMPACT?Ne.spacing(.5):Ne.spacing(2),alignItems:Oe?`flex-start`:`flex-end`,justifyContent:L===B.COMPACT?`flex-start`:`center`,children:lt.map((I,R)=>{let z=Oe?R:5-R;if(!Ie$1(I))return(0,import_jsx_runtime$2.jsx)(zC,{cardSize:L,playerId:F,fieldIdx:z},R);let{instance:Ae}=I,je=Pe===z,Me=Pe!==-1&&!je,Fe=je&&L===B.COMPACT;return(0,import_jsx_runtime$2.jsx)(RC,{"aria-label":je?HC:UC,tabIndex:0,cardProps:{cardInstance:Ae,cardIdxInField:z,cropIdxInFieldToWater:z,cropIdxInFieldToHarvest:z,isInField:!0,isFocused:je,playerId:De.id,size:Fe?BC:L,stackActionButtonsBelowCard:ke,...je&&{elevation:10},paperProps:{...je&&{elevation:10}}},playedCard:I,isInBackground:Me,onFocus:F=>at(F,z),sx:{flexShrink:0,mx:`auto`,position:`relative`,zIndex:0,transition:Ne.transitions.create([`transform`]),outline:`none`,transformStyle:`preserve-3d`,...!Oe&&{transform:`rotate(180deg)`},...!je&&{cursor:`pointer`},...je&&{transform:Ie,zIndex:20},...L===B.COMPACT&&{width:V[L].width,height:V[L].height}}},Ae.instanceId)})})})},GC=B.MEDIUM,KC=({match:F,handleClickTopCard:I,isTopCardSelected:L,playerId:R,deckThicknessPx:z=30,cardSize:De=GC,sx:Oe=[],...ke})=>{let{containerRef:Ae,selectedCardSxProps:je}=Tp({cardSize:De}),Me=useTheme$1(),Ne=P.getPlayer(F,R),Pe=R===F.sessionOwnerPlayerId;return(0,import_jsx_runtime$2.jsx)(Box,{"data-testid":`deck_${R}`,height:V[De].height,width:V[De].width,position:`relative`,ref:Ae,sx:[{...!Pe&&{transform:`rotate(180deg)`}},...Tt(Oe)?Oe:[Oe]],...ke,children:Ne.deck.map((F,R)=>{let Oe=z/Ne.deck.length*R,ke=R===Ne.deck.length-1;return(0,import_jsx_runtime$2.jsx)(PC,{cardInstance:F,playerId:Ne.id,position:`absolute`,isFlipped:!(ke&&L),size:De,sx:{transform:`translateX(${Oe}px) translateY(${Oe/2}px)`,transition:Me.transitions.create([`transform`]),...ke&&L&&je},...ke&&{onClick:I}},F.instanceId)})})},qC=B.SMALL,JC=({playerId:F,match:I,cardSize:L=qC,discardPileThicknessPx:R=30,...z})=>{let De=useTheme$1(),Oe=P.getPlayer(I,F),ke=F===I.sessionOwnerPlayerId;return(0,import_jsx_runtime$2.jsx)(Box,{"data-testid":`discard-pile_${F}`,height:V[L].height,width:V[L].width,position:`relative`,sx:{transformStyle:`preserve-3d`,outlineStyle:`solid`,outlineWidth:Nn(1),outlineColor:cn(De.palette.divider),borderRadius:`${De.shape.borderRadius}px`,...!ke&&{transform:`rotate(180deg)`}},...z,children:[...Oe.discardPile].reverse().map((I,z)=>{let ke=R/Oe.discardPile.length*z;return(0,import_jsx_runtime$2.jsx)(Tooltip,{title:I.name,placement:`top`,children:(0,import_jsx_runtime$2.jsx)(PC,{cardInstance:I,size:L,playerId:F,position:`absolute`,sx:{transform:`translateX(${ke}px)`,transition:De.transitions.create([`transform`])}})},I.instanceId)})})},YC=()=>{let F=(0,import_react$10.useRef)(new Map);return(0,import_react$10.useEffect)(()=>{let{current:I}=F;return()=>{I.forEach(F=>{F()})}},[]),{setRejectingTimeout:I=>new Promise((L,R)=>{let z=setTimeout(()=>{F.current.delete(z),L()},I);F.current.set(z,R)})}},XC=new class{constructor(){this.scaleNumber=(F,I,L,R,z)=>(F-I)*(z-R)/(L-I)+R}},ZC=1,QC=.65,$C=B.MEDIUM,ew=F=>F>60?3:F>30?5:F>20?10:F>10?15:F>5?30:50,tw=({playerId:F,match:I,cardSize:L=B.LARGE,sx:R=[],...z})=>{let{blockingOperation:De,isHandInViewport:Oe,setIsHandInViewport:ke,isNarrowViewport:Ae,selectedHandCardIdx:je,setSelectedHandCardIdx:Me,isHandCardSelected:Ne,isHandCardSelectionLocked:Pe,handContainerRef:Fe}=(0,import_react$10.useContext)(Ep),{setRejectingTimeout:Ie}=YC(),{containerRef:Le,selectedCardSxProps:Re,selectedCardTransform:ze}=Tp({cardSize:$C}),Be=P.getPlayer(I,F),Ge=useTheme$1(),rt=(0,import_react$10.useRef)(null);(0,import_react$10.useEffect)(()=>{Oe&&Ne&&!Pe&&rt.current?.focus()},[Oe,rt,Ne,Pe]);let it=(0,import_react$10.useCallback)(()=>{Me(-1),document.activeElement instanceof HTMLElement&&document.activeElement.blur()},[Me]);(0,import_react$10.useEffect)(()=>{it(),ke(!0)},[Be.hand,ke,it]);let at=F=>{Pe||Me(F)},ot=F=>{if(!Pe)switch(F.key){case`Escape`:it();break}},st=F=>{!Pe&&Le.current&&!Le.current.contains(F.relatedTarget)&&it()},ct=parseFloat(V[L].width)/parseFloat(V[$C].width),lt=ew(Be.hand.length)*ct,{width:ut}=Le.current?.getBoundingClientRect()??{width:0},dt=Cp(Le,Fe),ft=async()=>{await De(async()=>{await Ie(Ge.transitions.duration.shortest)})};return(0,import_jsx_runtime$2.jsx)(Box,{...z,"data-testid":`hand_${F}`,ref:dt,sx:[{position:`relative`,minHeight:V[L].height,pointerEvents:Oe?void 0:`none`},...Tt(R)?R:[R]],onKeyDown:ot,onBlur:st,children:Be.hand.map((I,R)=>{let z=lt*Be.hand.length,De=XC.scaleNumber(R/Be.hand.length,0,1,-z,z),ke=ut/2+De,Me=je===R&&Oe,Pe=Ne&&Oe,Fe=``;Me||(Fe=`translateX(${`calc(-50% + ${lt}px + ${ke}px)`}) translateY(${Pe?`calc(${V[L].height} / 2)`:`0rem`}) rotate(-5deg) scale(${Pe?QC:ZC}) rotateY(25deg)`);let Ie=`translateY(${Oe?0:V[L].height})`;return(0,import_jsx_runtime$2.jsx)(PC,{disableEnterAnimation:!0,cardInstance:I,cardIdxInHand:R,playerId:F,size:Me?$C:L,paperProps:{...Me&&{elevation:10}},sx:{position:`absolute`,transition:Ge.transitions.create([`transform`]),cursor:`pointer`,...Me&&Re,transform:`${Me?ze:Fe} ${Ie}`},onBeforePlay:ft,onFocus:()=>at(R),tabIndex:Oe?0:-1,isFocused:Me,stackActionButtonsBelowCard:Ae,ref:Me?rt:void 0},I.instanceId)})})},nw=-8,rw=(F,I)=>`calc(${hn} + max(0px, calc((${F}px - ${hn} - ${I}) / 2)))`,iw=({match:F,...I})=>{let L=useTheme$1(),{setSelectedFieldCardIdx:R,isNarrowViewport:z}=(0,import_react$10.useContext)(Ep),{sessionOwnerPlayerId:De}=F,Oe=P.getOpponentPlayerIds(F),ke=!z,Ae=ke?B.MEDIUM:B.COMPACT,je=ke?B.SMALL:B.COMPACT,Me=L.spacing(nw*(parseFloat(V[Ae].height)/parseFloat(V[B.MEDIUM].height))),Ne=(0,import_react$10.useRef)(null),Pe=(0,import_react$10.useRef)(null),[Fe,Ie]=(0,import_react$10.useState)(null),{height:Le}=Mt({debounceDelay:1});(0,import_react$10.useLayoutEffect)(()=>{let F=Pe.current;F&&Ie(F.getBoundingClientRect().bottom)},[Le,ke]),(0,import_react$10.useLayoutEffect)(()=>{let F=Ne.current,I=Pe.current;if(!F||!I||typeof ResizeObserver>`u`)return;let L=new ResizeObserver(()=>{Ie(I.getBoundingClientRect().bottom)});return L.observe(F),()=>{L.disconnect()}},[]);let Re=Fe===null?Me:rw(Le-Fe,V[Ae].height),ze=ke?Me:Re;return(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsxs)(Grid,{gap:4,container:!0,...I,ref:Ne,"data-testid":`table_${F.sessionOwnerPlayerId}`,children:[(0,import_jsx_runtime$2.jsx)(Grid,{item:!0,xs:12,children:Oe.map(I=>(0,import_jsx_runtime$2.jsx)(WC,{match:F,playerId:I,cardSize:je},I))}),(0,import_jsx_runtime$2.jsx)(Grid,{item:!0,xs:12,children:(0,import_jsx_runtime$2.jsxs)(Box,{display:`flex`,justifyContent:`space-between`,alignContent:`center`,px:1,children:[(0,import_jsx_runtime$2.jsx)(KC,{match:F,playerId:De,cardSize:je}),(0,import_jsx_runtime$2.jsx)(JC,{match:F,playerId:De,cardSize:je})]})}),(0,import_jsx_runtime$2.jsx)(Grid,{item:!0,xs:12,ref:Pe,children:(0,import_jsx_runtime$2.jsx)(WC,{match:F,playerId:De,cardSize:je,onSelectedCardIdxChange:R})})]}),(0,import_jsx_runtime$2.jsx)(Box,{position:`fixed`,left:`50%`,right:`50%`,bottom:ze,children:(0,import_jsx_runtime$2.jsx)(tw,{match:F,playerId:De,cardSize:Ae})})]})},aw=new Intl.NumberFormat(void 0,{style:`decimal`,useGrouping:!0}).format.bind(null),ow=F=>aw(F),sw=10,cw=({match:F,useGenericPlayerLabels:I=!1})=>{let L=useTheme$1(),R=CC.useActorRef(),{setIsHandInViewport:z}=(0,import_react$10.useContext)(Ep),{matchState:De,botTurnActionState:Oe,match:{currentPlayerId:ke,sessionOwnerPlayerId:Ae}}=wC(),je=I?on:Ct(ke??``),Me=()=>{R.send({type:g.PROMPT_BOT_FOR_SETUP_ACTION})},Ne=()=>{R.send({type:g.START_TURN})},Pe=()=>{R.send({type:g.OPERATION_ABORTED}),z(!0)},Fe=()=>{R.send({type:g.OPERATION_ABORTED}),z(!0)},Ie=null,Le=ke?P.getPlayer(F,ke):null,Re=``;switch(De){case v.CHOOSING_CARD_POSITION:Re=`Select a position in the field`,Le?.id===F.sessionOwnerPlayerId&&(Ie=(0,import_jsx_runtime$2.jsx)(Button,{onClick:Fe,color:`warning`,children:`Cancel placement`}));break;case v.WAITING_FOR_PLAYER_SETUP_ACTION:Re=`Set up your Field`,Le&&Le.field.cards.length>0&&(Ie=(0,import_jsx_runtime$2.jsx)(Button,{onClick:Me,children:`Complete setup`}));break;case v.WAITING_FOR_PLAYER_TURN_ACTION:Re=`Your turn`,Le&&Le.id===F.sessionOwnerPlayerId&&(Ie=(0,import_jsx_runtime$2.jsx)(Button,{onClick:Ne,children:`End turn`}));break;case v.PLAYER_WATERING_CROP:Re=`Select a crop to water`,Le&&Le.id===F.sessionOwnerPlayerId&&(Ie=(0,import_jsx_runtime$2.jsx)(Button,{onClick:Pe,color:`warning`,children:`Cancel watering`}));break;case v.PERFORMING_BOT_TURN_ACTION:switch(Re=`${je}'s turn`,Oe){case _.PLAYING_CROPS:case _.PLACING_CROP:Re=`${je} is planting crops`;break;case _.WATERING_CROPS:case _.WATERING_CROP:Re=`${je} is watering crops`;break;case _.HARVESTING_CROPS:case _.HARVESTING_CROP:Re=`${je} is harvesting crops`;break;case _.PLAYING_EVENTS:Re=`${je} is playing Event cards`;break;case _.PLAYING_TOOLS:Re=`${je} is playing Tool cards`;break;default:}break;case v.PERFORMING_BOT_SETUP_ACTION:Re=`${je} is setting their field up`;break;default:}let{[Ae]:ze,...Be}=F.table.players;if(!ze)throw new j(`Session owner player not found`);let Ge=ze.funds,rt=Object.keys(Be)[0],it=rt?P.getPlayer(F,rt)?.funds:0,at=I?on:Ct(rt??``),ot=F=>({...Kn({outline:Un(L)}),backgroundColor:L.palette.background.paper,color:F!==void 0&&F<=sw?L.palette.error.dark:L.palette.text.primary,cursor:`help`,justifyContent:`center`,"& .MuiChip-icon":{color:`inherit`,fontSize:L.typography.body1.fontSize,ml:.5,mr:.5},"& .MuiChip-label":{fontSize:L.typography.body1.fontSize,pl:0,pr:.5,textAlign:`center`}});return(0,import_jsx_runtime$2.jsxs)(Stack,{spacing:1,children:[(0,import_jsx_runtime$2.jsxs)(Stack,{direction:`row`,justifyContent:`space-between`,gap:`0.25rem`,flexWrap:`wrap`,children:[(0,import_jsx_runtime$2.jsx)(Tooltip,{title:`Your funds`,children:(0,import_jsx_runtime$2.jsx)(Chip,{icon:(0,import_jsx_runtime$2.jsx)(Kt,{}),label:ow(Ge),sx:ot(Ge)})}),F.buffedCrop&&(0,import_jsx_runtime$2.jsx)(Tooltip,{title:`Sell ${F.buffedCrop.crop.name} cards now for ${F.buffedCrop.multiplier}x value`,children:(0,import_jsx_runtime$2.jsx)(Stack,{direction:`row`,alignItems:`center`,children:(0,import_jsx_runtime$2.jsx)(Chip,{color:`success`,icon:(0,import_jsx_runtime$2.jsx)(Ut,{}),label:(0,import_jsx_runtime$2.jsx)(up,{src:dp(F.buffedCrop.crop),sx:{imageRendering:`pixelated`,filter:`drop-shadow(0 0 5px ${L.palette.common.white})`}}),sx:{...Kn({outline:L.palette.success.dark}),backgroundColor:L.palette.success.light}})})}),(0,import_jsx_runtime$2.jsx)(Tooltip,{title:`Community funds`,children:(0,import_jsx_runtime$2.jsx)(Chip,{icon:(0,import_jsx_runtime$2.jsx)(qt,{}),label:ow(F.table.communityFund),sx:ot()})}),F.nerfedCrop&&(0,import_jsx_runtime$2.jsx)(Tooltip,{title:`${F.nerfedCrop.crop.name} cards now sell for ${F.nerfedCrop.multiplier}x value`,children:(0,import_jsx_runtime$2.jsx)(Stack,{direction:`row`,alignItems:`center`,children:(0,import_jsx_runtime$2.jsx)(Chip,{sx:{flexDirection:`row-reverse`,"& .MuiSvgIcon-root":{ml:-.75,mr:.75},"& .MuiChip-label":{pr:1},...Kn({outline:L.palette.error.dark}),backgroundColor:L.palette.error.light},color:`error`,icon:(0,import_jsx_runtime$2.jsx)(Ht,{}),label:(0,import_jsx_runtime$2.jsx)(up,{src:dp(F.nerfedCrop.crop),sx:{imageRendering:`pixelated`,filter:`drop-shadow(0 0 5px ${L.palette.common.black})`}})})})}),(0,import_jsx_runtime$2.jsx)(Tooltip,{title:`${at}'s funds`,children:(0,import_jsx_runtime$2.jsx)(Chip,{icon:(0,import_jsx_runtime$2.jsx)(Kt,{}),label:it===void 0?``:ow(it),sx:ot(it)})})]}),(0,import_jsx_runtime$2.jsxs)(Accordion,{sx:{width:1,mb:2,borderRadius:`${L.shape.borderRadius}px`,"&.Mui-expanded":{mt:1}},expanded:Ie!==null,children:[(0,import_jsx_runtime$2.jsx)(AccordionSummary,{sx:{"&:hover:not(.Mui-disabled)":{cursor:`default`},"& .MuiAccordionSummary-content":{justifyContent:`center`}},children:(0,import_jsx_runtime$2.jsx)(Typography,{variant:`h6`,component:`h1`,textAlign:`center`,fontWeight:`normal`,children:Re})}),(0,import_jsx_runtime$2.jsx)(AccordionActions,{sx:{justifyContent:`center`},children:Ie})]})]})},lw=new URLSearchParams(window.location.search).has(`debug`),uw=()=>useMediaQuery(useTheme$1().breakpoints.down(`md`)),dw=({actorRef:F,match:I,useGenericPlayerLabels:L=!1})=>{let{showNotification:R}=an(),z=(0,import_react$10.useCallback)((F,I)=>{lw&&console.debug(`Notification: ${(0,import_build.default)(F)}`),R(F,I)},[R]),De=I.currentPlayerId===I.sessionOwnerPlayerId;return(0,import_react$10.useEffect)(()=>{let R=L?on:Ct(I.currentPlayerId??``);F.send({type:g.SET_SHELL,shell:{triggerNotification:({type:F,payload:I})=>{switch(F){case b.CARDS_DRAWN:{let{howMany:F,playerId:R}=I;if(De)z(F===1?`You drew 1 card`:`You drew ${F} cards`,`success`);else{let I=L?on:Ct(R);z(F===1?`${I} drew 1 card`:`${I} drew ${F} cards`,`warning`)}break}case b.CROP_HARVESTED:{let{cropHarvested:{name:F}}=I;De?z(`You harvested and sold a ${F}`,`success`):z(`${R} harvested and sold a ${F}`,`warning`);break}case b.CARD_DISCARDED:{let{cardDiscarded:{name:F}}=I;z(De?`You discarded ${F}`:`${R} discarded ${F}`,`info`);break}case b.CROP_WATERED:{let{cropWatered:{name:F}}=I;z(De?`You watered your ${F}`:`${R} watered their ${F}`,`info`);break}case b.EVENT_CARD_PLAYED:{let{eventCard:F}=I;z(De?`You played ${F.name}`:`${R} played ${F.name}`,`info`);break}case b.TOOL_CARD_PLAYED:{let{toolCard:F}=I;z(De?`You played ${F.name}`:`${R} played ${F.name}`,`info`);break}case b.ALL_CROPS_WATERED:z(`Watered all crops`,`info`);break;default:}}}})},[F,I.currentPlayerId,De,z,L]),{showNotification:z}},fw=({playerSeeds:F,userPlayerId:I,onMatchEnd:L,onCheckpoint:R,initialMatch:z,useGenericPlayerLabels:De})=>{let Oe=CC.useActorRef(),{match:ke,matchState:Ae}=wC(),je=CC.useSelector(({context:F})=>F.botState),[Me,Ne]=(0,import_react$10.useState)(!0),Pe=uw();(0,import_react$10.useEffect)(()=>{lw&&Oe.subscribe(F=>{typeof F.value==`string`&&console.debug(`State: ${F.value}`,F.context)})},[Oe]);let[Fe,Ie]=(0,import_react$10.useState)(!1);(0,import_react$10.useEffect)(()=>{Ae===v.UNINITIALIZED&&(z?Oe.send({type:g.RESUME,matchState:z.matchState,match:z.match,botState:z.botState,userPlayerId:I}):Oe.send({type:g.INIT,playerSeeds:F,userPlayerId:I}))},[Ae,F,I,z,Oe]),(0,import_react$10.useEffect)(()=>{(Ae===v.WAITING_FOR_PLAYER_SETUP_ACTION||Ae===v.WAITING_FOR_PLAYER_TURN_ACTION)&&R?.({matchState:Ae,match:ke,botState:je})},[Ae]);let Le=(0,import_react$10.useRef)(!1);(0,import_react$10.useEffect)(()=>{Ae===v.GAME_OVER?Le.current||(Le.current=!0,L?.(ke.winner)):Le.current=!1},[Ae,ke.winner,L]);let Re=(0,import_react$10.useCallback)(async F=>{try{Ie(!0),await F()}catch{}finally{Ie(!1)}},[Ie]),{showNotification:ze}=dw({actorRef:Oe,match:ke,useGenericPlayerLabels:De}),[Be,Ge]=(0,import_react$10.useState)(-1),rt=(0,import_react$10.useCallback)((...F)=>{if(ke.currentPlayerId===ke.sessionOwnerPlayerId)return Ge(...F)},[ke]),[it,at]=(0,import_react$10.useState)(-1),ot=Be!==-1,st=it!==-1,ct=Ae===v.CHOOSING_CARD_POSITION,lt=(0,import_react$10.useRef)(null),ut=(0,import_react$10.useRef)(null),dt=(0,import_react$10.useMemo)(()=>({blockingOperation:Re,isHandInViewport:Me,setIsHandInViewport:Ne,isNarrowViewport:Pe,showNotification:ze,selectedHandCardIdx:Be,setSelectedHandCardIdx:rt,selectedFieldCardIdx:it,setSelectedFieldCardIdx:at,isHandCardSelected:ot,isFieldCardSelected:st,isHandCardSelectionLocked:ct,handContainerRef:lt,fieldContainerRef:ut}),[Re,Me,Ne,Pe,ze,Be,rt,it,at,ot,st,ct,lt,ut]),ft=ke.sessionOwnerPlayerId===ke.currentPlayerId,pt=Fe||!ft,mt=()=>{Ne(F=>!F)},ht=()=>{Oe.send({type:g.INIT,playerSeeds:F,userPlayerId:I})},gt=[v.PLAYER_WATERING_CROP].includes(Ae),vt=Me||gt,yt=Ae===v.GAME_OVER;return{match:ke,botState:je,handleHandVisibilityToggle:mt,handleClickPlayAgain:ht,isHandDisabled:gt,isInputBlocked:pt,isSelectingFieldPosition:[v.CHOOSING_CARD_POSITION,v.PLAYER_WATERING_CROP].includes(Ae),shellContextValue:dt,showGameOver:yt,showHand:vt}},pw=({playerSeeds:F,userPlayerId:I,fullHeight:L=!1,sx:R=[],onMatchEnd:z,onCheckpoint:De,renderStatusBarContent:Oe,renderGameOverContent:ke,hideDefaultGameOverActions:Ae=!1,initialMatch:je,useGenericPlayerLabels:Me=!1,hideScrollbar:Ne=!1,...Pe})=>{let Fe=useTheme$1(),{match:Ie,handleHandVisibilityToggle:Le,handleClickPlayAgain:Re,isHandDisabled:ze,isInputBlocked:Be,isSelectingFieldPosition:Ge,shellContextValue:rt,showGameOver:it,showHand:at}=fw({playerSeeds:F,userPlayerId:I,onMatchEnd:z,onCheckpoint:De,initialMatch:je,useGenericPlayerLabels:Me}),{winner:ot}=Ie,{selectedHandCardIdx:st,isNarrowViewport:ct,isHandCardSelected:lt,isFieldCardSelected:ut,handContainerRef:dt,fieldContainerRef:ft}=rt,pt=(lt||ut)&&!Ge,mt=(F,I,L)=>{F.length!==0&&F[(I+L+F.length)%F.length]?.focus()},ht=F=>{if(lt){mt(dt.current?[...dt.current.querySelectorAll(`.${fp}`)]:[],st,F);return}if(ut){let I=ft.current?[...ft.current.querySelectorAll(`.${LC}`)]:[],L=I.findIndex(F=>F.getAttribute(`aria-label`)===HC);if(L===-1)return;mt(I,L,F)}},gt=F=>{F.preventDefault()},vt=pn(Fe.spacing(ct?2:3));return(0,import_jsx_runtime$2.jsx)(Ep.Provider,{value:rt,children:(0,import_jsx_runtime$2.jsxs)(Container,{maxWidth:!1,disableGutters:!0,"data-testid":`match`,sx:[{backgroundColor:`#ffba4d`,backgroundImage:`url(${jn.brownDotBackground})`,backgroundSize:Fe.spacing(10),imageRendering:`pixelated`,color:Fe.palette.common.white,display:`flex`,flexDirection:`column`,overflow:`hidden`,transform:`translateZ(0)`,...Be&&{"*":{pointerEvents:`none`}},height:L?`100vh`:void 0},...Tt(R)?R:[R]],...Pe,children:[(0,import_jsx_runtime$2.jsxs)(Box,{sx:{flex:1,minHeight:0,overflowX:`hidden`,overflowY:`auto`,p:vt,pb:`calc(${vt} + ${hn} + ${ct?V[B.COMPACT].height:`0px`})`,maskImage:[`linear-gradient(to right, transparent, #000 ${vt}, #000 calc(100% - ${vt}), transparent)`,`linear-gradient(to bottom, transparent, #000 ${vt}, #000)`].join(`, `),maskComposite:`intersect`,WebkitMaskComposite:`source-in`,...Ne&&{scrollbarWidth:`none`,"&::-webkit-scrollbar":{display:`none`}}},children:[(0,import_jsx_runtime$2.jsx)(cw,{match:Ie,useGenericPlayerLabels:Me}),Oe?.(),(0,import_jsx_runtime$2.jsx)(iw,{sx:{pt:4},match:Ie})]}),ct?(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsx)(Fade,{in:pt,unmountOnExit:!0,children:(0,import_jsx_runtime$2.jsx)(Fab,{color:`secondary`,"aria-label":`Previous card`,onPointerDown:gt,onClick:()=>ht(-1),sx:{position:`fixed`,top:`50%`,left:Fe.spacing(2),transform:`translateY(-50%)`},children:(0,import_jsx_runtime$2.jsx)(Wt,{})})}),(0,import_jsx_runtime$2.jsx)(Fade,{in:pt,unmountOnExit:!0,children:(0,import_jsx_runtime$2.jsx)(Fab,{color:`secondary`,"aria-label":`Next card`,onPointerDown:gt,onClick:()=>ht(1),sx:{position:`fixed`,top:`50%`,right:Fe.spacing(2),transform:`translateY(-50%)`},children:(0,import_jsx_runtime$2.jsx)(Gt,{})})})]}):(0,import_jsx_runtime$2.jsx)(Tooltip,{title:at?`Hide Hand`:`Show Hand`,children:(0,import_jsx_runtime$2.jsx)(Fab,{color:`secondary`,disabled:Be||ze,onClick:Le,sx:{position:`fixed`,bottom:dn(ln,Fe.spacing(2)),left:dn(un,Fe.spacing(2))},children:(0,import_jsx_runtime$2.jsx)(Ht,{sx:{transform:`rotate(${at?0:180}deg)`,transition:Fe.transitions.create([`transform`])}})})}),(0,import_jsx_runtime$2.jsxs)(Dialog,{open:it,children:[(0,import_jsx_runtime$2.jsx)(DialogTitle,{children:`Game Over`}),(0,import_jsx_runtime$2.jsxs)(DialogContent,{children:[`Winner:`,` `,(0,import_jsx_runtime$2.jsx)(`strong`,{children:ot?Me?ot===Ie.sessionOwnerPlayerId?`You`:on:Ct(ot):`No one`}),ke?.(ot)]}),(0,import_jsx_runtime$2.jsx)(DialogActions,{children:!Ae&&(0,import_jsx_runtime$2.jsx)(Button,{onClick:Re,children:`Play again`})})]})]})})},mw=({...F})=>(0,import_jsx_runtime$2.jsx)(CC.Provider,{children:(0,import_jsx_runtime$2.jsx)(ThemeProvider,{theme:_r,children:(0,import_jsx_runtime$2.jsx)(rn,{children:(0,import_jsx_runtime$2.jsx)(pw,{...F})})})}),name=`@jeremyckahn/farmhand-shuffle`,version=`0.1.0`,description=`A card game for farmers`,main=`./dist-lib/index.mjs`,module$1=`./dist-lib/index.mjs`,types=`./dist-lib/index.d.ts`,exports$1={".":{types:`./dist-lib/index.d.ts`,import:`./dist-lib/index.mjs`},"./testing":{types:`./dist-lib/testing.d.ts`,import:`./dist-lib/testing.mjs`},"./package.json":`./package.json`},files=[`dist-lib`],scripts={test:`vitest --run`,"test:watch":`vitest --watch`,start:`vite serve`,"start:storybook":`storybook dev -p 3000 --no-open`,build:`vite build`,"build:lib":`vite build --config vite.lib.config.mts`,"build:storybook":`storybook build`,"fix:lint":`eslint src --fix`,"fix:style":`prettier --write "src/**/*.ts" "src/**/*.tsx"`,check:`npm test -- --coverage && npm run check:lint && npm run check:types`,"check:lint":`eslint src --max-warnings=0`,"check:types":`tsc`,prepare:`husky install || echo 'husky: not a git checkout, skipping' && npm run build:lib`,prepublishOnly:`npm run build:lib`,gitingest:`command -v gitingest >/dev/null 2>&1 || { echo "gitingest not found. Please install it: https://github.com/cyclotruc/gitingest"; exit 1; } && gitingest`,"gitingest:app":`npm run gitingest -- --exclude-pattern="coverage,storybook-static,.vercel,*.piskel,*.test.*,*.stories.*,.github,.storybook"`,"gitingest:app-and-tests":`npm run gitingest -- --exclude-pattern="coverage,storybook-static,.vercel,*.piskel,*.stories.*,.github,.storybook"`},repository={type:`git`,url:`git+ssh://git@github.com/jeremyckahn/farmhand-shuffle.git`},author=`Jeremy Kahn`,license=`GPL-2.0-or-later`,bugs={url:`https://github.com/jeremyckahn/farmhand-shuffle/issues`},homepage=`https://github.com/jeremyckahn/farmhand-shuffle#readme`,devDependencies={"@babel/core":`^7.23.6`,"@babel/plugin-proposal-private-property-in-object":`^7.21.11`,"@babel/preset-env":`^7.23.6`,"@babel/preset-react":`^7.23.3`,"@babel/preset-typescript":`^7.23.3`,"@emotion/react":`^11.11.1`,"@emotion/styled":`^11.11.0`,"@eslint/compat":`^2.0.0`,"@eslint/eslintrc":`^3.3.1`,"@eslint/js":`^9.39.1`,"@mui/material":`^5.14.18`,"@storybook/addon-docs":`^10.0.7`,"@storybook/addon-links":`^10.0.7`,"@storybook/addon-onboarding":`^10.0.7`,"@storybook/addon-themes":`^10.0.7`,"@storybook/react-vite":`^10.4.6`,"@storybook/testing-library":`^0.2.2`,"@stylistic/eslint-plugin":`^5.6.1`,"@testing-library/dom":`^9.3.3`,"@testing-library/jest-dom":`^6.1.6`,"@testing-library/react":`^14.1.2`,"@testing-library/user-event":`^14.5.1`,"@types/localforage":`^0.0.33`,"@types/lodash.clamp":`^4.0.7`,"@types/lodash.clonedeep":`^4.5.9`,"@types/react":`^18.2.18`,"@types/react-dom":`^18.2.7`,"@types/seedrandom":`^3.0.8`,"@types/uuid":`^9.0.2`,"@vitejs/plugin-react":`^5.2.0`,"@vitest/coverage-v8":`^4.1.8`,eslint:`^9.39.1`,"eslint-plugin-functional":`^9.0.2`,"eslint-plugin-import":`^2.32.0`,"eslint-plugin-react":`^7.37.5`,"eslint-plugin-react-hooks":`^7.0.1`,"eslint-plugin-storybook":`^10.0.7`,globals:`^16.5.0`,husky:`^8.0.3`,jsdom:`^27.4.0`,prettier:`^2.8.8`,"pretty-quick":`^3.1.3`,process:`^0.11.10`,react:`^18.2.0`,"react-dom":`^18.2.0`,storybook:`^10.2.13`,typescript:`^5.9.3`,"typescript-eslint":`^8.46.4`,vite:`^8.0.16`,"vite-plugin-dts":`^5.0.3`,vitest:`^4.1.8`,"vitest-mock-extended":`^2.0.2`},peerDependencies={"@emotion/react":`^11.11.1`,"@emotion/styled":`^11.11.0`,"@mui/material":`^5.14.18`,react:`^17.0.2 || ^18.2.0`,"react-dom":`^17.0.2 || ^18.2.0`},browserslist=`> 0.5%, last 2 versions, not dead`,engines={node:`>=22.18.0`},dependencies={"@fontsource/jersey-10":`^5.3.0`,"@fontsource/jersey-20":`^5.3.0`,"@fontsource/jersey-25":`^5.3.0`,"@fontsource/material-icons":`^5.0.7`,"@xstate/react":`^5.0.2`,"fun-animal-names":`^0.1.1`,localforage:`^1.10.0`,"lodash.clamp":`^4.0.3`,"lodash.clonedeep":`^4.5.0`,motion:`^11.11.14`,"react-markdown":`^10.1.0`,"react-node-to-string":`^0.1.2`,"react-router-dom":`^7.18.2`,"react-use":`^17.6.1`,seedrandom:`^3.0.5`,"usehooks-ts":`^2.16.0`,uuid:`^14.0.0`,xstate:`^5.19.1`},package_default={name,version,description,main,module:module$1,types,exports:exports$1,files,scripts,repository,author,license,bugs,homepage,devDependencies,peerDependencies,browserslist,engines,dependencies},FARMHAND_SHUFFLE_LIBRARY_VERSION=package_default.version,BOT_PLAYER_ID=FARMHAND_SHUFFLE_BOT_PLAYER_ID;v.WAITING_FOR_PLAYER_SETUP_ACTION,v.WAITING_FOR_PLAYER_TURN_ACTION;var WagerNumberFormat=(0,import_react$10.forwardRef)((F,I)=>{let{max:L,onChange:R,...z}=F;return(0,import_jsx_runtime$2.jsx)(NumberFormat,{fixedDecimalScale:!0,thousandSeparator:!0,getInputRef:I,...z,allowNegative:!1,decimalScale:2,prefix:`$`,isAllowed:({floatValue:F=0})=>F<=L,onValueChange:({floatValue:F=0})=>R(F)})}),ShuffleResultSummary=({winnerId:F,userPlayerId:I,wager:L,winStreak:R,onPlayAgain:z,onLeave:De})=>{let Oe=F===null,ke=!Oe&&F===I;return(0,import_jsx_runtime$2.jsxs)(Div,{sx:{marginTop:`1em`,textAlign:`center`},children:[(0,import_jsx_runtime$2.jsx)(P$1,{sx:{fontWeight:`bold`},children:L===0?`No wager was placed.`:Oe?`It's a draw — your ${moneyString(L)} wager was refunded.`:ke?`You won ${moneyString(L*2)}!`:`You lost your ${moneyString(L)} wager.`}),ke&&R>1&&(0,import_jsx_runtime$2.jsxs)(P$1,{children:[`Current win streak: `,R]}),(0,import_jsx_runtime$2.jsxs)(Div,{sx:{marginTop:`1em`},children:[(0,import_jsx_runtime$2.jsx)(Button,{color:`primary`,variant:`contained`,onClick:z,sx:{marginRight:`1em`},children:`Play again`}),(0,import_jsx_runtime$2.jsx)(Button,{color:`inherit`,onClick:De,children:`Leave`})]})]})},FarmhandShuffleView=()=>{let{gameState:{farmhandShuffle:F,money:I,playerId:L},handlers:R}=(0,import_react$10.useContext)(FarmhandContext),z=L,[De,Oe]=(0,import_react$10.useState)(F.isMatchInProgress?`playing`:`wager`),[ke,Ae]=(0,import_react$10.useState)(0),je=(0,import_react$10.useRef)(F.wager);F.isMatchInProgress&&(je.current=F.wager);let Me=(0,import_react$10.useMemo)(()=>[{id:z,deck:Xe()},{id:BOT_PLAYER_ID,deck:Xe()}],[z]),Ne=(0,import_react$10.useMemo)(()=>{let{serializedMatch:I}=F;if(I){if(I.libraryVersion!==FARMHAND_SHUFFLE_LIBRARY_VERSION)return`error`;try{return{matchState:I.matchState,match:nt(I.match),botState:I.botState}}catch{return`error`}}},[De]);(0,import_react$10.useEffect)(()=>{Ne===`error`&&(R.handleRefundUnresumableFarmhandShuffleMatch(),Oe(`wager`))},[Ne]);let Pe=()=>{R.handlePlaceFarmhandShuffleWager(ke),Oe(`playing`)},Fe=(0,import_react$10.useRef)(!1),Ie=F=>{Fe.current=!0,R.handleSettleFarmhandShuffleMatch(F,z)};(0,import_react$10.useEffect)(()=>{if(!(F.isMatchInProgress||De!==`playing`)){if(Fe.current){Fe.current=!1;return}Oe(`wager`),Ae(0)}},[F.isMatchInProgress]);let Le=({matchState:F,match:I,botState:L})=>{R.handleSaveFarmhandShuffleMatch({libraryVersion:FARMHAND_SHUFFLE_LIBRARY_VERSION,matchState:F,match:tt(I),botState:L,userPlayerId:z,opponentPlayerId:BOT_PLAYER_ID})},Re=()=>{Ae(je.current),Oe(`wager`)},ze=()=>{Ae(0),Oe(`wager`)};return(0,import_jsx_runtime$2.jsxs)(Div,{className:`FarmhandShuffleView`,sx:{height:`100%`,display:`flex`,flexDirection:`column`,...De===`wager`&&{overflowX:`hidden`,overflowY:`auto`,padding:`0.5rem 0.5rem 8em`,scrollbarWidth:`none`,"&::-webkit-scrollbar":{display:`none`}}},children:[De===`wager`&&(0,import_jsx_runtime$2.jsx)(H2,{sx:{"&&":{fontSize:`2.5em`,marginBottom:`0.6em`,textAlign:`center`,marginTop:`4.75rem`,flexShrink:0,[`@media (min-width: ${breakpoints.largePhone}px)`]:{display:`none`}}},children:`Farmhand Shuffle`}),De===`wager`&&(0,import_jsx_runtime$2.jsxs)(Div,{sx:{maxWidth:`30em`,width:`calc(100% - 2em)`,flexShrink:0,margin:`0 auto 2em`,[`@media (min-width: ${breakpoints.largePhone}px)`]:{marginTop:`4.75em`},[`@media (min-width: ${breakpoints.sm}px)`]:{marginTop:`4.625em`},padding:`0.5em`,background:`rgba(255, 255, 255, 0.5)`,borderRadius:`0.5em`,"& > * + *":{marginTop:`1em`},"& .card-list":{marginBottom:0},"& .card-list > li:last-child":{marginBottom:0}},children:[(0,import_jsx_runtime$2.jsxs)(Card,{children:[(0,import_jsx_runtime$2.jsx)(CardHeader,{subheader:`Wager money on a match. Winning gets you double your money back!`}),(0,import_jsx_runtime$2.jsxs)(CardContent,{children:[(0,import_jsx_runtime$2.jsxs)(P$1,{children:[`You have `,moneyString(I),`.`]}),(0,import_jsx_runtime$2.jsx)(TextField,{variant:`standard`,label:`Wager`,value:ke,inputProps:{max:I,min:0,pattern:`[0-9]*`},onChange:F=>{Ae(Number(F))},InputProps:{inputComponent:WagerNumberFormat}}),(0,import_jsx_runtime$2.jsx)(Div,{sx:{marginTop:`1em`},children:(0,import_jsx_runtime$2.jsx)(Button,{color:`primary`,variant:`contained`,disabled:ke<0||ke>I,onClick:Pe,children:`Start Match`})})]})]}),(0,import_jsx_runtime$2.jsx)(`ul`,{className:`card-list`,children:(0,import_jsx_runtime$2.jsx)(`li`,{children:(0,import_jsx_runtime$2.jsx)(Card,{children:(0,import_jsx_runtime$2.jsx)(CardContent,{children:(0,import_jsx_runtime$2.jsx)(Markdown,{children:`Farmhand Shuffle is a card game for farmers! Just like the Field, the goal is to plant, water, and harvest crops for a profit. Some crop values rise and fall depending on the turn, so try to time your harvest to make the most of it.
|
|
411
411
|
|
|
412
|
-
In Farmhand Shuffle you play against a bot opponent and pay money into a Community Fund at the start of every turn. Whoever avoids bankruptcy the longest wins!`})})})})})]}),De===`playing`&&Ne!==`error`&&(0,import_jsx_runtime$2.jsx)(mw,{playerSeeds:Me,userPlayerId:z,initialMatch:Ne,onMatchEnd:Ie,onCheckpoint:Le,hideDefaultGameOverActions:!0,useGenericPlayerLabels:!0,hideScrollbar:!0,sx:{height:`100%`,backgroundColor:`transparent`,backgroundImage:`none`,color:`black`,"--farmhand-shuffle-placeholder-outline-color":`rgba(0, 0, 0, 0.35)`,"--farmhand-shuffle-content-padding":`0.5rem`,"--farmhand-shuffle-bottom-inset":`0px`,"@media (max-width: 899.95px)":{"--farmhand-shuffle-bottom-inset":`7.5em`},"--farmhand-shuffle-hand-toggle-bottom":`1.4375rem`,"--farmhand-shuffle-hand-toggle-left":`1.4375rem`},renderGameOverContent:I=>(0,import_jsx_runtime$2.jsx)(ShuffleResultSummary,{winnerId:I,userPlayerId:z,wager:je.current,winStreak:F.currentWinStreak,onPlayAgain:Re,onLeave:ze})})]})},brown_dot_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAk0lEQVRoge2UoRGAMBAECZYS8HRDw5QSnxKig88gfgaxl59befPi12wZzz22idr6dp3HPEvu5UtgJXb6gb9YgCaPQG3980B9d4VoLECTU0ClMJHdFaKxAE0eAcXCRHZXiMYCNDkFVAoT2V0hGgvQ5BFQLExkd4VoLECTU0ClMJHdFaKxAE0eAcXCRHZXiMYCNMsLvBG5ypkvoIETAAAAAElFTkSuQmCC`,floorboard_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAAAwCAYAAAD+WvNWAAAAAXNSR0IArs4c6QAAAUxJREFUeJzt3TFuwkAQheEFjSUQoo1EKJIid8oFuFMuwEVyjYgCCrBEayEiuQgtASNBXvDMmv8rt9nR7pPG24x7X/PZT0LryqpKk/HYuwxZ37sA5I0AQWJlVXnX8LC6cPY2rL9/LeyLQTpdAy6hhUFCgCAhQJDYvhicLTatAU3OPqIRW7RHDi0MEgIECQGCpPEjGrFFujObTl68a8CRdblKOd0JLQwSAgQJAYKEAEFCgCCxdbnyrgEncroTexoVrW643dWp7T1xP7QwSAgQJAQIEgIECQGCxLa7uvVNPfbEfdjb67N3DY0Wy02KWlvu/vNsaWGQECBICBAkBAiS3ufHOwOm8GdhX2FeeP3dhhYGCQGChABBQoAgIUCQ2GK58a4hHM7kelfPB4o2lwYx0MIgIUCQECBICBAkNw2YijTYCDFYF345lKOu/O7pAEBLR2y+MLyqAAAAAElFTkSuQmCC`,hay_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACYElEQVRoQ8VYwVEDQQwjbxqgBWqiHTqhDOpg+PKkAd5kNjPL7Dm2Jdkbwi+czyvZss53p4+3l9+Hwt/j0/Phrp/vz0KW/i0nhoAFO47NAHvx6B6Gysy7nk0RYJIzMSoxpst/BNTkDGA1hgE8c85Y2IGImAcOzYEngZEn+r93ho2FBJQqsl1c4xDp9fxxn43fSkAhuyv29PX+erBRpiKKVm0F52/vnEpnrjrg6XEH4MhGPVmsc5ERHte2SkghqgxuJrcWAQWwtT9GqpkLzWsSgQrgCvDMuiUX6gDO2o6eLUp3wiHu7i5KFTuWSksIWdwtuoXOvLjQfA4obWMSe1bY6WrUUXeZU8io7d/dqVBC7F6jEmCHmy0iPQPWDi0Q9sBIWlV5yQSUiv9HF6+WObR7ME/HSg5GWl6X0w5k+wrrREh6inQ8PJSEVLCKzLKZyDbYec2VEPPFwcawJHdtoZO424Hu8HlkqsA9LHf7rKIYAGsE1Ayoml7jd26eXt4WAQROcRi2SFaKlI1GyZWnLwtQjUu/zO0E2DWGiFhLQspQomKwLuVKiPVwtb2VeJVI6ZUSeTMDHBUNXZ9nQAmpFcnARzJCYDMMkIBdxpCWma1yjVHyeUQvBHZIwgJHVWVkxhRDfqW0SZUKKqDZd2daQtHhle5lyx67A1FDzA4wqixbTZTHu059F7olgGh2WGmWVonOgLL3snHtGWCcomqb1sK97XYLgVstamjXGjIrE2BbvILYPUsjX7oLqZamusgOQlQH7vHm5ekfzkDH9ysPtAEIFQfZ6eG7EApWJYKG0KuoesYZ+5TyAAnuGB8AAAAASUVORK5CYIIA`,jack_o_lantern_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAeCAYAAABNChwpAAAA4UlEQVRYR+2VMQ6DMAxFYe4R2LsxdOopuHBv0KkDW/ceoTOVK/0qhICd8K0wNBNyIv3nH5PfTrdhaiqu9vAAz9f768+5O7n4tOmAt7h0tAAIRde+mVbMACCoCTCv4wcQio+Pe9NfrjOOuMaCWACIEBYgUjU3AM1+7LsCVL0CdBjaLrV4JugOiEjVvwCdhxDoMlWzzop27vhZoHWwd//vgLsDWqK6AmjiyTjeO1S5cU51oOQhowGUxjkdIDfO6QDWGcIz7wKQE+cuAOKCNc5pAKVxTgWIISxxTgewDiHOVQf4AHx92LXFZzetAAAAAElFTkSuQmCC`,winter_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAQdJREFUeJztmcERgyAUBZ9pIjVRUa5UldT0K/BITnhKZpgYXYG3Bei6oyCwxFrKPb9EEznpTI/ISZK06PEsp931YkROcweQpBstQNMcoH4zo9EUoD78iBGaAtTR+Qqzxb/xIEgL0DgALUDTTYCjZiAPgrQAjQPQAjQOcNSFe1k3eBagBWgcgBagcYBeRuujmP4NWGIt2zQ44pbXN7aDkaucDFH4E/Cf4OQ4AC1A4wC0AI0D0AI0DkAL0DgALUDjALQAze4AkVM3hyCfmP4N8H4ALUDjALQAjQPQAjQOQAvQOAAtQDNEgD3rkSECSL+fbHstQAvQOAAtQOMAtACNA9ACFWJjNXLSG2nxQbKUEorlAAAAAElFTkSuQmCC`,yellow_dot_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAx0lEQVRoQ+2WwQ3AIAwDYRVW6dx9dg1GKf1WlEcTAUks94maBHzGIt/taqn7aj1TKUe/nDyu59EBPjt3vMADWMMhATcEPCbMnySkhdxYyHoj2vm0kFa5WXVDApESiRaaZQVtHxLQKjerDodApOR5v5FwCMzy5O4+JLBb8X4eJoFIiYRJwNrXkvkkIFFrxb84BCIlD99CK7ys7YlzB7QKWNdhEoiUSJgErH0tmU8CErVW/ItDIFLy8C20wsvanjh3QKuAdV14Ag9MlnJUFzG78wAAAABJRU5ErkJgggAA`,lavender_dot_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAyUlEQVRoQ+2WwRGAIAwEQw0WYf/l+LQAPzaAXwd5mAyQ5OZ8MiaB2+OGcp+1SvNdh8i2t6siEddL7wDfrcdd4QG82ZBAGAIRE+ZPEtJCYSzkvRHrfFrIqtyoui6BTIlEC42ygrUPCViVG1WHQyBT8rzfSDgERnlydR8SWK14Ow+TQKZEwiTg7WvNfBLQqDXjXxwCmZKHb6EZXrb2xLkDVgW86zAJZEokTALevtbMJwGNWjP+xSGQKXn4FprhZWtPnDtgVcC7Lj2BB3XCNohEy6k2AAAAAElFTkSuQmCC`,grass_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABp0lEQVRoQ92Y63HDMAyD5RE6QMfLCp2qi2SODtARkmt7yTmuJIAEeHbiv+LrIyjZ8vJxbpe28/P91drbe66IZQ2gBMql//Ni8o5sZAAm+RqOtd/aUQCzLo4CsAXdYrP2rN2DAhkAZXQcvjSAI1lFjBIAVn4H0K4ADtASALaz7EkzO8V+ARydYItWD4ptrVMAJ5gz1roJ0xFyJnXGogGiclcVOasjvYl7xT4VgGPTOmKkFXAkd8S4AyD50fqoGNZvZjdbex0Ah5xsDFYVJp60B7KFZP16d4pdAJjOsu8gCaCXRO1uFE6+E28TPj1AtIOqinCEqjuqfpIcEiCiIgRAwaoVmt3GftZKAdxwvXjL6bNdsv8lj6BOKYB6wqAGWUaISYLmOBrDcqVUkiLfyN75t4lZZ9YOFauO2SEBItDyMcp+NTJFZVSlATLBoz6Za2UpANN11mb0zUQDsIlYu6g6o81uAcgUk/HpQewG4Hq50b9V2NHI2ClqHAIgA33zgSOkdMcxJij/6wMo8lb5rlWBCkSLQJKjeIy/BIASoHUHgHQfUAtEANH1K9JWO4Tg58LYAAAAAElFTkSuQmCC`,forest_floor_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAWRJREFUaIHlWTkSgzAMNH6AO16V/78inT+QVDREYB2rg8mWjBHs6rBkb+M1Pu2Euc823uP8uCQ69RD583OfMFsUSAJIcMXQEjUTQCms9bqZQHauqAl4xzYXagIZylOi/RCIUlbzHUq0HwJRyqK+415GD3h5NoyAl2dVBO7URCjNsXGs2ahe6ElwD6GVmlaPpfdC1twISWLPvaV7u7g57y0d7WK02it78BBCq72yF7aRecF9oJGGlHQ9SUBiBJ1D0vXuQ/0K0I0sY8qCbmR3xiQNViTYScxRKmPMLFlGJZ6En0pEtx7wUwmvMLoShl2Fss+BroRhVyGOsqWrEAfWMqzBf55KVEIZApD7gcxKA7kfoIxkl88Velv8pFaZKOK9OVWIqMbOlMQaldFtuYmARmVUW36QZBOolswHyWUSn1+oBrck1kDj5TI7cVMKyb6lfMxQb5m0rtZIiEFO5tAfk8wJ0jD6AhfOowgv6la0AAAAAElFTkSuQmCC`,Stage=({dayCount:F,field:I,isMenuOpen:L=!0,stageFocus:R,useAlternateEndDayButtonPosition:z=!1,viewTitle:De})=>{let Oe=(0,import_react$10.useRef)(null);(0,import_react$10.useEffect)(()=>{if(Oe.current){let F=Oe.current,{style:I}=F;F.scrollTop=0,I.overflow=`hidden`,setTimeout(()=>I.overflow=``,0)}},[R]);let ke={[stageFocusType.HOME]:isOctober()?jack_o_lantern_bg_default:isDecember()?winter_bg_default:brown_dot_bg_default,[stageFocusType.SHOP]:yellow_dot_bg_default,[stageFocusType.WORKSHOP]:lavender_dot_bg_default,[stageFocusType.CELLAR]:floorboard_default,[stageFocusType.FIELD]:grass_default,[stageFocusType.COW_PEN]:grass_default,[stageFocusType.FOREST]:forest_floor_default,[stageFocusType.FARMHAND_SHUFFLE]:hay_bg_default}[R],Ae=[stageFocusType.FIELD,stageFocusType.COW_PEN,stageFocusType.FOREST].includes(R);return(0,import_jsx_runtime$2.jsxs)(Div,{className:(0,import_classnames.default)(`Stage`,{"is-october":isOctober(),"is-december":isDecember()}),"data-stage-focus":R,role:`main`,ref:Oe,sx:I=>({flex:2,imageRendering:`pixelated`,marginLeft:0,overflow:`auto`,padding:`1.5em 1.5em 0`,position:`relative`,zIndex:0,transition:I.transitions.create(`margin-left`,{duration:I.transitions.duration.enteringScreen,easing:I.transitions.easing.easeOut}),"& .stage-background":{backgroundSize:`96px`,bottom:0,left:0,pointerEvents:`none`,position:`fixed`,right:0,top:0,zIndex:-1,...ke?{backgroundImage:`url(${ke})`}:{},...Ae?{backgroundSize:`30%`,filter:seasonFilterMap[getCurrentSeason(F)],[`@media (min-width: ${breakpoints.md}px)`]:{backgroundSize:`10%`}}:{},...R===stageFocusType.CELLAR?{backgroundSize:`288px 96px`}:{}},"& h3":{textAlign:`center`},"& h2":{fontSize:`1.2em`},"& .view-title":{fontSize:`2.5em`,marginBottom:`0.6em`,textAlign:`center`,[`@media (min-width: ${breakpoints.largePhone}px)`]:{display:`none`},...R===stageFocusType.FARMHAND_SHUFFLE&&{display:`none`}},"& section":{padding:`0.5em 0`,[`@media (max-width: ${breakpoints.sm}px)`]:{fontSize:`1em`}},...z?{paddingTop:`4em`,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{paddingTop:`4.5em`}}:{},...L?{transitionProperty:`padding, margin-left`,[`@media (max-width: ${breakpoints.sm}px)`]:{padding:0},"& > *:not(.stage-background)":{opacity:1,transition:I.transitions.create(`opacity`,{duration:I.transitions.duration.enteringScreen,easing:I.transitions.easing.easeOut}),[`@media (max-width: ${breakpoints.sm}px)`]:{opacity:0}}}:{marginLeft:`-${layout.sidebarWidth}`,transition:I.transitions.create(`margin-left`,{duration:I.transitions.duration.leavingScreen,easing:I.transitions.easing.sharp}),[`@media (max-width: ${breakpoints.smallPhone}px)`]:{marginLeft:`-${layout.narrowSidebarWidth}px`}},...R===stageFocusType.FARMHAND_SHUFFLE?{overflow:`hidden`,padding:0}:{}}),children:[(0,import_jsx_runtime$2.jsx)(`div`,{className:`stage-background`}),(0,import_jsx_runtime$2.jsx)(`h2`,{className:`view-title`,children:De}),R===stageFocusType.HOME&&(0,import_jsx_runtime$2.jsx)(Consumer$7,{}),R===stageFocusType.FIELD&&(0,import_jsx_runtime$2.jsx)(Consumer$10,{columns:I[0].length,rows:I.length}),R===stageFocusType.FOREST&&(0,import_jsx_runtime$2.jsx)(Forest,{}),R===stageFocusType.SHOP&&(0,import_jsx_runtime$2.jsx)(Consumer$4,{}),R===stageFocusType.COW_PEN&&(0,import_jsx_runtime$2.jsx)(Consumer$6,{}),R===stageFocusType.WORKSHOP&&(0,import_jsx_runtime$2.jsx)(Consumer$1,{}),R===stageFocusType.CELLAR&&(0,import_jsx_runtime$2.jsx)(Cellar,{}),R===stageFocusType.FARMHAND_SHUFFLE&&(0,import_jsx_runtime$2.jsx)(FarmhandShuffleView,{}),R!==stageFocusType.FARMHAND_SHUFFLE&&(0,import_jsx_runtime$2.jsx)(`div`,{className:`spacer`})]})};function Consumer(F){return(0,import_jsx_runtime$2.jsx)(FarmhandContext.Consumer,{children:({gameState:I,handlers:L})=>(0,import_jsx_runtime$2.jsx)(Stage,{...I,...L,...F})})}var scriptRel=`modulepreload`,assetsURL=function(F,I){return new URL(F,I).href},seen={},__vitePreload=function(F,I,L){let R=Promise.resolve();if(I&&I.length>0){let F=document.getElementsByTagName(`link`),z=document.querySelector(`meta[property=csp-nonce]`),De=z?.nonce||z?.getAttribute(`nonce`);function Oe(F){return Promise.all(F.map(F=>Promise.resolve(F).then(F=>({status:`fulfilled`,value:F}),F=>({status:`rejected`,reason:F}))))}function ke(F){return import.meta.resolve?import.meta.resolve(F):new URL(F,import.meta.url).href}R=Oe(I.map(I=>{if(I=assetsURL(I,L),I=ke(I),I in seen)return;seen[I]=!0;let R=I.endsWith(`.css`);for(let L=F.length-1;L>=0;L--){let z=F[L];if(z.href===I&&(!R||z.rel===`stylesheet`))return}let z=document.createElement(`link`);if(z.rel=R?`stylesheet`:scriptRel,R||(z.as=`script`),z.crossOrigin=``,z.href=I,De&&z.setAttribute(`nonce`,De),document.head.appendChild(z),R)return new Promise((F,L)=>{z.addEventListener(`load`,F),z.addEventListener(`error`,()=>L(Error(`Unable to preload CSS for ${I}`)))})}))}function z(F){let I=new Event(`vite:preloadError`,{cancelable:!0});if(I.payload=F,window.dispatchEvent(I),!I.defaultPrevented)throw F}return R.then(I=>{for(let F of I||[])F.status===`rejected`&&z(F.reason);return F().catch(z)})},autoUpdateMode=`false`,selfDestroying=`false`,auto=autoUpdateMode===`true`,autoDestroy=selfDestroying===`true`;function registerSW(F={}){let{immediate:I=!1,onNeedReload:L,onNeedRefresh:R,onOfflineReady:z,onRegistered:De,onRegisteredSW:Oe,onRegisterError:ke}=F,Ae,je,Me,Ne=async(F=!0)=>{await je,auto||Me?.()};async function Pe(){if(`serviceWorker`in navigator){if(Ae=await __vitePreload(async()=>{let{Workbox:F}=await import(`./workbox-window.prod.es5-Bd17z0YL.js`);return{Workbox:F}},[],import.meta.url).then(({Workbox:F})=>new F(`./service-worker.js`,{scope:`./`,type:`classic`})).catch(F=>{ke?.(F)}),!Ae)return;if(Me=()=>{Ae?.messageSkipWaiting()},!autoDestroy)if(auto)Ae.addEventListener(`activated`,F=>{(F.isUpdate||F.isExternal)&&(L?L():window.location.reload())}),Ae.addEventListener(`installed`,F=>{F.isUpdate||z?.()});else{let F=!1,I=()=>{F=!0,Ae?.addEventListener(`controlling`,F=>{F.isUpdate&&(L?L():window.location.reload())}),R?.()};Ae.addEventListener(`installed`,L=>{L.isUpdate===void 0?L.isExternal===void 0?!F&&z?.():L.isExternal?I():!F&&z?.():L.isUpdate||z?.()}),Ae.addEventListener(`waiting`,I)}Ae.register({immediate:I}).then(F=>{Oe?Oe(`./service-worker.js`,F):De?.(F)}).catch(F=>{ke?.(F)})}}return je=Pe(),Ne}function useRegisterSW(F={}){let{immediate:I=!0,onNeedReload:L,onNeedRefresh:R,onOfflineReady:z,onRegistered:De,onRegisteredSW:Oe,onRegisterError:ke}=F,[Ae,je]=(0,import_react$10.useState)(!1),[Me,Ne]=(0,import_react$10.useState)(!1),[Pe]=(0,import_react$10.useState)(()=>registerSW({immediate:I,onNeedReload:L,onOfflineReady(){Ne(!0),z?.()},onNeedRefresh(){je(!0),R?.()},onRegistered:De,onRegisteredSW:Oe,onRegisterError:ke}));return{needRefresh:[Ae,je],offlineReady:[Me,Ne],updateServiceWorker:Pe}}var RELOAD_FALLBACK_DELAY=1e3,UpdateNotifier=()=>{let{gameState:{hasBooted:F},handlers:{handleGameUpdateAvailable:I}}=(0,import_react$10.useContext)(FarmhandContext),{needRefresh:[L],updateServiceWorker:R}=useRegisterSW(),z=(0,import_react$10.useRef)(!1);return(0,import_react$10.useEffect)(()=>{!L||!F||z.current||(z.current=!0,I(async()=>{await R(!0),setTimeout(()=>window.location.reload(),RELOAD_FALLBACK_DELAY)}),window.addEventListener(`beforeunload`,()=>{R(!0)}))},[L,F,I,R]),null},commonFetchConfig={mode:`cors`,cache:`no-cache`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},redirect:`follow`,referrerPolicy:`no-referrer`};async function getData(F=``,I={}){let L=new URLSearchParams;return Object.keys(I).forEach(F=>L.append(encodeURIComponent(F),encodeURIComponent(I[F]))),(await fetch(`${F}?${L}`,{...commonFetchConfig,method:`GET`})).json()}async function postData(F=``,I={}){return(await fetch(F,{...commonFetchConfig,method:`POST`,body:JSON.stringify(I)})).json()}var createNewField=()=>Array(10).fill(void 0).map(()=>[,,,,,,].fill(null)),createNewForest=()=>[,].fill(void 0).map(()=>[,,,,].fill(null)),doesMenuObstructStage=()=>window.innerWidth<BREAKPOINTS.MD,getAvailableShopInventory=memoize(F=>inventory.filter(({id:I})=>!(unlockableItems.hasOwnProperty(I)&&!F.items.hasOwnProperty(I)))),getPeerMetadata=F=>{let I=PEER_METADATA_STATE_KEYS.reduce((I,L)=>(I[L]=F[L],I),{});return Object.assign(I,{cowOfferedForTrade:F.cowInventory.find(({id:I})=>I===F.cowIdOfferedForTrade)}),I},getViewList=({isFarmhandShuffleUnlocked:F,isForestUnlocked:I,purchasedCellar:L,purchasedCowPen:R,showHomeScreen:z})=>{let{CELLAR:De,COW_PEN:Oe,HOME:ke,WORKSHOP:Ae,FOREST:je,FARMHAND_SHUFFLE:Me}=stageFocusType,Ne=[...STANDARD_VIEW_LIST];return z&&Ne.unshift(ke),I&&Ne.push(je),R&&Ne.push(Oe),Ne.push(Ae),L&&Ne.push(De),F&&Ne.push(Me),Ne},getValidatedStageFocusFromHash=F=>{let I=getHashQueryParams().get(VIEW_QUERY_PARAM_NAME);if(!I)return;let L=getLevelEntitlements(levelAchieved(F.experience)),R=L.stageFocusType[stageFocusType.FOREST],z=L.stageFocusType[stageFocusType.FARMHAND_SHUFFLE];return getViewList({isFarmhandShuffleUnlocked:z,isForestUnlocked:R,purchasedCellar:F.purchasedCellar,purchasedCowPen:F.purchasedCowPen,showHomeScreen:F.showHomeScreen}).find(F=>F===I)},sleep=F=>new Promise(I=>setTimeout(I,F)),{PLANT}=fieldMode,{MULCH}=itemType,FarmhandService=class{static computePlayerInventory=memoize((F,I)=>F.map(({quantity:F,id:L})=>({quantity:F,...itemsMap[L],value:getItemCurrentValue(itemsMap[L],I)})));static getFieldToolInventory=memoize(F=>F.filter(({id:F})=>{let I=itemsMap[F];return typeof I.enablesFieldMode==`string`&&I.enablesFieldMode!==PLANT&&I.type!==MULCH}).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static getPlantableCropInventory=memoize(F=>F.filter(({id:F})=>itemsMap[F].isPlantableCrop).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static getMulchInventory=memoize(F=>F.filter(({id:F})=>itemsMap[F]?.type===MULCH).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static getPlantableTreeInventory=memoize(F=>F.filter(({id:F})=>itemsMap[F]?.isPlantableTree).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static applyPriceEvents=(F,I,L)=>{let R={...F};return Object.keys(I).forEach(F=>{R[F]=.5}),Object.keys(L).forEach(F=>{R[F]=1.5}),R}},itemIds=Object.keys(itemsMap),getInventoryQuantities=F=>{let I={};for(let F of itemIds)I[F]=0;for(let{id:L,quantity:R}of F)I[L]=R;return I},useFarmhandNavigation=(F,I)=>({openDialogView:(0,import_react$10.useCallback)(I=>{F(F=>({...F,currentDialogView:I,isDialogViewOpen:!0}))},[F]),closeDialogView:(0,import_react$10.useCallback)(()=>{F(F=>({...F,isDialogViewOpen:!1}))},[F]),focusNextView:(0,import_react$10.useCallback)(()=>{document.activeElement?.getAttribute(`role`)!==`tab`&&F(F=>{let L=I.indexOf(F.stageFocus);return{...F,stageFocus:I[(L+1)%I.length]}})},[F,I]),focusPreviousView:(0,import_react$10.useCallback)(()=>{document.activeElement?.getAttribute(`role`)!==`tab`&&F(F=>{let L=I.indexOf(F.stageFocus),R=L===0?I.length-1:(L-1)%I.length;return{...F,stageFocus:I[R]}})},[F,I])}),{floor,random,sin}=Math,libName=`Trystero`,alloc=(F,I)=>Array(F).fill(void 0).map(I),charSet=`0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz`,genId=F=>alloc(F,()=>charSet[floor(random()*62)]??``).join(``),selfId=genId(20),all=Promise.all.bind(Promise),isBrowser=typeof window<`u`,{entries,fromEntries,keys,values}=Object,noOp=()=>{},candidateType=`candidate`,resetTimer=F=>(F!==null&&clearTimeout(F),null),mkErr=F=>Error(`${libName}: ${F}`),toErrorMessage=(F,I)=>F instanceof Error&&F.message?F.message:typeof F==`string`&&F?F:toJson(F??I),toError=(F,I)=>F instanceof Error?F:mkErr(toErrorMessage(F,I)),encoder=new TextEncoder,decoder=new TextDecoder,encodeBytes=F=>encoder.encode(F),decodeBytes=F=>decoder.decode(F),toHex=F=>F.reduce((F,I)=>F+I.toString(16).padStart(2,`0`),``),topicPath=(...F)=>F.join(`@`),shuffle=(F,I)=>{let L=[...F],R=()=>{let F=sin(I++)*1e4;return F-floor(F)},z=L.length;for(;z;){let F=floor(R()*z--),I=L[z];L[z]=L[F],L[F]=I}return L},getRelays=(F,I,L,R=!1)=>F.relayConfig?.urls||(R?shuffle(I,strToNum(F.appId)):I).slice(0,F.relayConfig?.redundancy??L),toJson=JSON.stringify,fromJson=F=>{try{return JSON.parse(F)}catch{throw mkErr(`failed to parse JSON: ${F}`)}},strToNum=(F,I=2**53-1)=>F.split(``).reduce((F,I)=>F+I.charCodeAt(0),0)%I,defaultRetryMs=3333,socketRetryPeriods={},reconnectionLockingPromise=null,resolver=null,pauseRelayReconnection=()=>{reconnectionLockingPromise||=new Promise(F=>{resolver=F}).finally(()=>{resolver=null,reconnectionLockingPromise=null})},resumeRelayReconnection=()=>{resolver?.()},makeSocket=(F,I)=>{let L={},R=()=>{let z=new WebSocket(F);z.onclose=()=>{if(reconnectionLockingPromise){reconnectionLockingPromise.then(R);return}socketRetryPeriods[F]??=defaultRetryMs,setTimeout(R,socketRetryPeriods[F]),socketRetryPeriods[F]*=2},z.onmessage=F=>I(String(F.data)),L.socket=z,L.url=z.url,L.ready=new Promise(I=>z.onopen=()=>{I(L),socketRetryPeriods[F]=defaultRetryMs}),L.send=F=>{z.readyState===1&&z.send(F)}};return R(),L},createRelayManager=F=>{let I={},L=new WeakMap,R=F=>{let I=L.get(F);if(!I)throw mkErr(`relay bookkeeping missing registration for relay client`);return I};return{register:(F,R)=>(I[F]=R,L.set(R,F),R),keyOf:R,scoped:()=>{let F={},I=I=>F[I]??={};return{forKey:I,forRelay:F=>I(R(F))}},getSockets:()=>fromEntries(entries(I).flatMap(([I,L])=>{let R=F(L);return R?[[I,R]]:[]}))}},watchOnline=()=>{if(isBrowser){let F=new AbortController;return addEventListener(`online`,resumeRelayReconnection,{signal:F.signal}),addEventListener(`offline`,pauseRelayReconnection,{signal:F.signal}),()=>F.abort()}return noOp},algo=`AES-GCM`,strToSha1={},pack=F=>btoa(String.fromCharCode.apply(null,Array.from(new Uint8Array(F)))),unpack=F=>{let I=atob(F);return new Uint8Array(I.length).map((F,L)=>I.charCodeAt(L)).buffer},hashWith=async(F,I)=>new Uint8Array(await crypto.subtle.digest(F,encodeBytes(I))),sha1=async F=>strToSha1[F]??=Array.from(await hashWith(`SHA-1`,F)).map(F=>F.toString(36)).join(``),genKey=async(F,I,L)=>crypto.subtle.importKey(`raw`,await crypto.subtle.digest({name:`SHA-256`},encodeBytes(`${F}:${I}:${L}`)),{name:algo},!1,[`encrypt`,`decrypt`]),deriveRoomNamespace=async(F,I)=>toHex(await hashWith(`SHA-256`,`${libName}:${F}:${I}`)),joinChar=`$`,ivJoinChar=`,`,encrypt=async(F,I)=>{let L=crypto.getRandomValues(new Uint8Array(16));return L.join(ivJoinChar)+joinChar+pack(await crypto.subtle.encrypt({name:algo,iv:L},await F,encodeBytes(I)))},decrypt=async(F,I)=>{let[L,R]=I.split(joinChar);return decodeBytes(await crypto.subtle.decrypt({name:algo,iv:new Uint8Array(L?.split(ivJoinChar).map(Number)??[])},await F,unpack(R??``)))},offerTtl=57333,offerLeaseTtlMs=18e4,poolSize=20,OfferPool=class{pool=[];pooled=new Set;leased=new Map;recycling=new Set;cleanupTimer=null;active=!1;constructor(F){this.makeOffer=F}get isActive(){return this.active}warmup(){this.pool=[],this.pooled.clear(),alloc(poolSize,this.makeOffer).forEach(F=>this.push(F)),this.active=!0,this.cleanupTimer=setInterval(()=>{this.pool=this.pool.filter(F=>F.isDead?(this.pooled.delete(F),!1):!0)},offerTtl)}push(F){F.isDead||this.pooled.has(F)||this.leased.has(F)||(this.pool.push(F),this.pooled.add(F))}shift(F){let I=[];for(;I.length<F&&this.pool.length>0;){let F=this.pool.shift();if(!F)break;this.pooled.delete(F),I.push(F)}return I}claimLeased(F){let I=this.leased.get(F);I&&(resetTimer(I),this.leased.delete(F))}recycle(F){if(!(F.isDead||this.recycling.has(F))){if(F.connection.remoteDescription){F.destroy();return}if(!this.active){F.destroy();return}this.recycling.add(F),F.setHandlers({connect:noOp,close:noOp,error:noOp}),F.getOffer(!0).then(I=>{if(!I||I.type!==`offer`||F.isDead||!this.active){F.destroy();return}this.push(F)}).catch(()=>F.destroy()).finally(()=>this.recycling.delete(F))}}reclaimLeased(F){let I=this.leased.get(F);I&&(resetTimer(I),this.leased.delete(F),this.recycle(F))}lease(F){this.claimLeased(F),this.leased.set(F,setTimeout(()=>{this.leased.delete(F),this.recycle(F)},offerLeaseTtlMs))}checkout(F,I,L){let R=this.shift(F),z=Math.max(0,F-R.length);z>0&&R.push(...alloc(z,this.makeOffer));let De=async(F,R=!1)=>{try{let R=await L(F);return I?(this.lease(F),{peer:F,offer:R,claim:()=>this.claimLeased(F),reclaim:()=>this.reclaimLeased(F)}):{peer:F,offer:R}}catch(I){if(this.claimLeased(F),this.pooled.delete(F),F.destroy(),!R)return De(this.makeOffer(),!0);throw I}};return all(R.map(F=>De(F)))}getOffers(F,I){return this.checkout(F,!0,I)}destroy(){this.active=!1,this.cleanupTimer&&=(clearInterval(this.cleanupTimer),null),this.pool.forEach(F=>F.destroy()),this.pool=[],this.pooled.clear(),this.leased.forEach((F,I)=>{resetTimer(F),I.destroy()}),this.leased.clear(),this.recycling.forEach(F=>F.destroy()),this.recycling.clear()}},overlapRoomPasswordErr=mkErr(`incorrect password for overlapping room`),createPasswordHandshake=(F,I,L)=>{let R=R=>hashWith(`SHA-256`,`${R}:${F}:${I}:${L}`).then(toHex),z=async(I,L,z)=>{if(!F)return;if(z){let F=genId(36);await I({__trystero_pw:`challenge`,c:F});let{data:z}=await L();if(!z||typeof z!=`object`||z.__trystero_pw!==`response`||typeof z.h!=`string`)throw overlapRoomPasswordErr;let De=await R(F);if(z.h!==De)throw overlapRoomPasswordErr;return}let{data:De}=await L();if(!De||typeof De!=`object`||De.__trystero_pw!==`challenge`||typeof De.c!=`string`)throw overlapRoomPasswordErr;await I({__trystero_pw:`response`,h:await R(De.c)})};return{run:z,compose:I=>F||I?async(F,L,R,De)=>{await z(L,R,De),await I?.(F,L,R,De)}:void 0}},iceTimeout=15e3,disconnectedCloseDelayMs=5e3,iceStateEvent=`icegatheringstatechange`,offerType=`offer`,answerType=`answer`,outOfRangePattern=/out of range/i,rewriteMdnsCandidatesToLoopback=F=>F.replace(/ (\S+\.local) (\d+) typ host/g,` 127.0.0.1 $2 typ host`),peer_default=(F,{trickleIce:I,rtcConfig:L,rtcPolyfill:R,turnConfig:z,_test_only_mdnsHostFallbackToLoopback:De})=>{let Oe=new(R??RTCPeerConnection)({iceServers:defaultIceServers.concat(z??[]),...L}),ke={},Ae=[],je=[],Me=I!==!1,Ne=[],Pe=[],Fe=!1,Ie=!1,Le=null,Re=null,ze=!1,Be=()=>Re=resetTimer(Re),Ge=()=>{ze||(ze=!0,Be(),ke.close?.())},rt=F=>{ke.signal?ke.signal(F):Ae.push(F)},it=F=>{let I=ke.signal;ke.signal=L=>{I?.(L),F(L)},Ae.length>0&&Ae.splice(0).forEach(F=>ke.signal?.(F))},at=F=>De?rewriteMdnsCandidatesToLoopback(F):F,ot=F=>{if(!De||typeof F.candidate!=`string`)return F;let I=rewriteMdnsCandidatesToLoopback(F.candidate);return I===F.candidate?F:{...F,candidate:I}},st=F=>({type:F.localDescription?.type??offerType,sdp:at(F.localDescription?.sdp??``)}),ct=()=>{let F=Oe.remoteDescription?.sdp;return F?F.match(/a=ice-ufrag:([^\s]+)/)?.[1]??null:null},lt=()=>(Oe.remoteDescription?.sdp?.match(/^m=/gm)??[]).length,ut=F=>{if(!Oe.remoteDescription)return!1;let I=lt();if(typeof F.sdpMLineIndex==`number`&&I>0&&F.sdpMLineIndex>=I)return!1;let L=ct();return!(L&&F.usernameFragment&&F.usernameFragment!==L)},dt=async F=>{try{return await Oe.addIceCandidate(F),!0}catch(I){if(I instanceof Error&&outOfRangePattern.test(I.message)&&typeof F.sdpMLineIndex==`number`)return!1;throw I}},ft=async()=>{if(!Oe.remoteDescription||Ne.length===0)return;let F=Ne.splice(0),I=[];for(let L of F){if(!ut(L)){I.push(L);continue}await dt(L)||I.push(L)}I.length>0&&Ne.push(...I)},pt=async F=>{if(ut(F)){await dt(F)||Ne.push(F);return}Ne.push(F)},mt=F=>{F.binaryType=`arraybuffer`,F.bufferedAmountLowThreshold=65535,F.onmessage=F=>{let I=F.data;ke.data?ke.data(I):je.push(I)},F.onopen=()=>ke.connect?.(),F.onclose=Ge,F.onerror=({error:F})=>ke.error?.(toError(F,`data channel error`))},ht=async F=>{let I=null;try{await Promise.race([new Promise(I=>{let L=()=>{F.iceGatheringState===`complete`&&(F.removeEventListener(iceStateEvent,L),I())};F.addEventListener(iceStateEvent,L),L()}),new Promise(F=>{I=setTimeout(F,iceTimeout)})])}finally{resetTimer(I)}return st(F)},gt=async()=>{let F=Me?st(Oe):await ht(Oe);return rt(F),F};F?(Le=Oe.createDataChannel(`data`),mt(Le)):Oe.ondatachannel=({channel:F})=>{Le=F,mt(F)};let vt=async(F=!1)=>{if(Oe.connectionState!==`closed`)try{return Fe=!0,F&&(Oe.signalingState!==`stable`&&Oe.signalingState!==`closed`&&Oe.localDescription?.type===offerType&&await Oe.setLocalDescription({type:`rollback`}),typeof Oe.restartIce==`function`&&Oe.restartIce()),await Oe.setLocalDescription(F?await Oe.createOffer({iceRestart:!0}):void 0),await gt()}catch(F){ke.error?.(toError(F,`failed to create local offer`))}finally{Fe=!1}};Oe.onnegotiationneeded=async()=>vt(!1),Oe.onicecandidate=({candidate:F})=>{if(!Me||!F)return;let I=ot(typeof F.toJSON==`function`?F.toJSON():{candidate:F.candidate,sdpMid:F.sdpMid,sdpMLineIndex:F.sdpMLineIndex,usernameFragment:F.usernameFragment});rt({type:candidateType,sdp:JSON.stringify(I)})},Oe.onconnectionstatechange=()=>{if(Oe.connectionState===`connected`||Oe.connectionState===`connecting`){Be();return}if(Oe.connectionState===`disconnected`){Re||=setTimeout(()=>{Re=null,Oe.connectionState===`disconnected`&&Ge()},disconnectedCloseDelayMs);return}(Oe.connectionState===`failed`||Oe.connectionState===`closed`)&&Ge()},Oe.ontrack=F=>{let I=F.streams[0];if(I){if(!ke.track&&!ke.stream){Pe.push({track:F.track,stream:I});return}ke.track?.(F.track,I),ke.stream?.(I)}},Oe.onremovestream=F=>ke.stream?.(F.stream);let yt=F?new Promise(F=>it(I=>{I.type===offerType&&F(I)})):Promise.resolve();return F&&queueMicrotask(()=>{!Fe&&Oe.signalingState===`stable`&&!Oe.localDescription&&Oe.connectionState!==`closed`&&Oe.onnegotiationneeded?.(new Event(`negotiationneeded`))}),{created:Date.now(),connection:Oe,get channel(){return Le},get isDead(){return Oe.connectionState===`closed`},getOffer:async(I=!1)=>{if(F)return I?vt(!0):Oe.localDescription?.type===offerType?Me?st(Oe):ht(Oe):yt},async signal(I){if(I.type===`candidate`){try{let F=JSON.parse(I.sdp);F&&typeof F==`object`&&await pt(ot(F))}catch(F){ke.error?.(toError(F,`failed to parse remote candidate`))}return}if(!(Le?.readyState===`open`&&!I.sdp?.includes(`a=rtpmap`)))try{let L={...I,sdp:at(I.sdp)};if(I.type===offerType){if(Fe||Oe.signalingState!==`stable`&&!Ie){if(F)return;await all([Oe.setLocalDescription({type:`rollback`}),Oe.setRemoteDescription(L)])}else await Oe.setRemoteDescription(L);return await ft(),await Oe.setLocalDescription(),await gt()}if(I.type===answerType){Ie=!0;try{await Oe.setRemoteDescription(L),await ft()}finally{Ie=!1}}}catch(F){ke.error?.(toError(F,`failed to apply remote signal`))}},sendData:F=>Le?.send(F),destroy:()=>{Be(),Le?.close(),Oe.close(),Fe=!1,Ie=!1,Ge()},setHandlers:F=>{let{signal:I,...L}=F;Object.assign(ke,L),ke.data&&je.length>0&&je.splice(0).forEach(F=>ke.data?.(F)),I&&it(I),(ke.track||ke.stream)&&Pe.length>0&&Pe.splice(0).forEach(({track:F,stream:I})=>{ke.track?.(F,I),ke.stream?.(I)})},offerPromise:yt,addStream:F=>F.getTracks().forEach(I=>Oe.addTrack(I,F)),removeStream:F=>Oe.getSenders().filter(I=>I.track&&F.getTracks().includes(I.track)).forEach(F=>Oe.removeTrack(F)),addTrack:(F,I)=>Oe.addTrack(F,I),removeTrack:F=>{let I=Oe.getSenders().find(I=>I.track===F);I&&Oe.removeTrack(I)},replaceTrack:(F,I)=>{let L=Oe.getSenders().find(I=>I.track===F);if(L)return L.replaceTrack(I)}}},defaultIceServers=[...alloc(3,(F,I)=>`stun:stun${I||``}.l.google.com:19302`),`stun:stun.cloudflare.com:3478`].map(F=>({urls:F})),TypedArray=Object.getPrototypeOf(Uint8Array),typeByteLimit=32,typeIndex=0,nonceIndex=32,tagIndex=34,progressIndex=35,payloadIndex=36,chunkSize=16*2**10-payloadIndex,oneByteMax=255,twoByteMax=65535,buffLowEvent=`bufferedamountlow`,channelCloseEvent=`close`,channelErrorEvent=`error`,unloadEvent=`beforeunload`,defaultHandshakeTimeoutMs=1e4,backpressureWaitTimeoutMs=1e4,internalNs=F=>`@_`+F,beforeUnloadRoomCleanups=new Set,cleanupActiveRoomsOnBeforeUnload=()=>beforeUnloadRoomCleanups.forEach(F=>F()),registerBeforeUnloadCleanup=F=>(beforeUnloadRoomCleanups.add(F),beforeUnloadRoomCleanups.size===1&&addEventListener(unloadEvent,cleanupActiveRoomsOnBeforeUnload),()=>{beforeUnloadRoomCleanups.delete(F),beforeUnloadRoomCleanups.size||removeEventListener(unloadEvent,cleanupActiveRoomsOnBeforeUnload)}),toByteArray=F=>F instanceof ArrayBuffer?new Uint8Array(F):new Uint8Array(F.buffer,F.byteOffset,F.byteLength),toHandshakeErrorMessage=F=>{let I=toErrorMessage(F,`unknown error`);return I.startsWith(`handshake `)?I:`handshake failed: ${I}`},waitForBufferedAmountLow=(F,I=backpressureWaitTimeoutMs)=>F.readyState!==`open`||F.bufferedAmount<=F.bufferedAmountLowThreshold?Promise.resolve(F.readyState===`open`):new Promise(L=>{let R=!1,z=null,De=I=>{R||(R=!0,F.removeEventListener(buffLowEvent,Oe),F.removeEventListener(channelCloseEvent,ke),F.removeEventListener(channelErrorEvent,ke),resetTimer(z),L(I))},Oe=()=>De(!0),ke=()=>De(!1);if(F.addEventListener(buffLowEvent,Oe),F.addEventListener(channelCloseEvent,ke),F.addEventListener(channelErrorEvent,ke),z=setTimeout(()=>De(!1),I),F.readyState!==`open`){De(!1);return}F.bufferedAmount<=F.bufferedAmountLowThreshold&&De(!0)}),room_default=(F,I,L,{onPeerHandshake:R,onHandshakeError:z,handshakeTimeoutMs:De=defaultHandshakeTimeoutMs}={})=>{let Oe={},ke={},Ae={},je={},Me={},Ne={},Pe={},Fe={},Ie={},Le={},Re=new WeakMap,ze=new WeakMap,Be={onPeerJoin:noOp,onPeerLeave:noOp,onPeerStream:noOp,onPeerTrack:noOp},Ge=noOp,rt=(F,I,{includePending:L=!1}={})=>(F?Array.isArray(F)?F:[F]:keys(L?Oe:ke)).flatMap(F=>{let R=L?Oe[F]:ke[F];return R?[Promise.resolve(I(F,R))]:(console.warn(`${libName}: no peer with id ${F} found`),[])}),it=(F,I,L,R,z,De={})=>{let Oe={k:I,...De,...L===void 0?{}:{m:L}};return rt(F,async(F,I)=>{await R(Oe,F),z(I)})},at=F=>I=>{let L=F.get(I);return L||(L=genId(20),F.set(I,L)),L},ot=at(Re),st=at(ze),ct=F=>Oe[F]??null,lt=(F,I,L,R)=>{ke[F]&&(ct(F)?.__trysteroSetRemoteStreamByKey?.(I,L),typeof L.id==`string`&&ct(F)?.__trysteroSetRemoteStreamById?.(L.id,L),Be.onPeerStream(L,F,R))},ut=(F,I,L,R,z)=>{ke[F]&&(ct(F)?.__trysteroSetRemoteTrackByKey?.(I,L,R),typeof R.id==`string`&&ct(F)?.__trysteroSetRemoteStreamById?.(R.id,R),typeof L.id==`string`&&ct(F)?.__trysteroSetRemoteTrackById?.(L.id,L,R),Be.onPeerTrack(L,R,F,z))},dt=(F,I=mkErr(`peer disconnected`))=>{let L=Ae[F],R=toError(I,`peer disconnected`);L&&(resetTimer(L.handshakeTimer),L.pendingHandshakePayloads.length=0,L.handshakeWaiters.splice(0).forEach(F=>F.reject(R)),delete Ae[F]),delete Oe[F],delete ke[F],delete Ne[F],Fe[F]?.splice(0).forEach(F=>F.reject(R)),delete Fe[F],delete Ie[F],delete Le[F]},ft=(F,L,R)=>{let z=Oe[F];if(!z||L&&z!==L)return;let De=!!ke[F];dt(F,R),z.destroy(),De&&Be.onPeerLeave(F),I(F)},pt=(F,I={})=>{let L=Me[F];if(je[F]&&L){let R=je[F].options;if(R.sendToPending!==!!I.sendToPending||R.receiveWhilePending!==!!I.receiveWhilePending)throw mkErr(`action type "${F}" cannot be redefined`);return L}if(!F)throw mkErr(`action type argument is required`);let R=encodeBytes(F);if(R.byteLength>typeByteLimit)throw mkErr(`action type string "${F}" (${R.byteLength}b) exceeds byte limit (${typeByteLimit}). Hint: choose a shorter name.`);let z={sendToPending:!!I.sendToPending,receiveWhilePending:!!I.receiveWhilePending},De=new Uint8Array(typeByteLimit);De.set(R);let Ae=0;return je[F]={onComplete:noOp,onProgress:noOp,setOnComplete:I=>{je[F].onComplete=I;let L=Pe[F];L?.length&&(delete Pe[F],L.forEach(({payload:F,peerId:L,metadata:R})=>I(F,L,R)))},setOnProgress:I=>{je[F].onProgress=I},send:async(F,I,L,R)=>{let je=typeof F;if(je===`undefined`)throw mkErr(`action data cannot be undefined`);let Me=je!==`string`,Ne=F instanceof Blob,Pe=Ne||F instanceof ArrayBuffer||F instanceof TypedArray,Fe=L!==void 0,Ie=Pe?toByteArray(Ne?await F.arrayBuffer():F):encodeBytes(Me?toJson(F):F),Le=Fe?encodeBytes(toJson(L)):null,Re=Math.ceil(Ie.byteLength/chunkSize)+ +!!Fe||1,ze=alloc(Re,(F,I)=>{let L=I===Re-1,R=!!(Fe&&I===0),z=new Uint8Array(payloadIndex+(R?Le?.byteLength??0:L?Ie.byteLength-chunkSize*(Re-(Fe?2:1)):chunkSize));return z.set(De),z.set([Ae>>8,Ae&oneByteMax],nonceIndex),z.set([Number(L)|Number(R)<<1|Number(Pe)<<2|Number(Me)<<3],tagIndex),z.set([Math.round((I+1)/Re*oneByteMax)],progressIndex),z.set(Fe?R?Le??new Uint8Array:Ie.subarray((I-1)*chunkSize,I*chunkSize):Ie.subarray(I*chunkSize,(I+1)*chunkSize),payloadIndex),z});return Ae=Ae+1&twoByteMax,await all(rt(I,async(F,I)=>{let{channel:De}=I,Ae=0;for(;Ae<Re;){let je=ze[Ae];if(!je||De&&De.bufferedAmount>De.bufferedAmountLowThreshold&&!await waitForBufferedAmountLow(De))break;let Me=z.sendToPending?Oe[F]:ke[F];if(!Me||Me!==I)break;I.sendData(je),Ae++;let Ne=je[progressIndex]??oneByteMax;R?.(Ne/oneByteMax,F,L)}},{includePending:z.sendToPending})),[]},options:z},Me[F]=[je[F].send,je[F].setOnComplete,je[F].setOnProgress]},mt=F=>pt(F),ht=(F,I)=>{let L=Ae[F];if(!L)return;let R=new Uint8Array(I),z=decodeBytes(R.subarray(typeIndex,nonceIndex)).replaceAll(`\0`,``),De=je[z];if(!L.isActive&&!De?.options.receiveWhilePending)return;let Oe=(R[nonceIndex]??0)<<8|(R[33]??0),ke=R[tagIndex]??0,Me=R[progressIndex]??0,Fe=R.subarray(payloadIndex),Ie=!!(ke&1),Le=!!(ke&2),Re=!!(ke&4),ze=!!(ke&8);Ne[F]??={},Ne[F][z]??={};let Be=Ne[F][z][Oe]??={chunks:[]};if(Le?Be.meta=fromJson(decodeBytes(Fe)):Be.chunks.push(Fe),De?.onProgress(Me/oneByteMax,F,Be.meta),!Ie)return;let Ge=new Uint8Array(Be.chunks.reduce((F,I)=>F+I.byteLength,0));if(Be.chunks.reduce((F,I)=>(Ge.set(I,F),F+I.byteLength),0),delete Ne[F][z][Oe],Re)De?De.onComplete(Ge,F,Be.meta):(Pe[z]??=[]).push({payload:Ge,peerId:F,...Be.meta===void 0?{}:{metadata:Be.meta}});else{let I=decodeBytes(Ge),L=ze?fromJson(I):I;De?De.onComplete(L,F,Be.meta):(Pe[z]??=[]).push({payload:L,peerId:F,...Be.meta===void 0?{}:{metadata:Be.meta}})}},gt=async()=>{await xw(``),await new Promise(F=>setTimeout(F,99)),entries(Oe).forEach(([F,I])=>{I.destroy(),dt(F,mkErr(`room left`))}),Ge(),L()},[vt,yt]=pt(internalNs(`ping`)),[yr,br]=pt(internalNs(`pong`)),[hw,gw]=pt(internalNs(`signal`)),[_w,vw]=pt(internalNs(`stream`)),[yw,bw]=pt(internalNs(`track`)),[xw,Sw]=pt(internalNs(`leave`),{sendToPending:!0,receiveWhilePending:!0}),[Cw,ww]=pt(internalNs(`hsdata`),{sendToPending:!0,receiveWhilePending:!0}),[Tw,Ew]=pt(internalNs(`hsready`),{sendToPending:!0,receiveWhilePending:!0}),Dw=(F,I)=>{let L=Ae[F];!L||I&&L.peer!==I||L.isActive||!L.didLocalHandshakePass||!L.didReceiveRemoteReady||(L.isActive=!0,ke[F]=L.peer,L.handshakeTimer=resetTimer(L.handshakeTimer),Be.onPeerJoin(F))},Ow=(F,I,L)=>{let R=Ae[F];if(!R||R.peer!==I)return;let De=toHandshakeErrorMessage(L);z?.(F,De),ft(F,I,mkErr(De))},kw=(F,I)=>{let L=Ae[F];!L||L.peer!==I||L.isActive||(L.didLocalHandshakePass=!0,Tw(``,F).catch(L=>Ow(F,I,mkErr(`failed sending handshake readiness: ${toErrorMessage(L,`unknown send failure`)}`))),Dw(F,I))},Aw=(F,I)=>{let L=Ae[F];if(!L||L.peer!==I)return;L.handshakeTimer=setTimeout(()=>Ow(F,I,mkErr(`handshake timed out after ${De}ms`)),De);let z=async(I,L)=>{await Cw(I,F,L)},Oe=()=>new Promise((L,R)=>{let z=Ae[F];if(!z||z.peer!==I){R(mkErr(`peer disconnected during handshake`));return}let De=z.pendingHandshakePayloads.shift();if(De){L(De);return}z.handshakeWaiters.push({resolve:L,reject:F=>R(F)})}),ke=selfId<F;Promise.resolve(R?.(F,z,Oe,ke)).then(()=>kw(F,I)).catch(L=>Ow(F,I,toError(L,`handshake failed`)))},jw=F=>F&&typeof F==`object`&&!Array.isArray(F)&&typeof F.k==`string`?{key:F.k,...typeof F.s==`string`?{streamId:F.s}:{},...typeof F.t==`string`?{trackId:F.t}:{},...Object.hasOwn(F,`m`)?{metadata:F.m}:{}}:null;return yt((F,I)=>yr(``,I)),br((F,I)=>{let L=Fe[I];(L?.shift())?.resolve(),L&&!L.length&&delete Fe[I]}),gw((F,I)=>{ke[I]&&Oe[I]?.signal(F)}),vw((F,I)=>{if(!ke[I])return;let L=jw(F);if(!L)return;let R=ct(I),z=R?.__trysteroGetRemoteStreamByKey?.(L.key)??(L.streamId?R?.__trysteroGetRemoteStreamById?.(L.streamId):void 0);if(z){lt(I,L.key,z,L.metadata);return}(Ie[I]??=[]).push(L)}),bw((F,I)=>{if(!ke[I])return;let L=jw(F);if(!L)return;let R=ct(I),z=R?.__trysteroGetRemoteTrackByKey?.(L.key)??(L.trackId?R?.__trysteroGetRemoteTrackById?.(L.trackId):void 0);if(z){ut(I,L.key,z.track,z.stream,L.metadata);return}(Le[I]??=[]).push(L)}),Sw((F,I)=>ft(I,void 0,mkErr(`peer left room`))),ww((F,I,L)=>{let R=Ae[I];if(!R||R.isActive)return;let z=L===void 0?{data:F}:{data:F,metadata:L},De=R.handshakeWaiters.shift();if(De){De.resolve(z);return}R.pendingHandshakePayloads.push(z)}),Ew((F,I)=>{let L=Ae[I];!L||L.isActive||(L.didReceiveRemoteReady=!0,Dw(I))}),F((F,I)=>{let L=Oe[I];if(L){if(L===F)return;L.destroy(),dt(I,mkErr(`peer replaced`))}Oe[I]=F,Ae[I]={peer:F,isActive:!1,didLocalHandshakePass:!1,didReceiveRemoteReady:!1,handshakeTimer:null,pendingHandshakePayloads:[],handshakeWaiters:[]},F.setHandlers({data:F=>ht(I,F),stream:F=>{if(!ke[I])return;let L=Ie[I]?.shift();L&<(I,L.key,F,L.metadata)},track:(F,L)=>{if(!ke[I])return;let R=Le[I]?.shift();R&&ut(I,R.key,F,L,R.metadata)},signal:F=>{ke[I]&&hw(F,I)},close:()=>ft(I,F,mkErr(`peer disconnected`)),error:L=>{console.error(`${libName} peer error:`,L),ft(I,F,L)}}),Aw(I,F)}),isBrowser&&(Ge=registerBeforeUnloadCleanup(()=>gt().catch(noOp))),{makeAction:mt,leave:gt,ping:async F=>{if(!ke[F])throw mkErr(`no active peer with id ${F}`);let I=Date.now();return await new Promise((I,L)=>{let R=Fe[F]??=[],z=()=>{let I=Fe[F];if(!I)return;let L=I.indexOf(De);L>-1&&I.splice(L,1),I.length||delete Fe[F]},De={resolve:()=>{z(),I()},reject:F=>{z(),L(F)}};R.push(De),vt(``,F).catch(F=>De.reject(toError(F,`peer disconnected`)))}),Date.now()-I},getPeers:()=>fromEntries(entries(ke).map(([F,I])=>[F,I.connection])),addStream:(F,I,L)=>it(I,ot(F),L,_w,I=>I.addStream(F),{s:F.id}),removeStream:(F,I)=>{rt(I,(I,L)=>L.removeStream(F))},addTrack:(F,I,L,R)=>it(L,st(F),R,yw,L=>L.addTrack(F,I),{s:I.id,t:F.id}),removeTrack:(F,I)=>{rt(I,(I,L)=>L.removeTrack(F))},replaceTrack:(F,I,L,R)=>it(L,st(I),R,yw,L=>L.replaceTrack(F,I),{t:F.id}),onPeerJoin:F=>{Be.onPeerJoin=F,keys(ke).forEach(I=>F(I))},onPeerLeave:F=>Be.onPeerLeave=F,onPeerStream:F=>Be.onPeerStream=F,onPeerTrack:F=>Be.onPeerTrack=F}},roomFrameVersion=1,roomPresenceFrameVersion=2,wrapRoomFrame=(F,I)=>{let L=encodeBytes(F),R=new Uint8Array(3+L.byteLength+I.byteLength);return R[0]=roomFrameVersion,R[1]=L.byteLength>>>8&255,R[2]=L.byteLength&255,R.set(L,3),R.set(I,3+L.byteLength),R},wrapRoomPresenceFrame=(F,I)=>{let L=encodeBytes(F),R=new Uint8Array(4+L.byteLength);return R[0]=roomPresenceFrameVersion,R[1]=Number(I),R[2]=L.byteLength>>>8&255,R[3]=L.byteLength&255,R.set(L,4),R},unwrapFrame=F=>{let I=new Uint8Array(F);if(I.byteLength<3)return null;if(I[0]===roomFrameVersion){let F=(I[1]??0)<<8|(I[2]??0),L=3+F;return F<=0||I.byteLength<L?null:{type:`room`,roomToken:decodeBytes(I.subarray(3,L)),payload:I.subarray(L).slice().buffer}}if(I[0]!==roomPresenceFrameVersion||I.byteLength<4)return null;let L=(I[2]??0)<<8|(I[3]??0),R=4+L;return L<=0||I.byteLength<R?null:{type:`presence`,roomToken:decodeBytes(I.subarray(4,R)),isPresent:I[1]===1}},isPeerUnderlyingStale=F=>{let{connection:I,channel:L}=F;return F.isDead||I.connectionState===`closed`||I.connectionState===`failed`||I.iceConnectionState===`closed`||I.iceConnectionState===`failed`||L?.readyState===`closing`||L?.readyState===`closed`},getConnectedPeerHealth=F=>{if(isPeerUnderlyingStale(F))return`stale`;let{channel:I}=F;return!I||I.readyState!==`open`?`transient`:`live`},SharedPeerManager=class{byApp={};roomPresenceHandlers={};getMap(F){return this.byApp[F]??={}}get(F,I){return this.byApp[F]?.[I]}isPeerStale(F){return isPeerUnderlyingStale(F)}getHealth(F){return this.isPeerStale(F)?`stale`:`live`}setRoomPresenceHandler(F,I){return this.roomPresenceHandlers[F]=I,()=>{this.roomPresenceHandlers[F]===I&&delete this.roomPresenceHandlers[F]}}sendRoomPresence(F,I,L){F.isClosing||F.peer.isDead||F.peer.sendData(wrapRoomPresenceFrame(I,L))}clear(F,I,{destroyPeer:L}){let R=this.byApp[F],z=R?.[I];if(!z||z.isClosing)return;z.idleTimer=resetTimer(z.idleTimer),z.isClosing=!0,L&&!z.peer.isDead&&z.peer.destroy();let De=values(z.bindings);z.bindings={},z.bindingsByToken={},z.controlRoomId=null,delete R[I],De.forEach(F=>{F.handlers.close?.(),F.pendingData.length=0,F.pendingSendData.length=0,F.pendingTracks.length=0}),z.remoteStreamsByKey.clear(),z.remoteStreamsById.clear(),z.remoteTracksByKey.clear(),z.remoteTracksById.clear(),z.pendingDataByToken.clear(),z.remoteRoomTokens.clear(),keys(R).length===0&&delete this.byApp[F]}register(F,I,L,R){let z=this.getMap(F),De=z[I];if(De){if(De.idleTimer=resetTimer(De.idleTimer),De.peer===L)return De;this.clear(F,I,{destroyPeer:!0})}let Oe={appId:F,peerId:I,peer:L,bindings:{},bindingsByToken:{},pendingDataByToken:new Map,remoteRoomTokens:new Set,idleTimer:null,controlRoomId:null,streamOwners:new Map,trackOwners:new Map,remoteStreamsByKey:new Map,remoteStreamsById:new Map,remoteTracksByKey:new Map,remoteTracksById:new Map,idleMs:R,isClosing:!1};return L.setHandlers({data:F=>this.dispatchData(Oe,F),signal:F=>this.dispatchSignal(Oe,F),close:()=>this.clear(F,I,{destroyPeer:!1}),error:L=>{console.error(`${libName} peer error:`,L),this.clear(F,I,{destroyPeer:!1})},track:(F,I)=>this.dispatchTrack(Oe,F,I)}),z[I]=Oe,Oe}bind(F,I,L,{onDetach:R}){let z=L.bindings[F];if(z)return L.idleTimer=resetTimer(L.idleTimer),{proxy:z.proxy,isNew:!1};let De={roomId:F,roomToken:null,roomTokenPromise:I,handlers:{},pendingData:[],pendingSendData:[],pendingTracks:[],detach:noOp,proxy:{}},Oe=()=>{L.bindings[F]&&(this.pruneRoomOwnership(L,F),delete L.bindings[F],De.roomToken&&L.bindingsByToken[De.roomToken]===De&&delete L.bindingsByToken[De.roomToken],L.controlRoomId===F&&(L.controlRoomId=keys(L.bindings)[0]??null),R(),this.scheduleIdleTimer(L))},ke={created:L.peer.created,get connection(){return L.peer.connection},get channel(){return L.peer.channel},get isDead(){return L.peer.isDead},getOffer:F=>L.peer.getOffer(F),signal:F=>L.peer.signal(F),sendData:F=>{if(!De.roomToken){De.pendingSendData.push(F);return}L.peer.sendData(wrapRoomFrame(De.roomToken,F))},destroy:()=>Oe(),setHandlers:F=>{let{signal:I,...L}=F;Object.assign(De.handlers,L),I&&(De.handlers.signal=I),this.flushBindingQueues(De)},offerPromise:L.peer.offerPromise,addStream:I=>{let R=L.streamOwners.get(I)??new Set,z=R.size===0;R.add(F),L.streamOwners.set(I,R),z&&L.peer.addStream(I)},removeStream:I=>{let R=L.streamOwners.get(I);R&&(R.delete(F),R.size===0&&(L.streamOwners.delete(I),L.peer.removeStream(I)))},addTrack:(I,R)=>{let z=L.trackOwners.get(I)??{stream:R,rooms:new Set},De=z.rooms.size===0;return z.stream=R,z.rooms.add(F),L.trackOwners.set(I,z),De?L.peer.addTrack(I,R):L.peer.connection.getSenders().find(F=>F.track===I)??L.peer.addTrack(I,R)},removeTrack:I=>{let R=L.trackOwners.get(I);R&&(R.rooms.delete(F),R.rooms.size===0&&(L.trackOwners.delete(I),L.peer.removeTrack(I)))},replaceTrack:(F,I)=>{let R=L.trackOwners.get(F);if(R){L.trackOwners.delete(F);let z=L.trackOwners.get(I)??{stream:R.stream,rooms:new Set};R.rooms.forEach(F=>z.rooms.add(F)),L.trackOwners.set(I,z)}return L.peer.replaceTrack(F,I)},__trysteroGetRemoteStreamByKey:F=>L.remoteStreamsByKey.get(F),__trysteroSetRemoteStreamByKey:(F,I)=>void L.remoteStreamsByKey.set(F,I),__trysteroGetRemoteStreamById:F=>L.remoteStreamsById.get(F),__trysteroSetRemoteStreamById:(F,I)=>void L.remoteStreamsById.set(F,I),__trysteroGetRemoteTrackByKey:F=>L.remoteTracksByKey.get(F),__trysteroSetRemoteTrackByKey:(F,I,R)=>void L.remoteTracksByKey.set(F,{track:I,stream:R}),__trysteroGetRemoteTrackById:F=>L.remoteTracksById.get(F),__trysteroSetRemoteTrackById:(F,I,R)=>void L.remoteTracksById.set(F,{track:I,stream:R})};return De.proxy=ke,De.detach=Oe,L.bindings[F]=De,L.controlRoomId??=F,L.idleTimer=resetTimer(L.idleTimer),I.then(I=>{if(L.isClosing||L.bindings[F]!==De)return;De.roomToken=I,L.bindingsByToken[I]=De;let R=L.pendingDataByToken.get(I);R?.length&&(De.pendingData.push(...R),L.pendingDataByToken.delete(I)),De.pendingSendData.splice(0).forEach(F=>L.peer.sendData(wrapRoomFrame(I,F))),this.flushBindingQueues(De)}),{proxy:ke,isNew:!0}}pruneRoomOwnership(F,I){F.streamOwners.forEach((L,R)=>{L.delete(I),L.size===0&&(F.streamOwners.delete(R),F.peer.removeStream(R))}),F.trackOwners.forEach((L,R)=>{L.rooms.delete(I),L.rooms.size===0&&(F.trackOwners.delete(R),F.peer.removeTrack(R))})}scheduleIdleTimer(F){F.isClosing||keys(F.bindings).length>0||(F.idleTimer=resetTimer(F.idleTimer),F.idleTimer=setTimeout(()=>{let I=this.byApp[F.appId]?.[F.peerId];!I||keys(I.bindings).length>0||this.clear(F.appId,F.peerId,{destroyPeer:!0})},F.idleMs))}getSignalBinding(F){if(F.controlRoomId){let I=F.bindings[F.controlRoomId];if(I?.handlers.signal)return I}let I=values(F.bindings).find(F=>!!F.handlers.signal);return I?(F.controlRoomId=I.roomId,I):null}flushBindingQueues(F){let{handlers:I}=F;I.data&&F.pendingData.length>0&&F.pendingData.splice(0).forEach(F=>I.data?.(F)),(I.track||I.stream)&&F.pendingTracks.length&&F.pendingTracks.splice(0).forEach(({track:F,stream:L})=>{I.track?.(F,L),I.stream?.(L)})}dispatchData(F,I){let L=unwrapFrame(I);if(!L)return;if(L.type===`presence`){L.isPresent?F.remoteRoomTokens.add(L.roomToken):F.remoteRoomTokens.delete(L.roomToken),this.roomPresenceHandlers[F.appId]?.(F.peerId,L.roomToken,L.isPresent);return}let R=F.bindingsByToken[L.roomToken];if(!R){let I=F.pendingDataByToken.get(L.roomToken)??[];I.push(L.payload),F.pendingDataByToken.set(L.roomToken,I);return}R.handlers.data?R.handlers.data(L.payload):R.pendingData.push(L.payload)}dispatchSignal(F,I){this.getSignalBinding(F)?.handlers.signal?.(I)}dispatchTrack(F,I,L){values(F.bindings).forEach(F=>{if(F.handlers.track||F.handlers.stream){F.handlers.track?.(I,L),F.handlers.stream?.(L);return}F.pendingTracks.push({track:I,stream:L})})}},offerPostAnswerTtlMs=23333,offerIdSize=12,disconnectedPeerGraceMs=7533,answeringTtlMs=23333,legacyCandidateKey=`__legacy__`,offerRelayPlaceholder=`offer-placeholder`,publishCipheredSignalingMessage=(F,I,L,R,z,De)=>{F.toCipher(I).then(I=>{F.isLeaving()||!De()||R(L,toJson(z(I.sdp)))})},makeState=()=>({status:`idle`,offerPeer:null,offerId:null,offerSdp:null,offerInitPromise:null,offerAnswered:!1,offerRelays:[],offerSignalRelays:[],offerSignalBacklog:[],offerRelayTimers:[],offerExpiryTimer:null,connectedPeer:null,connectedPeerUnhealthySinceMs:null,answeringExpiryTimer:null,answeringPeer:null,pendingCandidates:{}}),getState=(F,I)=>F[I]??=makeState(),updateStatus=F=>{F.connectedPeer?F.status=`connected`:F.answeringPeer?F.status=`answering`:F.offerPeer||F.offerRelays.some(Boolean)?F.status=`offering`:F.status=`idle`},clearAnswering=(F,I)=>{F.answeringPeer===I&&(F.answeringExpiryTimer=resetTimer(F.answeringExpiryTimer),F.answeringPeer=null,updateStatus(F))},clearConnectedPeer=(F,I,L)=>{F.connectedPeer&&(F.connectedPeer.isDead||F.connectedPeer.destroy(),F.connectedPeer=null,F.connectedPeerUnhealthySinceMs=null,updateStatus(F))},clearOfferRelay=(F,I)=>{F.offerRelayTimers[I]=resetTimer(F.offerRelayTimers[I]),F.offerRelays[I]&&(F.offerRelays[I]=void 0,updateStatus(F))},clearOfferRelayIfPlaceholder=(F,I)=>{F?.offerRelays[I]===offerRelayPlaceholder&&clearOfferRelay(F,I)},hasRemoteDescription=F=>{if(F.isDead||F.connection.connectionState===`closed`)return!0;try{return!!F.connection.remoteDescription}catch{return!0}},resetOfferState=(F,I)=>{let L=F.offerAnswered;F.offerExpiryTimer=resetTimer(F.offerExpiryTimer),F.offerInitPromise=null,F.offerRelays.forEach((I,L)=>clearOfferRelay(F,L)),F.offerRelays=[],F.offerSignalRelays=[],F.offerRelayTimers=[],F.offerSignalBacklog=[],F.offerPeer&&F.offerPeer!==F.connectedPeer&&(L||hasRemoteDescription(F.offerPeer)?F.offerPeer.isDead||F.offerPeer.destroy():I.recycle(F.offerPeer)),F.offerPeer=null,F.offerId=null,F.offerSdp=null,F.offerAnswered=!1,updateStatus(F)},scheduleAnsweringExpiry=(F,I,L,R)=>{resetTimer(I.answeringExpiryTimer),I.answeringExpiryTimer=setTimeout(()=>{let I=F.peerStates[L];!I||I.connectedPeer||I.answeringPeer!==R||(R.destroy(),clearAnswering(I,R))},answeringTtlMs)},flushBufferedCandidates=async(F,I,L)=>{let R=L?[L,legacyCandidateKey]:[legacyCandidateKey];for(let L of R){let R=F.pendingCandidates[L];if(R?.length){delete F.pendingCandidates[L];for(let F of R)await I.signal(F)}}},scheduleOfferExpiry=(F,I,L,R=offerTtl)=>{resetTimer(I.offerExpiryTimer);let z=I.offerId;I.offerExpiryTimer=setTimeout(()=>{let I=F.peerStates[L];!I||I.connectedPeer||I.offerId!==z||resetOfferState(I,F.offerPool)},R)},ensureOffer=(F,I,L,R)=>I.offerPeer&&I.offerId&&I.offerSdp?Promise.resolve({peer:I.offerPeer,offer:I.offerSdp,offerId:I.offerId}):(I.offerInitPromise||=(async()=>{let z=(await F.offerPool.checkout(1,!1,F.encryptOffer))[0];if(!z)throw mkErr(`failed to allocate offer peer`);let{peer:De,offer:Oe}=z;I.offerPeer=De,I.offerId=genId(offerIdSize),I.offerSdp=Oe,I.offerAnswered=!1,I.offerSignalBacklog=[],updateStatus(I);let ke=()=>{I.offerPeer===De&&!I.connectedPeer&&resetOfferState(I,F.offerPool),F.disconnectPeer(De,L)};return De.setHandlers({connect:()=>F.connectPeer(De,L,R),signal:F=>{I.offerPeer===De&&(I.offerSignalBacklog.push(F),I.offerSignalRelays.forEach(I=>I?.(F)))},close:ke,error:ke}),scheduleOfferExpiry(F,I,L),{peer:De,offer:Oe,offerId:I.offerId}})().finally(()=>I.offerInitPromise=null),I.offerInitPromise),handleAnnouncement=async(F,I,L,R,z)=>{if(R){F.attachSharedPeerToRoom(L,R);return}let De=F.peerStates[L];if(!De||De.connectedPeer||De.answeringPeer||De.offerAnswered){clearOfferRelayIfPlaceholder(De,I);return}if(De.offerRelays[I]!==offerRelayPlaceholder)return;let[Oe,ke]=await all([sha1(topicPath(F.rootTopicPlaintext,L)),ensureOffer(F,De,L,I)]);if(F.isLeaving())return;if(De.connectedPeer||De.answeringPeer||De.offerAnswered||De.offerRelays[I]!==offerRelayPlaceholder){clearOfferRelayIfPlaceholder(De,I);return}De.offerRelayTimers[I]=resetTimer(De.offerRelayTimers[I]),De.offerRelays[I]=!0,updateStatus(De),De.offerRelayTimers[I]=setTimeout(()=>prunePendingOffer(F,L,I),(F.announceIntervals[I]??F.announceIntervalMs)*.9);let Ae=!1;De.offerSignalRelays[I]=I=>{Ae&&(F.isLeaving()||De.connectedPeer||De.offerPeer!==ke.peer||De.offerId!==ke.offerId||I.type!==`candidate`||publishCipheredSignalingMessage(F,I,Oe,z,F=>({peerId:selfId,offerId:ke.offerId,candidate:F}),()=>!De.connectedPeer&&De.offerPeer===ke.peer&&De.offerId===ke.offerId))},z(Oe,toJson({peerId:selfId,offerId:ke.offerId,offer:ke.offer})),Ae=!0,De.offerSignalBacklog.forEach(F=>De.offerSignalRelays[I]?.(F))},handleOffer=async(F,I,L,R,z,De,Oe)=>{let ke=getState(F.peerStates,L);if(ke.answeringPeer||ke.offerAnswered)return;let Ae=!!(ke.offerPeer||ke.offerRelays.some(Boolean));if((Ae||De)&&selfId<L)return;Ae&&resetOfferState(ke,F.offerPool);let je=F.initPeer(!1,F.config);ke.answeringPeer=je,scheduleAnsweringExpiry(F,ke,L,je),updateStatus(ke);let Me=()=>{clearAnswering(ke,je),F.disconnectPeer(je,L)};je.setHandlers({connect:()=>F.connectPeer(je,L,I),close:Me,error:Me});let Ne;try{Ne=await F.toPlain({type:`offer`,sdp:R})}catch{clearAnswering(ke,je),F.onJoinError?.({error:`incorrect room password when decrypting offer`,appId:F.appId,peerId:L,roomId:F.roomId});return}if(je.isDead){clearAnswering(ke,je);return}let Pe=await sha1(topicPath(F.rootTopicPlaintext,L));F.isLeaving()||(je.setHandlers({signal:I=>{F.isLeaving()||ke.answeringPeer!==je||je.isDead||I.type!==`answer`&&I.type!==`candidate`||publishCipheredSignalingMessage(F,I,Pe,Oe,F=>{let L={peerId:selfId};return I.type===`answer`?L.answer=F:L.candidate=F,z&&(L.offerId=z),L},()=>ke.answeringPeer===je&&!je.isDead)}}),await je.signal(Ne),await flushBufferedCandidates(ke,je,z))},handleCandidate=async(F,I,L,R,z)=>{let De;try{De=await F.toPlain({type:candidateType,sdp:L})}catch{return}let Oe=getState(F.peerStates,I),ke=R&&Oe?.offerPeer&&Oe.offerId===R?Oe.offerPeer:null,Ae=Oe?.answeringPeer??null,je=!R&&Oe?.offerPeer?Oe.offerPeer:null,Me=z&&!z.isDead?z:ke??Ae??je;if(!Me||Me.isDead){let F=R??legacyCandidateKey;(Oe.pendingCandidates[F]??=[]).push(De);return}Me.signal(De)},handleAnswer=async(F,I,L,R,z,De)=>{let Oe;try{Oe=await F.toPlain({type:`answer`,sdp:R})}catch{F.onJoinError?.({error:`incorrect room password when decrypting answer`,appId:F.appId,peerId:L,roomId:F.roomId});return}if(De)F.offerPool.claimLeased(De),De.setHandlers({connect:()=>F.connectPeer(De,L,I),close:()=>F.disconnectPeer(De,L)}),De.signal(Oe);else{let I=F.peerStates[L];if(!I||!I.offerPeer||I.offerAnswered||z&&I.offerId&&z!==I.offerId||I.offerPeer.isDead)return;I.offerAnswered=!0,scheduleOfferExpiry(F,I,L,offerPostAnswerTtlMs),I.offerPeer.signal(Oe)}},prunePendingOffer=(F,I,L)=>{let R=F.peerStates[I];!R||R.connectedPeer||R.offerRelays[L]&&clearOfferRelay(R,L)},createSignalHandler=F=>I=>async(L,R,z)=>{if(F.isLeaving())return;let De=typeof R==`string`?fromJson(R):R,Oe=typeof De.peerId==`string`?De.peerId:``,ke=De.offer,Ae=De.answer,je=De.candidate,Me=De.offerId,Ne=De.peer,Pe=De.hasOutgoingOffer===!0;if(Oe===selfId)return;let Fe=F.peerStates[Oe],Ie=Fe?.connectedPeer;if(Ie&&Fe){let F=getConnectedPeerHealth(Ie);if(F===`live`){Fe.connectedPeerUnhealthySinceMs=null;return}if(F===`stale`)clearConnectedPeer(Fe,Oe,`message-from-stale-peer`);else{let F=Date.now(),I=Fe.connectedPeerUnhealthySinceMs??F;if(Fe.connectedPeerUnhealthySinceMs=I,F-I<disconnectedPeerGraceMs)return;clearConnectedPeer(Fe,Oe,`message-from-prolonged-disconnect`)}}let Le=F.sharedPeers.get(F.appId,Oe);Le&&F.sharedPeers.getHealth(Le.peer)===`stale`&&(F.sharedPeers.clear(F.appId,Oe,{destroyPeer:!0}),Le=void 0);let Re=!!(Oe&&!ke&&!Ae&&!je),[ze,Be]=await all([F.rootTopicP,F.selfTopicP]);if(!F.isLeaving()&&!(L!==ze&&L!==Be)){if(Re&&!Le){let L=getState(F.peerStates,Oe),R=selfId<Oe;if(L.answeringPeer||L.connectedPeer||L.offerAnswered)return;if(!R&&!L.offerPeer){let I=await sha1(topicPath(F.rootTopicPlaintext,Oe));!F.isLeaving()&&!L.connectedPeer&&z(I,toJson({peerId:selfId}));return}if(L.offerRelays[I])return;L.offerRelays[I]=offerRelayPlaceholder,updateStatus(L)}if(Le&&(ke||Ae||je)){if(Le.bindings[F.roomId])return;F.attachSharedPeerToRoom(Oe,Le);return}if(Re)return handleAnnouncement(F,I,Oe,Le,z);if(ke)return handleOffer(F,I,Oe,ke,Me,Pe,z);if(je)return handleCandidate(F,Oe,je,Me,Ne);if(Ae)return handleAnswer(F,I,Oe,Ae,Me,Ne)}},announceIntervalMs=5333,announceWarmupIntervalsMs=[233,533,1333],sharedPeerIdleMsDefault=123333,strategy_default=({init:F,subscribe:I,announce:L})=>{let R={},z={},De={},Oe={},ke=new SharedPeerManager,Ae=()=>values(R).some(F=>keys(F).length>0),je=F=>z[F]??={},Me=F=>De[F]??={},Ne=(F,I,L)=>{ke.getHealth(F.peer)===`live`&&ke.sendRoomPresence(F,I,L)},Pe=(F,I)=>{entries(z[F]??{}).forEach(([L,R])=>{let{roomToken:De,roomTokenPromise:Oe}=R;if(De){Ne(I,De,!0);return}Oe.then(De=>{z[F]?.[L]===R&&R.roomToken===De&&(ke.get(F,I.peerId)!==I||I.isClosing||Ne(I,De,!0))})})},Fe=(F,I,L)=>values(ke.getMap(F)).forEach(F=>Ne(F,I,L)),Ie=F=>{Oe[F]||(Oe[F]=ke.setRoomPresenceHandler(F,(I,L,R)=>{if(!R)return;let Oe=ke.get(F,I),Ae=De[F]?.[L];!Oe||!Ae||z[F]?.[Ae]?.attachSharedPeerToRoom(I,Oe)}))},Le=F=>{R[F]&&keys(R[F]).length>0||(Oe[F]?.(),delete Oe[F],delete z[F],delete De[F])},Re=!1,ze=[],Be=null,Ge=noOp;return(Oe,Ne,rt)=>{if(!Oe)throw mkErr(`requires a config map as the first argument`);if(rt&&typeof rt!=`object`)throw mkErr(`third argument must be a callbacks object`);let{appId:it}=Oe,at=rt?.onJoinError,ot=rt?.onPeerHandshake,st=rt?.handshakeTimeoutMs;if(!it)throw mkErr(`config map is missing appId field`);if(!Ne)throw mkErr(`roomId argument required`);if(st!==void 0&&(!Number.isFinite(st)||st<=0))throw mkErr(`handshakeTimeoutMs must be a positive number`);if(R[it]?.[Ne])return R[it][Ne];Ie(it);let ct=topicPath(libName,it,Ne),lt=sha1(ct),ut=sha1(topicPath(ct,selfId)),dt=genKey(Oe.password??``,it,Ne),ft=deriveRoomNamespace(it,Ne),pt=Oe._test_only_sharedPeerIdleMs??sharedPeerIdleMsDefault,mt=!1,ht=F=>async I=>({type:I.type,sdp:await F(dt,I.sdp)}),gt=ht(decrypt),vt=ht(encrypt),yt=ke.getMap(it);Be||=new OfferPool(()=>peer_default(!0,Oe));let yr=Be,br=async F=>{let I=await F.getOffer(Date.now()-F.created>offerTtl);if(!I||I.type!==`offer`)throw mkErr(`failed to get offer for peer`);return(await vt(I)).sdp},hw=(F,I)=>{let L=getState(gw.peerStates,F);L.answeringExpiryTimer=resetTimer(L.answeringExpiryTimer),L.answeringPeer=null;let{proxy:R,isNew:z}=ke.bind(Ne,ft,I,{onDetach:()=>{let L=gw.peerStates[F];L?.connectedPeer===I.peer&&(L.connectedPeer=null,L.connectedPeerUnhealthySinceMs=null,updateStatus(L))}});L.connectedPeer=I.peer,L.connectedPeerUnhealthySinceMs=null,updateStatus(L),z&&xw(R,F),resetOfferState(L,yr)},gw={appId:it,roomId:Ne,config:Oe,peerStates:{},rootTopicPlaintext:ct,rootTopicP:lt,selfTopicP:ut,toPlain:gt,toCipher:vt,isLeaving:()=>mt,onJoinError:at,sharedPeers:ke,offerPool:yr,encryptOffer:br,initPeer:peer_default,connectPeer:(F,I,L)=>{if(mt){F.destroy();return}let R=getState(gw.peerStates,I);if(R.connectedPeer){let L=yt[I];if(L&&R.connectedPeer===L.peer&&L.bindings[Ne])return;R.connectedPeer!==F&&!F.isDead&&F.destroy();return}let z=yt[I];if(z&&ke.getHealth(z.peer)===`stale`&&(ke.clear(it,I,{destroyPeer:!0}),z=void 0),z&&z.peer!==F){F.isDead||F.destroy(),hw(I,z);return}let De=!z;z||=ke.register(it,I,F,pt),hw(I,z),De&&Pe(it,z)},disconnectPeer:(F,I)=>{if(mt)return;let L=gw.peerStates[I];L?.connectedPeer===F&&clearConnectedPeer(L,I,`close-event`)},attachSharedPeerToRoom:hw,announceIntervals:[],announceIntervalMs},_w=createSignalHandler(gw);if(!Re){let I=F(Oe);yr.warmup(),ze=(Array.isArray(I)?I:[I]).map(F=>Promise.resolve(F)),Re=!0,Ge=Oe.relayConfig?.manualReconnection?noOp:watchOnline()}gw.announceIntervals=ze.map(()=>announceIntervalMs);let vw=ze.map(()=>0),yw=[],bw=ze.map(async(F,L)=>I(await F,await lt,await ut,_w(L),F=>yr.getOffers(F,br)));all([lt,ut]).then(([F,I])=>{if(mt)return;let R=async(z,De)=>{if(mt)return;let Oe=await L(z,F,I);if(mt)return;typeof Oe==`number`&&(gw.announceIntervals[De]=Oe);let ke=vw[De]??0;vw[De]=ke+1;let Ae=gw.announceIntervals[De]??announceIntervalMs,je=announceWarmupIntervalsMs[ke];yw[De]=setTimeout(()=>{R(z,De)},typeof je==`number`?Math.min(Ae,je):Ae)};bw.forEach(async(F,I)=>{if(await F,mt)return;let L=await ze[I];L&&!mt&&R(L,I)})});let xw=noOp,{compose:Sw}=createPasswordHandshake(Oe.password??``,it,Ne),Cw=Sw(ot),ww={...Cw?{onPeerHandshake:Cw}:{},...st===void 0?{}:{handshakeTimeoutMs:st},onHandshakeError:(F,I)=>at?.({error:I.replace(/^handshake failed: /,``),appId:it,peerId:F,roomId:Ne})};R[it]??={};let Tw=je(it),Ew=room_default(F=>xw=F,F=>{if(mt)return;let I=gw.peerStates[F];I?.connectedPeer&&(I.connectedPeer=null,updateStatus(I))},()=>{mt=!0,xw=noOp;let F=z[it]?.[Ne];F?.roomToken&&(Fe(it,F.roomToken,!1),delete De[it]?.[F.roomToken],De[it]&&!keys(De[it]).length&&delete De[it]),z[it]&&(delete z[it][Ne],keys(z[it]).length||delete z[it]),entries(gw.peerStates).forEach(([F,I])=>{if(I.answeringExpiryTimer=resetTimer(I.answeringExpiryTimer),I.connectedPeer&&!I.connectedPeer.isDead){let L=yt[F];(!L||L.peer!==I.connectedPeer)&&I.connectedPeer.destroy()}I.answeringPeer&&!I.answeringPeer.isDead&&I.answeringPeer.destroy(),resetOfferState(I,yr),I.connectedPeer=null,I.answeringPeer=null,updateStatus(I)}),R[it]&&(delete R[it][Ne],keys(R[it]).length===0&&delete R[it]),yw.forEach(resetTimer),bw.forEach(async F=>{(await F)()}),!Ae()&&(Re=!1,yr.destroy(),Be=null,Ge(),Le(it))},ww),Dw={roomToken:null,roomTokenPromise:ft,attachSharedPeerToRoom:hw};return Tw[Ne]=Dw,ft.then(F=>{mt||z[it]?.[Ne]!==Dw||(Dw.roomToken=F,Me(it)[F]=Ne,values(yt).forEach(I=>{I.remoteRoomTokens.has(F)&&hw(I.peerId,I)}),Fe(it,F,!0))}),R[it][Ne]=Ew}},relayManager=createRelayManager(F=>F.socket),topicToInfoHash={},infoHashToTopic={},announceIntervals=relayManager.scoped(),announceFns=relayManager.scoped(),subscriptionTokens=relayManager.scoped(),trackerAnnounceMs={},handledSignals={},msgHandlers=relayManager.scoped(),roomOutstandingOffers={},roomOfferGenerationPromises={},roomSubscriberCounts={},trackerAction=`announce`,hashLimit=20,offerPoolSize=3,defaultAnnounceMs=1e4,maxAnnounceMs=2e4,offerRetentionMs=12e4,signalDedupeWindowMs=4e3,defaultRedundancy=3,getInfoHash=async F=>{if(topicToInfoHash[F])return topicToInfoHash[F];let I=(await sha1(F)).slice(0,hashLimit);return topicToInfoHash[F]=I,infoHashToTopic[I]=F,I},send=async(F,I,L)=>F.send(toJson({action:trackerAction,info_hash:await getInfoHash(I),peer_id:selfId,...L})),warn=(F,I,L=!1)=>console.warn(`${libName}: torrent tracker ${L?`failure`:`warning`} from ${F} - ${I}`),getRoomOutstandingOffers=F=>roomOutstandingOffers[F]??={},deleteRoomOfferBookkeeping=F=>{delete roomOutstandingOffers[F],delete roomOfferGenerationPromises[F]},claimOutstandingOffer=(F,I)=>{let L=roomOutstandingOffers[F],R=L?.[I];if(R)return delete L[I],R.claim?.(),!keys(L).length&&!roomSubscriberCounts[F]&&deleteRoomOfferBookkeeping(F),R},reclaimOutstandingOffer=(F,I)=>{let L=roomOutstandingOffers[F],R=L?.[I];R&&(delete L[I],R.reclaim?.(),!keys(L).length&&!roomSubscriberCounts[F]&&deleteRoomOfferBookkeeping(F))},reclaimAllOutstandingOffers=F=>{keys(getRoomOutstandingOffers(F)).forEach(I=>reclaimOutstandingOffer(F,I)),deleteRoomOfferBookkeeping(F)},pruneOutstandingOffers=F=>{let I=Date.now();entries(getRoomOutstandingOffers(F)).forEach(([L,R])=>{I-R.createdAt>offerRetentionMs&&reclaimOutstandingOffer(F,L)})},ensureOutstandingOffers=async(F,I)=>{for(;roomOfferGenerationPromises[F];)await roomOfferGenerationPromises[F];let L=(async()=>{pruneOutstandingOffers(F);let L=getRoomOutstandingOffers(F),R=keys(L).length,z=Math.max(0,offerPoolSize-R);z>0&&(await I(z)).forEach(F=>{L[genId(hashLimit)]={...F,createdAt:Date.now()}})})().finally(()=>{roomOfferGenerationPromises[F]===L&&delete roomOfferGenerationPromises[F]});return roomOfferGenerationPromises[F]=L,await L,getRoomOutstandingOffers(F)},joinRoomStrategy=strategy_default({init:F=>getRelays(F,defaultRelayUrls,defaultRedundancy).map(F=>{let I=relayManager.register(F,makeSocket(F,L=>{let R=fromJson(L),z=R[`failure reason`],De=R[`warning message`],{interval:Oe}=R,ke=R.info_hash?infoHashToTopic[R.info_hash]:void 0;if(z){warn(I.url,z,!0);return}if(De&&warn(I.url,De),Oe&&Oe*1e3>(trackerAnnounceMs[I.url]??defaultAnnounceMs)&&ke&&announceFns.forKey(F)[ke]){let L=Math.min(Oe*1e3,maxAnnounceMs),R=announceIntervals.forKey(F),z=announceFns.forKey(F);R[ke]&&clearInterval(R[ke]),trackerAnnounceMs[I.url]=L;let De=z[ke];De&&(R[ke]=setInterval(()=>{De()},L))}if((R.offer||R.answer)&&ke&&R.offer_id){if(R.peer_id===selfId)return;let I=`${ke}:${R.offer?`offer`:`answer`}:${R.offer_id}:${R.peer_id??``}`,L=Date.now(),z=handledSignals[I];if(typeof z==`number`&&L-z<signalDedupeWindowMs)return;handledSignals[I]=L,entries(handledSignals).forEach(([F,I])=>{L-I>signalDedupeWindowMs*6&&delete handledSignals[F]}),msgHandlers.forKey(F)[ke]?.(R)}}));return I.ready}),subscribe:(F,I,L,R,z)=>{let De=msgHandlers.forRelay(F),Oe=announceFns.forRelay(F),ke=announceIntervals.forRelay(F),Ae=subscriptionTokens.forRelay(F),je=Symbol(I);Ae[I]=je,roomSubscriberCounts[I]=(roomSubscriberCounts[I]??0)+1;let Me=L=>{if(L.offer&&L.peer_id&&L.offer_id)R(I,{offer:L.offer.sdp,peerId:L.peer_id,hasOutgoingOffer:keys(getRoomOutstandingOffers(I)).length>0},(R,z)=>void send(F,I,{answer:{type:`answer`,sdp:fromJson(z).answer},offer_id:L.offer_id,to_peer_id:L.peer_id}));else if(L.answer&&L.offer_id&&L.peer_id){let F=claimOutstandingOffer(I,L.offer_id);F&&R(I,{answer:L.answer.sdp,peerId:L.peer_id,peer:F.peer},()=>{})}};De[I]=Me;let Ne=async()=>{Ae[I]===je&&send(F,I,{numwant:offerPoolSize,offers:entries(await ensureOutstandingOffers(I,z)).map(([F,{offer:I}])=>({offer_id:F,offer:{type:`offer`,sdp:I}}))})};return trackerAnnounceMs[F.url]=defaultAnnounceMs,Oe[I]=Ne,ke[I]=setInterval(Ne,trackerAnnounceMs[F.url]),Ne(),()=>{if(roomSubscriberCounts[I]=Math.max(0,(roomSubscriberCounts[I]??1)-1),roomSubscriberCounts[I]||delete roomSubscriberCounts[I],Ae[I]!==je){roomSubscriberCounts[I]||reclaimAllOutstandingOffers(I);return}let F=ke[I];F&&(clearInterval(F),delete ke[I]),De[I]===Me&&delete De[I],Oe[I]===Ne&&delete Oe[I],delete Ae[I],roomSubscriberCounts[I]||reclaimAllOutstandingOffers(I)}},announce:F=>trackerAnnounceMs[F.url]}),joinRoom=(F,I,L)=>joinRoomStrategy({...F,trickleIce:F.trickleIce??!1},I,L),getRelaySockets=relayManager.getSockets,defaultRelayUrls=[`tracker.webtorrent.dev`,`tracker.openwebtorrent.com`,`tracker.btorrent.xyz`,`tracker.files.fm:7073/announce`].map(F=>`wss://`+F),require_lodash_throttle=__commonJSMin(((F,I)=>{var L=`Expected a function`,R=NaN,z=`[object Symbol]`,De=/^\s+|\s+$/g,Oe=/^[-+]0x[0-9a-f]+$/i,ke=/^0b[01]+$/i,Ae=/^0o[0-7]+$/i,je=parseInt,Me={}.Object===Object&&{},Ne=typeof self==`object`&&self&&self.Object===Object&&self,Pe=Me||Ne||Function(`return this`)(),Fe=Object.prototype.toString,Ie=Math.max,Le=Math.min,Re=function(){return Pe.Date.now()};function ze(F,I,R){var z,De,Oe,ke,Ae,je,Me=0,Ne=!1,Pe=!1,Fe=!0;if(typeof F!=`function`)throw TypeError(L);I=at(I)||0,Ge(R)&&(Ne=!!R.leading,Pe=`maxWait`in R,Oe=Pe?Ie(at(R.maxWait)||0,I):Oe,Fe=`trailing`in R?!!R.trailing:Fe);function ze(I){var L=z,R=De;return z=De=void 0,Me=I,ke=F.apply(R,L),ke}function Be(F){return Me=F,Ae=setTimeout(ot,I),Ne?ze(F):ke}function rt(F){var L=F-je,R=F-Me,z=I-L;return Pe?Le(z,Oe-R):z}function it(F){var L=F-je,R=F-Me;return je===void 0||L>=I||L<0||Pe&&R>=Oe}function ot(){var F=Re();if(it(F))return st(F);Ae=setTimeout(ot,rt(F))}function st(F){return Ae=void 0,Fe&&z?ze(F):(z=De=void 0,ke)}function ct(){Ae!==void 0&&clearTimeout(Ae),Me=0,z=je=De=Ae=void 0}function lt(){return Ae===void 0?ke:st(Re())}function ut(){var F=Re(),L=it(F);if(z=arguments,De=this,je=F,L){if(Ae===void 0)return Be(je);if(Pe)return Ae=setTimeout(ot,I),ze(je)}return Ae===void 0&&(Ae=setTimeout(ot,I)),ke}return ut.cancel=ct,ut.flush=lt,ut}function Be(F,I,R){var z=!0,De=!0;if(typeof F!=`function`)throw TypeError(L);return Ge(R)&&(z=`leading`in R?!!R.leading:z,De=`trailing`in R?!!R.trailing:De),ze(F,I,{leading:z,maxWait:I,trailing:De})}function Ge(F){var I=typeof F;return!!F&&(I==`object`||I==`function`)}function rt(F){return!!F&&typeof F==`object`}function it(F){return typeof F==`symbol`||rt(F)&&Fe.call(F)==`[object Symbol]`}function at(F){if(typeof F==`number`)return F;if(it(F))return R;if(Ge(F)){var I=typeof F.valueOf==`function`?F.valueOf():F;F=Ge(I)?I+``:I}if(typeof F!=`string`)return F===0?F:+F;F=F.replace(De,``);var L=ke.test(F);return L||Ae.test(F)?je(F.slice(2),L?2:8):Oe.test(F)?R:+F}I.exports=Be})),import_lodash_throttle=__toESM(require_lodash_throttle()),endpoints={getMarketData:`https://farmhand.vercel.app/api/get-market-data`,postDayResults:`https://farmhand.vercel.app/api/post-day-results`},features=Object.keys({BASE_URL:`./`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1,VITE_API_ROOT:`https://farmhand.vercel.app/`,VITE_FARMHAND_PACKAGE_VERSION:`1.24.0`,VITE_NAME:`@jeremyckahn/farmhand`,VITE_TURN_CREDENTIAL:`6x4LaeUz+EVcw7zh`,VITE_TURN_USERNAME:`02e7e9daca7857e8d1faccf1`}).reduce((F,I)=>{let L=I.match(/VITE_ENABLE_(.*)/);return L&&(F[L[1]]=!0),F},{}),searchParams=new URLSearchParams(import_window.default.location?.search);for(let F of searchParams.keys()){let I=F.match(/enable_(.*)/);I&&(features[I[1]]=!0)}var turnUsername=`02e7e9daca7857e8d1faccf1`,turnCredential=`6x4LaeUz+EVcw7zh`,rtcConfig={iceServers:[{urls:`stun:stun.relay.metered.ca:80`},{urls:`turn:a.relay.metered.ca:80`,username:turnUsername,credential:turnCredential},{urls:`turn:a.relay.metered.ca:80?transport=tcp`,username:turnUsername,credential:turnCredential},{urls:`turn:a.relay.metered.ca:443`,username:turnUsername,credential:turnCredential},{urls:`turn:a.relay.metered.ca:443?transport=tcp`,username:turnUsername,credential:turnCredential}]},handlePeerMetadataRequest=(F,I,L)=>{F.updatePeer(F,I,L)},handleCowTradeRequest=async(F,{cowOffered:I,cowRequested:L},R)=>{let z=!1;F.setState(F=>{let{allowCustomPeerCowNames:De,cowIdOfferedForTrade:Oe,cowsTraded:ke,cowInventory:Ae,playerId:je,isAwaitingCowTradeRequest:Me,peers:Ne,sendCowAccept:Pe,sendCowReject:Fe}=F;if(!Pe||!Fe)return console.error(`Peer connection not set up correctly`),null;let Ie=Ae.find(({id:F})=>F===Oe);if(Me||L.id!==Oe||!Ie)return Fe({reason:cowTradeRejectionReason.REQUESTED_COW_UNAVAILABLE},R),null;let Le={...I,timesTraded:I.originalOwnerId===je?I.timesTraded:I.timesTraded+1},[,Re]=Object.entries(Ne).find(([,F])=>F?.playerId===Le.ownerId)??[];return Re?(F=changeCowAutomaticHugState(F,Ie,!1),F=removeCowFromInventory(F,Ie),F=addCowToInventory(F,{...Le,ownerId:je}),F=showNotification(F,COW_TRADED_NOTIFICATION(``,Ie,I,je,De),`success`),Pe({...Ie,isUsingHuggingMachine:!1},R),z=!0,{...F,cowIdOfferedForTrade:Le.id,cowsTraded:Le.originalOwnerId===je?ke:ke+1,isAwaitingCowTradeRequest:!0,selectedCowId:Le.id,peers:{...Ne,[R]:{...Re,cowOfferedForTrade:{...Ie,ownerId:Re.playerId}}}}):(console.error(`No data for peer ${Le.ownerId}`),null)},async()=>{z&&(await sleep(750),await F.persistState(),F.showNotification(PROGRESS_SAVED_MESSAGE,`info`),F.setState(()=>({isAwaitingCowTradeRequest:!1})))})},handleCowTradeRequestAccept=(F,I,L)=>{let R=!1;F.setState(F=>{let{allowCustomPeerCowNames:z,cowIdOfferedForTrade:De,cowInventory:Oe,cowsTraded:ke,cowTradeTimeoutId:Ae,playerId:je,peers:Me}=F,Ne=Oe.find(({id:F})=>F===De);if(!Ne)return console.error(`handleCowTradeRequestAccept: cow with ID ${De} is no longer available`),F=showNotification(F,UNKNOWN_COW_TRADE_FAILURE,`error`),{...F,isAwaitingCowTradeRequest:!1};let[,Pe]=Object.entries(Me).find(([,F])=>{let{playerId:L}=F;return L===I.ownerId})||[],Fe=I.originalOwnerId===je,Ie={...I,timesTraded:Fe?I.timesTraded:I.timesTraded+1};return F=removeCowFromInventory(F,Ne),F=addCowToInventory(F,{...Ie,ownerId:je}),F=showNotification(F,COW_TRADED_NOTIFICATION(``,Ne,Ie,je,z),`success`),Fe||(F=addExperience(F,EXPERIENCE_VALUES.COW_TRADED)),Ae&&clearTimeout(Ae),R=!0,{...F,cowsTraded:Ie.originalOwnerId===je?ke:ke+1,cowTradeTimeoutId:null,isAwaitingCowTradeRequest:!1,cowIdOfferedForTrade:Ie.id,selectedCowId:Ie.id,peers:{...Me,[L]:{...Pe,cowOfferedForTrade:{...Ne,ownerId:Pe.playerId}}}}},async()=>{R&&(await F.persistState(),F.showNotification(PROGRESS_SAVED_MESSAGE,`info`))})},handleCowTradeRequestReject=(F,{reason:I})=>{let{cowTradeTimeoutId:L}=F.state;typeof L==`number`&&clearTimeout(L),F.setState({cowTradeTimeoutId:null,isAwaitingCowTradeRequest:!1}),F.showNotification(REQUESTED_COW_TRADE_UNAVAILABLE,`error`)},relayRedundancy=4,useFarmhandNetwork=(F,I,L,R,z,De,Oe,ke)=>{let{hasBooted:Ae,isOnline:je,room:Me,redirect:Ne,heartbeatTimeoutId:Pe,peerRoom:Fe,sendPeerMetadata:Ie}=F,Le=(0,import_react$10.useCallback)(F=>(0,import_lodash_throttle.default)((...L)=>{F(...L),I(F=>({...F,pendingPeerMessages:[]}))},5e3,{trailing:!0}),[I]),Re=(0,import_react$10.useCallback)(()=>{typeof R.current?.state?.cowTradeTimeoutId==`number`&&(L.current.showNotification(REQUESTED_COW_TRADE_UNAVAILABLE,`error`),console.error(`Cow trade request timed out`),I(F=>({...F,cowTradeTimeoutId:null,isAwaitingCowTradeRequest:!1})))},[I,L,R]),ze=(0,import_react$10.useCallback)(z=>{let{cowIdOfferedForTrade:De,cowInventory:Oe,peers:ke,sendCowTradeRequest:Ae}=R.current?.state??F;if(!Ae)return;let{ownerId:je}=z,[Me]=Object.entries(ke).find(([,F])=>F?.playerId===je)??[];if(!Me){console.error(`Owner not found for cow ${JSON.stringify(z)}`);return}if(Oe.find(({id:F})=>F===z.id)){console.error(`Cow ID ${z.id} is already in inventory`),L.current.showNotification(COW_ALREADY_OWNED,`error`);return}let Ne=Oe.find(({id:F})=>F===De);if(!Ne){console.error(`Cow ID ${De} not found`);return}let Pe=setTimeout(Re,COW_TRADE_TIMEOUT);Ae({cowOffered:{...Ne,isUsingHuggingMachine:!1},cowRequested:z},Me),I(F=>({...F,cowTradeTimeoutId:Pe,isAwaitingCowTradeRequest:!0}))},[I,Re,L,R]),Be=(0,import_react$10.useCallback)(()=>{I(F=>(clearTimeout(F.heartbeatTimeoutId??-1),F));let F=import_window.default.setTimeout(()=>{I(F=>({...F,money:moneyTotal(F.money,F.activePlayers??0)})),Be()},HEARTBEAT_INTERVAL_PERIOD);I(I=>({...I,heartbeatTimeoutId:F}))},[I]),Ge=(0,import_react$10.useCallback)(async()=>{let{isOnline:F,priceCrashes:z,priceSurges:De,room:Oe,playerId:ke,peerRoom:Ae}=R.current.state;if(F){L.current.showNotification(CONNECTING_TO_SERVER,`info`);try{I(F=>({...F,isAwaitingNetworkRequest:!0,peers:{}})),Ae?.leave();let{valueAdjustments:F}=await getData(endpoints.getMarketData,{farmId:ke,room:Oe});Be(),I(I=>({...I,activePlayers:1,peerRoom:joinRoom({appId:`@jeremyckahn/farmhand`,rtcConfig},Oe),valueAdjustments:FarmhandService.applyPriceEvents(F,z,De)})),L.current.showNotification(CONNECTED_TO_ROOM(``,Oe),`success`)}catch(F){L.current.showNotification(SERVER_ERROR,`error`),console.error(F),I(F=>({...F,redirect:withCurrentHashQuery(`/`),cowIdOfferedForTrade:``}))}I(F=>({...F,isAwaitingNetworkRequest:!1,isAwaitingCowTradeRequest:!1}))}},[Be,L,R,I]),rt=(0,import_react$10.useCallback)((F,I)=>{L.current.prependPendingPeerMessage(F,I)},[L]);return(0,import_react$10.useEffect)(()=>{if(!Ae||!z)return;let F=decodeURIComponent(De),Re=Oe.startsWith(`/online`),ze=!!Ne&&Ne!==z.redirect;if(!ze&&(Re!==je||F!==Me)?I(I=>({...I,isOnline:Re,redirect:``,room:F})):Ne&&!ze&&Re===je&&F===Me&&I(F=>({...F,redirect:``})),(je!==z.isOnline||Me!==z.room)&&(je&&Ge(),!je&&typeof Pe==`number`&&(clearTimeout(Pe),I(F=>({...F,activePlayers:null,heartbeatTimeoutId:null,peerRoom:null})))),je===!1&&z.isOnline===!0&&L.current.showNotification(DISCONNECTED_FROM_SERVER,`info`),Fe!==z.peerRoom)if(Fe){Fe.onPeerJoin(F=>L.current.addPeer(F)),Fe.onPeerLeave(F=>L.current.removePeer(F));let[F,z]=Fe.makeAction(`peerMetadata`);z((...F)=>handlePeerMetadataRequest(R.current,F[0],F[1]));let[De,Oe]=Fe.makeAction(`cowTrade`);Oe((...F)=>handleCowTradeRequest(R.current,F[0],F[1]));let[Ae,je]=Fe.makeAction(`cowAccept`);je((...F)=>handleCowTradeRequestAccept(R.current,F[0],F[1]));let[Me,Ne]=Fe.makeAction(`cowReject`);Ne((...F)=>handleCowTradeRequestReject(R.current,F[0])),I(I=>({...I,getCowAccept:je,getCowReject:Ne,getCowTradeRequest:Oe,getPeerMetadata:z,pendingPeerMessages:[],sendCowAccept:Ae,sendCowReject:Me,sendCowTradeRequest:De,sendPeerMetadata:Le(F)})),F(ke)}else z.peerRoom?.leave(),I(F=>({...F,peers:{},sendPeerMetadata:null}));Ie?.(ke)},[Ae,je,Me,Ne,Pe,Fe,Ie,z,De,Oe,Ge,Le,ke,L,R,I]),{syncToRoom:Ge,scheduleHeartbeat:Be,wrapSendPeerMetadata:Le,tradeForPeerCow:ze,handleCowTradeTimeout:Re,messagePeers:rt}},computeMarketPositions=(F,I,L)=>L.reduce((L,{id:R,quantity:z})=>{let De=F[R]||0,Oe=I[R]||0;return itemsMap[R].doesPriceFluctuate&&De!==z&&(z<De||z<Oe?L[R]=-1:(z>De||z>Oe)&&(L[R]=1)),L},{}),useFarmhandDayAdvancement=(F,I,L,R,z)=>{let De=(0,import_react$10.useCallback)(async()=>{await L.localforage?.clear(),R.current.showNotification(DATA_DELETED)},[L.localforage,R]),Oe=(0,import_react$10.useCallback)((F,I={})=>L.localforage?.setItem(`state`,reduceByPersistedKeys({...F,...I})),[L.localforage]),ke=(0,import_react$10.useCallback)(async()=>{let L=[],R=null;I(F=>({...F,isAwaitingNetworkRequest:!0}));let z;if(F.current.isOnline){let{inventory:De,room:Oe,todaysPurchases:ke,todaysStartingInventory:Ae}=F.current,je=computeMarketPositions(Ae,ke,De);try{z=(await postData(endpoints.postDayResults,{positions:je,room:Oe})).valueAdjustments,Object.keys(je).length&&(L.push({message:POSITIONS_POSTED_NOTIFICATION(``,`You`,je),severity:`info`}),R=POSITIONS_POSTED_NOTIFICATION(``,``,je))}catch(F){L.push({message:SERVER_ERROR,severity:`error`}),I(F=>({...F,redirect:withCurrentHashQuery(`/`),cowIdOfferedForTrade:``,isAwaitingNetworkRequest:!1})),console.error(F)}}return{broadcastedPositionMessage:R,serverMessages:L,serverValueAdjustments:z}},[F,I]);return{clearPersistedData:De,persistState:Oe,updateServerForNextDay:ke,incrementDay:(0,import_react$10.useCallback)(async(L=!1)=>{if(F.current.isWaitingForDayToCompleteIncrementing&&!L)return;L||I(F=>({...F,isWaitingForDayToCompleteIncrementing:!0}));let{broadcastedPositionMessage:R,serverMessages:De,serverValueAdjustments:Oe}=await ke();I(F=>{let I=computeStateForNextDay(F,L),ke=[...De,...I.newDayNotifications];return I.valueAdjustments=FarmhandService.applyPriceEvents(Oe??I.valueAdjustments,I.priceCrashes,I.priceSurges),I.isAwaitingNetworkRequest=!1,I.isWaitingForDayToCompleteIncrementing=!0,I.newDayNotifications=[],I.todaysNotifications=[],z.current={state:I,pendingNotifications:ke,broadcastedPositionMessage:R,isFirstDay:L},I})},[F,ke,I,z])}},useFarmhandNotifications=(F,I)=>({showInventoryFullNotifications:(0,import_react$10.useCallback)((F,L)=>{inventorySpaceRemaining(F)>0&&inventorySpaceRemaining(L)<=0&&I.current.showNotification(INVENTORY_FULL_NOTIFICATION,`warning`)},[I]),showRecipeLearnedNotifications:(0,import_react$10.useCallback)(({learnedRecipes:L})=>{let R=[];Object.keys(F.learnedRecipes).forEach(F=>{L.hasOwnProperty(F)||R.push(recipesMap[F])}),R.length>1?I.current.showNotification(RECIPES_LEARNED(``,R)):R.length===1&&I.current.showNotification(RECIPE_LEARNED(``,R[0]))},[F.learnedRecipes,I])}),FarmhandReducers=class F extends import_react$10.Component{addCowToInventory(...F){throw Error(`Unimplemented`)}addPeer(...F){throw Error(`Unimplemented`)}adjustLoan(...F){throw Error(`Unimplemented`)}changeCowAutomaticHugState(...F){throw Error(`Unimplemented`)}changeCowBreedingPenResident(...F){throw Error(`Unimplemented`)}changeCowName(...F){throw Error(`Unimplemented`)}clearPlot(...F){throw Error(`Unimplemented`)}chopForestPlot(...F){throw Error(`Unimplemented`)}computeStateForNextDay(...F){throw Error(`Unimplemented`)}fertilizePlot(...F){throw Error(`Unimplemented`)}forRange(...F){throw Error(`Unimplemented`)}harvestForestPlot(...F){throw Error(`Unimplemented`)}harvestPlot(...F){throw Error(`Unimplemented`)}hugCow(...F){throw Error(`Unimplemented`)}makeRecipe(...F){throw Error(`Unimplemented`)}makeFermentationRecipe(...F){throw Error(`Unimplemented`)}makeWine(...F){throw Error(`Unimplemented`)}modifyCow(...F){throw Error(`Unimplemented`)}mulchForestPlot(...F){throw Error(`Unimplemented`)}offerCow(...F){throw Error(`Unimplemented`)}placeFarmhandShuffleWager(...F){throw Error(`Unimplemented`)}plantInPlot(...F){throw Error(`Unimplemented`)}plantTreeInPlot(...F){throw Error(`Unimplemented`)}prependPendingPeerMessage(...F){throw Error(`Unimplemented`)}purchaseCombine(...F){throw Error(`Unimplemented`)}purchaseComposter(...F){throw Error(`Unimplemented`)}purchaseCow(...F){throw Error(`Unimplemented`)}purchaseCowPen(...F){throw Error(`Unimplemented`)}purchaseCellar(...F){throw Error(`Unimplemented`)}purchaseField(...F){throw Error(`Unimplemented`)}purchaseForest(...F){throw Error(`Unimplemented`)}purchaseItem(...F){throw Error(`Unimplemented`)}purchaseSmelter(...F){throw Error(`Unimplemented`)}purchaseStorageExpansion(...F){throw Error(`Unimplemented`)}purchaseWoodChipper(...F){throw Error(`Unimplemented`)}removeCowFromInventory(...F){throw Error(`Unimplemented`)}removeKegFromCellar(...F){throw Error(`Unimplemented`)}removePeer(...F){throw Error(`Unimplemented`)}refundUnresumableFarmhandShuffleMatch(...F){throw Error(`Unimplemented`)}saveFarmhandShuffleMatch(...F){throw Error(`Unimplemented`)}selectCow(...F){throw Error(`Unimplemented`)}sellCow(...F){throw Error(`Unimplemented`)}sellItem(...F){throw Error(`Unimplemented`)}sellKeg(...F){throw Error(`Unimplemented`)}settleFarmhandShuffleMatch(...F){throw Error(`Unimplemented`)}setLightningRod(...F){throw Error(`Unimplemented`)}setScarecrow(...F){throw Error(`Unimplemented`)}setSprinkler(...F){throw Error(`Unimplemented`)}showNotification(...F){throw Error(`Unimplemented`)}updatePeer(...F){throw Error(`Unimplemented`)}upgradeTool(...F){throw Error(`Unimplemented`)}waterAllPlots(...F){throw Error(`Unimplemented`)}waterField(...F){throw Error(`Unimplemented`)}waterPlot(...F){throw Error(`Unimplemented`)}withdrawCow(...F){throw Error(`Unimplemented`)}constructor(I){super(I);let L=Object.getOwnPropertyNames(F.prototype).filter(F=>F!==`constructor`);for(let F of L){let I=reducers_exports[F];I&&(this[F]=(...F)=>{this.setState(L=>I(L,...F))})}}},useFarmhandReducers=F=>(0,import_react$10.useMemo)(()=>{let I={};Object.assign(I,reducers_exports);let L=Object.getOwnPropertyNames(FarmhandReducers.prototype).filter(F=>F!==`constructor`);for(let R of L){let L=reducers_exports[R];typeof L==`function`&&(I[R]=(...I)=>{F(F=>{let R=L(F,...I);return!R||R===F?F:{...R}})})}return I},[F]),usePrevious=F=>{let I=(0,import_react$10.useRef)();return(0,import_react$10.useEffect)(()=>{I.current=F},[F]),I.current},{CLEANUP,HARVEST,MINE,WATER}=fieldMode,useFarmhand=F=>{let{features:I,match:{path:L=``,params:{room:R}={}}={}}=F,z=(0,import_react$10.useCallback)(()=>({activePlayers:null,allowCustomPeerCowNames:!1,cellarInventory:[],currentDialogView:dialogView.NONE,completedAchievements:{},cowForSale:generateCow(),cowBreedingPen:{cowId1:null,cowId2:null,daysUntilBirth:-1},cowColorsPurchased:{},cowIdOfferedForTrade:``,cowInventory:[],cowsSold:{},cowsTraded:0,cowTradeTimeoutId:-1,cropsHarvested:{},dayCount:0,experience:0,farmName:`Unnamed`,farmhandShuffle:{isMatchInProgress:!1,wager:0,serializedMatch:null,totalMatchesPlayed:0,totalWins:0,totalLosses:0,currentWinStreak:0,longestWinStreak:0},field:createNewField(),fieldMode:fieldMode.OBSERVE,forest:createNewForest(),treesChopped:0,treeFruitsHarvested:{},mulchApplied:{},getCowAccept:noop$2,getCowReject:noop$2,getCowTradeRequest:noop$2,getPeerMetadata:noop$2,hasBooted:!1,hasProducedRainbowFertilizer:!1,heartbeatTimeoutId:null,historicalDailyLosses:[],historicalDailyRevenue:[],historicalValueAdjustments:[],hoveredPlotRangeSize:0,playerId:v4(),inventory:[{id:scarecrow.id,quantity:1}],inventoryLimit:100,isAwaitingCowTradeRequest:!1,isAwaitingNetworkRequest:!1,isCombineEnabled:!1,isMenuOpen:!doesMenuObstructStage(),itemsSold:{},cellarItemsSold:{},isChatOpen:!1,isDialogViewOpen:!1,isOnline:L.startsWith(`/online`)??!1,isWaitingForDayToCompleteIncrementing:!1,learnedRecipes:{},loanBalance:500,loansTakenOut:1,money:500,latestNotification:null,newDayNotifications:[],notificationLog:[],notificationDuration:NOTIFICATION_DURATION_DEFAULT,peers:{},peerRoom:null,pendingPeerMessages:[],latestPeerMessages:[],sendPeerMetadata:null,selectedCowId:``,selectedForestItemId:``,selectedItemId:``,priceCrashes:{},priceSurges:{},profitabilityStreak:0,recipesMade:{},record7dayProfitAverage:0,recordProfitabilityStreak:0,recordSingleDayProfit:0,revenue:0,redirect:``,room:decodeURIComponent(F.match?.params?.room||`global`),sendCowAccept:noop$2,sendCowReject:noop$2,purchasedCombine:0,purchasedComposter:0,purchasedCowPen:0,purchasedCellar:0,purchasedField:0,purchasedForest:0,purchasedSmelter:0,purchasedWoodChipper:0,sendCowTradeRequest:noop$2,showHomeScreen:!0,showNotifications:!0,stageFocus:stageFocusType.HOME,todaysNotifications:[],todaysLosses:0,todaysPurchases:{},todaysRevenue:0,todaysStartingInventory:{},toolLevels:{[toolType.AXE]:toolLevel.UNAVAILABLE,[toolType.HOE]:toolLevel.DEFAULT,[toolType.PICKER_POLE]:toolLevel.UNAVAILABLE,[toolType.SCYTHE]:toolLevel.DEFAULT,[toolType.SHOVEL]:toolLevel.UNAVAILABLE,[toolType.WATERING_CAN]:toolLevel.DEFAULT},useAlternateEndDayButtonPosition:!1,valueAdjustments:{},version:`1.24.0`}),[L,F.match?.params?.room]),[De,Oe]=(0,import_react$10.useState)(z),ke=(0,import_react$10.useRef)(De);ke.current=De;let Ae=R===void 0?De.room:R,je=(0,import_react$10.useRef)(null),Me=(0,import_react$10.useRef)(!1),Ne=useFarmhandReducers(Oe),Pe=(0,import_react$10.useRef)(Ne);Pe.current=Ne;let Fe=usePrevious(De),Ie=STAGE_TITLE_MAP[De.stageFocus],Le=FarmhandService.getFieldToolInventory(De.inventory),Re=FarmhandService.computePlayerInventory(De.inventory,De.valueAdjustments),ze=FarmhandService.getPlantableCropInventory(De.inventory),Be=FarmhandService.getPlantableTreeInventory(De.inventory),Ge=FarmhandService.getMulchInventory(De.inventory),rt=(0,import_react$10.useMemo)(()=>getLevelEntitlements(levelAchieved(De.experience)),[De.experience]),it=(0,import_react$10.useMemo)(()=>getAvailableShopInventory(rt),[rt]),at=rt.stageFocusType[stageFocusType.FOREST],ot=rt.stageFocusType[stageFocusType.FARMHAND_SHUFFLE],st=De.isOnline&&De.room!==`global`,ct=(0,import_react$10.useMemo)(()=>getViewList({isFarmhandShuffleUnlocked:ot,isForestUnlocked:at,purchasedCellar:De.purchasedCellar,purchasedCowPen:De.purchasedCowPen,showHomeScreen:De.showHomeScreen}),[De.showHomeScreen,ot,at,De.purchasedCowPen,De.purchasedCellar]),lt=(0,import_react$10.useMemo)(()=>getPeerMetadata(De),[De]),ut=De.isAwaitingNetworkRequest||De.isAwaitingCowTradeRequest||De.isWaitingForDayToCompleteIncrementing,dt=(0,import_react$10.useRef)(null),{openDialogView:ft,closeDialogView:pt,focusNextView:mt,focusPreviousView:ht}=useFarmhandNavigation(Oe,ct),gt=(0,import_react$10.useRef)(!0),vt=(0,import_react$10.useRef)(!1);(0,import_react$10.useEffect)(()=>{if(De.hasBooted){if(vt.current){vt.current=!1,setHashQueryParam(VIEW_QUERY_PARAM_NAME,De.stageFocus);return}if(gt.current){gt.current=!1,setHashQueryParam(VIEW_QUERY_PARAM_NAME,De.stageFocus);return}setHashQueryParam(VIEW_QUERY_PARAM_NAME,De.stageFocus,`push`),removeHashQueryParam(`tab`)}},[De.stageFocus,De.hasBooted]),(0,import_react$10.useEffect)(()=>{let F=()=>{let F=getValidatedStageFocusFromHash(ke.current)??stageFocusType.HOME;F!==ke.current.stageFocus&&(vt.current=!0,Oe(I=>({...I,stageFocus:F})))};return import_window.default.addEventListener(`popstate`,F),()=>import_window.default.removeEventListener(`popstate`,F)},[]);let{syncToRoom:yt,scheduleHeartbeat:yr,tradeForPeerCow:br,handleCowTradeTimeout:hw,messagePeers:gw}=useFarmhandNetwork(De,Oe,Pe,dt,Fe,Ae,L,lt),{clearPersistedData:_w,persistState:vw,updateServerForNextDay:yw,incrementDay:bw}=useFarmhandDayAdvancement(ke,Oe,F,Pe,je),{showInventoryFullNotifications:xw,showRecipeLearnedNotifications:Sw}=useFarmhandNotifications(De,Pe);dt.current=(0,import_react$10.useMemo)(()=>({queueRandomNumbers:(F,I)=>randomNumberService.queueRandomNumbers(F,I),state:De,props:F,viewTitle:Ie,fieldToolInventory:Le,mulchInventory:Ge,playerInventory:Re,plantableCropInventory:ze,plantableTreeInventory:Be,viewList:ct,levelEntitlements:rt,shopInventory:it,peerMetadata:lt,isInputBlocked:ut,isChatAvailable:st,isFarmhandShuffleUnlocked:ot,isForestUnlocked:at,setState:(F,I)=>{Oe(L=>{let R=typeof F==`function`?F(L):F;if(R==null)return L;let z={...L,...R};return I&&setTimeout(I,0),z})},...Pe.current,purchaseItem:(F,I)=>Pe.current.purchaseItem(F,I),sellItem:(F,I)=>Pe.current.sellItem(F,I),showNotification:(F,I,L,R)=>Pe.current.showNotification(F,I,L,R),prependPendingPeerMessage:(F,I)=>Pe.current.prependPendingPeerMessage(F,I),forRange:(F,I,L,R,z)=>Pe.current.forRange(F,I,L,R,z),createInitialState:z,getData,postData,tradeForPeerCow:br,handleCowTradeTimeout:hw,clearPersistedData:_w,syncToRoom:yt,scheduleHeartbeat:yr,showInventoryFullNotifications:xw,showRecipeLearnedNotifications:Sw,persistState:(F={})=>vw(dt.current?.state??De,F),updateServerForNextDay:yw,incrementDay:bw,openDialogView:ft,closeDialogView:pt,focusNextView:mt,focusPreviousView:ht,messagePeers:gw}),[De,F,Ie,Le,Ge,Re,ze,Be,ct,rt,it,lt,ut,st,ot,at,br,hw,_w,yt,yr,xw,Sw,vw,yw,bw,ft,pt,mt,ht,gw,z]);let Cw=(0,import_react$10.useMemo)(()=>{let F={debounced:{}};return Object.keys(ui_events_default).forEach(I=>{let L=I;F[L]=(...F)=>ui_events_default[L].apply(dt.current,F),F.debounced[L]=(0,import_lodash_debounce.default)(F[L],50)}),F},[]),ww=(0,import_react$10.useMemo)(()=>{let F={incrementDay:`shift+c`,nextView:`right`,openAccounting:`b`,openAchievements:`a`,openLog:`l`,openPriceEvents:`e`,openStats:`s`,openSettings:`,`,openKeybindings:`shift+?`,previousView:`left`,toggleMenu:`m`};return nullArray(9).forEach((I,L)=>{F[`numberKey${L+1}`]=String(L+1)}),F},[]),Tw=(0,import_react$10.useMemo)(()=>{let F={incrementDay:()=>{De.farmhandShuffle.isMatchInProgress||bw()},nextView:mt,openAccounting:()=>ft(dialogView.ACCOUNTING),openAchievements:()=>ft(dialogView.ACHIEVEMENTS),openLog:()=>ft(dialogView.FARMERS_LOG),openPriceEvents:()=>ft(dialogView.PRICE_EVENTS),openStats:()=>ft(dialogView.STATS),openSettings:()=>ft(dialogView.SETTINGS),openKeybindings:()=>ft(dialogView.KEYBINDINGS),previousView:ht,selectHoe:()=>Cw.handleFieldModeSelect(CLEANUP),selectScythe:()=>Cw.handleFieldModeSelect(HARVEST),selectWateringCan:()=>Cw.handleFieldModeSelect(WATER),selectShovel:()=>{De.toolLevels[toolType.SHOVEL]!==toolLevel.UNAVAILABLE&&Cw.handleFieldModeSelect(MINE)},toggleMenu:()=>Cw.handleMenuToggle()};return nullArray(9).forEach((I,L)=>{F[`numberKey${L+1}`]=()=>{let F=ct[L];typeof F==`string`&&Oe(I=>({...I,stageFocus:stageFocusType[F]}))}}),F},[bw,mt,ft,ht,Cw,De.farmhandShuffle.isMatchInProgress,De.toolLevels,ct,_w]);(0,import_react$10.useEffect)(()=>{if(Me.current)return;Me.current=!0,Object.defineProperty(import_window.default,"farmhand",{get:()=>dt.current,configurable:!0});let I=!0;return(async()=>{let L=await F.localforage?.getItem(`state`);if(I){if(L){let F=transformStateDataForImport({...z(),...L}),{isCombineEnabled:I,newDayNotifications:R}=F,De=getValidatedStageFocusFromHash(F);Oe(I=>({...I,...F,...De&&{stageFocus:De},newDayNotifications:[],hasBooted:!0})),R.forEach(({message:F,severity:I})=>{setTimeout(()=>Pe.current.showNotification(F,I),0)}),I&&Pe.current.forRange(harvestPlot,1/0,0,0)}else{await bw(!0),Oe(F=>({...F,historicalValueAdjustments:[]})),Pe.current.showNotification(LOAN_INCREASED(``,500),`info`);let F=getValidatedStageFocusFromHash(ke.current);Oe(I=>({...I,...F&&{stageFocus:F},hasBooted:!0}))}yt()}})(),()=>{I=!1}},[z,bw,F.localforage,yt]);let Ew=(0,import_react$10.useRef)(import_window.default.innerWidth);(0,import_react$10.useEffect)(()=>{let F=()=>{let{innerWidth:F}=import_window.default,I=F!==Ew.current;Ew.current=F,I&&Oe(F=>{let I=!doesMenuObstructStage();return F.isMenuOpen===I?F:{...F,isMenuOpen:I}})};return import_window.default.addEventListener(`resize`,F),()=>import_window.default.removeEventListener(`resize`,F)},[]),(0,import_react$10.useEffect)(()=>{if(!De.hasBooted||!je.current)return;let I=!0,{state:L,pendingNotifications:R,broadcastedPositionMessage:z,isFirstDay:ke}=je.current;return je.current=null,(async()=>{try{if(await F.localforage?.setItem(`state`,reduceByPersistedKeys({...L,...ke&&{historicalValueAdjustments:[]},newDayNotifications:R})),!I)return;if([...R].concat(ke?[]:[{message:PROGRESS_SAVED_MESSAGE,severity:`info`}]).forEach(({message:F,severity:I})=>setTimeout(()=>Pe.current.showNotification(F,I),0)),L.isCombineEnabled){if(L.stageFocus===stageFocusType.FIELD&&await sleep(1e3),!I)return;Pe.current.forRange(harvestPlot,1/0,0,0)}}catch(F){console.error(F),I&&Pe.current.showNotification(JSON.stringify(F),`error`)}finally{I&&(Oe(F=>({...F,isWaitingForDayToCompleteIncrementing:!1})),z&&Pe.current.prependPendingPeerMessage(z))}})(),()=>{I=!1}},[De.dayCount,De.hasBooted,F.localforage,Oe]),(0,import_react$10.useEffect)(()=>()=>{ke.current.heartbeatTimeoutId&&clearTimeout(ke.current.heartbeatTimeoutId),ke.current.peerRoom?.leave()},[]),(0,import_react$10.useEffect)(()=>{!De.hasBooted||!Fe||(updateAchievements(De,Fe)!==De&&Oe(F=>{let I=updateAchievements(F,Fe);return I===F?F:I}),De.stageFocus===stageFocusType.COW_PEN&&Fe.stageFocus!==stageFocusType.COW_PEN&&Oe(F=>({...F,selectedCowId:``})),De.stageFocus!==Fe.stageFocus&&De.isMenuOpen&&Oe(F=>{let I=!doesMenuObstructStage();return F.isMenuOpen===I?F:{...F,isMenuOpen:I}}),De.money<Fe.money&&Oe(F=>({...F,todaysLosses:moneyTotal(F.todaysLosses,De.money-Fe.money)})),xw(Fe,De),Sw(Fe))},[De,Fe,xw,Sw]);let Dw=De.redirect;return{gameState:{...De,blockInput:ut,features:I??{},fieldToolInventory:Le,mulchInventory:Ge,isChatAvailable:st,levelEntitlements:rt,plantableCropInventory:ze,plantableTreeInventory:Be,playerInventory:Re,playerInventoryQuantities:getInventoryQuantities(De.inventory),shopInventory:it,viewList:ct,viewTitle:Ie},handlers:Cw,isInputBlocked:ut,keyMap:ww,keyHandlers:Tw,redirect:Dw,state:De,viewList:ct,focusPreviousView:ht,focusNextView:mt,isChatAvailable:st}},emptyObject=Object.freeze({}),defaultFeatures={},defaultLocalforage=import_localforage.default.createInstance({name:`farmhand`,description:`Persisted game data for Farmhand`}),defaultMatch={path:``,params:{}},Farmhand=({features:F=defaultFeatures,localforage:I=defaultLocalforage,match:L=defaultMatch,...R})=>{let{gameState:z,handlers:De,isInputBlocked:Oe,keyMap:ke,keyHandlers:Ae,redirect:je,state:Me,viewList:Ne,focusPreviousView:Pe,focusNextView:Fe,isChatAvailable:Ie}=useFarmhand({...R,features:F,localforage:I,match:L});return(0,import_jsx_runtime$2.jsx)(import_index_es.GlobalHotKeys,{allowChanges:!0,keyMap:Oe?emptyObject:ke,handlers:Oe?emptyObject:Ae,children:(0,import_jsx_runtime$2.jsxs)(ThemeProvider,{theme:mui_theme_default,children:[(0,import_jsx_runtime$2.jsx)(CssBaseline,{}),(0,import_jsx_runtime$2.jsxs)(SnackbarProvider,{anchorOrigin:{vertical:`top`,horizontal:`right`},classes:{containerRoot:`Farmhand notification-container`},content:snackbarProviderContentCallback,maxSnack:4,children:[je&&(0,import_jsx_runtime$2.jsx)(Redirect,{to:je}),(0,import_jsx_runtime$2.jsxs)(FarmhandContext.Provider,{value:{gameState:z,handlers:De},children:[(0,import_jsx_runtime$2.jsxs)(Div,{className:(0,import_classnames.default)(`Farmhand farmhand-root fill`,Me.isMenuOpen?`menu-open`:`menu-closed`,{"use-alternate-end-day-button-position":Me.useAlternateEndDayButtonPosition,"block-input":Oe,"has-booted":Me.hasBooted}),sx:F=>({...fillSx,display:`flex`,paddingTop:`3.5em`,position:`fixed`,touchAction:`manipulation`,opacity:+!!Me.hasBooted,transform:Me.hasBooted?`scale(1)`:`scale(0)`,transition:`opacity, transform 200ms`,...Oe&&{"& button, & input":{filter:`contrast(65%)`,pointerEvents:`none`}},[`@media (min-width: ${breakpoints.smallPhone}px) and (orientation: landscape)`]:{paddingTop:`3em`},[`@media (min-width: ${breakpoints.sm}px)`]:{paddingTop:`4em`},"& .sidebar-wrapper":{display:`flex`},"& .bottom-controls":{alignItems:`center`,bottom:`1em`,display:`flex`,flexFlow:`column`,justifyContent:`center`,left:`50%`,opacity:.85,position:`fixed`,transition:F.transitions.create(`left`,{duration:F.transitions.duration.enteringScreen,easing:F.transitions.easing.easeOut}),width:0,zIndex:Z_INDEX.END_DAY_BUTTON,[`@media (max-width: ${breakpoints.mediumPhone}px)`]:{bottom:`0.5em`},"& .MuiMobileStepper-root":{background:`none`},"& .fab-buttons":{display:`flex`,flexFlow:`row`,"& button":{margin:`0.5em`,position:`relative`,[`@media (max-width: ${breakpoints.mediumPhone}px)`]:{margin:`0.25em 0.5em`},"@media (max-width: 320px)":{margin:`0.25em 0.1em`}}},...Me.isMenuOpen&&{"@media (orientation: landscape)":{left:`calc(50vw + ${layout.sidebarWidth} / 2)`}}},"& .end-day":{position:`fixed`,top:`5em`,right:`1em`,[`@media (min-width: ${breakpoints.sm}px)`]:{right:`1.25em`,top:`5.5em`},...Me.useAlternateEndDayButtonPosition&&{right:`auto`,left:`1em`}},"& .menu-button":{transition:F.transitions.create(`transform`,{duration:F.transitions.duration.shorter}),transform:Me.isMenuOpen?`rotate(-90deg)`:`rotate(0deg)`}}),children:[(0,import_jsx_runtime$2.jsx)(UpdateNotifier,{}),(0,import_jsx_runtime$2.jsx)(Consumer$30,{}),(0,import_jsx_runtime$2.jsxs)(Drawer,{className:`sidebar-wrapper`,open:z.isMenuOpen,variant:`persistent`,role:`complementary`,PaperProps:{className:`sidebar`,sx:{backgroundImage:`url(${blue_stripe_bg_default})`,boxSizing:`border-box`,overflow:`auto`,padding:`1em 1em 0`,position:`relative`,width:layout.sidebarWidth,zIndex:20,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{width:layout.narrowSidebarWidth},"& .button-array":{display:`flex`,flexWrap:`wrap`,margin:`0.5em 0`}}},children:[(0,import_jsx_runtime$2.jsx)(Consumer$14,{}),(0,import_jsx_runtime$2.jsx)(Consumer$24,{}),(0,import_jsx_runtime$2.jsx)(`div`,{className:`spacer`})]}),(0,import_jsx_runtime$2.jsx)(Consumer,{}),(0,import_jsx_runtime$2.jsxs)(`div`,{className:`bottom-controls`,children:[(0,import_jsx_runtime$2.jsx)(MobileStepper,{variant:`dots`,steps:Ne.length,position:`static`,activeStep:Ne.indexOf(Me.stageFocus),className:``,backButton:null,nextButton:null}),(0,import_jsx_runtime$2.jsxs)(`div`,{className:`fab-buttons buttons`,children:[(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":`Previous view`,color:`primary`,onClick:Pe,children:(0,import_jsx_runtime$2.jsx)(KeyboardArrowLeftIcon,{})}),(0,import_jsx_runtime$2.jsx)(Fab,{className:(0,import_classnames.default)(`menu-button`,{"is-open":Me.isMenuOpen}),color:`primary`,"aria-label":`Open drawer`,onClick:()=>De.handleMenuToggle(),children:(0,import_jsx_runtime$2.jsx)(MenuIcon,{})}),(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":`Next view`,color:`primary`,onClick:Fe,children:(0,import_jsx_runtime$2.jsx)(KeyboardArrowRightIcon,{})})]})]}),!z.farmhandShuffle.isMatchInProgress&&(0,import_jsx_runtime$2.jsx)(Tooltip,{placement:`left`,title:(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsx)(`p`,{children:`End the day to save your progress and advance the game.`}),(0,import_jsx_runtime$2.jsx)(`p`,{children:`(shift + c)`})]}),children:(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":`End the day to save your progress and advance the game.`,className:`end-day`,color:`error`,onClick:De.handleClickEndDayButton,sx:{zIndex:Z_INDEX.END_DAY_BUTTON},children:(0,import_jsx_runtime$2.jsx)(HotelIcon,{})})})]}),Ie?(0,import_jsx_runtime$2.jsx)(ChatRoom,{}):null,(0,import_jsx_runtime$2.jsx)(NotificationSystem_default,{})]})]})]})})},FarmhandRoute=F=>(0,import_jsx_runtime$2.jsx)(Farmhand,{...F,features});(0,import_client.createRoot)(document.getElementById(`root`)).render((0,import_jsx_runtime$2.jsx)(HashRouter,{hashType:`noslash`,children:(0,import_jsx_runtime$2.jsx)(Route,{path:[`/online/:room`,`/online`,`/`],component:FarmhandRoute})}));
|
|
413
|
-
//# sourceMappingURL=index-
|
|
412
|
+
In Farmhand Shuffle you play against a bot opponent and pay money into a Community Fund at the start of every turn. Whoever avoids bankruptcy the longest wins!`})})})})})]}),De===`playing`&&Ne!==`error`&&(0,import_jsx_runtime$2.jsx)(mw,{playerSeeds:Me,userPlayerId:z,initialMatch:Ne,onMatchEnd:Ie,onCheckpoint:Le,hideDefaultGameOverActions:!0,useGenericPlayerLabels:!0,hideScrollbar:!0,sx:{height:`100%`,backgroundColor:`transparent`,backgroundImage:`none`,color:`black`,"--farmhand-shuffle-placeholder-outline-color":`rgba(0, 0, 0, 0.35)`,"--farmhand-shuffle-content-padding":`0.5rem`,"--farmhand-shuffle-bottom-inset":`0px`,"@media (max-width: 899.95px)":{"--farmhand-shuffle-bottom-inset":`7.5em`},"--farmhand-shuffle-hand-toggle-bottom":`1.4375rem`,"--farmhand-shuffle-hand-toggle-left":`1.4375rem`},renderGameOverContent:I=>(0,import_jsx_runtime$2.jsx)(ShuffleResultSummary,{winnerId:I,userPlayerId:z,wager:je.current,winStreak:F.currentWinStreak,onPlayAgain:Re,onLeave:ze})})]})},brown_dot_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAk0lEQVRoge2UoRGAMBAECZYS8HRDw5QSnxKig88gfgaxl59befPi12wZzz22idr6dp3HPEvu5UtgJXb6gb9YgCaPQG3980B9d4VoLECTU0ClMJHdFaKxAE0eAcXCRHZXiMYCNDkFVAoT2V0hGgvQ5BFQLExkd4VoLECTU0ClMJHdFaKxAE0eAcXCRHZXiMYCNMsLvBG5ypkvoIETAAAAAElFTkSuQmCC`,floorboard_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAAAwCAYAAAD+WvNWAAAAAXNSR0IArs4c6QAAAUxJREFUeJzt3TFuwkAQheEFjSUQoo1EKJIid8oFuFMuwEVyjYgCCrBEayEiuQgtASNBXvDMmv8rt9nR7pPG24x7X/PZT0LryqpKk/HYuwxZ37sA5I0AQWJlVXnX8LC6cPY2rL9/LeyLQTpdAy6hhUFCgCAhQJDYvhicLTatAU3OPqIRW7RHDi0MEgIECQGCpPEjGrFFujObTl68a8CRdblKOd0JLQwSAgQJAYKEAEFCgCCxdbnyrgEncroTexoVrW643dWp7T1xP7QwSAgQJAQIEgIECQGCxLa7uvVNPfbEfdjb67N3DY0Wy02KWlvu/vNsaWGQECBICBAkBAiS3ufHOwOm8GdhX2FeeP3dhhYGCQGChABBQoAgIUCQ2GK58a4hHM7kelfPB4o2lwYx0MIgIUCQECBICBAkNw2YijTYCDFYF345lKOu/O7pAEBLR2y+MLyqAAAAAElFTkSuQmCC`,hay_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACYElEQVRoQ8VYwVEDQQwjbxqgBWqiHTqhDOpg+PKkAd5kNjPL7Dm2Jdkbwi+czyvZss53p4+3l9+Hwt/j0/Phrp/vz0KW/i0nhoAFO47NAHvx6B6Gysy7nk0RYJIzMSoxpst/BNTkDGA1hgE8c85Y2IGImAcOzYEngZEn+r93ho2FBJQqsl1c4xDp9fxxn43fSkAhuyv29PX+erBRpiKKVm0F52/vnEpnrjrg6XEH4MhGPVmsc5ERHte2SkghqgxuJrcWAQWwtT9GqpkLzWsSgQrgCvDMuiUX6gDO2o6eLUp3wiHu7i5KFTuWSksIWdwtuoXOvLjQfA4obWMSe1bY6WrUUXeZU8io7d/dqVBC7F6jEmCHmy0iPQPWDi0Q9sBIWlV5yQSUiv9HF6+WObR7ME/HSg5GWl6X0w5k+wrrREh6inQ8PJSEVLCKzLKZyDbYec2VEPPFwcawJHdtoZO424Hu8HlkqsA9LHf7rKIYAGsE1Ayoml7jd26eXt4WAQROcRi2SFaKlI1GyZWnLwtQjUu/zO0E2DWGiFhLQspQomKwLuVKiPVwtb2VeJVI6ZUSeTMDHBUNXZ9nQAmpFcnARzJCYDMMkIBdxpCWma1yjVHyeUQvBHZIwgJHVWVkxhRDfqW0SZUKKqDZd2daQtHhle5lyx67A1FDzA4wqixbTZTHu059F7olgGh2WGmWVonOgLL3snHtGWCcomqb1sK97XYLgVstamjXGjIrE2BbvILYPUsjX7oLqZamusgOQlQH7vHm5ekfzkDH9ysPtAEIFQfZ6eG7EApWJYKG0KuoesYZ+5TyAAnuGB8AAAAASUVORK5CYIIA`,jack_o_lantern_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAeCAYAAABNChwpAAAA4UlEQVRYR+2VMQ6DMAxFYe4R2LsxdOopuHBv0KkDW/ceoTOVK/0qhICd8K0wNBNyIv3nH5PfTrdhaiqu9vAAz9f768+5O7n4tOmAt7h0tAAIRde+mVbMACCoCTCv4wcQio+Pe9NfrjOOuMaCWACIEBYgUjU3AM1+7LsCVL0CdBjaLrV4JugOiEjVvwCdhxDoMlWzzop27vhZoHWwd//vgLsDWqK6AmjiyTjeO1S5cU51oOQhowGUxjkdIDfO6QDWGcIz7wKQE+cuAOKCNc5pAKVxTgWIISxxTgewDiHOVQf4AHx92LXFZzetAAAAAElFTkSuQmCC`,winter_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAQdJREFUeJztmcERgyAUBZ9pIjVRUa5UldT0K/BITnhKZpgYXYG3Bei6oyCwxFrKPb9EEznpTI/ISZK06PEsp931YkROcweQpBstQNMcoH4zo9EUoD78iBGaAtTR+Qqzxb/xIEgL0DgALUDTTYCjZiAPgrQAjQPQAjQOcNSFe1k3eBagBWgcgBagcYBeRuujmP4NWGIt2zQ44pbXN7aDkaucDFH4E/Cf4OQ4AC1A4wC0AI0D0AI0DkAL0DgALUDjALQAze4AkVM3hyCfmP4N8H4ALUDjALQAjQPQAjQOQAvQOAAtQDNEgD3rkSECSL+fbHstQAvQOAAtQOMAtACNA9ACFWJjNXLSG2nxQbKUEorlAAAAAElFTkSuQmCC`,yellow_dot_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAx0lEQVRoQ+2WwQ3AIAwDYRVW6dx9dg1GKf1WlEcTAUks94maBHzGIt/taqn7aj1TKUe/nDyu59EBPjt3vMADWMMhATcEPCbMnySkhdxYyHoj2vm0kFa5WXVDApESiRaaZQVtHxLQKjerDodApOR5v5FwCMzy5O4+JLBb8X4eJoFIiYRJwNrXkvkkIFFrxb84BCIlD99CK7ys7YlzB7QKWNdhEoiUSJgErH0tmU8CErVW/ItDIFLy8C20wsvanjh3QKuAdV14Ag9MlnJUFzG78wAAAABJRU5ErkJgggAA`,lavender_dot_bg_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAyUlEQVRoQ+2WwRGAIAwEQw0WYf/l+LQAPzaAXwd5mAyQ5OZ8MiaB2+OGcp+1SvNdh8i2t6siEddL7wDfrcdd4QG82ZBAGAIRE+ZPEtJCYSzkvRHrfFrIqtyoui6BTIlEC42ygrUPCViVG1WHQyBT8rzfSDgERnlydR8SWK14Ow+TQKZEwiTg7WvNfBLQqDXjXxwCmZKHb6EZXrb2xLkDVgW86zAJZEokTALevtbMJwGNWjP+xSGQKXn4FprhZWtPnDtgVcC7Lj2BB3XCNohEy6k2AAAAAElFTkSuQmCC`,grass_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABp0lEQVRoQ92Y63HDMAyD5RE6QMfLCp2qi2SODtARkmt7yTmuJIAEeHbiv+LrIyjZ8vJxbpe28/P91drbe66IZQ2gBMql//Ni8o5sZAAm+RqOtd/aUQCzLo4CsAXdYrP2rN2DAhkAZXQcvjSAI1lFjBIAVn4H0K4ADtASALaz7EkzO8V+ARydYItWD4ptrVMAJ5gz1roJ0xFyJnXGogGiclcVOasjvYl7xT4VgGPTOmKkFXAkd8S4AyD50fqoGNZvZjdbex0Ah5xsDFYVJp60B7KFZP16d4pdAJjOsu8gCaCXRO1uFE6+E28TPj1AtIOqinCEqjuqfpIcEiCiIgRAwaoVmt3GftZKAdxwvXjL6bNdsv8lj6BOKYB6wqAGWUaISYLmOBrDcqVUkiLfyN75t4lZZ9YOFauO2SEBItDyMcp+NTJFZVSlATLBoz6Za2UpANN11mb0zUQDsIlYu6g6o81uAcgUk/HpQewG4Hq50b9V2NHI2ClqHAIgA33zgSOkdMcxJij/6wMo8lb5rlWBCkSLQJKjeIy/BIASoHUHgHQfUAtEANH1K9JWO4Tg58LYAAAAAElFTkSuQmCC`,forest_floor_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAWRJREFUaIHlWTkSgzAMNH6AO16V/78inT+QVDREYB2rg8mWjBHs6rBkb+M1Pu2Euc823uP8uCQ69RD583OfMFsUSAJIcMXQEjUTQCms9bqZQHauqAl4xzYXagIZylOi/RCIUlbzHUq0HwJRyqK+415GD3h5NoyAl2dVBO7URCjNsXGs2ahe6ElwD6GVmlaPpfdC1twISWLPvaV7u7g57y0d7WK02it78BBCq72yF7aRecF9oJGGlHQ9SUBiBJ1D0vXuQ/0K0I0sY8qCbmR3xiQNViTYScxRKmPMLFlGJZ6En0pEtx7wUwmvMLoShl2Fss+BroRhVyGOsqWrEAfWMqzBf55KVEIZApD7gcxKA7kfoIxkl88Velv8pFaZKOK9OVWIqMbOlMQaldFtuYmARmVUW36QZBOolswHyWUSn1+oBrck1kDj5TI7cVMKyb6lfMxQb5m0rtZIiEFO5tAfk8wJ0jD6AhfOowgv6la0AAAAAElFTkSuQmCC`,Stage=({dayCount:F,field:I,isMenuOpen:L=!0,stageFocus:R,useAlternateEndDayButtonPosition:z=!1,viewTitle:De})=>{let Oe=(0,import_react$10.useRef)(null);(0,import_react$10.useEffect)(()=>{if(Oe.current){let F=Oe.current,{style:I}=F;F.scrollTop=0,I.overflow=`hidden`,setTimeout(()=>I.overflow=``,0)}},[R]);let ke={[stageFocusType.HOME]:isOctober()?jack_o_lantern_bg_default:isDecember()?winter_bg_default:brown_dot_bg_default,[stageFocusType.SHOP]:yellow_dot_bg_default,[stageFocusType.WORKSHOP]:lavender_dot_bg_default,[stageFocusType.CELLAR]:floorboard_default,[stageFocusType.FIELD]:grass_default,[stageFocusType.COW_PEN]:grass_default,[stageFocusType.FOREST]:forest_floor_default,[stageFocusType.FARMHAND_SHUFFLE]:hay_bg_default}[R],Ae=[stageFocusType.FIELD,stageFocusType.COW_PEN,stageFocusType.FOREST].includes(R);return(0,import_jsx_runtime$2.jsxs)(Div,{className:(0,import_classnames.default)(`Stage`,{"is-october":isOctober(),"is-december":isDecember()}),"data-stage-focus":R,role:`main`,ref:Oe,sx:I=>({flex:2,imageRendering:`pixelated`,marginLeft:0,overflow:`auto`,padding:`1.5em 1.5em 0`,position:`relative`,zIndex:0,transition:I.transitions.create(`margin-left`,{duration:I.transitions.duration.enteringScreen,easing:I.transitions.easing.easeOut}),"& .stage-background":{backgroundSize:`96px`,bottom:0,left:0,pointerEvents:`none`,position:`fixed`,right:0,top:0,zIndex:-1,...ke?{backgroundImage:`url(${ke})`}:{},...Ae?{backgroundSize:`30%`,filter:seasonFilterMap[getCurrentSeason(F)],[`@media (min-width: ${breakpoints.md}px)`]:{backgroundSize:`10%`}}:{},...R===stageFocusType.CELLAR?{backgroundSize:`288px 96px`}:{}},"& h3":{textAlign:`center`},"& h2":{fontSize:`1.2em`},"& .view-title":{fontSize:`2.5em`,marginBottom:`0.6em`,textAlign:`center`,[`@media (min-width: ${breakpoints.largePhone}px)`]:{display:`none`},...R===stageFocusType.FARMHAND_SHUFFLE&&{display:`none`}},"& section":{padding:`0.5em 0`,[`@media (max-width: ${breakpoints.sm}px)`]:{fontSize:`1em`}},...z?{paddingTop:`4em`,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{paddingTop:`4.5em`}}:{},...L?{transitionProperty:`padding, margin-left`,[`@media (max-width: ${breakpoints.sm}px)`]:{padding:0},"& > *:not(.stage-background)":{opacity:1,transition:I.transitions.create(`opacity`,{duration:I.transitions.duration.enteringScreen,easing:I.transitions.easing.easeOut}),[`@media (max-width: ${breakpoints.sm}px)`]:{opacity:0}}}:{marginLeft:`-${layout.sidebarWidth}`,transition:I.transitions.create(`margin-left`,{duration:I.transitions.duration.leavingScreen,easing:I.transitions.easing.sharp}),[`@media (max-width: ${breakpoints.smallPhone}px)`]:{marginLeft:`-${layout.narrowSidebarWidth}px`}},...R===stageFocusType.FARMHAND_SHUFFLE?{overflow:`hidden`,padding:0}:{}}),children:[(0,import_jsx_runtime$2.jsx)(`div`,{className:`stage-background`}),(0,import_jsx_runtime$2.jsx)(`h2`,{className:`view-title`,children:De}),R===stageFocusType.HOME&&(0,import_jsx_runtime$2.jsx)(Consumer$7,{}),R===stageFocusType.FIELD&&(0,import_jsx_runtime$2.jsx)(Consumer$10,{columns:I[0].length,rows:I.length}),R===stageFocusType.FOREST&&(0,import_jsx_runtime$2.jsx)(Forest,{}),R===stageFocusType.SHOP&&(0,import_jsx_runtime$2.jsx)(Consumer$4,{}),R===stageFocusType.COW_PEN&&(0,import_jsx_runtime$2.jsx)(Consumer$6,{}),R===stageFocusType.WORKSHOP&&(0,import_jsx_runtime$2.jsx)(Consumer$1,{}),R===stageFocusType.CELLAR&&(0,import_jsx_runtime$2.jsx)(Cellar,{}),R===stageFocusType.FARMHAND_SHUFFLE&&(0,import_jsx_runtime$2.jsx)(FarmhandShuffleView,{}),R!==stageFocusType.FARMHAND_SHUFFLE&&(0,import_jsx_runtime$2.jsx)(`div`,{className:`spacer`})]})};function Consumer(F){return(0,import_jsx_runtime$2.jsx)(FarmhandContext.Consumer,{children:({gameState:I,handlers:L})=>(0,import_jsx_runtime$2.jsx)(Stage,{...I,...L,...F})})}var scriptRel=`modulepreload`,assetsURL=function(F,I){return new URL(F,I).href},seen={},__vitePreload=function(F,I,L){let R=Promise.resolve();if(I&&I.length>0){let F=document.getElementsByTagName(`link`),z=document.querySelector(`meta[property=csp-nonce]`),De=z?.nonce||z?.getAttribute(`nonce`);function Oe(F){return Promise.all(F.map(F=>Promise.resolve(F).then(F=>({status:`fulfilled`,value:F}),F=>({status:`rejected`,reason:F}))))}function ke(F){return import.meta.resolve?import.meta.resolve(F):new URL(F,import.meta.url).href}R=Oe(I.map(I=>{if(I=assetsURL(I,L),I=ke(I),I in seen)return;seen[I]=!0;let R=I.endsWith(`.css`);for(let L=F.length-1;L>=0;L--){let z=F[L];if(z.href===I&&(!R||z.rel===`stylesheet`))return}let z=document.createElement(`link`);if(z.rel=R?`stylesheet`:scriptRel,R||(z.as=`script`),z.crossOrigin=``,z.href=I,De&&z.setAttribute(`nonce`,De),document.head.appendChild(z),R)return new Promise((F,L)=>{z.addEventListener(`load`,F),z.addEventListener(`error`,()=>L(Error(`Unable to preload CSS for ${I}`)))})}))}function z(F){let I=new Event(`vite:preloadError`,{cancelable:!0});if(I.payload=F,window.dispatchEvent(I),!I.defaultPrevented)throw F}return R.then(I=>{for(let F of I||[])F.status===`rejected`&&z(F.reason);return F().catch(z)})},autoUpdateMode=`false`,selfDestroying=`false`,auto=autoUpdateMode===`true`,autoDestroy=selfDestroying===`true`;function registerSW(F={}){let{immediate:I=!1,onNeedReload:L,onNeedRefresh:R,onOfflineReady:z,onRegistered:De,onRegisteredSW:Oe,onRegisterError:ke}=F,Ae,je,Me,Ne=async(F=!0)=>{await je,auto||Me?.()};async function Pe(){if(`serviceWorker`in navigator){if(Ae=await __vitePreload(async()=>{let{Workbox:F}=await import(`./workbox-window.prod.es5-Bd17z0YL.js`);return{Workbox:F}},[],import.meta.url).then(({Workbox:F})=>new F(`./service-worker.js`,{scope:`./`,type:`classic`})).catch(F=>{ke?.(F)}),!Ae)return;if(Me=()=>{Ae?.messageSkipWaiting()},!autoDestroy)if(auto)Ae.addEventListener(`activated`,F=>{(F.isUpdate||F.isExternal)&&(L?L():window.location.reload())}),Ae.addEventListener(`installed`,F=>{F.isUpdate||z?.()});else{let F=!1,I=()=>{F=!0,Ae?.addEventListener(`controlling`,F=>{F.isUpdate&&(L?L():window.location.reload())}),R?.()};Ae.addEventListener(`installed`,L=>{L.isUpdate===void 0?L.isExternal===void 0?!F&&z?.():L.isExternal?I():!F&&z?.():L.isUpdate||z?.()}),Ae.addEventListener(`waiting`,I)}Ae.register({immediate:I}).then(F=>{Oe?Oe(`./service-worker.js`,F):De?.(F)}).catch(F=>{ke?.(F)})}}return je=Pe(),Ne}function useRegisterSW(F={}){let{immediate:I=!0,onNeedReload:L,onNeedRefresh:R,onOfflineReady:z,onRegistered:De,onRegisteredSW:Oe,onRegisterError:ke}=F,[Ae,je]=(0,import_react$10.useState)(!1),[Me,Ne]=(0,import_react$10.useState)(!1),[Pe]=(0,import_react$10.useState)(()=>registerSW({immediate:I,onNeedReload:L,onOfflineReady(){Ne(!0),z?.()},onNeedRefresh(){je(!0),R?.()},onRegistered:De,onRegisteredSW:Oe,onRegisterError:ke}));return{needRefresh:[Ae,je],offlineReady:[Me,Ne],updateServiceWorker:Pe}}var RELOAD_FALLBACK_DELAY=1e3,UpdateNotifier=()=>{let{gameState:{hasBooted:F},handlers:{handleGameUpdateAvailable:I}}=(0,import_react$10.useContext)(FarmhandContext),{needRefresh:[L],updateServiceWorker:R}=useRegisterSW(),z=(0,import_react$10.useRef)(!1);return(0,import_react$10.useEffect)(()=>{!L||!F||z.current||(z.current=!0,I(async()=>{await R(!0),setTimeout(()=>window.location.reload(),RELOAD_FALLBACK_DELAY)}),window.addEventListener(`beforeunload`,()=>{R(!0)}))},[L,F,I,R]),null},commonFetchConfig={mode:`cors`,cache:`no-cache`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},redirect:`follow`,referrerPolicy:`no-referrer`};async function getData(F=``,I={}){let L=new URLSearchParams;return Object.keys(I).forEach(F=>L.append(encodeURIComponent(F),encodeURIComponent(I[F]))),(await fetch(`${F}?${L}`,{...commonFetchConfig,method:`GET`})).json()}async function postData(F=``,I={}){return(await fetch(F,{...commonFetchConfig,method:`POST`,body:JSON.stringify(I)})).json()}var createNewField=()=>Array(10).fill(void 0).map(()=>[,,,,,,].fill(null)),createNewForest=()=>[,].fill(void 0).map(()=>[,,,,].fill(null)),doesMenuObstructStage=()=>window.innerWidth<BREAKPOINTS.MD,getAvailableShopInventory=memoize(F=>inventory.filter(({id:I})=>!(unlockableItems.hasOwnProperty(I)&&!F.items.hasOwnProperty(I)))),getPeerMetadata=F=>{let I=PEER_METADATA_STATE_KEYS.reduce((I,L)=>(I[L]=F[L],I),{});return Object.assign(I,{cowOfferedForTrade:F.cowInventory.find(({id:I})=>I===F.cowIdOfferedForTrade)}),I},getViewList=({isFarmhandShuffleUnlocked:F,isForestUnlocked:I,purchasedCellar:L,purchasedCowPen:R,showHomeScreen:z})=>{let{CELLAR:De,COW_PEN:Oe,HOME:ke,WORKSHOP:Ae,FOREST:je,FARMHAND_SHUFFLE:Me}=stageFocusType,Ne=[...STANDARD_VIEW_LIST];return z&&Ne.unshift(ke),I&&Ne.push(je),R&&Ne.push(Oe),Ne.push(Ae),L&&Ne.push(De),F&&Ne.push(Me),Ne},getValidatedStageFocusFromHash=F=>{let I=getHashQueryParams().get(VIEW_QUERY_PARAM_NAME);if(!I)return;let L=getLevelEntitlements(levelAchieved(F.experience)),R=L.stageFocusType[stageFocusType.FOREST],z=L.stageFocusType[stageFocusType.FARMHAND_SHUFFLE];return getViewList({isFarmhandShuffleUnlocked:z,isForestUnlocked:R,purchasedCellar:F.purchasedCellar,purchasedCowPen:F.purchasedCowPen,showHomeScreen:F.showHomeScreen}).find(F=>F===I)},sleep=F=>new Promise(I=>setTimeout(I,F)),{PLANT}=fieldMode,{MULCH}=itemType,FarmhandService=class{static computePlayerInventory=memoize((F,I)=>F.map(({quantity:F,id:L})=>({quantity:F,...itemsMap[L],value:getItemCurrentValue(itemsMap[L],I)})));static getFieldToolInventory=memoize(F=>F.filter(({id:F})=>{let I=itemsMap[F];return typeof I.enablesFieldMode==`string`&&I.enablesFieldMode!==PLANT&&I.type!==MULCH}).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static getPlantableCropInventory=memoize(F=>F.filter(({id:F})=>itemsMap[F].isPlantableCrop).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static getMulchInventory=memoize(F=>F.filter(({id:F})=>itemsMap[F]?.type===MULCH).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static getPlantableTreeInventory=memoize(F=>F.filter(({id:F})=>itemsMap[F]?.isPlantableTree).map(({id:F,quantity:I})=>({...itemsMap[F],quantity:I})));static applyPriceEvents=(F,I,L)=>{let R={...F};return Object.keys(I).forEach(F=>{R[F]=.5}),Object.keys(L).forEach(F=>{R[F]=1.5}),R}},itemIds=Object.keys(itemsMap),getInventoryQuantities=F=>{let I={};for(let F of itemIds)I[F]=0;for(let{id:L,quantity:R}of F)I[L]=R;return I},useFarmhandNavigation=(F,I)=>({openDialogView:(0,import_react$10.useCallback)(I=>{F(F=>({...F,currentDialogView:I,isDialogViewOpen:!0}))},[F]),closeDialogView:(0,import_react$10.useCallback)(()=>{F(F=>({...F,isDialogViewOpen:!1}))},[F]),focusNextView:(0,import_react$10.useCallback)(()=>{document.activeElement?.getAttribute(`role`)!==`tab`&&F(F=>{let L=I.indexOf(F.stageFocus);return{...F,stageFocus:I[(L+1)%I.length]}})},[F,I]),focusPreviousView:(0,import_react$10.useCallback)(()=>{document.activeElement?.getAttribute(`role`)!==`tab`&&F(F=>{let L=I.indexOf(F.stageFocus),R=L===0?I.length-1:(L-1)%I.length;return{...F,stageFocus:I[R]}})},[F,I])}),{floor,random,sin}=Math,libName=`Trystero`,alloc=(F,I)=>Array(F).fill(void 0).map(I),charSet=`0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz`,genId=F=>alloc(F,()=>charSet[floor(random()*62)]??``).join(``),selfId=genId(20),all=Promise.all.bind(Promise),isBrowser=typeof window<`u`,{entries,fromEntries,keys,values}=Object,noOp=()=>{},candidateType=`candidate`,resetTimer=F=>(F!==null&&clearTimeout(F),null),mkErr=F=>Error(`${libName}: ${F}`),toErrorMessage=(F,I)=>F instanceof Error&&F.message?F.message:typeof F==`string`&&F?F:toJson(F??I),toError=(F,I)=>F instanceof Error?F:mkErr(toErrorMessage(F,I)),encoder=new TextEncoder,decoder=new TextDecoder,encodeBytes=F=>encoder.encode(F),decodeBytes=F=>decoder.decode(F),toHex=F=>F.reduce((F,I)=>F+I.toString(16).padStart(2,`0`),``),topicPath=(...F)=>F.join(`@`),shuffle=(F,I)=>{let L=[...F],R=()=>{let F=sin(I++)*1e4;return F-floor(F)},z=L.length;for(;z;){let F=floor(R()*z--),I=L[z];L[z]=L[F],L[F]=I}return L},getRelays=(F,I,L,R=!1)=>F.relayConfig?.urls||(R?shuffle(I,strToNum(F.appId)):I).slice(0,F.relayConfig?.redundancy??L),toJson=JSON.stringify,fromJson=F=>{try{return JSON.parse(F)}catch{throw mkErr(`failed to parse JSON: ${F}`)}},strToNum=(F,I=2**53-1)=>F.split(``).reduce((F,I)=>F+I.charCodeAt(0),0)%I,defaultRetryMs=3333,socketRetryPeriods={},reconnectionLockingPromise=null,resolver=null,pauseRelayReconnection=()=>{reconnectionLockingPromise||=new Promise(F=>{resolver=F}).finally(()=>{resolver=null,reconnectionLockingPromise=null})},resumeRelayReconnection=()=>{resolver?.()},makeSocket=(F,I)=>{let L={},R=()=>{let z=new WebSocket(F);z.onclose=()=>{if(reconnectionLockingPromise){reconnectionLockingPromise.then(R);return}socketRetryPeriods[F]??=defaultRetryMs,setTimeout(R,socketRetryPeriods[F]),socketRetryPeriods[F]*=2},z.onmessage=F=>I(String(F.data)),L.socket=z,L.url=z.url,L.ready=new Promise(I=>z.onopen=()=>{I(L),socketRetryPeriods[F]=defaultRetryMs}),L.send=F=>{z.readyState===1&&z.send(F)}};return R(),L},createRelayManager=F=>{let I={},L=new WeakMap,R=F=>{let I=L.get(F);if(!I)throw mkErr(`relay bookkeeping missing registration for relay client`);return I};return{register:(F,R)=>(I[F]=R,L.set(R,F),R),keyOf:R,scoped:()=>{let F={},I=I=>F[I]??={};return{forKey:I,forRelay:F=>I(R(F))}},getSockets:()=>fromEntries(entries(I).flatMap(([I,L])=>{let R=F(L);return R?[[I,R]]:[]}))}},watchOnline=()=>{if(isBrowser){let F=new AbortController;return addEventListener(`online`,resumeRelayReconnection,{signal:F.signal}),addEventListener(`offline`,pauseRelayReconnection,{signal:F.signal}),()=>F.abort()}return noOp},algo=`AES-GCM`,strToSha1={},pack=F=>btoa(String.fromCharCode.apply(null,Array.from(new Uint8Array(F)))),unpack=F=>{let I=atob(F);return new Uint8Array(I.length).map((F,L)=>I.charCodeAt(L)).buffer},hashWith=async(F,I)=>new Uint8Array(await crypto.subtle.digest(F,encodeBytes(I))),sha1=async F=>strToSha1[F]??=Array.from(await hashWith(`SHA-1`,F)).map(F=>F.toString(36)).join(``),genKey=async(F,I,L)=>crypto.subtle.importKey(`raw`,await crypto.subtle.digest({name:`SHA-256`},encodeBytes(`${F}:${I}:${L}`)),{name:algo},!1,[`encrypt`,`decrypt`]),deriveRoomNamespace=async(F,I)=>toHex(await hashWith(`SHA-256`,`${libName}:${F}:${I}`)),joinChar=`$`,ivJoinChar=`,`,encrypt=async(F,I)=>{let L=crypto.getRandomValues(new Uint8Array(16));return L.join(ivJoinChar)+joinChar+pack(await crypto.subtle.encrypt({name:algo,iv:L},await F,encodeBytes(I)))},decrypt=async(F,I)=>{let[L,R]=I.split(joinChar);return decodeBytes(await crypto.subtle.decrypt({name:algo,iv:new Uint8Array(L?.split(ivJoinChar).map(Number)??[])},await F,unpack(R??``)))},offerTtl=57333,offerLeaseTtlMs=18e4,poolSize=20,OfferPool=class{pool=[];pooled=new Set;leased=new Map;recycling=new Set;cleanupTimer=null;active=!1;constructor(F){this.makeOffer=F}get isActive(){return this.active}warmup(){this.pool=[],this.pooled.clear(),alloc(poolSize,this.makeOffer).forEach(F=>this.push(F)),this.active=!0,this.cleanupTimer=setInterval(()=>{this.pool=this.pool.filter(F=>F.isDead?(this.pooled.delete(F),!1):!0)},offerTtl)}push(F){F.isDead||this.pooled.has(F)||this.leased.has(F)||(this.pool.push(F),this.pooled.add(F))}shift(F){let I=[];for(;I.length<F&&this.pool.length>0;){let F=this.pool.shift();if(!F)break;this.pooled.delete(F),I.push(F)}return I}claimLeased(F){let I=this.leased.get(F);I&&(resetTimer(I),this.leased.delete(F))}recycle(F){if(!(F.isDead||this.recycling.has(F))){if(F.connection.remoteDescription){F.destroy();return}if(!this.active){F.destroy();return}this.recycling.add(F),F.setHandlers({connect:noOp,close:noOp,error:noOp}),F.getOffer(!0).then(I=>{if(!I||I.type!==`offer`||F.isDead||!this.active){F.destroy();return}this.push(F)}).catch(()=>F.destroy()).finally(()=>this.recycling.delete(F))}}reclaimLeased(F){let I=this.leased.get(F);I&&(resetTimer(I),this.leased.delete(F),this.recycle(F))}lease(F){this.claimLeased(F),this.leased.set(F,setTimeout(()=>{this.leased.delete(F),this.recycle(F)},offerLeaseTtlMs))}checkout(F,I,L){let R=this.shift(F),z=Math.max(0,F-R.length);z>0&&R.push(...alloc(z,this.makeOffer));let De=async(F,R=!1)=>{try{let R=await L(F);return I?(this.lease(F),{peer:F,offer:R,claim:()=>this.claimLeased(F),reclaim:()=>this.reclaimLeased(F)}):{peer:F,offer:R}}catch(I){if(this.claimLeased(F),this.pooled.delete(F),F.destroy(),!R)return De(this.makeOffer(),!0);throw I}};return all(R.map(F=>De(F)))}getOffers(F,I){return this.checkout(F,!0,I)}destroy(){this.active=!1,this.cleanupTimer&&=(clearInterval(this.cleanupTimer),null),this.pool.forEach(F=>F.destroy()),this.pool=[],this.pooled.clear(),this.leased.forEach((F,I)=>{resetTimer(F),I.destroy()}),this.leased.clear(),this.recycling.forEach(F=>F.destroy()),this.recycling.clear()}},overlapRoomPasswordErr=mkErr(`incorrect password for overlapping room`),createPasswordHandshake=(F,I,L)=>{let R=R=>hashWith(`SHA-256`,`${R}:${F}:${I}:${L}`).then(toHex),z=async(I,L,z)=>{if(!F)return;if(z){let F=genId(36);await I({__trystero_pw:`challenge`,c:F});let{data:z}=await L();if(!z||typeof z!=`object`||z.__trystero_pw!==`response`||typeof z.h!=`string`)throw overlapRoomPasswordErr;let De=await R(F);if(z.h!==De)throw overlapRoomPasswordErr;return}let{data:De}=await L();if(!De||typeof De!=`object`||De.__trystero_pw!==`challenge`||typeof De.c!=`string`)throw overlapRoomPasswordErr;await I({__trystero_pw:`response`,h:await R(De.c)})};return{run:z,compose:I=>F||I?async(F,L,R,De)=>{await z(L,R,De),await I?.(F,L,R,De)}:void 0}},iceTimeout=15e3,disconnectedCloseDelayMs=5e3,iceStateEvent=`icegatheringstatechange`,offerType=`offer`,answerType=`answer`,outOfRangePattern=/out of range/i,rewriteMdnsCandidatesToLoopback=F=>F.replace(/ (\S+\.local) (\d+) typ host/g,` 127.0.0.1 $2 typ host`),peer_default=(F,{trickleIce:I,rtcConfig:L,rtcPolyfill:R,turnConfig:z,_test_only_mdnsHostFallbackToLoopback:De})=>{let Oe=new(R??RTCPeerConnection)({iceServers:defaultIceServers.concat(z??[]),...L}),ke={},Ae=[],je=[],Me=I!==!1,Ne=[],Pe=[],Fe=!1,Ie=!1,Le=null,Re=null,ze=!1,Be=()=>Re=resetTimer(Re),Ge=()=>{ze||(ze=!0,Be(),ke.close?.())},rt=F=>{ke.signal?ke.signal(F):Ae.push(F)},it=F=>{let I=ke.signal;ke.signal=L=>{I?.(L),F(L)},Ae.length>0&&Ae.splice(0).forEach(F=>ke.signal?.(F))},at=F=>De?rewriteMdnsCandidatesToLoopback(F):F,ot=F=>{if(!De||typeof F.candidate!=`string`)return F;let I=rewriteMdnsCandidatesToLoopback(F.candidate);return I===F.candidate?F:{...F,candidate:I}},st=F=>({type:F.localDescription?.type??offerType,sdp:at(F.localDescription?.sdp??``)}),ct=()=>{let F=Oe.remoteDescription?.sdp;return F?F.match(/a=ice-ufrag:([^\s]+)/)?.[1]??null:null},lt=()=>(Oe.remoteDescription?.sdp?.match(/^m=/gm)??[]).length,ut=F=>{if(!Oe.remoteDescription)return!1;let I=lt();if(typeof F.sdpMLineIndex==`number`&&I>0&&F.sdpMLineIndex>=I)return!1;let L=ct();return!(L&&F.usernameFragment&&F.usernameFragment!==L)},dt=async F=>{try{return await Oe.addIceCandidate(F),!0}catch(I){if(I instanceof Error&&outOfRangePattern.test(I.message)&&typeof F.sdpMLineIndex==`number`)return!1;throw I}},ft=async()=>{if(!Oe.remoteDescription||Ne.length===0)return;let F=Ne.splice(0),I=[];for(let L of F){if(!ut(L)){I.push(L);continue}await dt(L)||I.push(L)}I.length>0&&Ne.push(...I)},pt=async F=>{if(ut(F)){await dt(F)||Ne.push(F);return}Ne.push(F)},mt=F=>{F.binaryType=`arraybuffer`,F.bufferedAmountLowThreshold=65535,F.onmessage=F=>{let I=F.data;ke.data?ke.data(I):je.push(I)},F.onopen=()=>ke.connect?.(),F.onclose=Ge,F.onerror=({error:F})=>ke.error?.(toError(F,`data channel error`))},ht=async F=>{let I=null;try{await Promise.race([new Promise(I=>{let L=()=>{F.iceGatheringState===`complete`&&(F.removeEventListener(iceStateEvent,L),I())};F.addEventListener(iceStateEvent,L),L()}),new Promise(F=>{I=setTimeout(F,iceTimeout)})])}finally{resetTimer(I)}return st(F)},gt=async()=>{let F=Me?st(Oe):await ht(Oe);return rt(F),F};F?(Le=Oe.createDataChannel(`data`),mt(Le)):Oe.ondatachannel=({channel:F})=>{Le=F,mt(F)};let vt=async(F=!1)=>{if(Oe.connectionState!==`closed`)try{return Fe=!0,F&&(Oe.signalingState!==`stable`&&Oe.signalingState!==`closed`&&Oe.localDescription?.type===offerType&&await Oe.setLocalDescription({type:`rollback`}),typeof Oe.restartIce==`function`&&Oe.restartIce()),await Oe.setLocalDescription(F?await Oe.createOffer({iceRestart:!0}):void 0),await gt()}catch(F){ke.error?.(toError(F,`failed to create local offer`))}finally{Fe=!1}};Oe.onnegotiationneeded=async()=>vt(!1),Oe.onicecandidate=({candidate:F})=>{if(!Me||!F)return;let I=ot(typeof F.toJSON==`function`?F.toJSON():{candidate:F.candidate,sdpMid:F.sdpMid,sdpMLineIndex:F.sdpMLineIndex,usernameFragment:F.usernameFragment});rt({type:candidateType,sdp:JSON.stringify(I)})},Oe.onconnectionstatechange=()=>{if(Oe.connectionState===`connected`||Oe.connectionState===`connecting`){Be();return}if(Oe.connectionState===`disconnected`){Re||=setTimeout(()=>{Re=null,Oe.connectionState===`disconnected`&&Ge()},disconnectedCloseDelayMs);return}(Oe.connectionState===`failed`||Oe.connectionState===`closed`)&&Ge()},Oe.ontrack=F=>{let I=F.streams[0];if(I){if(!ke.track&&!ke.stream){Pe.push({track:F.track,stream:I});return}ke.track?.(F.track,I),ke.stream?.(I)}},Oe.onremovestream=F=>ke.stream?.(F.stream);let yt=F?new Promise(F=>it(I=>{I.type===offerType&&F(I)})):Promise.resolve();return F&&queueMicrotask(()=>{!Fe&&Oe.signalingState===`stable`&&!Oe.localDescription&&Oe.connectionState!==`closed`&&Oe.onnegotiationneeded?.(new Event(`negotiationneeded`))}),{created:Date.now(),connection:Oe,get channel(){return Le},get isDead(){return Oe.connectionState===`closed`},getOffer:async(I=!1)=>{if(F)return I?vt(!0):Oe.localDescription?.type===offerType?Me?st(Oe):ht(Oe):yt},async signal(I){if(I.type===`candidate`){try{let F=JSON.parse(I.sdp);F&&typeof F==`object`&&await pt(ot(F))}catch(F){ke.error?.(toError(F,`failed to parse remote candidate`))}return}if(!(Le?.readyState===`open`&&!I.sdp?.includes(`a=rtpmap`)))try{let L={...I,sdp:at(I.sdp)};if(I.type===offerType){if(Fe||Oe.signalingState!==`stable`&&!Ie){if(F)return;await all([Oe.setLocalDescription({type:`rollback`}),Oe.setRemoteDescription(L)])}else await Oe.setRemoteDescription(L);return await ft(),await Oe.setLocalDescription(),await gt()}if(I.type===answerType){Ie=!0;try{await Oe.setRemoteDescription(L),await ft()}finally{Ie=!1}}}catch(F){ke.error?.(toError(F,`failed to apply remote signal`))}},sendData:F=>Le?.send(F),destroy:()=>{Be(),Le?.close(),Oe.close(),Fe=!1,Ie=!1,Ge()},setHandlers:F=>{let{signal:I,...L}=F;Object.assign(ke,L),ke.data&&je.length>0&&je.splice(0).forEach(F=>ke.data?.(F)),I&&it(I),(ke.track||ke.stream)&&Pe.length>0&&Pe.splice(0).forEach(({track:F,stream:I})=>{ke.track?.(F,I),ke.stream?.(I)})},offerPromise:yt,addStream:F=>F.getTracks().forEach(I=>Oe.addTrack(I,F)),removeStream:F=>Oe.getSenders().filter(I=>I.track&&F.getTracks().includes(I.track)).forEach(F=>Oe.removeTrack(F)),addTrack:(F,I)=>Oe.addTrack(F,I),removeTrack:F=>{let I=Oe.getSenders().find(I=>I.track===F);I&&Oe.removeTrack(I)},replaceTrack:(F,I)=>{let L=Oe.getSenders().find(I=>I.track===F);if(L)return L.replaceTrack(I)}}},defaultIceServers=[...alloc(3,(F,I)=>`stun:stun${I||``}.l.google.com:19302`),`stun:stun.cloudflare.com:3478`].map(F=>({urls:F})),TypedArray=Object.getPrototypeOf(Uint8Array),typeByteLimit=32,typeIndex=0,nonceIndex=32,tagIndex=34,progressIndex=35,payloadIndex=36,chunkSize=16*2**10-payloadIndex,oneByteMax=255,twoByteMax=65535,buffLowEvent=`bufferedamountlow`,channelCloseEvent=`close`,channelErrorEvent=`error`,unloadEvent=`beforeunload`,defaultHandshakeTimeoutMs=1e4,backpressureWaitTimeoutMs=1e4,internalNs=F=>`@_`+F,beforeUnloadRoomCleanups=new Set,cleanupActiveRoomsOnBeforeUnload=()=>beforeUnloadRoomCleanups.forEach(F=>F()),registerBeforeUnloadCleanup=F=>(beforeUnloadRoomCleanups.add(F),beforeUnloadRoomCleanups.size===1&&addEventListener(unloadEvent,cleanupActiveRoomsOnBeforeUnload),()=>{beforeUnloadRoomCleanups.delete(F),beforeUnloadRoomCleanups.size||removeEventListener(unloadEvent,cleanupActiveRoomsOnBeforeUnload)}),toByteArray=F=>F instanceof ArrayBuffer?new Uint8Array(F):new Uint8Array(F.buffer,F.byteOffset,F.byteLength),toHandshakeErrorMessage=F=>{let I=toErrorMessage(F,`unknown error`);return I.startsWith(`handshake `)?I:`handshake failed: ${I}`},waitForBufferedAmountLow=(F,I=backpressureWaitTimeoutMs)=>F.readyState!==`open`||F.bufferedAmount<=F.bufferedAmountLowThreshold?Promise.resolve(F.readyState===`open`):new Promise(L=>{let R=!1,z=null,De=I=>{R||(R=!0,F.removeEventListener(buffLowEvent,Oe),F.removeEventListener(channelCloseEvent,ke),F.removeEventListener(channelErrorEvent,ke),resetTimer(z),L(I))},Oe=()=>De(!0),ke=()=>De(!1);if(F.addEventListener(buffLowEvent,Oe),F.addEventListener(channelCloseEvent,ke),F.addEventListener(channelErrorEvent,ke),z=setTimeout(()=>De(!1),I),F.readyState!==`open`){De(!1);return}F.bufferedAmount<=F.bufferedAmountLowThreshold&&De(!0)}),room_default=(F,I,L,{onPeerHandshake:R,onHandshakeError:z,handshakeTimeoutMs:De=defaultHandshakeTimeoutMs}={})=>{let Oe={},ke={},Ae={},je={},Me={},Ne={},Pe={},Fe={},Ie={},Le={},Re=new WeakMap,ze=new WeakMap,Be={onPeerJoin:noOp,onPeerLeave:noOp,onPeerStream:noOp,onPeerTrack:noOp},Ge=noOp,rt=(F,I,{includePending:L=!1}={})=>(F?Array.isArray(F)?F:[F]:keys(L?Oe:ke)).flatMap(F=>{let R=L?Oe[F]:ke[F];return R?[Promise.resolve(I(F,R))]:(console.warn(`${libName}: no peer with id ${F} found`),[])}),it=(F,I,L,R,z,De={})=>{let Oe={k:I,...De,...L===void 0?{}:{m:L}};return rt(F,async(F,I)=>{await R(Oe,F),z(I)})},at=F=>I=>{let L=F.get(I);return L||(L=genId(20),F.set(I,L)),L},ot=at(Re),st=at(ze),ct=F=>Oe[F]??null,lt=(F,I,L,R)=>{ke[F]&&(ct(F)?.__trysteroSetRemoteStreamByKey?.(I,L),typeof L.id==`string`&&ct(F)?.__trysteroSetRemoteStreamById?.(L.id,L),Be.onPeerStream(L,F,R))},ut=(F,I,L,R,z)=>{ke[F]&&(ct(F)?.__trysteroSetRemoteTrackByKey?.(I,L,R),typeof R.id==`string`&&ct(F)?.__trysteroSetRemoteStreamById?.(R.id,R),typeof L.id==`string`&&ct(F)?.__trysteroSetRemoteTrackById?.(L.id,L,R),Be.onPeerTrack(L,R,F,z))},dt=(F,I=mkErr(`peer disconnected`))=>{let L=Ae[F],R=toError(I,`peer disconnected`);L&&(resetTimer(L.handshakeTimer),L.pendingHandshakePayloads.length=0,L.handshakeWaiters.splice(0).forEach(F=>F.reject(R)),delete Ae[F]),delete Oe[F],delete ke[F],delete Ne[F],Fe[F]?.splice(0).forEach(F=>F.reject(R)),delete Fe[F],delete Ie[F],delete Le[F]},ft=(F,L,R)=>{let z=Oe[F];if(!z||L&&z!==L)return;let De=!!ke[F];dt(F,R),z.destroy(),De&&Be.onPeerLeave(F),I(F)},pt=(F,I={})=>{let L=Me[F];if(je[F]&&L){let R=je[F].options;if(R.sendToPending!==!!I.sendToPending||R.receiveWhilePending!==!!I.receiveWhilePending)throw mkErr(`action type "${F}" cannot be redefined`);return L}if(!F)throw mkErr(`action type argument is required`);let R=encodeBytes(F);if(R.byteLength>typeByteLimit)throw mkErr(`action type string "${F}" (${R.byteLength}b) exceeds byte limit (${typeByteLimit}). Hint: choose a shorter name.`);let z={sendToPending:!!I.sendToPending,receiveWhilePending:!!I.receiveWhilePending},De=new Uint8Array(typeByteLimit);De.set(R);let Ae=0;return je[F]={onComplete:noOp,onProgress:noOp,setOnComplete:I=>{je[F].onComplete=I;let L=Pe[F];L?.length&&(delete Pe[F],L.forEach(({payload:F,peerId:L,metadata:R})=>I(F,L,R)))},setOnProgress:I=>{je[F].onProgress=I},send:async(F,I,L,R)=>{let je=typeof F;if(je===`undefined`)throw mkErr(`action data cannot be undefined`);let Me=je!==`string`,Ne=F instanceof Blob,Pe=Ne||F instanceof ArrayBuffer||F instanceof TypedArray,Fe=L!==void 0,Ie=Pe?toByteArray(Ne?await F.arrayBuffer():F):encodeBytes(Me?toJson(F):F),Le=Fe?encodeBytes(toJson(L)):null,Re=Math.ceil(Ie.byteLength/chunkSize)+ +!!Fe||1,ze=alloc(Re,(F,I)=>{let L=I===Re-1,R=!!(Fe&&I===0),z=new Uint8Array(payloadIndex+(R?Le?.byteLength??0:L?Ie.byteLength-chunkSize*(Re-(Fe?2:1)):chunkSize));return z.set(De),z.set([Ae>>8,Ae&oneByteMax],nonceIndex),z.set([Number(L)|Number(R)<<1|Number(Pe)<<2|Number(Me)<<3],tagIndex),z.set([Math.round((I+1)/Re*oneByteMax)],progressIndex),z.set(Fe?R?Le??new Uint8Array:Ie.subarray((I-1)*chunkSize,I*chunkSize):Ie.subarray(I*chunkSize,(I+1)*chunkSize),payloadIndex),z});return Ae=Ae+1&twoByteMax,await all(rt(I,async(F,I)=>{let{channel:De}=I,Ae=0;for(;Ae<Re;){let je=ze[Ae];if(!je||De&&De.bufferedAmount>De.bufferedAmountLowThreshold&&!await waitForBufferedAmountLow(De))break;let Me=z.sendToPending?Oe[F]:ke[F];if(!Me||Me!==I)break;I.sendData(je),Ae++;let Ne=je[progressIndex]??oneByteMax;R?.(Ne/oneByteMax,F,L)}},{includePending:z.sendToPending})),[]},options:z},Me[F]=[je[F].send,je[F].setOnComplete,je[F].setOnProgress]},mt=F=>pt(F),ht=(F,I)=>{let L=Ae[F];if(!L)return;let R=new Uint8Array(I),z=decodeBytes(R.subarray(typeIndex,nonceIndex)).replaceAll(`\0`,``),De=je[z];if(!L.isActive&&!De?.options.receiveWhilePending)return;let Oe=(R[nonceIndex]??0)<<8|(R[33]??0),ke=R[tagIndex]??0,Me=R[progressIndex]??0,Fe=R.subarray(payloadIndex),Ie=!!(ke&1),Le=!!(ke&2),Re=!!(ke&4),ze=!!(ke&8);Ne[F]??={},Ne[F][z]??={};let Be=Ne[F][z][Oe]??={chunks:[]};if(Le?Be.meta=fromJson(decodeBytes(Fe)):Be.chunks.push(Fe),De?.onProgress(Me/oneByteMax,F,Be.meta),!Ie)return;let Ge=new Uint8Array(Be.chunks.reduce((F,I)=>F+I.byteLength,0));if(Be.chunks.reduce((F,I)=>(Ge.set(I,F),F+I.byteLength),0),delete Ne[F][z][Oe],Re)De?De.onComplete(Ge,F,Be.meta):(Pe[z]??=[]).push({payload:Ge,peerId:F,...Be.meta===void 0?{}:{metadata:Be.meta}});else{let I=decodeBytes(Ge),L=ze?fromJson(I):I;De?De.onComplete(L,F,Be.meta):(Pe[z]??=[]).push({payload:L,peerId:F,...Be.meta===void 0?{}:{metadata:Be.meta}})}},gt=async()=>{await xw(``),await new Promise(F=>setTimeout(F,99)),entries(Oe).forEach(([F,I])=>{I.destroy(),dt(F,mkErr(`room left`))}),Ge(),L()},[vt,yt]=pt(internalNs(`ping`)),[yr,br]=pt(internalNs(`pong`)),[hw,gw]=pt(internalNs(`signal`)),[_w,vw]=pt(internalNs(`stream`)),[yw,bw]=pt(internalNs(`track`)),[xw,Sw]=pt(internalNs(`leave`),{sendToPending:!0,receiveWhilePending:!0}),[Cw,ww]=pt(internalNs(`hsdata`),{sendToPending:!0,receiveWhilePending:!0}),[Tw,Ew]=pt(internalNs(`hsready`),{sendToPending:!0,receiveWhilePending:!0}),Dw=(F,I)=>{let L=Ae[F];!L||I&&L.peer!==I||L.isActive||!L.didLocalHandshakePass||!L.didReceiveRemoteReady||(L.isActive=!0,ke[F]=L.peer,L.handshakeTimer=resetTimer(L.handshakeTimer),Be.onPeerJoin(F))},Ow=(F,I,L)=>{let R=Ae[F];if(!R||R.peer!==I)return;let De=toHandshakeErrorMessage(L);z?.(F,De),ft(F,I,mkErr(De))},kw=(F,I)=>{let L=Ae[F];!L||L.peer!==I||L.isActive||(L.didLocalHandshakePass=!0,Tw(``,F).catch(L=>Ow(F,I,mkErr(`failed sending handshake readiness: ${toErrorMessage(L,`unknown send failure`)}`))),Dw(F,I))},Aw=(F,I)=>{let L=Ae[F];if(!L||L.peer!==I)return;L.handshakeTimer=setTimeout(()=>Ow(F,I,mkErr(`handshake timed out after ${De}ms`)),De);let z=async(I,L)=>{await Cw(I,F,L)},Oe=()=>new Promise((L,R)=>{let z=Ae[F];if(!z||z.peer!==I){R(mkErr(`peer disconnected during handshake`));return}let De=z.pendingHandshakePayloads.shift();if(De){L(De);return}z.handshakeWaiters.push({resolve:L,reject:F=>R(F)})}),ke=selfId<F;Promise.resolve(R?.(F,z,Oe,ke)).then(()=>kw(F,I)).catch(L=>Ow(F,I,toError(L,`handshake failed`)))},jw=F=>F&&typeof F==`object`&&!Array.isArray(F)&&typeof F.k==`string`?{key:F.k,...typeof F.s==`string`?{streamId:F.s}:{},...typeof F.t==`string`?{trackId:F.t}:{},...Object.hasOwn(F,`m`)?{metadata:F.m}:{}}:null;return yt((F,I)=>yr(``,I)),br((F,I)=>{let L=Fe[I];(L?.shift())?.resolve(),L&&!L.length&&delete Fe[I]}),gw((F,I)=>{ke[I]&&Oe[I]?.signal(F)}),vw((F,I)=>{if(!ke[I])return;let L=jw(F);if(!L)return;let R=ct(I),z=R?.__trysteroGetRemoteStreamByKey?.(L.key)??(L.streamId?R?.__trysteroGetRemoteStreamById?.(L.streamId):void 0);if(z){lt(I,L.key,z,L.metadata);return}(Ie[I]??=[]).push(L)}),bw((F,I)=>{if(!ke[I])return;let L=jw(F);if(!L)return;let R=ct(I),z=R?.__trysteroGetRemoteTrackByKey?.(L.key)??(L.trackId?R?.__trysteroGetRemoteTrackById?.(L.trackId):void 0);if(z){ut(I,L.key,z.track,z.stream,L.metadata);return}(Le[I]??=[]).push(L)}),Sw((F,I)=>ft(I,void 0,mkErr(`peer left room`))),ww((F,I,L)=>{let R=Ae[I];if(!R||R.isActive)return;let z=L===void 0?{data:F}:{data:F,metadata:L},De=R.handshakeWaiters.shift();if(De){De.resolve(z);return}R.pendingHandshakePayloads.push(z)}),Ew((F,I)=>{let L=Ae[I];!L||L.isActive||(L.didReceiveRemoteReady=!0,Dw(I))}),F((F,I)=>{let L=Oe[I];if(L){if(L===F)return;L.destroy(),dt(I,mkErr(`peer replaced`))}Oe[I]=F,Ae[I]={peer:F,isActive:!1,didLocalHandshakePass:!1,didReceiveRemoteReady:!1,handshakeTimer:null,pendingHandshakePayloads:[],handshakeWaiters:[]},F.setHandlers({data:F=>ht(I,F),stream:F=>{if(!ke[I])return;let L=Ie[I]?.shift();L&<(I,L.key,F,L.metadata)},track:(F,L)=>{if(!ke[I])return;let R=Le[I]?.shift();R&&ut(I,R.key,F,L,R.metadata)},signal:F=>{ke[I]&&hw(F,I)},close:()=>ft(I,F,mkErr(`peer disconnected`)),error:L=>{console.error(`${libName} peer error:`,L),ft(I,F,L)}}),Aw(I,F)}),isBrowser&&(Ge=registerBeforeUnloadCleanup(()=>gt().catch(noOp))),{makeAction:mt,leave:gt,ping:async F=>{if(!ke[F])throw mkErr(`no active peer with id ${F}`);let I=Date.now();return await new Promise((I,L)=>{let R=Fe[F]??=[],z=()=>{let I=Fe[F];if(!I)return;let L=I.indexOf(De);L>-1&&I.splice(L,1),I.length||delete Fe[F]},De={resolve:()=>{z(),I()},reject:F=>{z(),L(F)}};R.push(De),vt(``,F).catch(F=>De.reject(toError(F,`peer disconnected`)))}),Date.now()-I},getPeers:()=>fromEntries(entries(ke).map(([F,I])=>[F,I.connection])),addStream:(F,I,L)=>it(I,ot(F),L,_w,I=>I.addStream(F),{s:F.id}),removeStream:(F,I)=>{rt(I,(I,L)=>L.removeStream(F))},addTrack:(F,I,L,R)=>it(L,st(F),R,yw,L=>L.addTrack(F,I),{s:I.id,t:F.id}),removeTrack:(F,I)=>{rt(I,(I,L)=>L.removeTrack(F))},replaceTrack:(F,I,L,R)=>it(L,st(I),R,yw,L=>L.replaceTrack(F,I),{t:F.id}),onPeerJoin:F=>{Be.onPeerJoin=F,keys(ke).forEach(I=>F(I))},onPeerLeave:F=>Be.onPeerLeave=F,onPeerStream:F=>Be.onPeerStream=F,onPeerTrack:F=>Be.onPeerTrack=F}},roomFrameVersion=1,roomPresenceFrameVersion=2,wrapRoomFrame=(F,I)=>{let L=encodeBytes(F),R=new Uint8Array(3+L.byteLength+I.byteLength);return R[0]=roomFrameVersion,R[1]=L.byteLength>>>8&255,R[2]=L.byteLength&255,R.set(L,3),R.set(I,3+L.byteLength),R},wrapRoomPresenceFrame=(F,I)=>{let L=encodeBytes(F),R=new Uint8Array(4+L.byteLength);return R[0]=roomPresenceFrameVersion,R[1]=Number(I),R[2]=L.byteLength>>>8&255,R[3]=L.byteLength&255,R.set(L,4),R},unwrapFrame=F=>{let I=new Uint8Array(F);if(I.byteLength<3)return null;if(I[0]===roomFrameVersion){let F=(I[1]??0)<<8|(I[2]??0),L=3+F;return F<=0||I.byteLength<L?null:{type:`room`,roomToken:decodeBytes(I.subarray(3,L)),payload:I.subarray(L).slice().buffer}}if(I[0]!==roomPresenceFrameVersion||I.byteLength<4)return null;let L=(I[2]??0)<<8|(I[3]??0),R=4+L;return L<=0||I.byteLength<R?null:{type:`presence`,roomToken:decodeBytes(I.subarray(4,R)),isPresent:I[1]===1}},isPeerUnderlyingStale=F=>{let{connection:I,channel:L}=F;return F.isDead||I.connectionState===`closed`||I.connectionState===`failed`||I.iceConnectionState===`closed`||I.iceConnectionState===`failed`||L?.readyState===`closing`||L?.readyState===`closed`},getConnectedPeerHealth=F=>{if(isPeerUnderlyingStale(F))return`stale`;let{channel:I}=F;return!I||I.readyState!==`open`?`transient`:`live`},SharedPeerManager=class{byApp={};roomPresenceHandlers={};getMap(F){return this.byApp[F]??={}}get(F,I){return this.byApp[F]?.[I]}isPeerStale(F){return isPeerUnderlyingStale(F)}getHealth(F){return this.isPeerStale(F)?`stale`:`live`}setRoomPresenceHandler(F,I){return this.roomPresenceHandlers[F]=I,()=>{this.roomPresenceHandlers[F]===I&&delete this.roomPresenceHandlers[F]}}sendRoomPresence(F,I,L){F.isClosing||F.peer.isDead||F.peer.sendData(wrapRoomPresenceFrame(I,L))}clear(F,I,{destroyPeer:L}){let R=this.byApp[F],z=R?.[I];if(!z||z.isClosing)return;z.idleTimer=resetTimer(z.idleTimer),z.isClosing=!0,L&&!z.peer.isDead&&z.peer.destroy();let De=values(z.bindings);z.bindings={},z.bindingsByToken={},z.controlRoomId=null,delete R[I],De.forEach(F=>{F.handlers.close?.(),F.pendingData.length=0,F.pendingSendData.length=0,F.pendingTracks.length=0}),z.remoteStreamsByKey.clear(),z.remoteStreamsById.clear(),z.remoteTracksByKey.clear(),z.remoteTracksById.clear(),z.pendingDataByToken.clear(),z.remoteRoomTokens.clear(),keys(R).length===0&&delete this.byApp[F]}register(F,I,L,R){let z=this.getMap(F),De=z[I];if(De){if(De.idleTimer=resetTimer(De.idleTimer),De.peer===L)return De;this.clear(F,I,{destroyPeer:!0})}let Oe={appId:F,peerId:I,peer:L,bindings:{},bindingsByToken:{},pendingDataByToken:new Map,remoteRoomTokens:new Set,idleTimer:null,controlRoomId:null,streamOwners:new Map,trackOwners:new Map,remoteStreamsByKey:new Map,remoteStreamsById:new Map,remoteTracksByKey:new Map,remoteTracksById:new Map,idleMs:R,isClosing:!1};return L.setHandlers({data:F=>this.dispatchData(Oe,F),signal:F=>this.dispatchSignal(Oe,F),close:()=>this.clear(F,I,{destroyPeer:!1}),error:L=>{console.error(`${libName} peer error:`,L),this.clear(F,I,{destroyPeer:!1})},track:(F,I)=>this.dispatchTrack(Oe,F,I)}),z[I]=Oe,Oe}bind(F,I,L,{onDetach:R}){let z=L.bindings[F];if(z)return L.idleTimer=resetTimer(L.idleTimer),{proxy:z.proxy,isNew:!1};let De={roomId:F,roomToken:null,roomTokenPromise:I,handlers:{},pendingData:[],pendingSendData:[],pendingTracks:[],detach:noOp,proxy:{}},Oe=()=>{L.bindings[F]&&(this.pruneRoomOwnership(L,F),delete L.bindings[F],De.roomToken&&L.bindingsByToken[De.roomToken]===De&&delete L.bindingsByToken[De.roomToken],L.controlRoomId===F&&(L.controlRoomId=keys(L.bindings)[0]??null),R(),this.scheduleIdleTimer(L))},ke={created:L.peer.created,get connection(){return L.peer.connection},get channel(){return L.peer.channel},get isDead(){return L.peer.isDead},getOffer:F=>L.peer.getOffer(F),signal:F=>L.peer.signal(F),sendData:F=>{if(!De.roomToken){De.pendingSendData.push(F);return}L.peer.sendData(wrapRoomFrame(De.roomToken,F))},destroy:()=>Oe(),setHandlers:F=>{let{signal:I,...L}=F;Object.assign(De.handlers,L),I&&(De.handlers.signal=I),this.flushBindingQueues(De)},offerPromise:L.peer.offerPromise,addStream:I=>{let R=L.streamOwners.get(I)??new Set,z=R.size===0;R.add(F),L.streamOwners.set(I,R),z&&L.peer.addStream(I)},removeStream:I=>{let R=L.streamOwners.get(I);R&&(R.delete(F),R.size===0&&(L.streamOwners.delete(I),L.peer.removeStream(I)))},addTrack:(I,R)=>{let z=L.trackOwners.get(I)??{stream:R,rooms:new Set},De=z.rooms.size===0;return z.stream=R,z.rooms.add(F),L.trackOwners.set(I,z),De?L.peer.addTrack(I,R):L.peer.connection.getSenders().find(F=>F.track===I)??L.peer.addTrack(I,R)},removeTrack:I=>{let R=L.trackOwners.get(I);R&&(R.rooms.delete(F),R.rooms.size===0&&(L.trackOwners.delete(I),L.peer.removeTrack(I)))},replaceTrack:(F,I)=>{let R=L.trackOwners.get(F);if(R){L.trackOwners.delete(F);let z=L.trackOwners.get(I)??{stream:R.stream,rooms:new Set};R.rooms.forEach(F=>z.rooms.add(F)),L.trackOwners.set(I,z)}return L.peer.replaceTrack(F,I)},__trysteroGetRemoteStreamByKey:F=>L.remoteStreamsByKey.get(F),__trysteroSetRemoteStreamByKey:(F,I)=>void L.remoteStreamsByKey.set(F,I),__trysteroGetRemoteStreamById:F=>L.remoteStreamsById.get(F),__trysteroSetRemoteStreamById:(F,I)=>void L.remoteStreamsById.set(F,I),__trysteroGetRemoteTrackByKey:F=>L.remoteTracksByKey.get(F),__trysteroSetRemoteTrackByKey:(F,I,R)=>void L.remoteTracksByKey.set(F,{track:I,stream:R}),__trysteroGetRemoteTrackById:F=>L.remoteTracksById.get(F),__trysteroSetRemoteTrackById:(F,I,R)=>void L.remoteTracksById.set(F,{track:I,stream:R})};return De.proxy=ke,De.detach=Oe,L.bindings[F]=De,L.controlRoomId??=F,L.idleTimer=resetTimer(L.idleTimer),I.then(I=>{if(L.isClosing||L.bindings[F]!==De)return;De.roomToken=I,L.bindingsByToken[I]=De;let R=L.pendingDataByToken.get(I);R?.length&&(De.pendingData.push(...R),L.pendingDataByToken.delete(I)),De.pendingSendData.splice(0).forEach(F=>L.peer.sendData(wrapRoomFrame(I,F))),this.flushBindingQueues(De)}),{proxy:ke,isNew:!0}}pruneRoomOwnership(F,I){F.streamOwners.forEach((L,R)=>{L.delete(I),L.size===0&&(F.streamOwners.delete(R),F.peer.removeStream(R))}),F.trackOwners.forEach((L,R)=>{L.rooms.delete(I),L.rooms.size===0&&(F.trackOwners.delete(R),F.peer.removeTrack(R))})}scheduleIdleTimer(F){F.isClosing||keys(F.bindings).length>0||(F.idleTimer=resetTimer(F.idleTimer),F.idleTimer=setTimeout(()=>{let I=this.byApp[F.appId]?.[F.peerId];!I||keys(I.bindings).length>0||this.clear(F.appId,F.peerId,{destroyPeer:!0})},F.idleMs))}getSignalBinding(F){if(F.controlRoomId){let I=F.bindings[F.controlRoomId];if(I?.handlers.signal)return I}let I=values(F.bindings).find(F=>!!F.handlers.signal);return I?(F.controlRoomId=I.roomId,I):null}flushBindingQueues(F){let{handlers:I}=F;I.data&&F.pendingData.length>0&&F.pendingData.splice(0).forEach(F=>I.data?.(F)),(I.track||I.stream)&&F.pendingTracks.length&&F.pendingTracks.splice(0).forEach(({track:F,stream:L})=>{I.track?.(F,L),I.stream?.(L)})}dispatchData(F,I){let L=unwrapFrame(I);if(!L)return;if(L.type===`presence`){L.isPresent?F.remoteRoomTokens.add(L.roomToken):F.remoteRoomTokens.delete(L.roomToken),this.roomPresenceHandlers[F.appId]?.(F.peerId,L.roomToken,L.isPresent);return}let R=F.bindingsByToken[L.roomToken];if(!R){let I=F.pendingDataByToken.get(L.roomToken)??[];I.push(L.payload),F.pendingDataByToken.set(L.roomToken,I);return}R.handlers.data?R.handlers.data(L.payload):R.pendingData.push(L.payload)}dispatchSignal(F,I){this.getSignalBinding(F)?.handlers.signal?.(I)}dispatchTrack(F,I,L){values(F.bindings).forEach(F=>{if(F.handlers.track||F.handlers.stream){F.handlers.track?.(I,L),F.handlers.stream?.(L);return}F.pendingTracks.push({track:I,stream:L})})}},offerPostAnswerTtlMs=23333,offerIdSize=12,disconnectedPeerGraceMs=7533,answeringTtlMs=23333,legacyCandidateKey=`__legacy__`,offerRelayPlaceholder=`offer-placeholder`,publishCipheredSignalingMessage=(F,I,L,R,z,De)=>{F.toCipher(I).then(I=>{F.isLeaving()||!De()||R(L,toJson(z(I.sdp)))})},makeState=()=>({status:`idle`,offerPeer:null,offerId:null,offerSdp:null,offerInitPromise:null,offerAnswered:!1,offerRelays:[],offerSignalRelays:[],offerSignalBacklog:[],offerRelayTimers:[],offerExpiryTimer:null,connectedPeer:null,connectedPeerUnhealthySinceMs:null,answeringExpiryTimer:null,answeringPeer:null,pendingCandidates:{}}),getState=(F,I)=>F[I]??=makeState(),updateStatus=F=>{F.connectedPeer?F.status=`connected`:F.answeringPeer?F.status=`answering`:F.offerPeer||F.offerRelays.some(Boolean)?F.status=`offering`:F.status=`idle`},clearAnswering=(F,I)=>{F.answeringPeer===I&&(F.answeringExpiryTimer=resetTimer(F.answeringExpiryTimer),F.answeringPeer=null,updateStatus(F))},clearConnectedPeer=(F,I,L)=>{F.connectedPeer&&(F.connectedPeer.isDead||F.connectedPeer.destroy(),F.connectedPeer=null,F.connectedPeerUnhealthySinceMs=null,updateStatus(F))},clearOfferRelay=(F,I)=>{F.offerRelayTimers[I]=resetTimer(F.offerRelayTimers[I]),F.offerRelays[I]&&(F.offerRelays[I]=void 0,updateStatus(F))},clearOfferRelayIfPlaceholder=(F,I)=>{F?.offerRelays[I]===offerRelayPlaceholder&&clearOfferRelay(F,I)},hasRemoteDescription=F=>{if(F.isDead||F.connection.connectionState===`closed`)return!0;try{return!!F.connection.remoteDescription}catch{return!0}},resetOfferState=(F,I)=>{let L=F.offerAnswered;F.offerExpiryTimer=resetTimer(F.offerExpiryTimer),F.offerInitPromise=null,F.offerRelays.forEach((I,L)=>clearOfferRelay(F,L)),F.offerRelays=[],F.offerSignalRelays=[],F.offerRelayTimers=[],F.offerSignalBacklog=[],F.offerPeer&&F.offerPeer!==F.connectedPeer&&(L||hasRemoteDescription(F.offerPeer)?F.offerPeer.isDead||F.offerPeer.destroy():I.recycle(F.offerPeer)),F.offerPeer=null,F.offerId=null,F.offerSdp=null,F.offerAnswered=!1,updateStatus(F)},scheduleAnsweringExpiry=(F,I,L,R)=>{resetTimer(I.answeringExpiryTimer),I.answeringExpiryTimer=setTimeout(()=>{let I=F.peerStates[L];!I||I.connectedPeer||I.answeringPeer!==R||(R.destroy(),clearAnswering(I,R))},answeringTtlMs)},flushBufferedCandidates=async(F,I,L)=>{let R=L?[L,legacyCandidateKey]:[legacyCandidateKey];for(let L of R){let R=F.pendingCandidates[L];if(R?.length){delete F.pendingCandidates[L];for(let F of R)await I.signal(F)}}},scheduleOfferExpiry=(F,I,L,R=offerTtl)=>{resetTimer(I.offerExpiryTimer);let z=I.offerId;I.offerExpiryTimer=setTimeout(()=>{let I=F.peerStates[L];!I||I.connectedPeer||I.offerId!==z||resetOfferState(I,F.offerPool)},R)},ensureOffer=(F,I,L,R)=>I.offerPeer&&I.offerId&&I.offerSdp?Promise.resolve({peer:I.offerPeer,offer:I.offerSdp,offerId:I.offerId}):(I.offerInitPromise||=(async()=>{let z=(await F.offerPool.checkout(1,!1,F.encryptOffer))[0];if(!z)throw mkErr(`failed to allocate offer peer`);let{peer:De,offer:Oe}=z;I.offerPeer=De,I.offerId=genId(offerIdSize),I.offerSdp=Oe,I.offerAnswered=!1,I.offerSignalBacklog=[],updateStatus(I);let ke=()=>{I.offerPeer===De&&!I.connectedPeer&&resetOfferState(I,F.offerPool),F.disconnectPeer(De,L)};return De.setHandlers({connect:()=>F.connectPeer(De,L,R),signal:F=>{I.offerPeer===De&&(I.offerSignalBacklog.push(F),I.offerSignalRelays.forEach(I=>I?.(F)))},close:ke,error:ke}),scheduleOfferExpiry(F,I,L),{peer:De,offer:Oe,offerId:I.offerId}})().finally(()=>I.offerInitPromise=null),I.offerInitPromise),handleAnnouncement=async(F,I,L,R,z)=>{if(R){F.attachSharedPeerToRoom(L,R);return}let De=F.peerStates[L];if(!De||De.connectedPeer||De.answeringPeer||De.offerAnswered){clearOfferRelayIfPlaceholder(De,I);return}if(De.offerRelays[I]!==offerRelayPlaceholder)return;let[Oe,ke]=await all([sha1(topicPath(F.rootTopicPlaintext,L)),ensureOffer(F,De,L,I)]);if(F.isLeaving())return;if(De.connectedPeer||De.answeringPeer||De.offerAnswered||De.offerRelays[I]!==offerRelayPlaceholder){clearOfferRelayIfPlaceholder(De,I);return}De.offerRelayTimers[I]=resetTimer(De.offerRelayTimers[I]),De.offerRelays[I]=!0,updateStatus(De),De.offerRelayTimers[I]=setTimeout(()=>prunePendingOffer(F,L,I),(F.announceIntervals[I]??F.announceIntervalMs)*.9);let Ae=!1;De.offerSignalRelays[I]=I=>{Ae&&(F.isLeaving()||De.connectedPeer||De.offerPeer!==ke.peer||De.offerId!==ke.offerId||I.type!==`candidate`||publishCipheredSignalingMessage(F,I,Oe,z,F=>({peerId:selfId,offerId:ke.offerId,candidate:F}),()=>!De.connectedPeer&&De.offerPeer===ke.peer&&De.offerId===ke.offerId))},z(Oe,toJson({peerId:selfId,offerId:ke.offerId,offer:ke.offer})),Ae=!0,De.offerSignalBacklog.forEach(F=>De.offerSignalRelays[I]?.(F))},handleOffer=async(F,I,L,R,z,De,Oe)=>{let ke=getState(F.peerStates,L);if(ke.answeringPeer||ke.offerAnswered)return;let Ae=!!(ke.offerPeer||ke.offerRelays.some(Boolean));if((Ae||De)&&selfId<L)return;Ae&&resetOfferState(ke,F.offerPool);let je=F.initPeer(!1,F.config);ke.answeringPeer=je,scheduleAnsweringExpiry(F,ke,L,je),updateStatus(ke);let Me=()=>{clearAnswering(ke,je),F.disconnectPeer(je,L)};je.setHandlers({connect:()=>F.connectPeer(je,L,I),close:Me,error:Me});let Ne;try{Ne=await F.toPlain({type:`offer`,sdp:R})}catch{clearAnswering(ke,je),F.onJoinError?.({error:`incorrect room password when decrypting offer`,appId:F.appId,peerId:L,roomId:F.roomId});return}if(je.isDead){clearAnswering(ke,je);return}let Pe=await sha1(topicPath(F.rootTopicPlaintext,L));F.isLeaving()||(je.setHandlers({signal:I=>{F.isLeaving()||ke.answeringPeer!==je||je.isDead||I.type!==`answer`&&I.type!==`candidate`||publishCipheredSignalingMessage(F,I,Pe,Oe,F=>{let L={peerId:selfId};return I.type===`answer`?L.answer=F:L.candidate=F,z&&(L.offerId=z),L},()=>ke.answeringPeer===je&&!je.isDead)}}),await je.signal(Ne),await flushBufferedCandidates(ke,je,z))},handleCandidate=async(F,I,L,R,z)=>{let De;try{De=await F.toPlain({type:candidateType,sdp:L})}catch{return}let Oe=getState(F.peerStates,I),ke=R&&Oe?.offerPeer&&Oe.offerId===R?Oe.offerPeer:null,Ae=Oe?.answeringPeer??null,je=!R&&Oe?.offerPeer?Oe.offerPeer:null,Me=z&&!z.isDead?z:ke??Ae??je;if(!Me||Me.isDead){let F=R??legacyCandidateKey;(Oe.pendingCandidates[F]??=[]).push(De);return}Me.signal(De)},handleAnswer=async(F,I,L,R,z,De)=>{let Oe;try{Oe=await F.toPlain({type:`answer`,sdp:R})}catch{F.onJoinError?.({error:`incorrect room password when decrypting answer`,appId:F.appId,peerId:L,roomId:F.roomId});return}if(De)F.offerPool.claimLeased(De),De.setHandlers({connect:()=>F.connectPeer(De,L,I),close:()=>F.disconnectPeer(De,L)}),De.signal(Oe);else{let I=F.peerStates[L];if(!I||!I.offerPeer||I.offerAnswered||z&&I.offerId&&z!==I.offerId||I.offerPeer.isDead)return;I.offerAnswered=!0,scheduleOfferExpiry(F,I,L,offerPostAnswerTtlMs),I.offerPeer.signal(Oe)}},prunePendingOffer=(F,I,L)=>{let R=F.peerStates[I];!R||R.connectedPeer||R.offerRelays[L]&&clearOfferRelay(R,L)},createSignalHandler=F=>I=>async(L,R,z)=>{if(F.isLeaving())return;let De=typeof R==`string`?fromJson(R):R,Oe=typeof De.peerId==`string`?De.peerId:``,ke=De.offer,Ae=De.answer,je=De.candidate,Me=De.offerId,Ne=De.peer,Pe=De.hasOutgoingOffer===!0;if(Oe===selfId)return;let Fe=F.peerStates[Oe],Ie=Fe?.connectedPeer;if(Ie&&Fe){let F=getConnectedPeerHealth(Ie);if(F===`live`){Fe.connectedPeerUnhealthySinceMs=null;return}if(F===`stale`)clearConnectedPeer(Fe,Oe,`message-from-stale-peer`);else{let F=Date.now(),I=Fe.connectedPeerUnhealthySinceMs??F;if(Fe.connectedPeerUnhealthySinceMs=I,F-I<disconnectedPeerGraceMs)return;clearConnectedPeer(Fe,Oe,`message-from-prolonged-disconnect`)}}let Le=F.sharedPeers.get(F.appId,Oe);Le&&F.sharedPeers.getHealth(Le.peer)===`stale`&&(F.sharedPeers.clear(F.appId,Oe,{destroyPeer:!0}),Le=void 0);let Re=!!(Oe&&!ke&&!Ae&&!je),[ze,Be]=await all([F.rootTopicP,F.selfTopicP]);if(!F.isLeaving()&&!(L!==ze&&L!==Be)){if(Re&&!Le){let L=getState(F.peerStates,Oe),R=selfId<Oe;if(L.answeringPeer||L.connectedPeer||L.offerAnswered)return;if(!R&&!L.offerPeer){let I=await sha1(topicPath(F.rootTopicPlaintext,Oe));!F.isLeaving()&&!L.connectedPeer&&z(I,toJson({peerId:selfId}));return}if(L.offerRelays[I])return;L.offerRelays[I]=offerRelayPlaceholder,updateStatus(L)}if(Le&&(ke||Ae||je)){if(Le.bindings[F.roomId])return;F.attachSharedPeerToRoom(Oe,Le);return}if(Re)return handleAnnouncement(F,I,Oe,Le,z);if(ke)return handleOffer(F,I,Oe,ke,Me,Pe,z);if(je)return handleCandidate(F,Oe,je,Me,Ne);if(Ae)return handleAnswer(F,I,Oe,Ae,Me,Ne)}},announceIntervalMs=5333,announceWarmupIntervalsMs=[233,533,1333],sharedPeerIdleMsDefault=123333,strategy_default=({init:F,subscribe:I,announce:L})=>{let R={},z={},De={},Oe={},ke=new SharedPeerManager,Ae=()=>values(R).some(F=>keys(F).length>0),je=F=>z[F]??={},Me=F=>De[F]??={},Ne=(F,I,L)=>{ke.getHealth(F.peer)===`live`&&ke.sendRoomPresence(F,I,L)},Pe=(F,I)=>{entries(z[F]??{}).forEach(([L,R])=>{let{roomToken:De,roomTokenPromise:Oe}=R;if(De){Ne(I,De,!0);return}Oe.then(De=>{z[F]?.[L]===R&&R.roomToken===De&&(ke.get(F,I.peerId)!==I||I.isClosing||Ne(I,De,!0))})})},Fe=(F,I,L)=>values(ke.getMap(F)).forEach(F=>Ne(F,I,L)),Ie=F=>{Oe[F]||(Oe[F]=ke.setRoomPresenceHandler(F,(I,L,R)=>{if(!R)return;let Oe=ke.get(F,I),Ae=De[F]?.[L];!Oe||!Ae||z[F]?.[Ae]?.attachSharedPeerToRoom(I,Oe)}))},Le=F=>{R[F]&&keys(R[F]).length>0||(Oe[F]?.(),delete Oe[F],delete z[F],delete De[F])},Re=!1,ze=[],Be=null,Ge=noOp;return(Oe,Ne,rt)=>{if(!Oe)throw mkErr(`requires a config map as the first argument`);if(rt&&typeof rt!=`object`)throw mkErr(`third argument must be a callbacks object`);let{appId:it}=Oe,at=rt?.onJoinError,ot=rt?.onPeerHandshake,st=rt?.handshakeTimeoutMs;if(!it)throw mkErr(`config map is missing appId field`);if(!Ne)throw mkErr(`roomId argument required`);if(st!==void 0&&(!Number.isFinite(st)||st<=0))throw mkErr(`handshakeTimeoutMs must be a positive number`);if(R[it]?.[Ne])return R[it][Ne];Ie(it);let ct=topicPath(libName,it,Ne),lt=sha1(ct),ut=sha1(topicPath(ct,selfId)),dt=genKey(Oe.password??``,it,Ne),ft=deriveRoomNamespace(it,Ne),pt=Oe._test_only_sharedPeerIdleMs??sharedPeerIdleMsDefault,mt=!1,ht=F=>async I=>({type:I.type,sdp:await F(dt,I.sdp)}),gt=ht(decrypt),vt=ht(encrypt),yt=ke.getMap(it);Be||=new OfferPool(()=>peer_default(!0,Oe));let yr=Be,br=async F=>{let I=await F.getOffer(Date.now()-F.created>offerTtl);if(!I||I.type!==`offer`)throw mkErr(`failed to get offer for peer`);return(await vt(I)).sdp},hw=(F,I)=>{let L=getState(gw.peerStates,F);L.answeringExpiryTimer=resetTimer(L.answeringExpiryTimer),L.answeringPeer=null;let{proxy:R,isNew:z}=ke.bind(Ne,ft,I,{onDetach:()=>{let L=gw.peerStates[F];L?.connectedPeer===I.peer&&(L.connectedPeer=null,L.connectedPeerUnhealthySinceMs=null,updateStatus(L))}});L.connectedPeer=I.peer,L.connectedPeerUnhealthySinceMs=null,updateStatus(L),z&&xw(R,F),resetOfferState(L,yr)},gw={appId:it,roomId:Ne,config:Oe,peerStates:{},rootTopicPlaintext:ct,rootTopicP:lt,selfTopicP:ut,toPlain:gt,toCipher:vt,isLeaving:()=>mt,onJoinError:at,sharedPeers:ke,offerPool:yr,encryptOffer:br,initPeer:peer_default,connectPeer:(F,I,L)=>{if(mt){F.destroy();return}let R=getState(gw.peerStates,I);if(R.connectedPeer){let L=yt[I];if(L&&R.connectedPeer===L.peer&&L.bindings[Ne])return;R.connectedPeer!==F&&!F.isDead&&F.destroy();return}let z=yt[I];if(z&&ke.getHealth(z.peer)===`stale`&&(ke.clear(it,I,{destroyPeer:!0}),z=void 0),z&&z.peer!==F){F.isDead||F.destroy(),hw(I,z);return}let De=!z;z||=ke.register(it,I,F,pt),hw(I,z),De&&Pe(it,z)},disconnectPeer:(F,I)=>{if(mt)return;let L=gw.peerStates[I];L?.connectedPeer===F&&clearConnectedPeer(L,I,`close-event`)},attachSharedPeerToRoom:hw,announceIntervals:[],announceIntervalMs},_w=createSignalHandler(gw);if(!Re){let I=F(Oe);yr.warmup(),ze=(Array.isArray(I)?I:[I]).map(F=>Promise.resolve(F)),Re=!0,Ge=Oe.relayConfig?.manualReconnection?noOp:watchOnline()}gw.announceIntervals=ze.map(()=>announceIntervalMs);let vw=ze.map(()=>0),yw=[],bw=ze.map(async(F,L)=>I(await F,await lt,await ut,_w(L),F=>yr.getOffers(F,br)));all([lt,ut]).then(([F,I])=>{if(mt)return;let R=async(z,De)=>{if(mt)return;let Oe=await L(z,F,I);if(mt)return;typeof Oe==`number`&&(gw.announceIntervals[De]=Oe);let ke=vw[De]??0;vw[De]=ke+1;let Ae=gw.announceIntervals[De]??announceIntervalMs,je=announceWarmupIntervalsMs[ke];yw[De]=setTimeout(()=>{R(z,De)},typeof je==`number`?Math.min(Ae,je):Ae)};bw.forEach(async(F,I)=>{if(await F,mt)return;let L=await ze[I];L&&!mt&&R(L,I)})});let xw=noOp,{compose:Sw}=createPasswordHandshake(Oe.password??``,it,Ne),Cw=Sw(ot),ww={...Cw?{onPeerHandshake:Cw}:{},...st===void 0?{}:{handshakeTimeoutMs:st},onHandshakeError:(F,I)=>at?.({error:I.replace(/^handshake failed: /,``),appId:it,peerId:F,roomId:Ne})};R[it]??={};let Tw=je(it),Ew=room_default(F=>xw=F,F=>{if(mt)return;let I=gw.peerStates[F];I?.connectedPeer&&(I.connectedPeer=null,updateStatus(I))},()=>{mt=!0,xw=noOp;let F=z[it]?.[Ne];F?.roomToken&&(Fe(it,F.roomToken,!1),delete De[it]?.[F.roomToken],De[it]&&!keys(De[it]).length&&delete De[it]),z[it]&&(delete z[it][Ne],keys(z[it]).length||delete z[it]),entries(gw.peerStates).forEach(([F,I])=>{if(I.answeringExpiryTimer=resetTimer(I.answeringExpiryTimer),I.connectedPeer&&!I.connectedPeer.isDead){let L=yt[F];(!L||L.peer!==I.connectedPeer)&&I.connectedPeer.destroy()}I.answeringPeer&&!I.answeringPeer.isDead&&I.answeringPeer.destroy(),resetOfferState(I,yr),I.connectedPeer=null,I.answeringPeer=null,updateStatus(I)}),R[it]&&(delete R[it][Ne],keys(R[it]).length===0&&delete R[it]),yw.forEach(resetTimer),bw.forEach(async F=>{(await F)()}),!Ae()&&(Re=!1,yr.destroy(),Be=null,Ge(),Le(it))},ww),Dw={roomToken:null,roomTokenPromise:ft,attachSharedPeerToRoom:hw};return Tw[Ne]=Dw,ft.then(F=>{mt||z[it]?.[Ne]!==Dw||(Dw.roomToken=F,Me(it)[F]=Ne,values(yt).forEach(I=>{I.remoteRoomTokens.has(F)&&hw(I.peerId,I)}),Fe(it,F,!0))}),R[it][Ne]=Ew}},relayManager=createRelayManager(F=>F.socket),topicToInfoHash={},infoHashToTopic={},announceIntervals=relayManager.scoped(),announceFns=relayManager.scoped(),subscriptionTokens=relayManager.scoped(),trackerAnnounceMs={},handledSignals={},msgHandlers=relayManager.scoped(),roomOutstandingOffers={},roomOfferGenerationPromises={},roomSubscriberCounts={},trackerAction=`announce`,hashLimit=20,offerPoolSize=3,defaultAnnounceMs=1e4,maxAnnounceMs=2e4,offerRetentionMs=12e4,signalDedupeWindowMs=4e3,defaultRedundancy=3,getInfoHash=async F=>{if(topicToInfoHash[F])return topicToInfoHash[F];let I=(await sha1(F)).slice(0,hashLimit);return topicToInfoHash[F]=I,infoHashToTopic[I]=F,I},send=async(F,I,L)=>F.send(toJson({action:trackerAction,info_hash:await getInfoHash(I),peer_id:selfId,...L})),warn=(F,I,L=!1)=>console.warn(`${libName}: torrent tracker ${L?`failure`:`warning`} from ${F} - ${I}`),getRoomOutstandingOffers=F=>roomOutstandingOffers[F]??={},deleteRoomOfferBookkeeping=F=>{delete roomOutstandingOffers[F],delete roomOfferGenerationPromises[F]},claimOutstandingOffer=(F,I)=>{let L=roomOutstandingOffers[F],R=L?.[I];if(R)return delete L[I],R.claim?.(),!keys(L).length&&!roomSubscriberCounts[F]&&deleteRoomOfferBookkeeping(F),R},reclaimOutstandingOffer=(F,I)=>{let L=roomOutstandingOffers[F],R=L?.[I];R&&(delete L[I],R.reclaim?.(),!keys(L).length&&!roomSubscriberCounts[F]&&deleteRoomOfferBookkeeping(F))},reclaimAllOutstandingOffers=F=>{keys(getRoomOutstandingOffers(F)).forEach(I=>reclaimOutstandingOffer(F,I)),deleteRoomOfferBookkeeping(F)},pruneOutstandingOffers=F=>{let I=Date.now();entries(getRoomOutstandingOffers(F)).forEach(([L,R])=>{I-R.createdAt>offerRetentionMs&&reclaimOutstandingOffer(F,L)})},ensureOutstandingOffers=async(F,I)=>{for(;roomOfferGenerationPromises[F];)await roomOfferGenerationPromises[F];let L=(async()=>{pruneOutstandingOffers(F);let L=getRoomOutstandingOffers(F),R=keys(L).length,z=Math.max(0,offerPoolSize-R);z>0&&(await I(z)).forEach(F=>{L[genId(hashLimit)]={...F,createdAt:Date.now()}})})().finally(()=>{roomOfferGenerationPromises[F]===L&&delete roomOfferGenerationPromises[F]});return roomOfferGenerationPromises[F]=L,await L,getRoomOutstandingOffers(F)},joinRoomStrategy=strategy_default({init:F=>getRelays(F,defaultRelayUrls,defaultRedundancy).map(F=>{let I=relayManager.register(F,makeSocket(F,L=>{let R=fromJson(L),z=R[`failure reason`],De=R[`warning message`],{interval:Oe}=R,ke=R.info_hash?infoHashToTopic[R.info_hash]:void 0;if(z){warn(I.url,z,!0);return}if(De&&warn(I.url,De),Oe&&Oe*1e3>(trackerAnnounceMs[I.url]??defaultAnnounceMs)&&ke&&announceFns.forKey(F)[ke]){let L=Math.min(Oe*1e3,maxAnnounceMs),R=announceIntervals.forKey(F),z=announceFns.forKey(F);R[ke]&&clearInterval(R[ke]),trackerAnnounceMs[I.url]=L;let De=z[ke];De&&(R[ke]=setInterval(()=>{De()},L))}if((R.offer||R.answer)&&ke&&R.offer_id){if(R.peer_id===selfId)return;let I=`${ke}:${R.offer?`offer`:`answer`}:${R.offer_id}:${R.peer_id??``}`,L=Date.now(),z=handledSignals[I];if(typeof z==`number`&&L-z<signalDedupeWindowMs)return;handledSignals[I]=L,entries(handledSignals).forEach(([F,I])=>{L-I>signalDedupeWindowMs*6&&delete handledSignals[F]}),msgHandlers.forKey(F)[ke]?.(R)}}));return I.ready}),subscribe:(F,I,L,R,z)=>{let De=msgHandlers.forRelay(F),Oe=announceFns.forRelay(F),ke=announceIntervals.forRelay(F),Ae=subscriptionTokens.forRelay(F),je=Symbol(I);Ae[I]=je,roomSubscriberCounts[I]=(roomSubscriberCounts[I]??0)+1;let Me=L=>{if(L.offer&&L.peer_id&&L.offer_id)R(I,{offer:L.offer.sdp,peerId:L.peer_id,hasOutgoingOffer:keys(getRoomOutstandingOffers(I)).length>0},(R,z)=>void send(F,I,{answer:{type:`answer`,sdp:fromJson(z).answer},offer_id:L.offer_id,to_peer_id:L.peer_id}));else if(L.answer&&L.offer_id&&L.peer_id){let F=claimOutstandingOffer(I,L.offer_id);F&&R(I,{answer:L.answer.sdp,peerId:L.peer_id,peer:F.peer},()=>{})}};De[I]=Me;let Ne=async()=>{Ae[I]===je&&send(F,I,{numwant:offerPoolSize,offers:entries(await ensureOutstandingOffers(I,z)).map(([F,{offer:I}])=>({offer_id:F,offer:{type:`offer`,sdp:I}}))})};return trackerAnnounceMs[F.url]=defaultAnnounceMs,Oe[I]=Ne,ke[I]=setInterval(Ne,trackerAnnounceMs[F.url]),Ne(),()=>{if(roomSubscriberCounts[I]=Math.max(0,(roomSubscriberCounts[I]??1)-1),roomSubscriberCounts[I]||delete roomSubscriberCounts[I],Ae[I]!==je){roomSubscriberCounts[I]||reclaimAllOutstandingOffers(I);return}let F=ke[I];F&&(clearInterval(F),delete ke[I]),De[I]===Me&&delete De[I],Oe[I]===Ne&&delete Oe[I],delete Ae[I],roomSubscriberCounts[I]||reclaimAllOutstandingOffers(I)}},announce:F=>trackerAnnounceMs[F.url]}),joinRoom=(F,I,L)=>joinRoomStrategy({...F,trickleIce:F.trickleIce??!1},I,L),getRelaySockets=relayManager.getSockets,defaultRelayUrls=[`tracker.webtorrent.dev`,`tracker.openwebtorrent.com`,`tracker.btorrent.xyz`,`tracker.files.fm:7073/announce`].map(F=>`wss://`+F),require_lodash_throttle=__commonJSMin(((F,I)=>{var L=`Expected a function`,R=NaN,z=`[object Symbol]`,De=/^\s+|\s+$/g,Oe=/^[-+]0x[0-9a-f]+$/i,ke=/^0b[01]+$/i,Ae=/^0o[0-7]+$/i,je=parseInt,Me={}.Object===Object&&{},Ne=typeof self==`object`&&self&&self.Object===Object&&self,Pe=Me||Ne||Function(`return this`)(),Fe=Object.prototype.toString,Ie=Math.max,Le=Math.min,Re=function(){return Pe.Date.now()};function ze(F,I,R){var z,De,Oe,ke,Ae,je,Me=0,Ne=!1,Pe=!1,Fe=!0;if(typeof F!=`function`)throw TypeError(L);I=at(I)||0,Ge(R)&&(Ne=!!R.leading,Pe=`maxWait`in R,Oe=Pe?Ie(at(R.maxWait)||0,I):Oe,Fe=`trailing`in R?!!R.trailing:Fe);function ze(I){var L=z,R=De;return z=De=void 0,Me=I,ke=F.apply(R,L),ke}function Be(F){return Me=F,Ae=setTimeout(ot,I),Ne?ze(F):ke}function rt(F){var L=F-je,R=F-Me,z=I-L;return Pe?Le(z,Oe-R):z}function it(F){var L=F-je,R=F-Me;return je===void 0||L>=I||L<0||Pe&&R>=Oe}function ot(){var F=Re();if(it(F))return st(F);Ae=setTimeout(ot,rt(F))}function st(F){return Ae=void 0,Fe&&z?ze(F):(z=De=void 0,ke)}function ct(){Ae!==void 0&&clearTimeout(Ae),Me=0,z=je=De=Ae=void 0}function lt(){return Ae===void 0?ke:st(Re())}function ut(){var F=Re(),L=it(F);if(z=arguments,De=this,je=F,L){if(Ae===void 0)return Be(je);if(Pe)return Ae=setTimeout(ot,I),ze(je)}return Ae===void 0&&(Ae=setTimeout(ot,I)),ke}return ut.cancel=ct,ut.flush=lt,ut}function Be(F,I,R){var z=!0,De=!0;if(typeof F!=`function`)throw TypeError(L);return Ge(R)&&(z=`leading`in R?!!R.leading:z,De=`trailing`in R?!!R.trailing:De),ze(F,I,{leading:z,maxWait:I,trailing:De})}function Ge(F){var I=typeof F;return!!F&&(I==`object`||I==`function`)}function rt(F){return!!F&&typeof F==`object`}function it(F){return typeof F==`symbol`||rt(F)&&Fe.call(F)==`[object Symbol]`}function at(F){if(typeof F==`number`)return F;if(it(F))return R;if(Ge(F)){var I=typeof F.valueOf==`function`?F.valueOf():F;F=Ge(I)?I+``:I}if(typeof F!=`string`)return F===0?F:+F;F=F.replace(De,``);var L=ke.test(F);return L||Ae.test(F)?je(F.slice(2),L?2:8):Oe.test(F)?R:+F}I.exports=Be})),import_lodash_throttle=__toESM(require_lodash_throttle()),endpoints={getMarketData:`https://farmhand.vercel.app/api/get-market-data`,postDayResults:`https://farmhand.vercel.app/api/post-day-results`},features=Object.keys({BASE_URL:`./`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1,VITE_API_ROOT:`https://farmhand.vercel.app/`,VITE_FARMHAND_PACKAGE_VERSION:`1.24.1`,VITE_NAME:`@jeremyckahn/farmhand`,VITE_TURN_CREDENTIAL:`6x4LaeUz+EVcw7zh`,VITE_TURN_USERNAME:`02e7e9daca7857e8d1faccf1`}).reduce((F,I)=>{let L=I.match(/VITE_ENABLE_(.*)/);return L&&(F[L[1]]=!0),F},{}),searchParams=new URLSearchParams(import_window.default.location?.search);for(let F of searchParams.keys()){let I=F.match(/enable_(.*)/);I&&(features[I[1]]=!0)}var turnUsername=`02e7e9daca7857e8d1faccf1`,turnCredential=`6x4LaeUz+EVcw7zh`,rtcConfig={iceServers:[{urls:`stun:stun.relay.metered.ca:80`},{urls:`turn:a.relay.metered.ca:80`,username:turnUsername,credential:turnCredential},{urls:`turn:a.relay.metered.ca:80?transport=tcp`,username:turnUsername,credential:turnCredential},{urls:`turn:a.relay.metered.ca:443`,username:turnUsername,credential:turnCredential},{urls:`turn:a.relay.metered.ca:443?transport=tcp`,username:turnUsername,credential:turnCredential}]},handlePeerMetadataRequest=(F,I,L)=>{F.updatePeer(F,I,L)},handleCowTradeRequest=async(F,{cowOffered:I,cowRequested:L},R)=>{let z=!1;F.setState(F=>{let{allowCustomPeerCowNames:De,cowIdOfferedForTrade:Oe,cowsTraded:ke,cowInventory:Ae,playerId:je,isAwaitingCowTradeRequest:Me,peers:Ne,sendCowAccept:Pe,sendCowReject:Fe}=F;if(!Pe||!Fe)return console.error(`Peer connection not set up correctly`),null;let Ie=Ae.find(({id:F})=>F===Oe);if(Me||L.id!==Oe||!Ie)return Fe({reason:cowTradeRejectionReason.REQUESTED_COW_UNAVAILABLE},R),null;let Le={...I,timesTraded:I.originalOwnerId===je?I.timesTraded:I.timesTraded+1},[,Re]=Object.entries(Ne).find(([,F])=>F?.playerId===Le.ownerId)??[];return Re?(F=changeCowAutomaticHugState(F,Ie,!1),F=removeCowFromInventory(F,Ie),F=addCowToInventory(F,{...Le,ownerId:je}),F=showNotification(F,COW_TRADED_NOTIFICATION(``,Ie,I,je,De),`success`),Pe({...Ie,isUsingHuggingMachine:!1},R),z=!0,{...F,cowIdOfferedForTrade:Le.id,cowsTraded:Le.originalOwnerId===je?ke:ke+1,isAwaitingCowTradeRequest:!0,selectedCowId:Le.id,peers:{...Ne,[R]:{...Re,cowOfferedForTrade:{...Ie,ownerId:Re.playerId}}}}):(console.error(`No data for peer ${Le.ownerId}`),null)},async()=>{z&&(await sleep(750),await F.persistState(),F.showNotification(PROGRESS_SAVED_MESSAGE,`info`),F.setState(()=>({isAwaitingCowTradeRequest:!1})))})},handleCowTradeRequestAccept=(F,I,L)=>{let R=!1;F.setState(F=>{let{allowCustomPeerCowNames:z,cowIdOfferedForTrade:De,cowInventory:Oe,cowsTraded:ke,cowTradeTimeoutId:Ae,playerId:je,peers:Me}=F,Ne=Oe.find(({id:F})=>F===De);if(!Ne)return console.error(`handleCowTradeRequestAccept: cow with ID ${De} is no longer available`),F=showNotification(F,UNKNOWN_COW_TRADE_FAILURE,`error`),{...F,isAwaitingCowTradeRequest:!1};let[,Pe]=Object.entries(Me).find(([,F])=>{let{playerId:L}=F;return L===I.ownerId})||[],Fe=I.originalOwnerId===je,Ie={...I,timesTraded:Fe?I.timesTraded:I.timesTraded+1};return F=removeCowFromInventory(F,Ne),F=addCowToInventory(F,{...Ie,ownerId:je}),F=showNotification(F,COW_TRADED_NOTIFICATION(``,Ne,Ie,je,z),`success`),Fe||(F=addExperience(F,EXPERIENCE_VALUES.COW_TRADED)),Ae&&clearTimeout(Ae),R=!0,{...F,cowsTraded:Ie.originalOwnerId===je?ke:ke+1,cowTradeTimeoutId:null,isAwaitingCowTradeRequest:!1,cowIdOfferedForTrade:Ie.id,selectedCowId:Ie.id,peers:{...Me,[L]:{...Pe,cowOfferedForTrade:{...Ne,ownerId:Pe.playerId}}}}},async()=>{R&&(await F.persistState(),F.showNotification(PROGRESS_SAVED_MESSAGE,`info`))})},handleCowTradeRequestReject=(F,{reason:I})=>{let{cowTradeTimeoutId:L}=F.state;typeof L==`number`&&clearTimeout(L),F.setState({cowTradeTimeoutId:null,isAwaitingCowTradeRequest:!1}),F.showNotification(REQUESTED_COW_TRADE_UNAVAILABLE,`error`)},relayRedundancy=4,useFarmhandNetwork=(F,I,L,R,z,De,Oe,ke)=>{let{hasBooted:Ae,isOnline:je,room:Me,redirect:Ne,heartbeatTimeoutId:Pe,peerRoom:Fe,sendPeerMetadata:Ie}=F,Le=(0,import_react$10.useCallback)(F=>(0,import_lodash_throttle.default)((...L)=>{F(...L),I(F=>({...F,pendingPeerMessages:[]}))},5e3,{trailing:!0}),[I]),Re=(0,import_react$10.useCallback)(()=>{typeof R.current?.state?.cowTradeTimeoutId==`number`&&(L.current.showNotification(REQUESTED_COW_TRADE_UNAVAILABLE,`error`),console.error(`Cow trade request timed out`),I(F=>({...F,cowTradeTimeoutId:null,isAwaitingCowTradeRequest:!1})))},[I,L,R]),ze=(0,import_react$10.useCallback)(z=>{let{cowIdOfferedForTrade:De,cowInventory:Oe,peers:ke,sendCowTradeRequest:Ae}=R.current?.state??F;if(!Ae)return;let{ownerId:je}=z,[Me]=Object.entries(ke).find(([,F])=>F?.playerId===je)??[];if(!Me){console.error(`Owner not found for cow ${JSON.stringify(z)}`);return}if(Oe.find(({id:F})=>F===z.id)){console.error(`Cow ID ${z.id} is already in inventory`),L.current.showNotification(COW_ALREADY_OWNED,`error`);return}let Ne=Oe.find(({id:F})=>F===De);if(!Ne){console.error(`Cow ID ${De} not found`);return}let Pe=setTimeout(Re,COW_TRADE_TIMEOUT);Ae({cowOffered:{...Ne,isUsingHuggingMachine:!1},cowRequested:z},Me),I(F=>({...F,cowTradeTimeoutId:Pe,isAwaitingCowTradeRequest:!0}))},[I,Re,L,R]),Be=(0,import_react$10.useCallback)(()=>{I(F=>(clearTimeout(F.heartbeatTimeoutId??-1),F));let F=import_window.default.setTimeout(()=>{I(F=>({...F,money:moneyTotal(F.money,F.activePlayers??0)})),Be()},HEARTBEAT_INTERVAL_PERIOD);I(I=>({...I,heartbeatTimeoutId:F}))},[I]),Ge=(0,import_react$10.useCallback)(async()=>{let{isOnline:F,priceCrashes:z,priceSurges:De,room:Oe,playerId:ke,peerRoom:Ae}=R.current.state;if(F){L.current.showNotification(CONNECTING_TO_SERVER,`info`);try{I(F=>({...F,isAwaitingNetworkRequest:!0,peers:{}})),Ae?.leave();let{valueAdjustments:F}=await getData(endpoints.getMarketData,{farmId:ke,room:Oe});Be(),I(I=>({...I,activePlayers:1,peerRoom:joinRoom({appId:`@jeremyckahn/farmhand`,rtcConfig},Oe),valueAdjustments:FarmhandService.applyPriceEvents(F,z,De)})),L.current.showNotification(CONNECTED_TO_ROOM(``,Oe),`success`)}catch(F){L.current.showNotification(SERVER_ERROR,`error`),console.error(F),I(F=>({...F,redirect:withCurrentHashQuery(`/`),cowIdOfferedForTrade:``}))}I(F=>({...F,isAwaitingNetworkRequest:!1,isAwaitingCowTradeRequest:!1}))}},[Be,L,R,I]),rt=(0,import_react$10.useCallback)((F,I)=>{L.current.prependPendingPeerMessage(F,I)},[L]);return(0,import_react$10.useEffect)(()=>{if(!Ae||!z)return;let F=decodeURIComponent(De),Re=Oe.startsWith(`/online`),ze=!!Ne&&Ne!==z.redirect;if(!ze&&(Re!==je||F!==Me)?I(I=>({...I,isOnline:Re,redirect:``,room:F})):Ne&&!ze&&Re===je&&F===Me&&I(F=>({...F,redirect:``})),(je!==z.isOnline||Me!==z.room)&&(je&&Ge(),!je&&typeof Pe==`number`&&(clearTimeout(Pe),I(F=>({...F,activePlayers:null,heartbeatTimeoutId:null,peerRoom:null})))),je===!1&&z.isOnline===!0&&L.current.showNotification(DISCONNECTED_FROM_SERVER,`info`),Fe!==z.peerRoom)if(Fe){Fe.onPeerJoin(F=>L.current.addPeer(F)),Fe.onPeerLeave(F=>L.current.removePeer(F));let[F,z]=Fe.makeAction(`peerMetadata`);z((...F)=>handlePeerMetadataRequest(R.current,F[0],F[1]));let[De,Oe]=Fe.makeAction(`cowTrade`);Oe((...F)=>handleCowTradeRequest(R.current,F[0],F[1]));let[Ae,je]=Fe.makeAction(`cowAccept`);je((...F)=>handleCowTradeRequestAccept(R.current,F[0],F[1]));let[Me,Ne]=Fe.makeAction(`cowReject`);Ne((...F)=>handleCowTradeRequestReject(R.current,F[0])),I(I=>({...I,getCowAccept:je,getCowReject:Ne,getCowTradeRequest:Oe,getPeerMetadata:z,pendingPeerMessages:[],sendCowAccept:Ae,sendCowReject:Me,sendCowTradeRequest:De,sendPeerMetadata:Le(F)})),F(ke)}else z.peerRoom?.leave(),I(F=>({...F,peers:{},sendPeerMetadata:null}));Ie?.(ke)},[Ae,je,Me,Ne,Pe,Fe,Ie,z,De,Oe,Ge,Le,ke,L,R,I]),{syncToRoom:Ge,scheduleHeartbeat:Be,wrapSendPeerMetadata:Le,tradeForPeerCow:ze,handleCowTradeTimeout:Re,messagePeers:rt}},computeMarketPositions=(F,I,L)=>L.reduce((L,{id:R,quantity:z})=>{let De=F[R]||0,Oe=I[R]||0;return itemsMap[R].doesPriceFluctuate&&De!==z&&(z<De||z<Oe?L[R]=-1:(z>De||z>Oe)&&(L[R]=1)),L},{}),useFarmhandDayAdvancement=(F,I,L,R,z)=>{let De=(0,import_react$10.useCallback)(async()=>{await L.localforage?.clear(),R.current.showNotification(DATA_DELETED)},[L.localforage,R]),Oe=(0,import_react$10.useCallback)((F,I={})=>L.localforage?.setItem(`state`,reduceByPersistedKeys({...F,...I})),[L.localforage]),ke=(0,import_react$10.useCallback)(async()=>{let L=[],R=null;I(F=>({...F,isAwaitingNetworkRequest:!0}));let z;if(F.current.isOnline){let{inventory:De,room:Oe,todaysPurchases:ke,todaysStartingInventory:Ae}=F.current,je=computeMarketPositions(Ae,ke,De);try{z=(await postData(endpoints.postDayResults,{positions:je,room:Oe})).valueAdjustments,Object.keys(je).length&&(L.push({message:POSITIONS_POSTED_NOTIFICATION(``,`You`,je),severity:`info`}),R=POSITIONS_POSTED_NOTIFICATION(``,``,je))}catch(F){L.push({message:SERVER_ERROR,severity:`error`}),I(F=>({...F,redirect:withCurrentHashQuery(`/`),cowIdOfferedForTrade:``,isAwaitingNetworkRequest:!1})),console.error(F)}}return{broadcastedPositionMessage:R,serverMessages:L,serverValueAdjustments:z}},[F,I]);return{clearPersistedData:De,persistState:Oe,updateServerForNextDay:ke,incrementDay:(0,import_react$10.useCallback)(async(L=!1)=>{if(F.current.isWaitingForDayToCompleteIncrementing&&!L)return;L||I(F=>({...F,isWaitingForDayToCompleteIncrementing:!0}));let{broadcastedPositionMessage:R,serverMessages:De,serverValueAdjustments:Oe}=await ke();I(F=>{let I=computeStateForNextDay(F,L),ke=[...De,...I.newDayNotifications];return I.valueAdjustments=FarmhandService.applyPriceEvents(Oe??I.valueAdjustments,I.priceCrashes,I.priceSurges),I.isAwaitingNetworkRequest=!1,I.isWaitingForDayToCompleteIncrementing=!0,I.newDayNotifications=[],I.todaysNotifications=[],z.current={state:I,pendingNotifications:ke,broadcastedPositionMessage:R,isFirstDay:L},I})},[F,ke,I,z])}},useFarmhandNotifications=(F,I)=>({showInventoryFullNotifications:(0,import_react$10.useCallback)((F,L)=>{inventorySpaceRemaining(F)>0&&inventorySpaceRemaining(L)<=0&&I.current.showNotification(INVENTORY_FULL_NOTIFICATION,`warning`)},[I]),showRecipeLearnedNotifications:(0,import_react$10.useCallback)(({learnedRecipes:L})=>{let R=[];Object.keys(F.learnedRecipes).forEach(F=>{L.hasOwnProperty(F)||R.push(recipesMap[F])}),R.length>1?I.current.showNotification(RECIPES_LEARNED(``,R)):R.length===1&&I.current.showNotification(RECIPE_LEARNED(``,R[0]))},[F.learnedRecipes,I])}),FarmhandReducers=class F extends import_react$10.Component{addCowToInventory(...F){throw Error(`Unimplemented`)}addPeer(...F){throw Error(`Unimplemented`)}adjustLoan(...F){throw Error(`Unimplemented`)}changeCowAutomaticHugState(...F){throw Error(`Unimplemented`)}changeCowBreedingPenResident(...F){throw Error(`Unimplemented`)}changeCowName(...F){throw Error(`Unimplemented`)}clearPlot(...F){throw Error(`Unimplemented`)}chopForestPlot(...F){throw Error(`Unimplemented`)}computeStateForNextDay(...F){throw Error(`Unimplemented`)}fertilizePlot(...F){throw Error(`Unimplemented`)}forRange(...F){throw Error(`Unimplemented`)}harvestForestPlot(...F){throw Error(`Unimplemented`)}harvestPlot(...F){throw Error(`Unimplemented`)}hugCow(...F){throw Error(`Unimplemented`)}makeRecipe(...F){throw Error(`Unimplemented`)}makeFermentationRecipe(...F){throw Error(`Unimplemented`)}makeWine(...F){throw Error(`Unimplemented`)}modifyCow(...F){throw Error(`Unimplemented`)}mulchForestPlot(...F){throw Error(`Unimplemented`)}offerCow(...F){throw Error(`Unimplemented`)}placeFarmhandShuffleWager(...F){throw Error(`Unimplemented`)}plantInPlot(...F){throw Error(`Unimplemented`)}plantTreeInPlot(...F){throw Error(`Unimplemented`)}prependPendingPeerMessage(...F){throw Error(`Unimplemented`)}purchaseCombine(...F){throw Error(`Unimplemented`)}purchaseComposter(...F){throw Error(`Unimplemented`)}purchaseCow(...F){throw Error(`Unimplemented`)}purchaseCowPen(...F){throw Error(`Unimplemented`)}purchaseCellar(...F){throw Error(`Unimplemented`)}purchaseField(...F){throw Error(`Unimplemented`)}purchaseForest(...F){throw Error(`Unimplemented`)}purchaseItem(...F){throw Error(`Unimplemented`)}purchaseSmelter(...F){throw Error(`Unimplemented`)}purchaseStorageExpansion(...F){throw Error(`Unimplemented`)}purchaseWoodChipper(...F){throw Error(`Unimplemented`)}removeCowFromInventory(...F){throw Error(`Unimplemented`)}removeKegFromCellar(...F){throw Error(`Unimplemented`)}removePeer(...F){throw Error(`Unimplemented`)}refundUnresumableFarmhandShuffleMatch(...F){throw Error(`Unimplemented`)}saveFarmhandShuffleMatch(...F){throw Error(`Unimplemented`)}selectCow(...F){throw Error(`Unimplemented`)}sellCow(...F){throw Error(`Unimplemented`)}sellItem(...F){throw Error(`Unimplemented`)}sellKeg(...F){throw Error(`Unimplemented`)}settleFarmhandShuffleMatch(...F){throw Error(`Unimplemented`)}setLightningRod(...F){throw Error(`Unimplemented`)}setScarecrow(...F){throw Error(`Unimplemented`)}setSprinkler(...F){throw Error(`Unimplemented`)}showNotification(...F){throw Error(`Unimplemented`)}updatePeer(...F){throw Error(`Unimplemented`)}upgradeTool(...F){throw Error(`Unimplemented`)}waterAllPlots(...F){throw Error(`Unimplemented`)}waterField(...F){throw Error(`Unimplemented`)}waterPlot(...F){throw Error(`Unimplemented`)}withdrawCow(...F){throw Error(`Unimplemented`)}constructor(I){super(I);let L=Object.getOwnPropertyNames(F.prototype).filter(F=>F!==`constructor`);for(let F of L){let I=reducers_exports[F];I&&(this[F]=(...F)=>{this.setState(L=>I(L,...F))})}}},useFarmhandReducers=F=>(0,import_react$10.useMemo)(()=>{let I={};Object.assign(I,reducers_exports);let L=Object.getOwnPropertyNames(FarmhandReducers.prototype).filter(F=>F!==`constructor`);for(let R of L){let L=reducers_exports[R];typeof L==`function`&&(I[R]=(...I)=>{F(F=>{let R=L(F,...I);return!R||R===F?F:{...R}})})}return I},[F]),usePrevious=F=>{let I=(0,import_react$10.useRef)();return(0,import_react$10.useEffect)(()=>{I.current=F},[F]),I.current},{CLEANUP,HARVEST,MINE,WATER}=fieldMode,useFarmhand=F=>{let{features:I,match:{path:L=``,params:{room:R}={}}={}}=F,z=(0,import_react$10.useCallback)(()=>({activePlayers:null,allowCustomPeerCowNames:!1,cellarInventory:[],currentDialogView:dialogView.NONE,completedAchievements:{},cowForSale:generateCow(),cowBreedingPen:{cowId1:null,cowId2:null,daysUntilBirth:-1},cowColorsPurchased:{},cowIdOfferedForTrade:``,cowInventory:[],cowsSold:{},cowsTraded:0,cowTradeTimeoutId:-1,cropsHarvested:{},dayCount:0,experience:0,farmName:`Unnamed`,farmhandShuffle:{isMatchInProgress:!1,wager:0,serializedMatch:null,totalMatchesPlayed:0,totalWins:0,totalLosses:0,currentWinStreak:0,longestWinStreak:0},field:createNewField(),fieldMode:fieldMode.OBSERVE,forest:createNewForest(),treesChopped:0,treeFruitsHarvested:{},mulchApplied:{},getCowAccept:noop$2,getCowReject:noop$2,getCowTradeRequest:noop$2,getPeerMetadata:noop$2,hasBooted:!1,hasProducedRainbowFertilizer:!1,heartbeatTimeoutId:null,historicalDailyLosses:[],historicalDailyRevenue:[],historicalValueAdjustments:[],hoveredPlotRangeSize:0,playerId:v4(),inventory:[{id:scarecrow.id,quantity:1}],inventoryLimit:100,isAwaitingCowTradeRequest:!1,isAwaitingNetworkRequest:!1,isCombineEnabled:!1,isMenuOpen:!doesMenuObstructStage(),itemsSold:{},cellarItemsSold:{},isChatOpen:!1,isDialogViewOpen:!1,isOnline:L.startsWith(`/online`)??!1,isWaitingForDayToCompleteIncrementing:!1,learnedRecipes:{},loanBalance:500,loansTakenOut:1,money:500,latestNotification:null,newDayNotifications:[],notificationLog:[],notificationDuration:NOTIFICATION_DURATION_DEFAULT,peers:{},peerRoom:null,pendingPeerMessages:[],latestPeerMessages:[],sendPeerMetadata:null,selectedCowId:``,selectedForestItemId:``,selectedItemId:``,priceCrashes:{},priceSurges:{},profitabilityStreak:0,recipesMade:{},record7dayProfitAverage:0,recordProfitabilityStreak:0,recordSingleDayProfit:0,revenue:0,redirect:``,room:decodeURIComponent(F.match?.params?.room||`global`),sendCowAccept:noop$2,sendCowReject:noop$2,purchasedCombine:0,purchasedComposter:0,purchasedCowPen:0,purchasedCellar:0,purchasedField:0,purchasedForest:0,purchasedSmelter:0,purchasedWoodChipper:0,sendCowTradeRequest:noop$2,showHomeScreen:!0,showNotifications:!0,stageFocus:stageFocusType.HOME,todaysNotifications:[],todaysLosses:0,todaysPurchases:{},todaysRevenue:0,todaysStartingInventory:{},toolLevels:{[toolType.AXE]:toolLevel.UNAVAILABLE,[toolType.HOE]:toolLevel.DEFAULT,[toolType.PICKER_POLE]:toolLevel.UNAVAILABLE,[toolType.SCYTHE]:toolLevel.DEFAULT,[toolType.SHOVEL]:toolLevel.UNAVAILABLE,[toolType.WATERING_CAN]:toolLevel.DEFAULT},useAlternateEndDayButtonPosition:!1,valueAdjustments:{},version:`1.24.1`}),[L,F.match?.params?.room]),[De,Oe]=(0,import_react$10.useState)(z),ke=(0,import_react$10.useRef)(De);ke.current=De;let Ae=R===void 0?De.room:R,je=(0,import_react$10.useRef)(null),Me=(0,import_react$10.useRef)(!1),Ne=useFarmhandReducers(Oe),Pe=(0,import_react$10.useRef)(Ne);Pe.current=Ne;let Fe=usePrevious(De),Ie=STAGE_TITLE_MAP[De.stageFocus],Le=FarmhandService.getFieldToolInventory(De.inventory),Re=FarmhandService.computePlayerInventory(De.inventory,De.valueAdjustments),ze=FarmhandService.getPlantableCropInventory(De.inventory),Be=FarmhandService.getPlantableTreeInventory(De.inventory),Ge=FarmhandService.getMulchInventory(De.inventory),rt=(0,import_react$10.useMemo)(()=>getLevelEntitlements(levelAchieved(De.experience)),[De.experience]),it=(0,import_react$10.useMemo)(()=>getAvailableShopInventory(rt),[rt]),at=rt.stageFocusType[stageFocusType.FOREST],ot=rt.stageFocusType[stageFocusType.FARMHAND_SHUFFLE],st=De.isOnline&&De.room!==`global`,ct=(0,import_react$10.useMemo)(()=>getViewList({isFarmhandShuffleUnlocked:ot,isForestUnlocked:at,purchasedCellar:De.purchasedCellar,purchasedCowPen:De.purchasedCowPen,showHomeScreen:De.showHomeScreen}),[De.showHomeScreen,ot,at,De.purchasedCowPen,De.purchasedCellar]),lt=(0,import_react$10.useMemo)(()=>getPeerMetadata(De),[De]),ut=De.isAwaitingNetworkRequest||De.isAwaitingCowTradeRequest||De.isWaitingForDayToCompleteIncrementing,dt=(0,import_react$10.useRef)(null),{openDialogView:ft,closeDialogView:pt,focusNextView:mt,focusPreviousView:ht}=useFarmhandNavigation(Oe,ct),gt=(0,import_react$10.useRef)(!0),vt=(0,import_react$10.useRef)(!1);(0,import_react$10.useEffect)(()=>{if(De.hasBooted){if(vt.current){vt.current=!1,setHashQueryParam(VIEW_QUERY_PARAM_NAME,De.stageFocus);return}if(gt.current){gt.current=!1,setHashQueryParam(VIEW_QUERY_PARAM_NAME,De.stageFocus);return}setHashQueryParam(VIEW_QUERY_PARAM_NAME,De.stageFocus,`push`),removeHashQueryParam(`tab`)}},[De.stageFocus,De.hasBooted]),(0,import_react$10.useEffect)(()=>{let F=()=>{let F=getValidatedStageFocusFromHash(ke.current)??stageFocusType.HOME;F!==ke.current.stageFocus&&(vt.current=!0,Oe(I=>({...I,stageFocus:F})))};return import_window.default.addEventListener(`popstate`,F),()=>import_window.default.removeEventListener(`popstate`,F)},[]);let{syncToRoom:yt,scheduleHeartbeat:yr,tradeForPeerCow:br,handleCowTradeTimeout:hw,messagePeers:gw}=useFarmhandNetwork(De,Oe,Pe,dt,Fe,Ae,L,lt),{clearPersistedData:_w,persistState:vw,updateServerForNextDay:yw,incrementDay:bw}=useFarmhandDayAdvancement(ke,Oe,F,Pe,je),{showInventoryFullNotifications:xw,showRecipeLearnedNotifications:Sw}=useFarmhandNotifications(De,Pe);dt.current=(0,import_react$10.useMemo)(()=>({queueRandomNumbers:(F,I)=>randomNumberService.queueRandomNumbers(F,I),state:De,props:F,viewTitle:Ie,fieldToolInventory:Le,mulchInventory:Ge,playerInventory:Re,plantableCropInventory:ze,plantableTreeInventory:Be,viewList:ct,levelEntitlements:rt,shopInventory:it,peerMetadata:lt,isInputBlocked:ut,isChatAvailable:st,isFarmhandShuffleUnlocked:ot,isForestUnlocked:at,setState:(F,I)=>{Oe(L=>{let R=typeof F==`function`?F(L):F;if(R==null)return L;let z={...L,...R};return I&&setTimeout(I,0),z})},...Pe.current,purchaseItem:(F,I)=>Pe.current.purchaseItem(F,I),sellItem:(F,I)=>Pe.current.sellItem(F,I),showNotification:(F,I,L,R)=>Pe.current.showNotification(F,I,L,R),prependPendingPeerMessage:(F,I)=>Pe.current.prependPendingPeerMessage(F,I),forRange:(F,I,L,R,z)=>Pe.current.forRange(F,I,L,R,z),createInitialState:z,getData,postData,tradeForPeerCow:br,handleCowTradeTimeout:hw,clearPersistedData:_w,syncToRoom:yt,scheduleHeartbeat:yr,showInventoryFullNotifications:xw,showRecipeLearnedNotifications:Sw,persistState:(F={})=>vw(dt.current?.state??De,F),updateServerForNextDay:yw,incrementDay:bw,openDialogView:ft,closeDialogView:pt,focusNextView:mt,focusPreviousView:ht,messagePeers:gw}),[De,F,Ie,Le,Ge,Re,ze,Be,ct,rt,it,lt,ut,st,ot,at,br,hw,_w,yt,yr,xw,Sw,vw,yw,bw,ft,pt,mt,ht,gw,z]);let Cw=(0,import_react$10.useMemo)(()=>{let F={debounced:{}};return Object.keys(ui_events_default).forEach(I=>{let L=I;F[L]=(...F)=>ui_events_default[L].apply(dt.current,F),F.debounced[L]=(0,import_lodash_debounce.default)(F[L],50)}),F},[]),ww=(0,import_react$10.useMemo)(()=>{let F={incrementDay:`shift+c`,nextView:`right`,openAccounting:`b`,openAchievements:`a`,openLog:`l`,openPriceEvents:`e`,openStats:`s`,openSettings:`,`,openKeybindings:`shift+?`,previousView:`left`,toggleMenu:`m`};return nullArray(9).forEach((I,L)=>{F[`numberKey${L+1}`]=String(L+1)}),F},[]),Tw=(0,import_react$10.useMemo)(()=>{let F={incrementDay:()=>{De.stageFocus===stageFocusType.FARMHAND_SHUFFLE&&De.farmhandShuffle.isMatchInProgress||bw()},nextView:mt,openAccounting:()=>ft(dialogView.ACCOUNTING),openAchievements:()=>ft(dialogView.ACHIEVEMENTS),openLog:()=>ft(dialogView.FARMERS_LOG),openPriceEvents:()=>ft(dialogView.PRICE_EVENTS),openStats:()=>ft(dialogView.STATS),openSettings:()=>ft(dialogView.SETTINGS),openKeybindings:()=>ft(dialogView.KEYBINDINGS),previousView:ht,selectHoe:()=>Cw.handleFieldModeSelect(CLEANUP),selectScythe:()=>Cw.handleFieldModeSelect(HARVEST),selectWateringCan:()=>Cw.handleFieldModeSelect(WATER),selectShovel:()=>{De.toolLevels[toolType.SHOVEL]!==toolLevel.UNAVAILABLE&&Cw.handleFieldModeSelect(MINE)},toggleMenu:()=>Cw.handleMenuToggle()};return nullArray(9).forEach((I,L)=>{F[`numberKey${L+1}`]=()=>{let F=ct[L];typeof F==`string`&&Oe(I=>({...I,stageFocus:stageFocusType[F]}))}}),F},[bw,mt,ft,ht,Cw,De.farmhandShuffle.isMatchInProgress,De.stageFocus,De.toolLevels,ct,_w]);(0,import_react$10.useEffect)(()=>{if(Me.current)return;Me.current=!0,Object.defineProperty(import_window.default,"farmhand",{get:()=>dt.current,configurable:!0});let I=!0;return(async()=>{let L=await F.localforage?.getItem(`state`);if(I){if(L){let F=transformStateDataForImport({...z(),...L}),{isCombineEnabled:I,newDayNotifications:R}=F,De=getValidatedStageFocusFromHash(F);Oe(I=>({...I,...F,...De&&{stageFocus:De},newDayNotifications:[],hasBooted:!0})),R.forEach(({message:F,severity:I})=>{setTimeout(()=>Pe.current.showNotification(F,I),0)}),I&&Pe.current.forRange(harvestPlot,1/0,0,0)}else{await bw(!0),Oe(F=>({...F,historicalValueAdjustments:[]})),Pe.current.showNotification(LOAN_INCREASED(``,500),`info`);let F=getValidatedStageFocusFromHash(ke.current);Oe(I=>({...I,...F&&{stageFocus:F},hasBooted:!0}))}yt()}})(),()=>{I=!1}},[z,bw,F.localforage,yt]);let Ew=(0,import_react$10.useRef)(import_window.default.innerWidth);(0,import_react$10.useEffect)(()=>{let F=()=>{let{innerWidth:F}=import_window.default,I=F!==Ew.current;Ew.current=F,I&&Oe(F=>{let I=!doesMenuObstructStage();return F.isMenuOpen===I?F:{...F,isMenuOpen:I}})};return import_window.default.addEventListener(`resize`,F),()=>import_window.default.removeEventListener(`resize`,F)},[]),(0,import_react$10.useEffect)(()=>{if(!De.hasBooted||!je.current)return;let I=!0,{state:L,pendingNotifications:R,broadcastedPositionMessage:z,isFirstDay:ke}=je.current;return je.current=null,(async()=>{try{if(await F.localforage?.setItem(`state`,reduceByPersistedKeys({...L,...ke&&{historicalValueAdjustments:[]},newDayNotifications:R})),!I)return;if([...R].concat(ke?[]:[{message:PROGRESS_SAVED_MESSAGE,severity:`info`}]).forEach(({message:F,severity:I})=>setTimeout(()=>Pe.current.showNotification(F,I),0)),L.isCombineEnabled){if(L.stageFocus===stageFocusType.FIELD&&await sleep(1e3),!I)return;Pe.current.forRange(harvestPlot,1/0,0,0)}}catch(F){console.error(F),I&&Pe.current.showNotification(JSON.stringify(F),`error`)}finally{I&&(Oe(F=>({...F,isWaitingForDayToCompleteIncrementing:!1})),z&&Pe.current.prependPendingPeerMessage(z))}})(),()=>{I=!1}},[De.dayCount,De.hasBooted,F.localforage,Oe]),(0,import_react$10.useEffect)(()=>()=>{ke.current.heartbeatTimeoutId&&clearTimeout(ke.current.heartbeatTimeoutId),ke.current.peerRoom?.leave()},[]),(0,import_react$10.useEffect)(()=>{!De.hasBooted||!Fe||(updateAchievements(De,Fe)!==De&&Oe(F=>{let I=updateAchievements(F,Fe);return I===F?F:I}),De.stageFocus===stageFocusType.COW_PEN&&Fe.stageFocus!==stageFocusType.COW_PEN&&Oe(F=>({...F,selectedCowId:``})),De.stageFocus!==Fe.stageFocus&&De.isMenuOpen&&Oe(F=>{let I=!doesMenuObstructStage();return F.isMenuOpen===I?F:{...F,isMenuOpen:I}}),De.money<Fe.money&&Oe(F=>({...F,todaysLosses:moneyTotal(F.todaysLosses,De.money-Fe.money)})),xw(Fe,De),Fe.hasBooted&&Sw(Fe))},[De,Fe,xw,Sw]);let Dw=De.redirect;return{gameState:{...De,blockInput:ut,features:I??{},fieldToolInventory:Le,mulchInventory:Ge,isChatAvailable:st,levelEntitlements:rt,plantableCropInventory:ze,plantableTreeInventory:Be,playerInventory:Re,playerInventoryQuantities:getInventoryQuantities(De.inventory),shopInventory:it,viewList:ct,viewTitle:Ie},handlers:Cw,isInputBlocked:ut,keyMap:ww,keyHandlers:Tw,redirect:Dw,state:De,viewList:ct,focusPreviousView:ht,focusNextView:mt,isChatAvailable:st}},emptyObject=Object.freeze({}),defaultFeatures={},defaultLocalforage=import_localforage.default.createInstance({name:`farmhand`,description:`Persisted game data for Farmhand`}),defaultMatch={path:``,params:{}},Farmhand=({features:F=defaultFeatures,localforage:I=defaultLocalforage,match:L=defaultMatch,...R})=>{let{gameState:z,handlers:De,isInputBlocked:Oe,keyMap:ke,keyHandlers:Ae,redirect:je,state:Me,viewList:Ne,focusPreviousView:Pe,focusNextView:Fe,isChatAvailable:Ie}=useFarmhand({...R,features:F,localforage:I,match:L}),Le=Me.stageFocus===stageFocusType.FARMHAND_SHUFFLE&&z.farmhandShuffle.isMatchInProgress;return(0,import_jsx_runtime$2.jsx)(import_index_es.GlobalHotKeys,{allowChanges:!0,keyMap:Oe?emptyObject:ke,handlers:Oe?emptyObject:Ae,children:(0,import_jsx_runtime$2.jsxs)(ThemeProvider,{theme:mui_theme_default,children:[(0,import_jsx_runtime$2.jsx)(CssBaseline,{}),(0,import_jsx_runtime$2.jsxs)(SnackbarProvider,{anchorOrigin:{vertical:`top`,horizontal:`right`},classes:{containerRoot:`Farmhand notification-container`},content:snackbarProviderContentCallback,maxSnack:4,children:[je&&(0,import_jsx_runtime$2.jsx)(Redirect,{to:je}),(0,import_jsx_runtime$2.jsxs)(FarmhandContext.Provider,{value:{gameState:z,handlers:De},children:[(0,import_jsx_runtime$2.jsxs)(Div,{className:(0,import_classnames.default)(`Farmhand farmhand-root fill`,Me.isMenuOpen?`menu-open`:`menu-closed`,{"use-alternate-end-day-button-position":Me.useAlternateEndDayButtonPosition,"block-input":Oe,"has-booted":Me.hasBooted}),sx:F=>({...fillSx,display:`flex`,paddingTop:`3.5em`,position:`fixed`,touchAction:`manipulation`,opacity:+!!Me.hasBooted,transform:Me.hasBooted?`scale(1)`:`scale(0)`,transition:`opacity, transform 200ms`,...Oe&&{"& button, & input":{filter:`contrast(65%)`,pointerEvents:`none`}},[`@media (min-width: ${breakpoints.smallPhone}px) and (orientation: landscape)`]:{paddingTop:`3em`},[`@media (min-width: ${breakpoints.sm}px)`]:{paddingTop:`4em`},"& .sidebar-wrapper":{display:`flex`},"& .bottom-controls":{alignItems:`center`,bottom:`1em`,display:`flex`,flexFlow:`column`,justifyContent:`center`,left:`50%`,opacity:.85,position:`fixed`,transition:F.transitions.create(`left`,{duration:F.transitions.duration.enteringScreen,easing:F.transitions.easing.easeOut}),width:0,zIndex:Z_INDEX.END_DAY_BUTTON,[`@media (max-width: ${breakpoints.mediumPhone}px)`]:{bottom:`0.5em`},"& .MuiMobileStepper-root":{background:`none`},"& .fab-buttons":{display:`flex`,flexFlow:`row`,"& button":{margin:`0.5em`,position:`relative`,[`@media (max-width: ${breakpoints.mediumPhone}px)`]:{margin:`0.25em 0.5em`},"@media (max-width: 320px)":{margin:`0.25em 0.1em`}}},...Me.isMenuOpen&&{"@media (orientation: landscape)":{left:`calc(50vw + ${layout.sidebarWidth} / 2)`}}},"& .end-day":{position:`fixed`,top:`5em`,right:`1em`,[`@media (min-width: ${breakpoints.sm}px)`]:{right:`1.25em`,top:`5.5em`},...Me.useAlternateEndDayButtonPosition&&{right:`auto`,left:`1em`}},"& .menu-button":{transition:F.transitions.create(`transform`,{duration:F.transitions.duration.shorter}),transform:Me.isMenuOpen?`rotate(-90deg)`:`rotate(0deg)`}}),children:[(0,import_jsx_runtime$2.jsx)(UpdateNotifier,{}),(0,import_jsx_runtime$2.jsx)(Consumer$30,{}),(0,import_jsx_runtime$2.jsxs)(Drawer,{className:`sidebar-wrapper`,open:z.isMenuOpen,variant:`persistent`,role:`complementary`,PaperProps:{className:`sidebar`,sx:{backgroundImage:`url(${blue_stripe_bg_default})`,boxSizing:`border-box`,overflow:`auto`,padding:`1em 1em 0`,position:`relative`,width:layout.sidebarWidth,zIndex:20,[`@media (max-width: ${breakpoints.smallPhone}px)`]:{width:layout.narrowSidebarWidth},"& .button-array":{display:`flex`,flexWrap:`wrap`,margin:`0.5em 0`}}},children:[(0,import_jsx_runtime$2.jsx)(Consumer$14,{}),(0,import_jsx_runtime$2.jsx)(Consumer$24,{}),(0,import_jsx_runtime$2.jsx)(`div`,{className:`spacer`})]}),(0,import_jsx_runtime$2.jsx)(Consumer,{}),(0,import_jsx_runtime$2.jsxs)(`div`,{className:`bottom-controls`,children:[(0,import_jsx_runtime$2.jsx)(MobileStepper,{variant:`dots`,steps:Ne.length,position:`static`,activeStep:Ne.indexOf(Me.stageFocus),className:``,backButton:null,nextButton:null}),(0,import_jsx_runtime$2.jsxs)(`div`,{className:`fab-buttons buttons`,children:[(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":`Previous view`,color:`primary`,onClick:Pe,children:(0,import_jsx_runtime$2.jsx)(KeyboardArrowLeftIcon,{})}),(0,import_jsx_runtime$2.jsx)(Fab,{className:(0,import_classnames.default)(`menu-button`,{"is-open":Me.isMenuOpen}),color:`primary`,"aria-label":`Open drawer`,onClick:()=>De.handleMenuToggle(),children:(0,import_jsx_runtime$2.jsx)(MenuIcon,{})}),(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":`Next view`,color:`primary`,onClick:Fe,children:(0,import_jsx_runtime$2.jsx)(KeyboardArrowRightIcon,{})})]})]}),!Le&&(0,import_jsx_runtime$2.jsx)(Tooltip,{placement:`left`,title:(0,import_jsx_runtime$2.jsxs)(import_jsx_runtime$2.Fragment,{children:[(0,import_jsx_runtime$2.jsx)(`p`,{children:`End the day to save your progress and advance the game.`}),(0,import_jsx_runtime$2.jsx)(`p`,{children:`(shift + c)`})]}),children:(0,import_jsx_runtime$2.jsx)(Fab,{"aria-label":`End the day to save your progress and advance the game.`,className:`end-day`,color:`error`,onClick:De.handleClickEndDayButton,sx:{zIndex:Z_INDEX.END_DAY_BUTTON},children:(0,import_jsx_runtime$2.jsx)(HotelIcon,{})})})]}),Ie?(0,import_jsx_runtime$2.jsx)(ChatRoom,{}):null,(0,import_jsx_runtime$2.jsx)(NotificationSystem_default,{})]})]})]})})},FarmhandRoute=F=>(0,import_jsx_runtime$2.jsx)(Farmhand,{...F,features});(0,import_client.createRoot)(document.getElementById(`root`)).render((0,import_jsx_runtime$2.jsx)(HashRouter,{hashType:`noslash`,children:(0,import_jsx_runtime$2.jsx)(Route,{path:[`/online/:room`,`/online`,`/`],component:FarmhandRoute})}));
|
|
413
|
+
//# sourceMappingURL=index-B03HVYBS.js.map
|