var _={version:"v29.00",time:{daySeconds:60,farmShutdownGraceSeconds:10},cash:{starting:250},grid:{x:170,y:78,cols:20,rows:10,cell:46,expansion:{colsPerPurchase:10,rowsPerPurchase:10,costBase:850,costGrowthRate:.75,truncateUnit:50}},map:{blockedRatio:0,blockedExpansionIncrement:.0075,blockedRatioMax:.12},economy:{income:{mixer:5,truck:10,sausage:26},poopFine:10,fairiesTribute:{perDay:10,profitExemption:300,legalWorkExemptionBonus:250,profitRate:.12},incomeUpgradeRate:1.1,explosionDamageDivisor:30,maleTruckFinePerHalfDay:30,shredderBonus:{maxCards:30,payoutCoefficient:1.6,payoutExponent:1.25,baseHitChance:.28,hitChancePerUpgrade:.018,maxHitChance:.82,jackpotBaseChance:.01,jackpotChancePerUpgrade:.0025,jackpotMaxChance:.08,bigWinBaseChance:.07,bigWinChancePerUpgrade:.0015,bigWinMaxChance:.12,doubleChance:.2,jackpotMultiplier:10,bigWinMultiplier:4,doubleMultiplier:2},chemicalWeaponSubsidy:{poopPerBlock:70,yenPerBlock:1200}},production:{poopRate:.08,autoScannerCooldown:1.5,autoScannerUpgradeRate:.95,autoScannerCardUpgradeRate:.95,autoScannerMinCooldown:.5,poopRateCardBonus:.04,eggSpawnRanges:[[1.95,4.35],[1.55,3.45],[1.25,2.8],[1.05,2.35]]},conveyor:{baseSpeed:52,maxSpeed:300,bearingSpeedMultiplier:1.075,minimumItemSpacingPx:25},power:{recalcHz:10,maxAssignmentPasses:8,wires:{powerWire:{id:"powerWire",name:"Power Wire",shortName:"WIRE",price:10,lossV:.5},insulatedPowerWire:{id:"insulatedPowerWire",name:"Insulated Wire",shortName:"INS WIRE",price:22,lossV:.15}},exempt:["manualScanner","eggFarm","conveyor","boostConveyor","powerWire","insulatedPowerWire","footbridge","starterGenerator","biomassGenerator","coalGenerator"],machines:{mixer:{minVoltage:10,drawV:4,relayDropV:4,powerPriority:100},trash:{minVoltage:8,drawV:3,relayDropV:3,powerPriority:100},truck:{minVoltage:6,drawV:2,relayDropV:2,powerPriority:100},autoScanner:{minVoltage:8,drawV:2,relayDropV:2,powerPriority:50},sausageMaker:{minVoltage:12,drawV:5,relayDropV:5,powerPriority:50},maintenanceRoom:{minVoltage:6,drawV:1,relayDropV:1,powerPriority:50},inboundTruck:{minVoltage:5,drawV:1,relayDropV:1,powerPriority:50}},generators:{starterGenerator:{outputV:25},biomassGenerator:{baseOutputV:0,pulseVoltage:5,pulseSeconds:2},coalGenerator:{baseOutputV:0,pulseVoltage:15,pulseSeconds:3}}},imports:{combinedLimitPerTruck:80,prices:{coal:2,zundaMochi:4},jitterRatio:.15},farmQuality:{overflowCoefficient:.45,overflowExponent:.85,minMultiplier:1,maxMultiplier:2.5,zundaSeconds:8,zundaMaxSeconds:30,zundaIntervalMultiplier:.55,safeMinIntervalSeconds:.25},effects:{explosionHorizontalVelocityMultiplier:.82},cards:{definitions:[{id:"upgradeEgg",title:"EGG Improvement",rarity:"common",type:"equipmentUpgrade",target:"eggFarm",description:"Choose one EGG FARM on the map and raise it by 1 level.",tags:["EGG","ACTIVE"]},{id:"upgradeAutoScanner",title:"AUTO SCANNER Improvement",rarity:"common",type:"equipmentUpgrade",target:"autoScanner",description:"Choose one AUTO SCANNER on the map and raise it by 1 level.",tags:["SCANNER","ACTIVE"]},{id:"autoScannerTuning",title:"AUTO SCANNER Tuning",rarity:"common",type:"instant",description:"All AUTO SCANNER cooldowns use default cooldown x0.95 per copy.",requiresFacility:"autoScanner",tags:["SCANNER","PASSIVE"]},{id:"upgradeMixer",title:"MIXER Improvement",rarity:"common",type:"equipmentUpgrade",target:"mixer",description:"Choose one MIXER. Each level improves meat quality and raises sausage sale value by 10%.",tags:["ECONOMY","ACTIVE"]},{id:"upgradeTruck",title:"TRUCK Improvement",rarity:"common",type:"equipmentUpgrade",target:"truck",description:"Choose TRUCK on the map and raise it by 1 level.",tags:["ECONOMY","ACTIVE"]},{id:"upgradeSausageMaker",title:"SAUSAGE MACHINE Improvement",rarity:"common",type:"equipmentUpgrade",target:"sausageMaker",description:"Choose one SAUSAGE MACHINE. Each level raises sausage sale value by 10%.",tags:["ECONOMY","SAUSAGE","ACTIVE"]},{id:"upgradeTrash",title:"SHREDDER Improvement",rarity:"common",type:"equipmentUpgrade",target:"trash",description:"Adds a nonlinear scrap-lottery upgrade. More copies raise both payout and win chance; max 30.",tags:["POOP","ACTIVE"]},{id:"crowdedFarming",title:"Crowded Farming",rarity:"common",type:"instant",description:"EGG production interval -5%. Equipment deterioration +4%. Max 10 cards.",requiresFacility:"eggFarm",tags:["EGG","RISK","PASSIVE"]},{id:"hatchingFeed",title:"Hatching Feed",rarity:"common",type:"instant",description:"EGG production interval -4%. Poop rate +3%. No card limit.",requiresFacility:"eggFarm",tags:["EGG","POOP","PASSIVE"]},{id:"poopRateBooster",title:"Poop Culture",rarity:"common",type:"instant",description:"Base poop rate +4 percentage points. No card limit.",tags:["POOP","PASSIVE"]},{id:"safetyCover",title:"Safety Cover",rarity:"common",type:"instant",description:"Explosion damage -5%. No card limit.",tags:["RISK","PASSIVE"]},{id:"preventiveMaintenance",title:"Preventive Maintenance Manual",rarity:"common",type:"instant",description:"All equipment deterioration speed -5%. No card limit.",requiresAnyFacility:["conveyor","eggFarm","autoScanner","manualScanner","mixer","trash","sausageMaker"],tags:["MAINTENANCE","PASSIVE"]},{id:"dudFilter",title:"DUD Filter",rarity:"common",type:"instant",description:"DUD chance -5 percentage points. Stacks until DUD chance reaches 0%.",tags:["CARD","PASSIVE"]},{id:"durabilityCoating",title:"Durability Coating",rarity:"common",type:"instant",description:"All equipment maximum durability +3%. No card limit.",requiresAnyFacility:["conveyor","eggFarm","autoScanner","manualScanner","mixer","trash","sausageMaker"],tags:["MAINTENANCE","PASSIVE"]},{id:"bearing",title:"High-Quality Bearing",rarity:"common",type:"instant",description:"Conveyor speed +7.5%.",requiresFacility:"conveyor",tags:["CONVEYOR","PASSIVE"]},{id:"sparePartsBin",title:"SPARE PARTS BIN",rarity:"common",type:"instant",description:"Restores 2% durability to every machine. A box of almost-compatible parts.",requiresAnyFacility:["conveyor","eggFarm","autoScanner","manualScanner","mixer","trash","sausageMaker"],tags:["MAINTENANCE","ACTIVE"]},{id:"dudRefund",title:"DUD REFUND",rarity:"common",type:"instant",description:"DUDs now come with paperwork. Gain JPY 50 per copy when you pick a DUD.",tags:["CARD","ECONOMY","PASSIVE"]},{id:"freeReroll",title:"FREE REROLL",rarity:"common",type:"instant",description:"The first bad ideas are free.",tags:["CARD","PASSIVE"]},{id:"composter",title:"COMPOSTER",rarity:"common",type:"instant",description:"Turns shredder waste into suspicious fertilizer. Gain JPY 3 per copy when SHREDDER processes poop.",requiresFacility:"trash",tags:["POOP","ECONOMY","PASSIVE"]},{id:"scannerQueueSpacing",title:"Scanner Queue Spacing",rarity:"common",type:"instant",description:"Manual and Auto Scanner queue spacing -15%. No card limit.",requiresAnyFacility:["manualScanner","autoScanner"],tags:["SCANNER","PASSIVE"]},{id:"extraEggOutlet",title:"Extra Egg Outlet",rarity:"rare",type:"equipmentUpgrade",target:"eggOutlet",description:"Choose one EGG FARM and add +1 output port to that EGG. Max +3 per EGG.",tags:["EGG","RARE","ACTIVE"]},{id:"recyclingSubsidy",title:"Recycling Subsidy",rarity:"rare",type:"instant",description:"SELL refund rate +10 points. Max 3 cards; normal SELL can reach 80%.",tags:["ECONOMY","RARE","PASSIVE"]},{id:"dynamite",title:"Dynamite",rarity:"rare",type:"cellAction",target:"blockedCell",description:"Choose and remove up to 3 unbuildable cells.",tags:["RISK","RARE","ONE-SHOT"]},{id:"usedMachine",title:"Used Machines",rarity:"rare",type:"instant",description:"Future equipment costs half. New purchases have no refund and 60% durability. New Machines cancels it.",tags:["ECONOMY","RISK","RARE"]},{id:"newMachine",title:"New Machines",rarity:"common",type:"instant",description:"Cancel Used Machines and restore normal prices, refunds, and durability.",tags:["ECONOMY","ONE-SHOT"]},{id:"flattery",title:"Flattery",rarity:"rare",type:"instant",description:"Next Fairies tribute -50%.",tags:["ECONOMY","RARE","ONE-SHOT"]},{id:"extraCards",title:"Extra Cards",rarity:"rare",type:"instant",description:"Draw 2 cards now and choose both.",tags:["RARE","ACTIVE"]},{id:"legalWork",title:"Legal Work",rarity:"rare",type:"instant",description:"Fairies tribute profit exemption +JPY 250.",tags:["ECONOMY","RARE","PASSIVE"]},{id:"chemicalWeaponSubsidy",title:"Chemical Weapons Subsidy",rarity:"ultraRare",type:"instant",description:"Each day, gain JPY 1200 per 70 poop shipped by truck. No card limit.",tags:["POOP","ULTRA RARE","PASSIVE"]},{id:"laborExploitation",title:"Motivational Exploitation",rarity:"ultraRare",type:"instant",description:"Repair room work time -30%. The repairman smiles with bloodshot eyes. One time only.",tags:["MAINTENANCE","ULTRA RARE","PASSIVE"]},{id:"rescueLoan",title:"Emergency Loan",rarity:"ultraRare",type:"instant",description:"If cash is below JPY 0 at day-end settlement, gain JPY 500. Consumed on use.",tags:["ECONOMY","ULTRA RARE","ONE-SHOT"]}],defaultEffects:{bearing:0,legalWork:0,fairiesFlatteryNext:0,autoScannerTuning:0,poopRateBooster:0,crowdedFarming:0,hatchingFeed:0,safetyCover:0,recyclingSubsidy:0,chemicalWeaponSubsidy:0,preventiveMaintenance:0,dudFilter:0,durabilityCoating:0,sparePartsBin:0,dudRefund:0,freeReroll:0,composter:0,scannerQueueSpacing:0,laborExploitation:0,usedMachineActive:!1,rescueLoanCharges:0},commonWeight:8,rareWeight:2,ultraRareWeight:.45,baseDraftSize:3,maxDudsPerDraft:2,dudChancePerCard:.3,dudChanceReductionPerFilter:.05,extraCardsAddedPicks:2,rerollCost:{dayDivisor:2,multiplier:100}},events:{eventChance:.1,firstTurn:8},maintenance:{fullPerformanceUntilWear:.5,minimumPerformance:.5,durability:{conveyor:1300,eggFarm:475,autoScanner:850,mixer:775,trash:950,sausageMaker:825,starterGenerator:1e3,biomassGenerator:900,coalGenerator:900,inboundTruck:850},processingDelayMaxSeconds:{mixer:1.2,trash:1,sausageMaker:.9},repairman:{secondsPerOnePercent:.5,walkSpeed:90}},facilities:{conveyor:{id:"conveyor",type:"conveyor",name:"Conveyor",shortName:"Belt",price:30,buildable:!0,upgradeable:!1},boostConveyor:{id:"boostConveyor",type:"conveyor",name:"Boost Conveyor",shortName:"BOOST BELT",price:75,buildable:!0,upgradeable:!1,speedMultiplier:2},powerWire:{id:"powerWire",type:"powerWire",name:"Power Wire",shortName:"WIRE",price:10,buildable:!0,upgradeable:!1},insulatedPowerWire:{id:"insulatedPowerWire",type:"powerWire",name:"Insulated Power Wire",shortName:"INS WIRE",price:22,buildable:!0,upgradeable:!1},footbridge:{id:"footbridge",type:"footbridge",name:"Footbridge",shortName:"BRIDGE",price:90,buildable:!0,upgradeable:!1,footprint:{cols:1,rows:3}},eggFarm:{id:"eggFarm",type:"eggFarm",name:"Egg Farm",shortName:"EGG",price:250,buildable:!0,upgradeable:!0,maxLevel:4},manualScanner:{id:"manualScanner",type:"scanner",kind:"manual",name:"Manual Scanner",shortName:"Manual Scanner",price:260,buildable:!0,upgradeable:!1},autoScanner:{id:"autoScanner",type:"scanner",kind:"auto",name:"Auto Scanner",shortName:"Auto Scanner",price:180,buildable:!0,upgradeable:!1},mixer:{id:"mixer",type:"facility",name:"Mixer",shortName:"MIXER",price:450,buildable:!0,upgradeable:!0,incomeKey:"mixer",body:{w:164,h:126}},trash:{id:"trash",type:"facility",name:"Waste Shredder",shortName:"SHREDDER",price:240,buildable:!0,upgradeable:!0,body:{w:180,h:100}},truck:{id:"truck",type:"facility",name:"Shipping Truck",shortName:"SHIP TRUCK",price:450,buildable:!0,upgradeable:!0,incomeKey:"truck",body:{w:176,h:138}},sausageMaker:{id:"sausageMaker",type:"facility",name:"Sausage Machine",shortName:"SAUSAGE",price:380,buildable:!0,upgradeable:!0,incomeKey:"sausage",footprint:{cols:3,rows:3},body:{w:138,h:138},outputProduct:"sausage"},starterGenerator:{id:"starterGenerator",type:"facility",name:"Starter Generator",shortName:"STARTER",price:0,buildable:!1,upgradeable:!1,footprint:{cols:2,rows:2},body:{w:92,h:92}},biomassGenerator:{id:"biomassGenerator",type:"facility",name:"Biomass Generator",shortName:"BIOMASS",price:520,buildable:!0,upgradeable:!1,footprint:{cols:3,rows:3},body:{w:138,h:138}},coalGenerator:{id:"coalGenerator",type:"facility",name:"Coal Generator",shortName:"COAL GEN",price:680,buildable:!0,upgradeable:!1,footprint:{cols:2,rows:3},body:{w:92,h:138}},inboundTruck:{id:"inboundTruck",type:"facility",name:"Inbound Truck",shortName:"INBOUND",price:350,buildable:!0,upgradeable:!1,body:{w:176,h:120}},maintenanceRoom:{id:"maintenanceRoom",type:"maintenanceRoom",name:"Maintenance Room",shortName:"REPAIR ROOM",price:220,buildable:!0,upgradeable:!1,footprint:{cols:2,rows:2}}}};var Ai=_.version,yt=_.time.daySeconds,Un=_.cash.starting,Ie=_.economy,$i=_.time.farmShutdownGraceSeconds,bo=_.production.autoScannerCooldown,Fi=_.production.autoScannerUpgradeRate,wr=_.production.autoScannerCardUpgradeRate||_.production.autoScannerUpgradeRate,mr=_.production.autoScannerMinCooldown,Oi=_.events.eventChance,Vn=_.events.firstTurn,vr=_.production.poopRate,Sr=_.production.poopRateCardBonus||0,wo=_.conveyor.baseSpeed,yn=_.conveyor.maxSpeed,mo=_.conveyor.bearingSpeedMultiplier,qe=_.cards,Bi=_.cards.definitions,kr=_.cards.defaultEffects,Gt=_.production.eggSpawnRanges,p=_.grid,Te=_.facilities,Mr=["conveyor","boostConveyor","powerWire","insulatedPowerWire","footbridge","eggFarm","autoScanner","manualScanner","mixer","trash","truck","inboundTruck","sausageMaker","biomassGenerator","coalGenerator","maintenanceRoom"],vo=["mixer","trash","truck","inboundTruck"],So=["sausageMaker","starterGenerator","biomassGenerator","coalGenerator"],Cr=[...vo,...So],Di=["mixer","trash","truck"],Li=["mixer","truck","sausageMaker"],_t=Object.fromEntries(Object.entries(Te).map(([e,t])=>[e,t.price])),fe=[{name:"right",dc:1,dr:0,angle:0,opposite:"left"},{name:"left",dc:-1,dr:0,angle:Math.PI,opposite:"right"},{name:"down",dc:0,dr:1,angle:Math.PI/2,opposite:"up"},{name:"up",dc:0,dr:-1,angle:-Math.PI/2,opposite:"down"}],w={bg:"#111318",ink:"#090a0d",muted:"#8f9bab",green:"#7bd84f",greenSoft:"#273c24",mixerBlue:"#4aa3ff",truckPink:"#ffb33e",wasteGreen:"#88d35a",meatRed:"#d96b72",sausageOrange:"#d78b3f",danger:"#e34a36",warn:"#ffb827",white:"#e6edf2",poop:"#7b4a23",male:"#4aa3ff",female:"#ff6fae"},_e={ambient:0,important:1,critical:2};function R(e){let t=Number(e)||0;return`${t<0?"-":""}\uFFE5${Math.ceil(Math.abs(t)).toLocaleString("ja-JP")}`}function E(e,t){return`${e},${t}`}function X(e){let[t,n]=String(e).split(",").map(Number);return{col:t,row:n}}function Kn(e,t,n){return Math.max(t,Math.min(n,e))}function ne(e,t){return e+Math.random()*(t-e)}function Re(e,t){return e>=0&&e
=0&&tMath.round(Kn(r,0,255)).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`}function qn(e,t,n){let o=Ni(e),r=Ni(t);return Tl(gr(o.r,r.r,n),gr(o.g,r.g,n),gr(o.b,r.b,n))}var pe={appTitle:"Chick Sorter",versionTitle:`Chick Sorter ${Ai}`,currency:"\uFFE5",phases:{title:"Title",build:"Build",running:"Sorting",clearing:"Clearing",loanDecision:"Emergency Loan",gameover:"Game Over"},actions:{startGame:"Start Game",nextDay:"Next Day",buildPhase:"Build Phase",restart:"Restart",close:"Close",remove:"Remove",refund:"Refund",autoMenu:"Auto Menu"},status:{build:e=>`BUILD: ${(e==="erase"?"SELL":e||"SELECT").toUpperCase()} | Right-drag pan | Hover equipment for info`,sorting:"Sorting: use scanner keys. Build after clearing the day.",allPortsConnected:"Start condition met: one EGG route reaches an exit.",equipmentPanelEmpty:"Hover equipment in Build phase."},routeLabels:{mixer:"MIXER",truck:"TRUCK",inboundTruck:"INBOUND",trash:"WASTE",sausageMaker:"SAUSAGE",biomassGenerator:"BIOMASS",coalGenerator:"COAL GEN",scanner:"NEXT","scanner-role-1":"NEXT",input:"IN"},fail:{outOfGrid:"Out of grid",cellOccupied:"Cell occupied",notEnoughCash:"Not enough cash",facilityExists:"Facility already exists",facilityOverlap:"Facility overlap",nothingToErase:"Nothing to sell",noUpgrade:"No upgrade available"}};function ht(e){return Te[e]?.name||String(e||"").replace(/^[a-z]/,t=>t.toUpperCase())}function El(e){let t=Te[e];return t?e==="conveyor"||e==="boostConveyor"?`${R(t.price)} / tile`:e==="autoScanner"?`${R(t.price)} / ${bo.toFixed(1)}s cooldown`:e==="trash"?R(t.price):R(t.price):""}function Pl(e){return{conveyor:"A narrow green belt. Routes decide whether chicks live, ship, or become invoices.",boostConveyor:"Moves chicks twice as fast. Wears down like a normal belt.",eggFarm:"A tiny gatehouse producing questionable eggs on schedule.",autoScanner:"Processes about 40 items per day at Lv1, roughly 2.1 Lv1 farms.",manualScanner:"A manual checkpoint. The operator is the algorithm.",mixer:"Makes meat when OUT is clear; otherwise falls back to direct sale.",trash:"A polite shredder for poop and other regrets.",truck:"Shipping Truck. Ships target chicks and all sausages.",powerWire:"Overlay wire. Loses 0.5V per tile.",insulatedPowerWire:"Overlay wire. Loses 0.15V per tile.",footbridge:"Lets repair workers cross conveyor cells.",inboundTruck:"Imports coal and zunda mochi during the day.",biomassGenerator:"Fuel generator. Chicks and poop add timed voltage.",coalGenerator:"Fuel generator. Coal adds timed voltage.",sausageMaker:"A 3\xD73 grid machine. Left inlet takes 2 meat; right outlet emits 1 sausage.",maintenanceRoom:"2\xD72 repair bay. Each room dispatches one repairman during the day."}[e]||""}function Rl(e){return{conveyor:"./assets/dark_factory/facilities/conveyor/conveyor_straight_h_16.png",boostConveyor:"./assets/dark_factory/facilities/conveyor/boost_conveyor_straight_h_16.png",eggFarm:"./assets/dark_factory/facilities/machines/egg_farm_16.png?v=dark_factory",autoScanner:"./assets/dark_factory/facilities/machines/auto_scanner_32x48.png",manualScanner:"./assets/dark_factory/facilities/machines/manual_scanner_32x48.png",mixer:"./assets/dark_factory/facilities/machines/mixer_32.png",trash:"./assets/dark_factory/facilities/machines/shredder_32.png",truck:"./assets/dark_factory/facilities/vehicles/truck_32.png",sausageMaker:"./assets/dark_factory/facilities/machines/mixer_32.png",maintenanceRoom:"./assets/dark_factory/facilities/utility/maintenance_room_32.png"}[e]||""}function _i(e){let t=Pl(e),n=Rl(e);return`${n?``:""}${ht(e)}${El(e)}${t?`${t}`:""}`}function Wi(e){return pe.routeLabels[e]||String(e).toUpperCase()}function Ui(e){let t=2166136261;for(let n=0;n>>0}function Vi(e){let t=e>>>0;return()=>{t+=1831565813;let n=Math.imul(t^t>>>15,1|t);return n^=n+Math.imul(n^n>>>7,61|n),((n^n>>>14)>>>0)/4294967296}}function Ki(e,{base:t=0,increment:n=.0075,max:o=.12}={}){let r=Math.max(0,Math.floor(Number(e)||0));return Number(Math.min(o,t+r*n).toFixed(6))}function Mo(){return`RUN-${Date.now().toString(36)}-${Math.floor(Math.random()*1e6).toString(36)}`.toUpperCase()}function qi({seed:e,targetRatio:t=.2,reserved:n=[]}={}){let o=Vi(Ui(e||Mo())),r=new Set(n.map(c=>typeof c=="string"?c:E(c.col,c.row))),i=[];for(let c=0;c0;c-=1){let b=Math.floor(o()*(c+1));[i[c],i[b]]=[i[b],i[c]]}let a=Math.round(p.cols*p.rows*t+1e-9);return new Set(i.slice(0,Math.min(a,i.length)).map(c=>c.k))}function zi({seed:e,colStart:t=0,colEnd:n=p.cols,rowStart:o=0,rowEnd:r=p.rows,targetRatio:i=.2,reserved:a=[]}={}){let c=Vi(Ui(e||Mo())),b=new Set(a.map(z=>typeof z=="string"?z:E(z.col,z.row))),M=[],C=Math.max(0,Math.floor(t)),$=Math.max(C,Math.floor(n)),W=Math.max(0,Math.floor(o)),K=Math.max(W,Math.floor(r));for(let z=W;z0;z-=1){let Q=Math.floor(c()*(z+1));[M[z],M[Q]]=[M[Q],M[z]]}let G=Math.round(($-C)*(K-W)*i+1e-9);return new Set(M.slice(0,Math.min(G,M.length)).map(z=>z.k))}var hn=10,Hi=2,Yi=1;function bn(e,t){return`${e},${t}`}function Il(e){let[t,n]=String(e).split(",").map(Number);return{chunkX:t,chunkY:n}}function Co(e){let t=_.grid.expansion||{},n=Math.max(1,(e.gridExpansionPurchases||0)+1),o=Math.max(0,Number(t.costBase)||850),r=Math.max(0,Number(t.costGrowthRate)||.75),i=o*(1+r*(n-1)),a=Math.max(1,t.truncateUnit||50);return Math.floor(i/a)*a}function Qi(e){e.ownedCells=new Set,e.ownedChunks=new Set,e.gridChunkOriginX=0,e.gridChunkOriginY=0,e.gridExpansionPurchases=0,e.gridExpansionPurchasesByDirection={left:0,right:0,up:0,down:0};for(let t=0;t=0&&t=0&&n{let a=(o[r.direction]??9)-(o[i.direction]??9);return a||(r.chunkY!==i.chunkY?r.chunkY-i.chunkY:r.chunkX-i.chunkX)})}function Ji(e,t="right"){let n=jt(e);return n.find(o=>o.direction===t)||n[0]||null}function Et(e){return{x:p.x+e.colStart*p.cell,y:p.y+e.rowStart*p.cell,w:e.cols*p.cell,h:e.rows*p.cell}}function Tr(e){let t=Et(e);return{x:t.x+t.w/2-116,y:t.y+t.h/2-36,w:232,h:72,cx:t.x+t.w/2,cy:t.y+t.h/2}}function Zi(e,t){let n=Tr(e);return t.x>=n.x&&t.x<=n.x+n.w&&t.y>=n.y&&t.y<=n.y+n.h}function es(e){let t=[];for(let n=e.rowStart;nRe(t.col,t.row))}function Nl(e){return[{col:e.col,row:e.row-1},{col:e.col+1,row:e.row-1},{col:e.col,row:e.row},{col:e.col+1,row:e.row}].filter(t=>Re(t.col,t.row))}function Gl(e){return[{col:e.col,row:e.row+1},{col:e.col-1,row:e.row},{col:e.col+1,row:e.row},{col:e.col,row:e.row-1}].filter(t=>Re(t.col,t.row))}function ss(e){let t=new Set([...e.conveyorTiles]),n=o=>{o&&Re(o.col,o.row)&&t.add(E(o.col,o.row))};for(let o of e.scanners){for(let r of Nl(o))n(r);for(let r of Ll(o))n(r)}for(let o of e.eggFarms){n(o);for(let r of Gl(o))n(r)}for(let o of Object.values(e.facilities))n(o.entry);for(let o of Object.values(e.facilities))if(o.gridPlaced)for(let r=0;r<(o.hCells||1);r+=1)for(let i=0;i<(o.wCells||1);i+=1)n({col:o.col+i,row:o.row+r});return t}function _l(e,t,n,o="powerWire",r=!1){Re(t,n)&&e.powerWires.set(E(t,n),{kind:o,price:r?0:_.power.wires[o]?.price||0,builtSession:r?null:e.buildSession})}function Wl(e){let t=Te.starterGenerator,n={type:"facility",id:"starterGenerator",baseId:"starterGenerator",name:t.name,col:6,row:6,wCells:t.footprint.cols,hCells:t.footprint.rows,gridPlaced:!0,level:1,price:0,builtSession:null,unsellable:!0};n.x=p.x+n.col*p.cell,n.y=p.y+n.row*p.cell,n.w=n.wCells*p.cell,n.h=n.hCells*p.cell,e.facilities.starterGenerator=n}function os(e){e.powerWires=new Map;let t=[[5,6],[4,6],[3,6],[2,6],[1,6],[0,6],[0,5],[0,4],[8,7],[8,8],[9,8],[10,8],[11,8],[12,8],[12,9],[13,8],[14,8],[15,8],[16,8],[17,8],[18,8],[18,9]];for(let[n,o]of t)_l(e,n,o,"powerWire",!0)}function Ul(e){let t=new Set;for(let n of Object.values(e.facilities||{}))if(n.gridPlaced)for(let o=0;o<(n.hCells||1);o+=1)for(let r=0;r<(n.wCells||1);r+=1)t.add(E(n.col+r,n.row+o));for(let n of e.powerWires.keys())if(e.blockedCells.has(n)||t.has(n))throw new Error(`Invalid starter power wire at ${n}`);for(let n of["starterGenerator","mixer","trash","truck"])if(!e.facilities[n])throw new Error(`Missing starter power facility: ${n}`)}function rs(e){let t=Fl.map(([n,o])=>({col:n,row:o}));for(let{col:n,row:o}of t)is(e,n,o);for(let n=0;n({...n,keys:n.keys?{left:{...n.keys.left},right:{...n.keys.right}}:null,queue:[]})),e.eggFarms=Bl.map(n=>{let o=Jt(n);return{...n,nextSpawn:o,lastInterval:o}}),os(e);let t=ss(e);for(let n of e.powerWires.keys())t.add(n);e.blockedCells=qi({seed:e.runSeed,targetRatio:_.map.blockedRatio,reserved:[...t]}),Vl(e),rs(e),os(e),Ul(e),e.power={dirty:!0,elapsed:0,routes:new Map,assignments:new Map,sources:new Map,underVoltage:new Set},e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.routingVersion=(e.routingVersion||0)+1,e.factoryGraph=null,e.factoryGraphCommittedVersion=-1}function Pt(e){return e?[{col:e.col,row:e.row-1},{col:e.col+1,row:e.row-1},{col:e.col,row:e.row},{col:e.col+1,row:e.row}]:[]}function ge(e){let t=B(e.col,e.row);return{x:t.x+p.cell/2,y:t.y-p.cell/2}}function it(e,t,n){return e.eggFarms.find(o=>o.col===t&&o.row===n)||null}function st(e,t,n){return e.scanners.find(o=>Pt(o).some(r=>r.col===t&&r.row===n))||null}function Zt(e,t){return e.scanners.find(n=>n.id===t)||null}function $r(e,t){return e.scanners.find(n=>n.kind==="manual"&&n.slot===t)||null}function mn(e){return e?.baseId||e?.id||""}function Fr(e,t){return Object.entries(e.facilities||{}).filter(([,n])=>mn(n)===t)}function Ro(e,t){return!!(t&&Re(t.col,t.row)&&(!e?.ownedCells?.size||e.ownedCells.has(E(t.col,t.row))))}function bt(e,t,n){return Object.values(e?.facilities||{}).find(o=>o?.gridPlaced?t>=o.col&&t=o.row&&n({col:e.col+t.dc,row:e.row+t.dr})).filter(t=>Re(t.col,t.row)):[]}function cs(e,t,n=[],o=[]){if(!t||!Re(t.col,t.row))return[];let r=[],i=a=>{!a||!Re(a.col,a.row)||!e.conveyorTiles.has(E(a.col,a.row))||n.some(c=>c&&ko(a,c))||r.some(c=>ko(c,a))||r.push({...a,viaTolerance:!ko(a,t)})};i(t);for(let a of o)i(a);for(let a of ls(t))i(a);return r}function Ar(e,t,n=[],o=[]){let r=cs(e,t,n,o),i=r.filter(a=>!a.viaTolerance);return i.length?i:r}function Kl(e,t){let n=We(t,"inputA");return!n||!Re(n.col,n.row)?[]:Ar(e,n,Pt(t))}function ql(e,t,n){let o=We(t,n);return cs(e,o,Pt(t))}function zl(e,t){let n=e.facilities[t]||Fr(e,t)[0]?.[1];if(!n)return null;let o=wt(e,n);if(o)return B(o.col,o.row);let r=mn(n)||t;return r==="mixer"?{x:n.x+n.w,y:n.y+n.h*.52}:r==="truck"?{x:n.x,y:n.y+n.h*.52}:r==="trash"?{x:n.x+n.w/2,y:n.y+8}:{x:n.x+n.w/2,y:n.y+n.h/2}}function us(e,t,n){return n==="inputA"?Kl(e,t).length>0:ql(e,t,n).length>0}function Ee(e){e.branchCounters?.clear?.(),e.routeCache=null,e.routingVersion=(e.routingVersion||0)+1,e.factoryGraph=null,e.factoryGraphCommittedVersion=-1,e.frameCache&&(e.frameCache.routingVersion=-1,e.frameCache.congestionFrame=-1,e.frameCache.draw={})}function ze(e,t){return E(e,t)}function wn(e){return X(e)}function Hl(e,t){let n=e.conveyorMeta?.get?.(t)||{},o=[];return Array.isArray(n.outDirs)&&o.push(...n.outDirs),n.dir&&o.push(n.dir),[...new Set(o)].filter(r=>fe.some(i=>i.name===r))}function as(e,t,n){let o=fe.find(a=>a.name===n);if(!o)return!1;let r=e.conveyorMeta?.get?.(ze(t.col+o.dc,t.row+o.dr));return r?[...new Set([...Array.isArray(r.outDirs)?r.outDirs:[],r.dir].filter(Boolean))].includes(o.opposite):!1}function Yl(e,t){let n=wn(t),o=e.conveyorMeta?.get?.(t)||{},r=fe.filter(C=>e.conveyorTiles.has(ze(n.col+C.dc,n.row+C.dr))).map(C=>C.name),i=Hl(e,t).filter(C=>r.includes(C)),a=i.length?i:r;if(r.length===1&&(!i.length||i.includes(r[0]))&&as(e,n,r[0]))return[];if(r.length<3)return a;let c=new Set(r.filter(C=>as(e,n,C))),b=r.filter(C=>!c.has(C)),M=c.size?b:[...new Set(a)];return!M.length&&!c.size&&(M=r),o.branchMode&&o.branchMode!=="random"&&M.length>=2&&M.includes(o.branchMode)?[o.branchMode]:M}function Ql(e){return{version:e.routingVersion||0,cells:new Set,adjacency:new Map,components:new Map,cellToComponent:new Map,scannerInputs:new Map,scannerPorts:new Map,facilityPorts:new Map,farmOutputs:new Map,pathCache:new Map,metrics:{conveyorCells:0,edges:0,components:0,deadEnds:0,crosses:0,scannerPorts:0,connectedScannerPorts:0,facilityPorts:0,connectedFacilityPorts:0,farmOutputs:0},issues:[]}}function Xl(e){let t=Ql(e);for(let o of e.conveyorTiles)t.cells.add(o),t.adjacency.set(o,[]);for(let o of t.cells){let r=wn(o),i=Yl(e,o),a=fe.filter(c=>i.includes(c.name));for(let c of a){let b=ze(r.col+c.dc,r.row+c.dr);t.cells.has(b)&&t.adjacency.get(o).push({key:b,dir:c.name})}}let n=0;for(let[o,r]of t.adjacency.entries()){n+=r.length;let i=new Set(r.map(a=>a.dir));r.length===1&&(t.metrics.deadEnds+=1),r.length===4&&i.has("left")&&i.has("right")&&i.has("up")&&i.has("down")&&(t.metrics.crosses+=1)}return t.metrics.conveyorCells=t.cells.size,t.metrics.edges=Math.floor(n/2),jl(t),Jl(e,t),t.issues=uc(e,t,{includeRoutes:!1}),t}function jl(e){let t=1;for(let n of e.cells){if(e.cellToComponent.has(n))continue;let o=t++,r=[n],i=[];for(e.cellToComponent.set(n,o);r.length;){let a=r.shift();i.push(a);for(let c of e.adjacency.get(a)||[])e.cellToComponent.has(c.key)||(e.cellToComponent.set(c.key,o),r.push(c.key))}e.components.set(o,{id:o,cells:i,capacity:Math.max(1,i.length),count:0,ratio:0})}e.metrics.components=e.components.size}function Jl(e,t){for(let n of e.scanners){let o={};for(let r of["inputA","left","right"]){let i=We(n,r),a=Ar(e,i,Pt(n)).filter(M=>t.cells.has(ze(M.col,M.row))),c=a.map(M=>ze(M.col,M.row)),b=c.length>0;if(o[r]={type:r,cell:i,cells:a,keys:c,key:c[0]||null,connected:b},t.metrics.scannerPorts+=1,b&&(t.metrics.connectedScannerPorts+=1),r==="inputA")for(let M of c)t.scannerInputs.set(M,n.id)}t.scannerPorts.set(n.id,o)}for(let[n,o]of Object.entries(e.facilities)){let r=wt(e,o);if(!r)continue;let i=Ar(e,r).filter(b=>t.cells.has(ze(b.col,b.row))),a=i.map(b=>ze(b.col,b.row)),c=a.length>0;t.facilityPorts.set(n,{id:n,cell:{...r},cells:i,keys:a,key:a[0]||null,connected:c}),t.metrics.facilityPorts+=1,c&&(t.metrics.connectedFacilityPorts+=1)}for(let n of e.eggFarms){let o=ls({col:n.col,row:n.row}).map(r=>ze(r.col,r.row)).filter(r=>t.cells.has(r));t.farmOutputs.set(n.id,o),t.metrics.farmOutputs+=o.length}}function at(e){let t=e.routingVersion||0;return(!e.factoryGraph||e.factoryGraph.version!==t)&&(e.factoryGraph=Xl(e)),e.factoryGraph}function ds(e){let t=at(e);return e.factoryGraphCommittedVersion=t.version,e.factoryGraphSnapshot=Zl(t),t}function Zl(e){return e?{version:e.version,conveyorCells:e.metrics.conveyorCells,edges:e.metrics.edges,components:e.metrics.components,deadEnds:e.metrics.deadEnds,crosses:e.metrics.crosses,scannerPorts:`${e.metrics.connectedScannerPorts}/${e.metrics.scannerPorts}`,facilityPorts:`${e.metrics.connectedFacilityPorts}/${e.metrics.facilityPorts}`,farmOutputs:e.metrics.farmOutputs,issues:[...e.issues||[]]}:null}function ec(e,t){let n=t.col-e.col,o=t.row-e.row;return fe.find(r=>r.dc===n&&r.dr===o)?.name||null}function Or(e,t,n){let o=at(e),r=ze(t.col,t.row);if(!o.cells.has(r))return[];let i=`${r}|${n.cacheKey||"dynamic"}`;if(n.cacheKey&&o.pathCache.has(i))return o.pathCache.get(i).map(ae=>ae.map(ye=>({...ye})));let a=`${r}|none`,c=[{key:r,col:t.col,row:t.row,incoming:"none",depth:0}],b=new Map([[a,0]]),M=new Map,C=[],$=1/0,W=8,K=24,G=80;for(;c.length;){let ae=c.shift();if(ae.depth>$)break;let ye=`${ae.key}|${ae.incoming}`;if(n(ae)){if(C.push(ye),$=ae.depth,C.length>=K)break;continue}for(let L of o.adjacency.get(ae.key)||[]){let V=wn(L.key),se=ec(ae,V),O=ae.depth+1;if(O>$)continue;let H=`${L.key}|${se}`,oe=b.get(H);if(oe==null)b.set(H,O),M.set(H,[ye]),c.push({key:L.key,col:V.col,row:V.row,incoming:se,depth:O});else if(oe===O){let ue=M.get(H)||[];ue.length{if(z.length>=G)return;let[L]=ae.split("|"),V=[wn(L),...ye];if(ae===a||L===r){z.push(V);return}for(let se of M.get(ae)||[])Q(se,V)};for(let ae of C)Q(ae,[]);let ie=[],J=new Set;for(let ae of z){let ye=ae.map(L=>ze(L.col,L.row)).join(">");J.has(ye)||(J.add(ye),ie.push(ae))}return n.cacheKey&&o.pathCache.set(i,ie.map(ae=>ae.map(ye=>({...ye})))),ie}function fs(e){let t=at(e),n=new Map;for(let[o,r]of t.components.entries())n.set(o,{id:o,cells:[...r.cells],capacity:r.capacity,count:0,ratio:0});return{components:n,cellToComponent:new Map(t.cellToComponent)}}function Ao(e,t=null){let n=e.map(o=>B(o.col,o.row));return t&&n.push(t),n}function Wt(e,t){t&&(!e.length||Gi(e[e.length-1],t)>1)&&e.push(t)}function tc(e,t,n,o=null){let r=[{x:e.x,y:e.y}];Wt(r,B(t.col,t.row));for(let i of Ao(n,o))Wt(r,i);return r}function nc(e,t){let n=Ao(e),o=We(t,"inputA");return o&&Wt(n,B(o.col,o.row)),Wt(n,ge(t)),n}function oc(e,t,n,o){let r=[{x:e.x,y:e.y}];Wt(r,B(t.col,t.row));for(let a of Ao(n))Wt(r,a);let i=We(o,"inputA");return i&&Wt(r,B(i.col,i.row)),Wt(r,ge(o)),r}function rc(e,t,n=0){let o=B(t.col,t.row),r=0;for(let i of e.chicks||[]){if(i.stage==="flying"||i.stage==="queued")continue;Math.hypot(i.x-o.x,i.y-o.y){let W=C.roleBias??0,K=$.roleBias??0;if(W!==K)return W-K;let G=C.cells?.length??C.route?.length??Number.POSITIVE_INFINITY,z=$.cells?.length??$.route?.length??Number.POSITIVE_INFINITY;if(G!==z)return G-z;let Q=C.key||JSON.stringify(C.route||C.cells||C),ie=$.key||JSON.stringify($.route||$.cells||$);return Q.localeCompare(ie)});if(!o||r.length===1)return r[0];let i=r[0].roleBias??0,a=r.filter(C=>(C.roleBias??0)===i),c=a.map(C=>({item:C,score:ic(e,C)})),b=Math.min(...c.map(C=>C.score));a=c.filter(C=>C.score===b).map(C=>C.item);let M=e.branchCounters.get(t)||0;return e.branchCounters.set(t,M+1),a[Math.floor(Math.random()*a.length)]}function ps(e){return e.role===0?{left:{match:"male",destination:"mixer"},right:{match:"default",destination:"scanner-role-1"}}:{left:{match:"poop",destination:"trash"},right:{match:"default",destination:"truck"}}}function Br(e){let t=ps(e);return{left:t.left.destination,right:t.right.destination}}function Dr(e,t){return ps(e).left.match===t.sex?"left":"right"}function Lr(e){return Wi(e)}function Nr(e){return{mixer:"#2477ff",truck:"#ff6aa8",inboundTruck:"#8bd0ff",trash:"#22b94f",sausageMaker:"#d78b3f",biomassGenerator:"#7bd84f",coalGenerator:"#d0d5dc","scanner-role-1":"#526456",scanner:"#526456",input:"#526456"}[e]||"#102015"}function en(e,t,n=!1){let o=at(e),r=(o.farmOutputs.get(t.id)||[]).map(wn),i=[];for(let b of r){let M=$=>o.scannerInputs.has(ze($.col,$.row));M.cacheKey=`farmInput:${b.col},${b.row}:v${o.version}`;let C=Or(e,b,M);for(let $ of C){let W=$[$.length-1],K=o.scannerInputs.get(ze(W.col,W.row)),G=Zt(e,K);G&&i.push({key:`${G.id}:${W.col},${W.row}:${$.length}`,scanner:G,cells:$})}}let a=Io(e,`farm:${t.id}`,i,n);if(a)return{scannerId:a.scanner.id,route:nc(a.cells,a.scanner)};let c=Io(e,`farm:${t.id}:output`,r.map(b=>({key:E(b.col,b.row),cells:[b]})),n);return c?{scannerId:null,route:Ao(c.cells)}:null}function ys(e,t,n,o,r=!1){let i=Zt(e,o);if(!i)return null;let c=at(e).scannerPorts.get(i.id)?.[t],b=We(i,t),M=c?.connected?(c.keys||[c.key]).filter(Boolean).map(wn):[];if(!b||!M.length)return null;let C=Br(i)[t];return C==="scanner-role-1"?sc(e,i,t,n,b,M,r):ac(e,i,t,n,b,M,C,r)}function sc(e,t,n,o,r,i,a){let c=at(e),b=e.scanners.filter($=>$.id!==t.id&&c.scannerPorts.get($.id)?.inputA?.connected),M=[];for(let $ of i)for(let W of b){let K=c.scannerPorts.get(W.id)?.inputA?.key;if(!K)continue;let G=(c.scannerPorts.get(W.id)?.inputA?.keys||[K]).filter(Boolean),z=J=>G.includes(ze(J.col,J.row));z.cacheKey=`toScanner:${$.col},${$.row}:${W.id}:v${c.version}`;let Q=Or(e,$,z),ie=W.role===1?0:1;for(let J of Q)M.push({key:`${ie}:start${E($.col,$.row)}:s${W.id}:${J.length}:${E(J[J.length-1].col,J[J.length-1].row)}`,target:W,cells:J,roleBias:ie})}let C=Io(e,`scanner:${t.id}:${n}:toRole1`,M,a);return C?{destination:"scanner",nextScannerId:C.target.id,route:oc(o,r,C.cells,C.target)}:null}function ac(e,t,n,o,r,i,a,c){let b=at(e),M=[...b.facilityPorts.entries()].filter(([W,K])=>K?.connected&&mn(e.facilities?.[W])===a);if(!M.length)return null;let C=[];for(let W of i)for(let[K,G]of M){let z=(G.keys||[G.key]).filter(Boolean);if(!z.length)continue;let Q=J=>z.includes(ze(J.col,J.row));Q.cacheKey=`toFacility:${W.col},${W.row}:${K}:v${b.version}`;let ie=Or(e,W,Q);for(let J of ie)C.push({key:`start${E(W.col,W.row)}:${K}:${J.length}:${E(J[J.length-1].col,J[J.length-1].row)}`,cells:J,facilityId:K})}let $=Io(e,`scanner:${t.id}:${n}:${a}`,C,c);return $?{destination:a,facilityId:$.facilityId,route:tc(o,r,$.cells,zl(e,$.facilityId))}:null}function hs(e,t,n=new Set){if(!t||n.has(t.id))return!1;n.add(t.id);for(let o of["left","right"]){let r=ys(e,o,ge(t),t.id,!1);if(r){if(["mixer","trash","truck","sausageMaker"].includes(r.destination))return!0;if(r.destination==="scanner"){let i=Zt(e,r.nextScannerId);if(hs(e,i,n))return!0}}}return!1}function lc(e,t){return!!en(e,t,!1)?.scannerId}function vn(e){if(e.phase!=="build")return[];let t=[];for(let n of e.eggFarms||[])lc(e,n)||t.push({type:"eggFarm",id:n.id,ref:n,message:"This Egg will not produce chicks"});for(let n of Cr)for(let[o,r]of Fr(e,n))at(e).facilityPorts.get(o)?.connected||t.push({type:"facility",id:o,ref:r,message:"This facility cannot receive items"});return t}function cc(e){let t=at(e);for(let r of e.eggFarms||[]){let i=en(e,r,!1);if(!i?.scannerId)continue;let a=Zt(e,i.scannerId);if(hs(e,a))return[]}let n=e.eggFarms?.length||0,o=[...t.facilityPorts.entries()].filter(([r,i])=>i?.connected&&["mixer","trash","truck"].includes(mn(e.facilities?.[r]))).length;return n?t.metrics.farmOutputs?e.scanners?.length?o?["No route from an EGG scanner to a receiver."]:["Connect at least one receiver exit: Mixer, Shredder, or Truck."]:["Build at least one scanner and connect it to an EGG route."]:["Connect at least one EGG to a conveyor."]:["Build at least one EGG before starting the next day."]}function Po(e){return e.kind==="manual"?`S${(e.slot??0)+1}`:`Auto Scanner #${e.id}`}function uc(e,t=at(e),n={}){let o=n.includeRoutes!==!1,r=[],i={mixer:"Mixer",trash:"Shredder",truck:"Truck",sausageMaker:"Sausage Machine"};for(let a of Cr){let c=Fr(e,a);if(!c.length){Di.includes(a)&&r.push(`${i[a]||a} is missing`);continue}for(let[b]of c)t.facilityPorts.get(b)?.connected||r.push(`${i[a]||a} receiver has no conveyor`)}for(let a of e.scanners){let c=t.scannerPorts.get(a.id)||{};if(c.inputA?.connected||r.push(`${Po(a)} input has no conveyor`),c.left?.connected||r.push(`${Po(a)} left output has no conveyor`),c.right?.connected||r.push(`${Po(a)} right output has no conveyor`),!!o)for(let b of["left","right"])c[b]?.connected&&!ys(e,b,ge(a),a.id)&&r.push(`${Po(a)} ${b} route is incomplete`)}if(o)for(let a of e.eggFarms)en(e,a)?.scannerId||r.push(`Egg Farm #${a.id} has no scanner route`);else for(let a of e.eggFarms)(t.farmOutputs.get(a.id)||[]).length||r.push(`Egg Farm #${a.id} has no output conveyor`);return[...new Set(r)]}function $o(e){return cc(e)}var Hn=[{key:"premiumFemaleShipment",target:"female",truckTarget:"female",title:"Premium Female Shipment",route:"Female -> Truck",note:"Today only: ship female chicks to Truck. Meet the export target for a bonus.",objective:"truckTarget"},{key:"contaminantSampleExport",target:"poop",truckTarget:"poop",title:"Contaminant Sample Export",route:"Poop value x2",note:"Today only: poop is valid Truck cargo and all poop income is doubled.",objective:"truckTarget",poopValueMultiplier:2},{key:"healthInspection",title:"Health Inspection",route:"Poop -> Shredder",note:"Today only: poop mistakes are fined double. Shred enough poop for an inspection bonus.",objective:"poopTrash",poopFineMultiplier:2},{key:"conveyorJamWarning",title:"Conveyor Jam Warning",route:"No explosions",note:"Today only: jam explosions trigger at 85% congestion. Finish with zero explosions for a bonus.",objective:"noExplosion",congestionExplosionThreshold:.85,congestionWarningThreshold:.68},{key:"powerSavingOrder",title:"Power Saving Order",route:"Slow factory subsidy",note:"Today only: conveyors -20% speed and Auto Scanners +20% cooldown. A subsidy is paid at settlement.",objective:"flatBonus",conveyorSpeedMultiplier:.8,autoScannerCooldownMultiplier:1.2},{key:"overtimeDay",title:"Overtime Day",route:"80 second day",note:"Today only: the work day is longer. No extra reward or penalty.",objective:"none",daySeconds:80},{key:"shortShift",title:"Short Shift",route:"40 second day",note:"Today only: the work day is shorter. The next Fairies tribute is reduced by 10%.",objective:"none",daySeconds:40,fairiesTributeMultiplier:.9},{key:"chickBoom",title:"Chick Boom",route:"EGG interval x0.65",note:"Today only: eggs hatch faster and poop rate rises by 5 percentage points.",objective:"none",productionMultiplier:1/.65,poopRateAdd:.05},{key:"rottenFeed",title:"Rotten Feed",route:"Poop surge",note:"Today only: poop rate rises by 20 percentage points and Shredder poop income is multiplied by 1.5.",objective:"none",poopRateAdd:.2,shredderIncomeMultiplier:1.5},{key:"maintenanceAudit",title:"Maintenance Audit",route:"Durability check",note:"Today only: machines below 50% remaining durability fail the audit. Passing with none below 50% pays a bonus.",objective:"maintenanceAudit"}];function Fe(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function dc(e,t=0,n=1){let o=Math.max(1,Number(e?.turn||1)+1),r=Math.floor(Gr(e)*(.08+Math.random()*.08)),i=Math.floor(Math.max(0,e.cash||0)*.25),a=Math.floor(Math.max(0,t)*Math.max(1,o)*.75);return Math.max(120,Math.ceil(Math.max(r,i,a)*n))}function bs(e){return Math.max(0,Math.ceil(500+Math.max(1,e?.turn||1)*25))}function Gr(e){return[...e.eggFarms.map(t=>t.price||0),...e.scanners.map(t=>t.price||0),...Object.values(e.facilities).map(t=>t.price||0),...[...e.conveyorMeta.values()].map(t=>t.price||0)].reduce((t,n)=>t+n,0)}function fc(e,t=1,n=yt){return e.eggFarms.reduce((o,r)=>{let[i,a]=zn(r),c=Math.max(.1,(i+a)/2);return o+Math.max(1,n)/c*Math.max(.01,t||1)},0)}function pc(e,t){let n=Fe(t.productionMultiplier,1),o=Fe(t.daySeconds,yt),r=fc(e,n,o),i=Math.max(0,Number(e?.cardEffects?.hatchingFeed)||0),a=Math.max(0,Number(e?.cardEffects?.poopRateBooster)||0),c=Math.pow(1.03,i),b=vr+Sr*a,M=Math.min(.95,Math.max(0,(b+Fe(t.poopRateAdd,0))*Fe(t.poopMultiplier,1)*c));return{estimate:r,poopRate:M}}function _r(e,t){let n=typeof t=="string"?Hn.find(c=>c.key===t):t;if(!n)return null;let{estimate:o,poopRate:r}=pc(e,n),i=0;n.objective==="truckTarget"?i=Math.max(1,Math.ceil(o*.3)):n.objective==="poopTrash"&&(i=Math.max(1,Math.ceil(o*r*.8)));let a=0;return["truckTarget","poopTrash","noExplosion"].includes(n.objective)&&(a=dc(e,o)),n.objective==="flatBonus"&&(a=bs(e)),n.objective==="maintenanceAudit"&&(a=bs(e)),{id:`event-${e.turn}-${Date.now()}-${Math.floor(Math.random()*9999)}`,...n,target:n.target||null,truckTarget:n.truckTarget||null,forced:!0,productionMultiplier:Fe(n.productionMultiplier,1),poopMultiplier:Fe(n.poopMultiplier,1),poopRateAdd:Fe(n.poopRateAdd,0),daySeconds:Fe(n.daySeconds,yt),targetAmount:i,estimatedOutput:Math.round(o),reward:a,createdTurn:e.turn,oneTurnOnly:!0}}function ws(e){if(e.turn+1Oi)return null;let n=Hn[Math.floor(Math.random()*Hn.length)];return _r(e,n)}function ms(e){e.eventActive=e.eventOffer?{...e.eventOffer}:null,e.eventOffer=null}function vs(e){e.eventActive=null}function Ss(e){return Math.max(1,Fe(e.eventActive?.daySeconds,yt))}function ks(e){return Fe(e.eventActive?.productionMultiplier,1)}function Ms(e){let t=Math.max(0,Number(e?.cardEffects?.hatchingFeed)||0),n=Math.max(0,Number(e?.cardEffects?.poopRateBooster)||0),o=Math.pow(1.03,t),r=vr+Sr*n,i=Fe(e.eventActive?.poopRateAdd,0);return Math.min(.95,Math.max(0,(r+i)*Fe(e.eventActive?.poopMultiplier,1)*o))}function Sn(e){return e.eventActive?.truckTarget||e.eventActive?.target||"female"}function Wr(e,t){return t==="male"?e.truckMale||0:t==="poop"?e.poopTruck||0:e.truckFemale||0}function Cs(e,t){return Sn(e)===t}function gs(e){return Sn(e)!=="male"}function Ur(e){return Math.max(.01,Fe(e.eventActive?.poopValueMultiplier,1))}function Fo(e){return Math.max(.01,Ur(e)*Fe(e.eventActive?.shredderIncomeMultiplier,1))}function Vr(e){return Math.max(.01,Fe(e.eventActive?.poopFineMultiplier,1))}function Kr(e){return Math.max(.1,Math.min(1,Fe(e.eventActive?.congestionExplosionThreshold,1)))}function xs(e){return Math.max(.1,Math.min(1,Fe(e.eventActive?.congestionWarningThreshold,.8)))}function Ts(e){return Math.max(.01,Fe(e?.fairiesTributeMultiplier,1))}function yc(e){let t=0,n=(o,r)=>{let i=Math.max(1,Fe(r,1)),a=Math.max(0,Fe(o,0));1-Math.min(1,a/i)<.5&&(t+=1)};for(let o of e.conveyorMeta?.values?.()||[])n(o.uses,o.durability);for(let o of e.eggFarms||[])n(o.maintenance?.uses,o.maintenance?.durability);for(let o of e.scanners||[])o.kind==="auto"&&n(o.maintenance?.uses,o.maintenance?.durability);for(let o of Object.values(e.facilities||{})){let r=o?.baseId||o?.id;(r==="mixer"||r==="trash"||r==="sausageMaker")&&n(o.maintenance?.uses,o.maintenance?.durability)}return t}function Es(e){let t=e.eventActive;if(!t)return null;let n=0,o=!0,r=0,i="";t.objective==="truckTarget"?(n=Wr(e.stats,t.target),o=n>=t.targetAmount,r=o?t.reward:0):t.objective==="poopTrash"?(n=e.stats.poopTrash||0,o=n>=t.targetAmount,r=o?t.reward:0):t.objective==="noExplosion"?(n=e.stats.explosions||0,o=n===0,r=o?t.reward:0,i=`${n} explosion(s)`):t.objective==="flatBonus"?(o=!0,r=t.reward):t.objective==="maintenanceAudit"?(n=yc(e),o=n===0,o&&(r=t.reward),i=`${n} machine(s) below 50%`):o=!0,r>0?(tt(e,r),e.stats.eventBonus=(e.stats.eventBonus||0)+r,e.totals.eventBonus+=r,e.totals.eventSuccess+=1):t.objective&&t.objective!=="none"&&(e.stats.eventBonus=e.stats.eventBonus||0,e.totals.eventFailed+=o?0:1,o&&(e.totals.eventSuccess+=1));let a={title:t.title,key:t.key,target:t.target,route:t.route,objective:t.objective,targetAmount:t.targetAmount||0,count:n,success:o,bonus:r,reward:t.reward||0,productionMultiplier:t.productionMultiplier,poopMultiplier:t.poopMultiplier,daySeconds:t.daySeconds,detail:i};return e.stats.eventResult=a,a}function qr(e,t){return Math.max(0,Number(e?.cardEffects?.[t])||0)}function hc(e){return!!e?.cardEffects?.usedMachineActive}function bc(e,t){return t?1:Math.min(.8,.5+.1*Math.min(3,qr(e,"recyclingSubsidy")))}function wc(e){return Math.pow(.95,qr(e,"safetyCover"))}function Oo(e){let t=e?.ref||e||{},n=e?.type||t.type;return n==="conveyor"?t.price||Te[t.kind]?.price||Te.conveyor.price:n==="eggFarm"?t.price||Te.eggFarm.price:n==="scanner"?t.price||(t.kind==="auto"?Te.autoScanner.price:Te.manualScanner.price):n==="facility"?t.price||Te[t.id]?.price||0:n==="maintenanceRoom"?t.price||Te.maintenanceRoom.price:Te[t.id]?.price||0}function Le(e,t=null){let n=Te[e]?.price||0;return hc(t)?Math.ceil(n*.5):n}function mc(e,t){return e?.facilities?Object.values(e.facilities).filter(n=>(n?.baseId||n?.id)===t).reduce((n,o)=>n+Math.max(0,(o.level||1)-1),0):0}function Rt(e,t){return Li.includes(t)?Math.pow(Ie.incomeUpgradeRate,mc(e,t)):1}function Je(e){return Math.ceil(Ie.income.truck*Rt(e,"truck"))}function lt(e){return Math.ceil((Ie.income.sausage||26)*Rt(e,"mixer")*Rt(e,"sausageMaker"))}function Yn(e){return Math.ceil(Ie.poopFine*Rt(e,"mixer")*Vr(e))}function Qn(e){return Math.ceil(Ie.poopFine*Rt(e,"truck")*Vr(e))}function zr(e){let t=Ie.maleTruckFinePerHalfDay*(e.turn/2);return Math.ceil(t*Rt(e,"truck"))}function Hr(e){return e?.facilities?Object.values(e.facilities).filter(t=>(t?.baseId||t?.id)==="trash").reduce((t,n)=>t+Math.max(0,(n.level||1)-1),0):0}function At(e){return Math.min(Ie.shredderBonus.maxCards,Hr(e))}function kn(){return Ie.shredderBonus.maxCards}function Bo(){return Ie.shredderBonus||{}}function Ps(e){let t=typeof e=="number"?e:At(e),n=Bo(),o=Math.min(n.maxCards||30,Math.max(0,t));return o>0?Math.ceil((n.payoutCoefficient||1.6)*Math.pow(o,n.payoutExponent||1.25)):0}function tn(e){let t=typeof e=="number"?e:At(e);if(t<=0)return 0;let n=Bo();return Math.min(n.maxHitChance||.82,(n.baseHitChance||.28)+t*(n.hitChancePerUpgrade||.018))}function vc(e){let t=Bo(),n=Math.min(t.jackpotMaxChance||.08,(t.jackpotBaseChance||.01)+e*(t.jackpotChancePerUpgrade||.0025)),o=Math.min(t.bigWinMaxChance||.12,(t.bigWinBaseChance||.07)+e*(t.bigWinChancePerUpgrade||.0015)),r=Math.min(1-n-o,t.doubleChance||.2),i=Math.max(0,1-n-o-r);return n*(t.jackpotMultiplier||10)+o*(t.bigWinMultiplier||4)+r*(t.doubleMultiplier||2)+i}function It(e){let t=typeof e=="number"?e:At(e);return Math.round(Ps(t)*tn(t)*vc(t))}function Sc(e){let t=At(e),n=tn(t),o=Ps(t);if(t<=0||Math.random()>=n)return{cards:t,chance:n,amount:0,expected:It(t),baseAmount:o,multiplier:0,tier:"miss"};let r=Bo(),i=Math.min(r.jackpotMaxChance||.08,(r.jackpotBaseChance||.01)+t*(r.jackpotChancePerUpgrade||.0025)),a=Math.min(r.bigWinMaxChance||.12,(r.bigWinBaseChance||.07)+t*(r.bigWinChancePerUpgrade||.0015)),c=Math.min(1-i-a,r.doubleChance||.2),b=Math.random(),M=1,C="normal";b0&&(e.stats.shredderBonus=(e.stats.shredderBonus||0)+t.amount,e.totals.shredderBonus=(e.totals.shredderBonus||0)+t.amount,tt(e,t.amount)),t}function Yr(e,t=e.turn,n=null){let o=Math.max(1,Math.floor(Number(t)||1)),r=Ie.fairiesTribute||{perDay:10,profitExemption:300,legalWorkExemptionBonus:250,profitRate:.12},i=Math.ceil(o*(r.perDay||10)),a=Math.max(0,Math.floor(Number(n??e?.lastResult?.profit??e?.stats?.profit??0)||0)),c=Math.max(0,e?.cardEffects?.legalWork||0),b=Math.max(0,(r.profitExemption||0)+c*(r.legalWorkExemptionBonus||0)),M=Math.max(0,a-b),C=Math.ceil(M*Math.max(0,Number(r.profitRate)||0)),$=i+C,W=Math.max(0,e?.cardEffects?.fairiesFlatteryNext||e?.cardEffects?.flattery||0),K=W>0?Math.pow(.5,W):1,G=Math.max(.01,Number(e?.pendingFairiesTributeMultiplier)||1),z=K*G,Q=Math.max(0,Math.ceil($*z)),ie=Math.max(0,$-Q);return{day:o,base:i,profit:a,legalWork:c,profitExemption:b,taxableProfit:M,profitTribute:C,gross:$,flatteryCount:W,eventMultiplier:G,perCardReduction:Math.ceil($*.5),reduction:ie,amount:Q}}function Ut(e,t){let n=e?.ref||e||{},o=e?.type==="conveyor"?t?.conveyorMeta?.get(e.oldKey||n.id):n,r=o?.price||Oo(e||n),i=o?.builtSession===t?.buildSession;if(o?.noRefund||n?.noRefund)return{amount:0,sameBuild:i,price:r,rate:0,noRefund:!0};let a=bc(t,i);return{amount:Math.max(0,Math.ceil(r*a)),sameBuild:i,price:r,rate:a,noRefund:!1}}function kc(e,t=null){let n=Math.max(1,Math.ceil((Number(e)||0)/Ie.explosionDamageDivisor));return Math.max(1,Math.ceil(n*wc(t)))}function Mc(e,t){return Math.max(0,Math.ceil(t))}function Is(e,t){e.cash+=t,e.stats.profit+=t,e.totals.profit+=t,t>=0?(e.stats.revenue+=t,e.totals.revenue+=t):(e.stats.penalty+=Math.abs(t),e.totals.penalty+=Math.abs(t)),e.totals.maxCash=Math.max(e.totals.maxCash,e.cash)}function tt(e,t){let n=Math.max(0,Math.ceil(t));return n>0&&Is(e,n),n}function Mt(e,t){let n=Math.max(0,Math.ceil(t));return n>0&&Is(e,-n),n}function Ct(e,t){Mt(e,t)}function Qr(e,t){t<=0||(e.cash+=t,e.stats.profit+=t,e.totals.profit+=t,e.totals.maxCash=Math.max(e.totals.maxCash,e.cash))}function As(e){let t=Ie.income.mixer;return e.stats.mixerRevenue+=t,tt(e,t),t}function $s(e){let t=Yn(e);return e.stats.mixerPoopFine+=t,e.totals.mixerPoopFine+=t,Mt(e,t),t}function Fs(e){let t=Qn(e);return e.stats.truckPoopFine+=t,e.totals.truckPoopFine+=t,Mt(e,t),t}function Os(e){let t=zr(e);return e.stats.maleTruckFine+=t,e.totals.maleTruckFine+=t,Mt(e,t),t}function Bs(e,t){let n=kc(t,e);return e.stats.explosionDamage+=n,e.totals.explosionDamage+=n,Mt(e,n),n}function Ds(e){let t=Sn(e),n=t==="poop"?Math.ceil(Je(e)*Ur(e)):Je(e),o=Array.isArray(e.shippedCargo)?e.shippedCargo:Array.isArray(e.truckCargo)?e.truckCargo:[],r=o.filter(G=>G.sex===t),i=r.length||Wr(e.stats,t),a=r.length?r.reduce((G,z)=>G+Math.ceil(n*(t==="female"?Math.max(1,z.sourceQuality||1):1)),0):i*n,c=o.filter(G=>G.sex==="sausage"),b=c.length||Math.max(0,e?.stats?.sausageShipped||0),M=lt(e),C=c.length?c.reduce((G,z)=>G+Math.ceil(M*Math.max(1,z.sourceQuality||1)),0):b*M,$=i*n+b*M,W=Math.max(0,a+C-$);e.stats.qualityRevenue=(e.stats.qualityRevenue||0)+W,e.totals.qualityRevenue=(e.totals.qualityRevenue||0)+W;let K=Mc(e,a+C);return e.stats.pendingTruckRevenue=K,e.stats.truckRevenue=K,e.stats.sausageRevenue=C,t==="poop"?e.stats.poopShipmentIncome=a:e.stats.chickShipmentIncome=a,K>0&&tt(e,K),{base:a,adjusted:K,target:t,targetCount:i,unitPrice:n,sausageCount:b,sausageUnitPrice:M,sausageRevenue:C}}function Ls(e,t=e.turn,n=null,o={}){let r=Yr(e,t,n);return e.cardEffects&&(e.cardEffects.fairiesFlatteryNext=0,e.cardEffects.flattery!=null&&delete e.cardEffects.flattery),e.pendingFairiesTributeMultiplier!=null&&(e.pendingFairiesTributeMultiplier=1),r.amount<=0||(o.recordStats?(e.stats.fairiesTribute=(e.stats.fairiesTribute||0)+r.amount,e.totals.fairiesTribute=(e.totals.fairiesTribute||0)+r.amount,Mt(e,r.amount)):(e.totals.fairiesTribute=(e.totals.fairiesTribute||0)+r.amount,e.totals.penalty=(e.totals.penalty||0)+r.amount,e.totals.profit=(e.totals.profit||0)-r.amount,e.cash-=r.amount)),r}function Ns(e){let t=qr(e,"chemicalWeaponSubsidy"),n=Math.max(0,e?.stats?.poopTruck||0),o=Ie.chemicalWeaponSubsidy||{poopPerBlock:70,yenPerBlock:1200},r=Math.floor(n/Math.max(1,o.poopPerBlock||70)),i=t>0&&r>0?r*Math.max(0,o.yenPerBlock||1200)*t:0;return i>0&&(e.stats.chemicalWeaponSubsidy=(e.stats.chemicalWeaponSubsidy||0)+i,e.totals.chemicalWeaponSubsidy=(e.totals.chemicalWeaponSubsidy||0)+i,tt(e,i)),{cards:t,poopTruck:n,blocks:r,amount:i}}function Gs(e){let t=Gr(e),n=Math.max(1,e.totals.turnsCompleted||e.turn||1),o=Math.max(0,e.cash+e.totals.revenue+t*.5+e.totals.eventBonus*.5),r=Math.ceil(o/n),i=Math.floor(n*35+Math.max(0,n-5)*15),a=e.totals.correct*5,c=e.totals.explosionDamage;return{score:Math.max(0,Math.floor(o+r+a-e.totals.penalty-i)),factoryValue:t,base:o,dailyEarned:r,dayPenalty:i,correctBonus:a,explosionPenalty:c,days:n}}function Cc(e){return{...e,keys:e.keys?{left:{...e.keys.left},right:{...e.keys.right}}:null,queue:[],cooldown:e.cooldown||0}}function Xn(e){return JSON.stringify({cash:e.cash,stats:e.stats,totals:e.totals,nextId:e.nextId,gridX:p.x,gridY:p.y,gridCols:e.gridCols||p.cols,gridRows:e.gridRows||p.rows,gridExpansionPurchases:e.gridExpansionPurchases||0,gridExpansionPurchasesByDirection:e.gridExpansionPurchasesByDirection||{left:0,right:0,up:0,down:0},gridChunkOriginX:e.gridChunkOriginX||0,gridChunkOriginY:e.gridChunkOriginY||0,ownedCells:[...e.ownedCells||[]],ownedChunks:[...e.ownedChunks||[]],blockedCells:[...e.blockedCells||[]],selected:e.selected,multiSelected:e.multiSelected||[],buildTool:e.buildTool,view:e.view,facilities:e.facilities,eggFarms:e.eggFarms,scanners:e.scanners.map(Cc),conveyorTiles:[...e.conveyorTiles],conveyorMeta:[...e.conveyorMeta.entries()],powerWires:[...(e.powerWires||new Map).entries()],footbridges:[...(e.footbridges||new Map).entries()],footbridgeOrientation:e.footbridgeOrientation||"vertical",powerOverlay:!!e.powerOverlay,imports:{schedules:[...(e.imports?.schedules||new Map).entries()]},branchCounters:[...e.branchCounters.entries()],cardEffects:e.cardEffects,cardDraft:e.cardDraft,cardTargetPick:e.cardTargetPick})}function _s(e,t){let n=JSON.parse(t);e.cash=n.cash,e.stats=n.stats,e.totals=n.totals,e.nextId=n.nextId,p.x=n.gridX??_.grid.x,p.y=n.gridY??_.grid.y,p.cols=n.gridCols||_.grid.cols,p.rows=n.gridRows||_.grid.rows,e.gridCols=p.cols,e.gridRows=p.rows,e.gridExpansionPurchases=n.gridExpansionPurchases||0,e.gridExpansionPurchasesByDirection=n.gridExpansionPurchasesByDirection||{left:0,right:0,up:0,down:0},e.gridExpansionPurchasesByDirection.left==null&&(e.gridExpansionPurchasesByDirection.left=0),e.gridExpansionPurchasesByDirection.down==null&&(e.gridExpansionPurchasesByDirection.down=0),e.gridChunkOriginX=n.gridChunkOriginX||0,e.gridChunkOriginY=n.gridChunkOriginY||0,e.ownedCells=new Set(n.ownedCells||[]),e.ownedChunks=new Set(n.ownedChunks||[]),e.gridOwnedCells=e.ownedCells.size||p.cols*p.rows,e.blockedCells=new Set(n.blockedCells||[]),e.selected=n.selected,e.multiSelected=n.multiSelected||[],e.buildTool=n.buildTool,e.view=n.view||{x:0,y:0,scale:1},e.view.scale==null&&(e.view.scale=1),e.facilities=n.facilities||{},e.eggFarms=n.eggFarms||[],e.scanners=(n.scanners||[]).map(o=>({...o,queue:[],cooldown:o.cooldown||0})),e.conveyorTiles=new Set(n.conveyorTiles||[]),e.conveyorMeta=new Map(n.conveyorMeta||[]),e.powerWires=new Map(n.powerWires||[]),e.footbridges=new Map(n.footbridges||[]),e.footbridgeOrientation=n.footbridgeOrientation||"vertical",e.powerOverlay=!!n.powerOverlay,e.imports={schedules:new Map(n.imports?.schedules||[])},e.branchCounters=new Map(n.branchCounters||[]),e.cardEffects=n.cardEffects||{bearing:0,legalWork:0,fairiesFlatteryNext:0,scannerQueueSpacing:0},e.cardEffects.drawBonus!=null&&delete e.cardEffects.drawBonus,e.cardDraft=n.cardDraft||{pending:!1,choices:[],rerolls:0,picksRemaining:0},e.cardDraft.picksRemaining==null&&(e.cardDraft.picksRemaining=e.cardDraft.pending?1:0),e.cardDraft.freeRerolls==null&&(e.cardDraft.freeRerolls=0),e.cardTargetPick=n.cardTargetPick||null,e.groupDrag=null,e.selectionBox=null,e.pan=null,e.routingVersion=(e.routingVersion||0)+1,e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.power={...e.power||{},dirty:!0},e.factoryGraph=null,e.factoryGraphCommittedVersion=-1}function Oe(e){e.phase==="build"&&(e.undoStack.push(Xn(e)),e.undoStack.length>80&&e.undoStack.shift(),e.redoStack=[])}function Xr(e){return e.phase!=="build"||!e.undoStack.length?!1:(e.redoStack.push(Xn(e)),_s(e,e.undoStack.pop()),!0)}function jr(e){return e.phase!=="build"||!e.redoStack.length?!1:(e.undoStack.push(Xn(e)),_s(e,e.redoStack.pop()),!0)}function Y(e,t,n,o,r=w.ink){e.floatingTexts.push({x:t,y:n,text:o,color:r,life:1,maxLife:1})}function nn(e,t,n){e.shake.strength=Math.max(e.shake.strength,t),e.shake.time=Math.max(e.shake.time,n)}function Ws(e,t,n){e.effects.push({type:"spawn",priority:_e.ambient,x:t,y:n,life:.42,maxLife:.42,size:12})}function Us(e,t,n,o=w.green){e.effects.push({type:"scannerPulse",priority:_e.important,x:t,y:n,color:o,life:.42,maxLife:.42,size:24})}function Vs(e,t,n){for(let o=0;o<12;o+=1)e.effects.push({type:"meat",priority:_e.important,x:t+ne(-18,18),y:n+ne(-12,16),vx:ne(-60,60),vy:ne(-90,-25),life:ne(.45,.85),maxLife:.85,size:ne(4,8)})}function Ks(e,t,n){for(let o=0;o<16;o+=1)e.effects.push({type:"sludge",priority:_e.important,x:t+ne(-18,18),y:n+ne(-12,16),vx:ne(-46,46),vy:ne(-70,-20),life:ne(.45,.9),maxLife:.9,size:ne(4,8)})}function qs(e,t,n,o){let r=o==="poop"?w.poop:o==="male"?w.male:w.female;for(let i=0;i<22;i+=1)e.effects.push({type:"shred",priority:_e.important,x:t+ne(-16,16),y:n+ne(-8,8),vx:ne(-70,70),vy:ne(40,160),color:i%3===0?w.white:r,life:ne(.45,.95),maxLife:.95,w:ne(3,7),h:ne(10,24),rot:ne(-Math.PI,Math.PI)});gt(e,t,n,w.green,34,_e.important)}function zs(e,t,n,o){let r=o==="poop"?w.poop:o==="male"?w.danger:w.green;for(let i=0;i<8;i+=1)e.effects.push({type:"load",priority:_e.important,x:t+ne(-18,18),y:n+ne(-18,18),vx:ne(-42,42),vy:ne(-90,-25),color:r,life:ne(.35,.65),maxLife:.65,size:8})}function gt(e,t,n,o=w.danger,r=52,i=_e.critical){e.effects.push({type:"shockwave",priority:i,x:t,y:n,color:o,life:.55,maxLife:.55,size:8,maxSize:r})}function $t(e,t,n,o=12,r=w.danger,i=_e.critical){for(let a=0;a0&&(e.shake.time=Math.max(0,e.shake.time-t),e.shake.time<=0&&(e.shake.strength=0));for(let r of e.effects)if(r.life-=t,["meat","sludge","spark","smoke","shred","load","rage"].includes(r.type))r.x+=(r.vx||0)*t,r.y+=(r.vy||0)*t,r.vy=(r.vy||0)+150*t;else if(r.type==="flyingChick"){r.x+=r.vx*t,r.y+=r.vy*t,r.vy+=360*t,r.noDamage||gc(e,r,o);let i=r.x+e.view.x,a=r.y+e.view.y;(i<-100||a<-100||i>n.width+100||a>n.height+100)&&(r.life=0)}e.effects=e.effects.filter(r=>r.life>0);for(let r of e.floatingTexts)r.life-=t,r.y-=34*t;e.floatingTexts=e.floatingTexts.filter(r=>r.life>0)}function gc(e,t,n){t.hit||(t.hit=new Set);for(let o of n()){if(t.hit.has(o.id)||t.xo.x+o.w||t.yo.y+o.h)continue;t.hit.add(o.id);let r=Bs(e,o.price);Y(e,t.x,t.y-10,`-${R(r)}`,w.danger),gt(e,t.x,t.y,w.danger,30),$t(e,t.x,t.y,5,w.danger),nn(e,5,.18)}}var Qs=[[{key:"a",code:"KeyA",label:"A"},{key:"d",code:"KeyD",label:"D"}],[{key:"arrowleft",code:"ArrowLeft",label:"Left"},{key:"arrowright",code:"ArrowRight",label:"Right"}],[{key:"j",code:"KeyJ",label:"J"},{key:"l",code:"KeyL",label:"L"}],[{key:"f",code:"KeyF",label:"F"},{key:"h",code:"KeyH",label:"H"}],[{key:"q",code:"KeyQ",label:"Q"},{key:"e",code:"KeyE",label:"E"}],[{key:"z",code:"KeyZ",label:"Z"},{key:"x",code:"KeyX",label:"X"}],[{key:"u",code:"KeyU",label:"U"},{key:"o",code:"KeyO",label:"O"}],[{key:"n",code:"KeyN",label:"N"},{key:"m",code:"KeyM",label:"M"}]];function xc(e){let t=Qs[e]||Qs[0];return{left:{...t[0]},right:{...t[1]}}}function Xs(e,t,n){let o={type:"eggFarm",id:e.nextId++,col:t,row:n,level:1,nextSpawn:2,lastInterval:2,extraEggOutlet:0,price:_t.eggFarm,builtSession:e.buildSession};return o.nextSpawn=Jt(o),o.lastInterval=o.nextSpawn,o}function js(e,t,n,o){let r=o==="auto"?Te.autoScanner.price:Te.manualScanner.price,i=new Set(e.scanners.filter(c=>c.kind==="manual").map(c=>c.slot)),a=0;for(;i.has(a);)a+=1;return{type:"scanner",id:e.nextId++,kind:o,slot:o==="manual"?a:null,role:o==="manual"?a%2:0,col:t,row:n,level:1,queue:[],cooldown:0,price:r,builtSession:e.buildSession,autoMode:"standard",keys:o==="manual"?xc(a):null}}function Tc(e,t,n){let o=n.x-t.x,r=n.y-t.y,i=o*o+r*r,a=i>0?Math.max(0,Math.min(1,((e.x-t.x)*o+(e.y-t.y)*r)/i)):0,c=t.x+o*a,b=t.y+r*a;return Math.hypot(e.x-c,e.y-b)}function Ec(e){let t=[],n=e?.ownedCells?.size?[...e.ownedCells].map(o=>{let[r,i]=String(o).split(",").map(Number);return{col:r,row:i}}):Array.from({length:p.cols*p.rows},(o,r)=>({col:r%p.cols,row:Math.floor(r/p.cols)}));for(let o of n){let r=p.x+o.col*p.cell,i=p.y+o.row*p.cell,a=r+p.cell,c=i+p.cell;je(e,o.col-1,o.row)||t.push({side:"left",entry:o,a:{x:r,y:i},b:{x:r,y:c}}),je(e,o.col+1,o.row)||t.push({side:"right",entry:o,a:{x:a,y:i},b:{x:a,y:c}}),je(e,o.col,o.row-1)||t.push({side:"top",entry:o,a:{x:r,y:i},b:{x:a,y:i}}),je(e,o.col,o.row+1)||t.push({side:"bottom",entry:o,a:{x:r,y:c},b:{x:a,y:c}})}return t}function Lo(e,t=null){let n=Ec(t);if(n.length){let W=n.map(K=>({...K,distance:Tc(e,K.a,K.b)})).sort((K,G)=>K.distance-G.distance)[0];return{side:W.side,entry:{...W.entry}}}let o=(e.x-p.x)/p.cell,r=(e.y-p.y)/p.cell,i=Math.max(0,Math.min(p.cols-1,Math.round(o-.5))),a=Math.max(0,Math.min(p.rows-1,Math.round(r-.5))),c=Math.abs(e.x-p.x),b=Math.abs(e.x-(p.x+p.cols*p.cell)),M=Math.abs(e.y-p.y),C=Math.abs(e.y-(p.y+p.rows*p.cell)),$=[["left",c],["right",b],["top",M],["bottom",C]].sort((W,K)=>W[1]-K[1])[0][0];return $==="left"?{side:$,entry:{col:0,row:a}}:$==="right"?{side:$,entry:{col:p.cols-1,row:a}}:$==="top"?{side:$,entry:{col:i,row:0}}:{side:$,entry:{col:i,row:p.rows-1}}}function Mn(e){return e?.baseId||e?.id||""}function Cn(e){if(!e?.gridPlaced)return e;let t=Te[Mn(e)]||{};return e.wCells=Math.max(1,e.wCells||t.footprint?.cols||3),e.hCells=Math.max(1,e.hCells||t.footprint?.rows||3),e.x=p.x+e.col*p.cell,e.y=p.y+e.row*p.cell,e.w=e.wCells*p.cell,e.h=e.hCells*p.cell,Mn(e)==="sausageMaker"&&(e.entry={col:e.col-1,row:e.row+Math.floor(e.hCells/2)},e.side="grid"),(Mn(e)==="biomassGenerator"||Mn(e)==="coalGenerator")&&(e.entry={col:e.col-1,row:e.row+Math.floor(e.hCells/2)},e.side="grid"),e}function gn(e){if(!e?.gridPlaced)return[];let t=[];for(let n=0;n<(e.hCells||3);n+=1)for(let o=0;o<(e.wCells||3);o+=1)t.push({col:e.col+o,row:e.row+n});return t}function Pc(e,t){if(Mn(e)!=="mixer")return;let n=e.baseW||e.w||168,o=e.baseH||e.h||110;e.baseW=n,e.baseH=o;let r=t==="top"||t==="bottom";e.w=r?Math.max(n,o):Math.min(n,o),e.h=r?Math.min(n,o):Math.max(n,o)}function No(e,t="input"){if(!e)return null;let n=Mn(e);return n==="mixer"?e.side==="top"||e.side==="bottom"?t==="input"?{x:e.x+e.w/2,y:e.y}:{x:e.x+e.w/2,y:e.y+e.h}:t==="input"?{x:e.x,y:e.y+e.h/2}:{x:e.x+e.w,y:e.y+e.h/2}:n==="sausageMaker"&&e.gridPlaced?t==="input"?{x:e.x,y:e.y+e.h/2}:{x:e.x+e.w,y:e.y+e.h/2}:{x:e.x+e.w/2,y:e.y+e.h/2}}function Go(e,t,n){Pc(e,n);let o={x0:p.x+t.col*p.cell,y0:p.y+t.row*p.cell,x1:p.x+(t.col+1)*p.cell,y1:p.y+(t.row+1)*p.cell},r={x:(o.x0+o.x1)/2,y:(o.y0+o.y1)/2};return e.entry={...t},e.side=n,n==="left"?(e.x=o.x0-e.w-18,e.y=r.y-e.h/2):n==="right"?(e.x=o.x1+18,e.y=r.y-e.h/2):n==="top"?(e.x=r.x-e.w/2,e.y=o.y0-e.h-18):(e.x=r.x-e.w/2,e.y=o.y1+18),e}function Js(e,t,n,o){let{entry:r,side:i}=Lo(n,e),a=Te[t],c=a?{name:a.name,w:a.body?.w||168,h:a.body?.h||110,price:a.price}:{name:t[0].toUpperCase()+t.slice(1),w:168,h:110,price:o},b={type:"facility",id:t,name:c.name,x:0,y:0,w:c.w,h:c.h,baseW:c.w,baseH:c.h,level:1,price:o||c.price,builtSession:e.buildSession};return t==="inboundTruck"&&(b.inboundOrder={coalPerDay:0,zundaMochiPerDay:0}),Go(b,r,i)}function Zs(e,t,n,o,r){let i=Te[t],a={type:"facility",id:t,name:i?.name||t,baseId:t,col:n,row:o,wCells:i?.footprint?.cols||(t==="sausageMaker"?3:1),hCells:i?.footprint?.rows||(t==="sausageMaker"?3:1),gridPlaced:!0,level:1,price:r||i?.price||0,builtSession:e.buildSession};return(t==="biomassGenerator"||t==="coalGenerator")&&(a.fuelPulses=[]),Cn(a)}function xt(e){return e?[{col:e.col,row:e.row},{col:e.col+1,row:e.row},{col:e.col,row:e.row+1},{col:e.col+1,row:e.row+1}]:[]}function ea(e,t,n){return{type:"maintenanceRoom",id:e.nextId++,col:t,row:n,price:_t.maintenanceRoom,builtSession:e.buildSession,wCells:2,hCells:2}}function Rc(e){return Math.random()({x:i.x,y:i.y})),r=o[0];return{id:e.nextId++,sex:n,x:r.x,y:r.y,route:o,targetIndex:o.length>1?1:o.length,stage:t.stage||"belt",scannerId:t.scannerId??null,nextScannerId:null,pendingScannerId:null,radius:n==="poop"?15:17,bob:Math.random()*Math.PI*2,queueIndex:-1,queueRoute:null}}function jn(e){return e?.baseId||e?.id||""}function xn(e){if(!e)return null;let t=e.type==="scanner"?`${e.kind}Scanner`:jn(e)||e.type;return _.power.exempt.includes(t)?null:_.power.machines[t]||null}function ra(e){return _.power.generators[jn(e)]||null}function Tn(e){let t=ra(e);if(!t)return 0;let n=t.outputV||t.baseOutputV||0,o=(e.fuelPulses||[]).reduce((r,i)=>r+Math.max(0,i.voltage||0),0);return n+o}function Ic(e){return e?.gridPlaced?gn(e):[]}function Ac(e){if(!e)return[];if(e.type==="scanner")return[{col:e.col,row:e.row-1},{col:e.col+1,row:e.row-1},{col:e.col,row:e.row},{col:e.col+1,row:e.row}];if(e.type==="maintenanceRoom")return xt(e);if(e.gridPlaced){let t=jn(e),n=e.row+Math.floor((e.hCells||1)/2);return t==="sausageMaker"?[{col:e.col-1,row:n},{col:e.col+(e.wCells||3),row:n}]:[{col:e.col-1,row:n},{col:e.col+(e.wCells||1),row:n},{col:e.col+Math.floor((e.wCells||1)/2),row:e.row-1},{col:e.col+Math.floor((e.wCells||1)/2),row:e.row+(e.hCells||1)}]}return e.entry?[e.entry]:[]}function $c(e,t,n){let o=1/0;for(let r of t){for(let a of fe){let c=E(r.col+a.dc,r.row+a.dr),b=n.get(c);b!=null&&(o=Math.min(o,b))}let i=n.get(E(r.col,r.row));i!=null&&(o=Math.min(o,i))}return Number.isFinite(o)?o:null}function Fc(e,t){let n=new Map,o=[],r=(i,a)=>{a<0||a>=Tn(t)||n.has(i)&&n.get(i)<=a||(n.set(i,a),o.push({k:i,loss:a}))};for(let i of Ic(t))for(let a of fe){let c=E(i.col+a.dc,i.row+a.dr);e.powerWires?.has(c)&&r(c,_.power.wires[e.powerWires.get(c).kind]?.lossV||0)}for(;o.length;){o.sort((c,b)=>c.loss-b.loss);let i=o.shift();if(n.get(i.k)!==i.loss)continue;let a=X(i.k);for(let c of fe){let b=E(a.col+c.dc,a.row+c.dr),M=e.powerWires?.get(b);if(!M)continue;let C=_.power.wires[M.kind]?.lossV??.5;r(b,i.loss+C)}}return n}function na(e){let t=[];for(let n of Object.values(e.facilities||{}))xn(n)&&t.push(n);for(let n of e.scanners||[])xn(n)&&t.push(n);for(let n of e.maintenanceRooms||[])xn(n)&&t.push(n);return t}function ia(e){return Object.values(e.facilities||{}).filter(ra)}function Ft(e){return String(e.id??`${e.type}:${e.col},${e.row}`)}function oa(e){return e.builtSession==null?-1:e.builtSession}function _o(e){if(!e)return{dirty:!1,routes:new Map,assignments:new Map,sources:new Map,underVoltage:new Set};let t=new Map,n=ia(e).map(G=>{let z=Fc(e,G);return t.set(G.id,z),{generator:G,outputV:Tn(G),admitted:[],busVoltage:Tn(G)}}),o=[];for(let G of na(e)){let z=xn(G),Q=[];for(let ie of n){let J=$c(e,Ac(G),t.get(ie.generator.id));J!=null&&Q.push({source:ie,loss:J,openCircuit:ie.outputV-J})}Q.sort((ie,J)=>J.openCircuit-ie.openCircuit||ie.loss-J.loss||Ft(ie.source.generator).localeCompare(Ft(J.source.generator))),Q[0]&&o.push({item:G,spec:z,routes:Q})}o.sort((G,z)=>(z.spec.powerPriority||50)-(G.spec.powerPriority||50)||G.routes[0].loss-z.routes[0].loss||oa(G.item)-oa(z.item)||Ft(G.item).localeCompare(Ft(z.item)));let r=new Map,i="",a=0,c=Math.max(1,_.power.maxAssignmentPasses||8);for(let G=0;GO+H.spec.drawV,0)+ie.spec.drawV,L=ae.outputV-ye,V=ae.admitted.every(O=>L-O.loss>=O.spec.minVoltage),se=L-J.loss>=ie.spec.minVoltage;if(!(!V||!se)){ae.admitted.push({item:ie.item,spec:ie.spec,loss:J.loss}),ae.busVoltage=L,z.set(Ft(ie.item),{sourceId:ae.generator.id,sourceName:ae.generator.name||ae.generator.shortName||ae.generator.id,sourceBusV:L,routeLossV:J.loss,receivedV:L-J.loss,minVoltage:ie.spec.minVoltage,drawV:ie.spec.drawV});break}}let Q=[...z.entries()].map(([ie,J])=>`${ie}:${J.sourceId}:${J.receivedV.toFixed(3)}`).join("|");if(r=z,Q===i)break;i=Q}let b=new Map,M=new Map;for(let G of n)M.set(G.generator.id,{outputV:G.outputV,busVoltage:G.busVoltage,admitted:G.admitted.length,stablePasses:a});for(let[G,z]of r)b.set(G,z);let C=e.power?.underVoltage||new Set,$=new Set;for(let G of na(e))r.has(Ft(G))||$.add(Ft(G));let W=e.power?.assignments||new Map,K=0;for(let[G,z]of r)W.get(G)?.sourceId!==z.sourceId&&(K+=1);return e.phase==="running"&&e.stats&&(e.stats.generatorAssignmentChanges=(e.stats.generatorAssignmentChanges||0)+K,e.totals&&(e.totals.generatorAssignmentChanges=(e.totals.generatorAssignmentChanges||0)+K)),e.power={...e.power||{},dirty:!1,routes:b,assignments:r,sources:M,underVoltage:$,previousUnder:C},e.power}function Wo(e){return(!e.power||e.power.dirty)&&_o(e),e.power}function Ye(e){e.power||(e.power={}),e.power.dirty=!0}function sa(e,t){let n=!1;for(let i of ia(e)){if(e.stats){e.stats.maxGeneratorOutput=e.stats.maxGeneratorOutput||{};let c=i.id||jn(i);e.stats.maxGeneratorOutput[c]=Math.max(e.stats.maxGeneratorOutput[c]||0,Tn(i))}if(!i.fuelPulses?.length)continue;for(let c of i.fuelPulses)c.timeLeft-=t;let a=i.fuelPulses.length;i.fuelPulses=i.fuelPulses.filter(c=>c.timeLeft>0),i.fuelPulses.length!==a&&(n=!0)}n&&Ye(e),e.power||(e.power={dirty:!0,elapsed:0}),e.power.elapsed=(e.power.elapsed||0)+t;let o=1/Math.max(1,_.power.recalcHz||10);(e.power.dirty||e.power.elapsed>=o)&&(e.power.elapsed=0,_o(e));let r=Wo(e);if(e.phase==="running"){let i=r.underVoltage?.size||0;if(i){e.stats.underVoltageSeconds=(e.stats.underVoltageSeconds||0)+i*t,e.stats.underVoltageSecondsByMachine=e.stats.underVoltageSecondsByMachine||{};for(let a of r.underVoltage)e.stats.underVoltageSecondsByMachine[a]=(e.stats.underVoltageSecondsByMachine[a]||0)+t;e.totals.underVoltageSeconds=(e.totals.underVoltageSeconds||0)+i*t}}}function nt(e,t){return xn(t)?Wo(e).assignments.has(Ft(t)):!0}function En(e,t){let n=xn(t);return n?Wo(e).assignments.get(Ft(t))||{sourceName:"None",sourceBusV:0,routeLossV:0,receivedV:0,minVoltage:n.minVoltage,drawV:n.drawV}:null}function aa(e){let t=Wo(e);return`POWER: ${[...(t.sources||new Map).entries()].map(([o,r])=>`${o} ${r.outputV.toFixed(0)}V / ${r.admitted} powered`).join(" | ")||"none"} / ${t.underVoltage?.size||0} under-voltage`}function la(e,t){let n=jn(e),o=_.power.generators[n];return!o||n==="biomassGenerator"&&!["male","female","poop"].includes(t)||n==="coalGenerator"&&t!=="coal"?!1:(e.fuelPulses=e.fuelPulses||[],e.fuelPulses.push({voltage:o.pulseVoltage,timeLeft:o.pulseSeconds}),!0)}var Ze=_.maintenance;function Zr(e,t){return Math.max(0,Number(e?.cardEffects?.[t])||0)}function Ko(e){let t=Math.min(1.4,1+.04*Math.min(10,Zr(e,"crowdedFarming"))),n=Math.pow(.95,Zr(e,"preventiveMaintenance"));return t*n}function Oc(e){return Math.pow(1.03,Zr(e,"durabilityCoating"))}function qo(e,t,n=1){let o=Ze.durability[t]||1e3;return Math.max(1,Math.ceil(o*Math.max(.1,n||1)*Oc(e)))}function ca(e){return Math.max(.1,Number(e?.durabilityBaseMultiplier)||1)}function Bc(e,t=0){if(!e)return{x:p.x+p.cell*(.5+t*.55),y:p.y+p.rows*p.cell+84};let n=p.x+e.col*p.cell+p.cell,o=p.y+e.row*p.cell+p.cell;return{x:n,y:o}}function Dc(e,t=0){let n=(e.maintenanceRooms||[])[t];return Bc(n,t)}function Be(e){e.repairman||(e.repairman={active:!1,x:p.x+p.cell*.5,y:p.y+p.rows*p.cell+84,target:null,repairedToday:0}),Array.isArray(e.maintenanceRooms)||(e.maintenanceRooms=[]),Array.isArray(e.repairmen)||(e.repairmen=[]);for(let[t,n]of e.conveyorMeta||[]){n.uses==null&&(n.uses=0),n.maintenanceType==null&&(n.maintenanceType="conveyor"),n.kind||(n.kind="conveyor"),n.speedMultiplier||(n.speedMultiplier=n.kind==="boostConveyor"?2:1),n.branchMode||(n.branchMode="random");let o=qo(e,"conveyor",ca(n));(n.durability==null||n.durability0&&(n.processingCooldown=Math.max(0,n.processingCooldown-t))}function to(e){Be(e);let t=[];for(let[n,o]of e.conveyorMeta||[])t.push({type:"conveyor",key:n,meta:o,label:`${o.kind==="boostConveyor"?"Boost Belt":"Belt"} ${n}`,center:B(X(n).col,X(n).row)});for(let n of e.eggFarms||[])t.push({type:"eggFarm",ref:n,label:`EGG #${n.id}`,center:B(n.col,n.row)});for(let n of(e.scanners||[]).filter(o=>o.kind==="auto"))t.push({type:"autoScanner",ref:n,label:`AUTO #${n.id}`,center:B(n.col,n.row)});for(let n of Object.values(e.facilities||{})){let o=Qo(n);["mixer","trash","sausageMaker","starterGenerator","biomassGenerator","coalGenerator","inboundTruck"].includes(o)&&t.push({type:o,ref:n,label:`${n.shortName||n.name||o} #${n.id}`,center:{x:n.x+n.w/2,y:n.y+n.h/2}})}return t}function on(e){return e.meta?Pn(e):Pn(e.ref)}function Jn(e){return e.meta?ei(e):ei(e.ref)}function Uo(e){return e.meta?ti(e):ti(e.ref)}function ya(e,t){Lc(e.meta?e:e.ref,Math.max(0,Jn(e)-t))}function si(e){return e.type==="conveyor"?`conveyor:${e.key}`:`${e.type}:${e.ref?.id||e.ref?.type||e.type}`}function ha(e,t=.02){Be(e);let n=Math.max(0,Number(t)||0),o=0;for(let r of to(e)){let i=Jn(r);ya(r,Uo(r)*n),o+=Math.max(0,i-Jn(r))/Uo(r)*100}return o}function ba(e){Be(e);let t=e.maintenanceRooms||[];e.repairmen=t.map((o,r)=>{let i=ai(e,o),a=i?B(i.col,i.row):Dc(e,r);return{id:`room-${o.id}`,roomId:o.id,active:!0,x:a.x,y:a.y,target:null,repairedToday:0}});let n=e.repairmen[0];e.repairman.active=!!n,e.repairman.target=n?.target||null,e.repairman.repairedToday=0,n&&(e.repairman.x=n.x,e.repairman.y=n.y)}function wa(e){Be(e);for(let t of e.repairmen||[])t.active=!1,t.target=null;e.repairmen=[],e.repairman.active=!1,e.repairman.target=null}function Gc(e,t){return t&&to(e).find(o=>si(o)===t.key)||null}function _c(e){let t=null;for(let n of to(e)){if(!Vo(e,n))continue;let o=on(n);o<=.001||(!t||o>on(t))&&(t=n)}return t}function ma(e,t){Be(e);let n=e.repairmen?.length?e.repairmen:e.repairman?.active?[e.repairman]:[];if(!n.length||e.phase!=="running")return;let o=new Set(n.map(i=>i.target?.key).filter(Boolean));for(let i of n)Wc(e,i,t,o);let r=n[0];r&&e.repairman!==r&&(e.repairman.active=!0,e.repairman.x=r.x,e.repairman.y=r.y,e.repairman.target=r.target,e.repairman.repairedToday=r.repairedToday||0)}function Wc(e,t,n,o){if(!t.active)return;let r=(e.maintenanceRooms||[]).find(J=>J.id===t.roomId);if(r&&!nt(e,r))return;let i=Gc(e,t.target);if((!i||on(i)<=.001||!Vo(e,i))&&(t.target?.key&&o.delete(t.target.key),i=Uc(e,o)),!i){t.target=null;return}let a=si(i);o.add(a);let c=Vo(e,i,t);if(!c){e.stats.unreachableRepairTargets=(e.stats.unreachableRepairTargets||0)+1,e.totals.unreachableRepairTargets=(e.totals.unreachableRepairTargets||0)+1,o.delete(a),t.target=null;return}if(t.target={key:a,label:i.label,workKey:E(c.col,c.row)},zc(e,t,c),t.path?.length&&t.pathIndex4){let V=Math.min(L,Ze.repairman.walkSpeed*n);t.x+=ae/L*V,t.y+=ye/L*V;return}t.pathIndex+=1;return}let b=Ze.repairman.walkSpeed,M=B(c.col,c.row),C=M.x-t.x,$=M.y-t.y,W=Math.hypot(C,$);if(W>8){let J=Math.min(W,b*n);t.x+=C/W*J,t.y+=$/W*J;return}let K=e?.cardEffects?.laborExploitation?.7:1,G=n/(Ze.repairman.secondsPerOnePercent*K*100),z=Jn(i),Q=G*Uo(i);ya(i,Q);let ie=Math.max(0,(z-Jn(i))/Uo(i)*100);t.repairedToday=(t.repairedToday||0)+ie,ie>0&&Math.random()<.02&&Y(e,t.x,t.y-28,"REPAIR",w.green),on(i)<=.001&&(o.delete(a),t.target=null)}function Uc(e,t=new Set){let n=null;for(let o of to(e)){if(t.has(si(o))||!Vo(e,o))continue;let r=on(o);r<=.001||(!n||r>on(n))&&(n=o)}return n||_c(e)}function Vc(e){if(e.type==="conveyor")return[X(e.key)];if(e.type==="eggFarm")return[{col:e.ref.col,row:e.ref.row}];if(e.type==="autoScanner"){let n=e.ref;return[{col:n.col,row:n.row-1},{col:n.col+1,row:n.row-1},{col:n.col,row:n.row},{col:n.col+1,row:n.row}]}let t=e.ref;if(t?.gridPlaced){let n=[];for(let o=0;o<(t.hCells||1);o+=1)for(let r=0;r<(t.wCells||1);r+=1)n.push({col:t.col+r,row:t.row+o});return n}return t?.entry?[t.entry]:[]}function Kc(e){let t=new Set;for(let n of e.eggFarms||[])t.add(E(n.col,n.row));for(let n of e.scanners||[])for(let o of[{col:n.col,row:n.row-1},{col:n.col+1,row:n.row-1},{col:n.col,row:n.row},{col:n.col+1,row:n.row}])t.add(E(o.col,o.row));for(let n of e.maintenanceRooms||[])for(let o=0;o<2;o+=1)for(let r=0;r<2;r+=1)t.add(E(n.col+r,n.row+o));for(let n of Object.values(e.facilities||{}))if(n.gridPlaced)for(let o=0;o<(n.hCells||1);o+=1)for(let r=0;r<(n.wCells||1);r+=1)t.add(E(n.col+r,n.row+o));return t}function Rn(e,t,n){if(!Re(t,n)||!e.ownedCells?.has?.(E(t,n))||e.blockedCells?.has?.(E(t,n)))return!1;let o=E(t,n);return!(Kc(e).has(o)||e.conveyorTiles?.has(o)&&!e.footbridges?.has(o))}function ai(e,t){if(!t)return{col:0,row:Math.max(0,p.rows-1)};let n=[];for(let o=0;o<2;o+=1)n.push({col:t.col+o,row:t.row-1},{col:t.col+o,row:t.row+2});for(let o=0;o<2;o+=1)n.push({col:t.col-1,row:t.row+o},{col:t.col+2,row:t.row+o});return n.find(o=>Rn(e,o.col,o.row))||null}function va(e,t,n){if(!t)return null;let o=new Set(n.map(c=>E(c.col,c.row))),r=E(t.col,t.row),i=[t],a=new Map([[r,null]]);for(;i.length;){let c=i.shift(),b=E(c.col,c.row);if(o.has(b)){let M=[],C=b;for(;C;){let $=X(C);M.push($),C=a.get(C)}return M.reverse()}for(let M of fe){let C={col:c.col+M.dc,row:c.row+M.dr},$=E(C.col,C.row);a.has($)||!Rn(e,C.col,C.row)||(a.set($,b),i.push(C))}}return null}function qc(e,t){let n=[];for(let r of Vc(t)){t.type==="conveyor"&&e.footbridges?.has(E(r.col,r.row))&&Rn(e,r.col,r.row)&&n.push(r);for(let i of fe){let a={col:r.col+i.dc,row:r.row+i.dr};Rn(e,a.col,a.row)&&n.push(a)}}let o=new Set;return n.filter(r=>{let i=E(r.col,r.row);return o.has(i)?!1:(o.add(i),!0)})}function Vo(e,t,n=null){let o=qc(e,t);if(!o.length)return null;let r=(e.maintenanceRooms||[]).find(c=>c.id===n?.roomId)||(e.maintenanceRooms||[])[0],i=n?ka(e,n,r):ai(e,r),a=va(e,i,o);return a?.[a.length-1]||null}function Sa(e,t){let n=Math.floor((e-p.x)/p.cell),o=Math.floor((t-p.y)/p.cell);return Re(n,o)?{col:n,row:o}:null}function ka(e,t,n){let o=Sa(t.x,t.y);return o&&Rn(e,o.col,o.row)?o:ai(e,n)}function zc(e,t,n){let o=E(n.col,n.row);if(t.path&&t.pathVersion===e.walkabilityVersion&&t.target?.workKey===o&&t.pathIndexb.id===t.roomId),i=ka(e,t,r);t.path=va(e,i,[n])||[];let a=Sa(t.x,t.y),c=a&&i&&a.col===i.col&&a.row===i.row&&Rn(e,a.col,a.row);t.pathIndex=c&&t.path.length>1?1:0,t.pathVersion=e.walkabilityVersion||0}function Hc(e){let t=0,n="none";for(let o of to(e)){let r=on(o);r>t&&(t=r,n=o.label)}return{ratio:t,percent:Math.round(t*100),label:n}}function li(e){let t=Hc(e),n=ni(e);return{worst:t,avgBeltPerformance:n,repairman:e.repairman||null,repairmen:e.repairmen||[],rooms:e.maintenanceRooms||[]}}var Yc=qe.commonWeight,Qc=qe.rareWeight,Xc=qe.ultraRareWeight||.45,sn=qe.baseDraftSize,An=Bi;function In(e,t){let n=Qe(e);return Math.max(0,Number(n[t])||0)}function Qe(e){e.cardEffects||(e.cardEffects={...kr});for(let[t,n]of Object.entries(kr))e.cardEffects[t]==null&&(e.cardEffects[t]=Array.isArray(n)?[]:n);return e.cardEffects.flattery!=null&&(e.cardEffects.fairiesFlatteryNext=Math.max(0,e.cardEffects.fairiesFlatteryNext||0)+Math.max(0,e.cardEffects.flattery||0),delete e.cardEffects.flattery),e.cardEffects.drawBonus!=null&&delete e.cardEffects.drawBonus,e.cardDraft||(e.cardDraft={pending:!1,choices:[],rerolls:0,picksRemaining:0}),e.cardDraft.picksRemaining==null&&(e.cardDraft.picksRemaining=e.cardDraft.pending?1:0),e.cardDraft.freeRerolls==null&&(e.cardDraft.freeRerolls=0),e.cardEffects}function Ra(e){let t=Math.max(.5,1-.05*Math.min(10,In(e,"crowdedFarming"))),n=Math.pow(.96,In(e,"hatchingFeed"));return t*n}function Ia(e,t=null){return Math.min(3,Math.max(0,Number(t?.extraEggOutlet)||0))}function Aa(e){return Math.pow(.85,In(e,"scannerQueueSpacing"))}function Vt(e,t=null){let n=Qe(e),o=wo*Math.pow(mo,Math.max(0,n.bearing||0)),r=t?Math.max(.1,Number(e?.conveyorMeta?.get?.(t)?.speedMultiplier)||1):1,i=t?1:ni(e),a=Math.max(.01,Number(e?.eventActive?.conveyorSpeedMultiplier)||1);return Math.min(yn,o*i)*r*a}function Bt(e,t=null){let n=Math.max(0,(e?.level||1)-1),o=t?In(t,"autoScannerTuning"):0,r=bo*Math.pow(Fi,n)*Math.pow(wr,o),i=Math.max(mr,r),a=t?Math.max(.01,Number(t?.eventActive?.autoScannerCooldownMultiplier)||1):1;return t?Math.max(mr,i*Ho(e)*a):i}function Ma(e){let t=e.cardDraft||{rerolls:0},n=Math.max(1,(t.rerolls||0)+1);return Math.ceil(Math.max(1,e.turn||1)/qe.rerollCost.dayDivisor*n*qe.rerollCost.multiplier)}function an(e){return An.find(t=>t.id===e)||null}function $a(e,t){let n=typeof t=="string"?an(t):t;return Qe(e),!n||!(n.type==="equipmentUpgrade"||n.type==="cellAction")?[]:dt(e,n).map(o=>({key:Ot(o),label:fi(e,o),type:o.type}))}function di(e,t,n={}){let o=typeof t=="string"?an(t):t;if(Qe(e),!o||o.type==="dud")return{ok:!1,reason:"Card not found."};if(o.id==="extraCards")return e.cardDraft=e.cardDraft||{pending:!1,choices:[],rerolls:0,picksRemaining:0},e.cardDraft.choices.push(...jo(e,2)),{ok:!0,reason:`${o.title} added 2 draft cards.`};if(o.type==="instant")return Oa(e,o),{ok:!0,reason:`${o.title} granted.`};if(o.type==="equipmentUpgrade"){let r=dt(e,o);if(!r.length)return{ok:!1,reason:`No valid target for ${o.title}.`};let i=n.targetKey&&n.targetKey!=="__auto__"?String(n.targetKey):"",a=i?r.find(c=>Ot(c)===i):r[0];return a?(Fa(e,a),{ok:!0,reason:`${o.title} applied to ${fi(e,a)}.`}):{ok:!1,reason:`Selected target is no longer valid for ${o.title}.`}}if(o.type==="cellAction"&&o.target==="blockedCell"){let r=dt(e,o);if(!r.length)return{ok:!1,reason:"No blocked cells to remove."};let i=new Set((Array.isArray(n.targetKeys)?n.targetKeys:[n.targetKey]).filter(c=>c&&c!=="__auto__").map(String)),a=i.size?r.filter(c=>i.has(Ot(c))):r.slice(0,10);if(!a.length)return{ok:!1,reason:`Selected target is no longer valid for ${o.title}.`};for(let c of a.slice(0,3)){e.blockedCells.delete(E(c.col,c.row));let b=B(c.col,c.row);ct(e,b.x,b.y),gt(e,b.x,b.y,w.danger,42),$t(e,b.x,b.y,8,w.warn)}return Ee(e),{ok:!0,reason:`${o.title} removed ${Math.min(10,a.length)} blocked cell(s).`}}return{ok:!1,reason:`${o.title} cannot be debug-granted.`}}function fi(e,t){if(t.type==="blockedCell")return`Blocked cell ${t.col},${t.row}`;if(t.type==="eggFarm")return`EGG #${t.id} L${t.level} -> L${t.level+1}`;if(t.type==="eggOutlet"){let n=Math.max(0,Number(t.farm?.extraEggOutlet)||0);return`EGG #${t.id} OUTLET ${1+n} -> ${2+n}`}if(t.type==="scanner")return`AUTO #${t.id} L${t.level} -> L${t.level+1} | CD ${Bt(t,e).toFixed(1)}s -> ${Bt({...t,level:t.level+1},e).toFixed(1)}s`;if(t.type==="facility"&&["mixer","sausageMaker"].includes(t.baseId||t.id)){let n=t.baseId||t.id,o=t.level||1,r=lt(e);t.level=o+1;let i=lt(e);return t.level=o,`${n==="mixer"?"MIXER":"SAUSAGE MACHINE"} L${t.level} -> L${t.level+1} | sausage ${R(r)} -> ${R(i)}`}if(t.type==="facility"&&(t.baseId||t.id)==="truck"){let n=t.level,o=Je(e);t.level=n+1;let r=Je(e);return t.level=n,`TRUCK L${t.level} -> L${t.level+1} | ${R(o)} -> ${R(r)}`}if(t.type==="facility"&&(t.baseId||t.id)==="trash"){let n=At(e),o=Math.min(kn(),n+1),r=It(n),i=It(o);return`SHREDDER L${t.level||1} -> L${(t.level||1)+1} | expected ${R(r)} -> ${R(i)} per poop`}return`${t.name||t.id} L${t.level||1} -> L${(t.level||1)+1}`}function jc(e){return[...e.blockedCells||[]].map(t=>{let[n,o]=String(t).split(",").map(Number);return{type:"blockedCell",id:t,col:n,row:o}}).filter(t=>Number.isFinite(t.col)&&Number.isFinite(t.row))}function dt(e,t){let n=typeof t=="string"?an(t):t;return Qe(e),n?n.target==="blockedCell"?jc(e):n.target==="eggFarm"?e.eggFarms.filter(o=>(o.level||1)<4):n.target==="eggOutlet"?e.eggFarms.filter(o=>Math.max(0,Number(o.extraEggOutlet)||0)<3).map(o=>({type:"eggOutlet",id:o.id,col:o.col,row:o.row,farm:o})):n.target==="autoScanner"?e.scanners.filter(o=>o.kind==="auto"):n.target==="mixer"?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="mixer"):n.target==="truck"?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="truck"):n.target==="sausageMaker"?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="sausageMaker"):n.target==="trash"?Hr(e)(o.baseId||o.id)==="trash"):[]:[]:[]}function Jc(e,t){let n=Qe(e);if(t.id==="crowdedFarming")return(n.crowdedFarming||0)>=10;if(t.id==="recyclingSubsidy")return(n.recyclingSubsidy||0)>=3;if(t.id==="dudFilter"){let o=Math.max(0,Math.min(1,qe.dudChancePerCard||0)),r=Math.max(1e-4,Math.min(1,qe.dudChanceReductionPerFilter||.05));return(n.dudFilter||0)>=Math.ceil(o/r)}return t.id==="laborExploitation"?!!n.laborExploitation:t.id==="usedMachine"?!!n.usedMachineActive:t.id==="newMachine"?!n.usedMachineActive:!1}function Zc(e){return!!((e.maintenanceRooms||[]).length||(e.repairmen||[]).length||e.repairman?.active)}function Ca(e,t){return t==="conveyor"?(e.conveyorTiles?.size||0)>0:t==="autoScanner"?(e.scanners||[]).some(n=>n.kind==="auto"):t==="manualScanner"?(e.scanners||[]).some(n=>n.kind==="manual"):t==="eggFarm"?(e.eggFarms||[]).length>0:Object.values(e.facilities||{}).some(n=>(n.baseId||n.id)===t)}function eu(e,t){return!(t.requiresFacility&&!Ca(e,t.requiresFacility)||Array.isArray(t.requiresAnyFacility)&&!t.requiresAnyFacility.some(n=>Ca(e,n)))}function tu(e){return An.filter(t=>!(t.id==="laborExploitation"&&!Zc(e)||!eu(e,t)||Jc(e,t)||(t.type==="equipmentUpgrade"||t.type==="cellAction")&&dt(e,t).length<=0))}function ga(e,t){return t.rarity==="ultraRare"?Xc:t.rarity==="rare"?Qc:Yc}function nu(e,t){let n=t.reduce((r,i)=>r+ga(e,i),0);if(n<=0)return t[Math.floor(Math.random()*t.length)];let o=Math.random()*n;for(let r of t)if(o-=ga(e,r),o<=0)return r;return t[t.length-1]}var xa=0;function ou(){return xa+=1,{id:`dud:${Date.now()}:${xa}`,title:"Dud",rarity:"dud",type:"dud",description:"Click to flick this dud away. It does not consume a pick."}}function ru(e){let t=Qe(e),n=Math.max(0,Math.min(1,qe.dudChancePerCard||0)),o=Math.max(0,Math.min(1,qe.dudChanceReductionPerFilter||0));return Math.max(0,n-o*Math.max(0,t.dudFilter||0))}function iu(e,t){let n=[...t],o=0,r=Math.max(0,qe.maxDudsPerDraft||0),i=ru(e);for(let a=0;ac.id===i.id);a>=0&&r.splice(a,1)}return iu(e,o)}function Ot(e){return e?e.type==="blockedCell"?`blockedCell:${e.id}`:e.type==="eggFarm"?`eggFarm:${e.id}`:e.type==="eggOutlet"?`eggOutlet:${e.id}`:e.type==="scanner"?`scanner:${e.id}`:e.type==="facility"?`facility:${e.id}`:`${e.type}:${e.id}`:""}function Ta(e){if(!e)return null;if(e.type==="blockedCell"){let t=B(e.col,e.row);return{x:t.x-p.cell*.48,y:t.y-p.cell*.48,w:p.cell*.96,h:p.cell*.96,cx:t.x,cy:t.y}}if(e.type==="eggFarm"||e.type==="eggOutlet"){let t=B(e.col,e.row);return{x:t.x-34,y:t.y-34,w:68,h:68,cx:t.x,cy:t.y}}if(e.type==="scanner"){let t=ge(e);return{x:t.x-48,y:t.y-48,w:96,h:96,cx:t.x,cy:t.y}}return e.type==="facility"?{x:e.x,y:e.y,w:e.w,h:e.h,cx:e.x+e.w/2,cy:e.y+e.h/2}:null}function pi(e){if(!e.cardTargetPick?.pending)return[];if(e.cardTargetPick.mode==="autoScannerMenu"){let n=new Set(e.cardTargetPick.targetKeys||[]);return e.scanners.filter(o=>o.kind==="auto"&&n.has(Ot(o))).map(o=>({key:Ot(o),label:"AUTO ROUTE SETTINGS",target:o,bounds:Ta(o)})).filter(o=>o.bounds)}let t=new Set(e.cardTargetPick.targetKeys||[]);return dt(e,e.cardTargetPick.cardId).filter(n=>t.has(Ot(n))).map(n=>({key:Ot(n),label:fi(e,n),target:n,bounds:Ta(n)})).filter(n=>n.bounds)}function su(e,t){let n=pi(e);for(let o of n){let r=o.bounds;if(t.x>=r.x&&t.x<=r.x+r.w&&t.y>=r.y&&t.y<=r.y+r.h)return o.target}return null}function Fa(e,t){if(t.type==="eggOutlet"){let n=t.farm||e.eggFarms.find(r=>r.id===t.id);if(!n)return;n.extraEggOutlet=Math.min(3,Math.max(0,Number(n.extraEggOutlet)||0)+1);let o=B(n.col,n.row);Y(e,o.x,o.y-30,`OUTLET ${1+n.extraEggOutlet}`,w.green),Ee(e);return}if(t.level=(t.level||1)+1,t.type==="eggFarm"){t.nextSpawn=Jt(t),t.lastInterval=t.nextSpawn;let n=B(t.col,t.row);Y(e,n.x,n.y-30,`LV ${t.level}`,w.green);return}if(t.type==="scanner"){let n=ge(t);Y(e,n.x,n.y-34,`LV ${t.level}`,w.green);return}t.type==="facility"&&Y(e,t.x+t.w/2,t.y+18,`LV ${t.level}`,w.green)}function Oa(e,t){let n=Qe(e),o=r=>{n[r]=Math.max(0,n[r]||0)+1};if(t.id==="bearing"&&o("bearing"),t.id==="autoScannerTuning"&&o("autoScannerTuning"),t.id==="legalWork"&&o("legalWork"),t.id==="crowdedFarming"&&(n.crowdedFarming=Math.min(10,(n.crowdedFarming||0)+1)),t.id==="hatchingFeed"&&o("hatchingFeed"),t.id==="poopRateBooster"&&o("poopRateBooster"),t.id==="safetyCover"&&o("safetyCover"),t.id==="recyclingSubsidy"&&(n.recyclingSubsidy=Math.min(3,(n.recyclingSubsidy||0)+1)),t.id==="chemicalWeaponSubsidy"&&o("chemicalWeaponSubsidy"),t.id==="preventiveMaintenance"&&o("preventiveMaintenance"),t.id==="dudFilter"&&o("dudFilter"),t.id==="durabilityCoating"&&(o("durabilityCoating"),Be(e)),t.id==="sparePartsBin"){o("sparePartsBin");let r=ha(e,.02);e.stats.sparePartsRepair=(e.stats.sparePartsRepair||0)+r,e.totals.sparePartsRepair=(e.totals.sparePartsRepair||0)+r,Y(e,p.x+p.cols*p.cell/2,p.y-30,"REPAIR +2%",w.green)}t.id==="dudRefund"&&o("dudRefund"),t.id==="freeReroll"&&o("freeReroll"),t.id==="composter"&&o("composter"),t.id==="scannerQueueSpacing"&&o("scannerQueueSpacing"),t.id==="flattery"&&o("fairiesFlatteryNext"),t.id==="usedMachine"&&(n.usedMachineActive=!0),t.id==="newMachine"&&(n.usedMachineActive=!1),t.id==="laborExploitation"&&(n.laborExploitation=1),t.id==="rescueLoan"&&(o("rescueLoanCharges"),Y(e,p.x+p.cols*p.cell/2,p.y-30,"RESCUE HELD",w.green))}function mt(e){return`${Math.round(Number(e||0)*100)}%`}function Ea(e){let t=Gt[Math.max(0,Math.min(Gt.length-1,e-1))]||Gt[0]||[0,0];return`${t[0].toFixed(2)}-${t[1].toFixed(2)}s`}function Pa(e,t){return Math.ceil(e*Math.pow(Ie.incomeUpgradeRate,Math.max(0,t-1)))}function ci(e,t,n){let r=dt(e,t==="mixer"?"upgradeMixer":t==="sausageMaker"?"upgradeSausageMaker":"upgradeTruck")[0];if(!r)return{before:Pa(n,1),after:Pa(n,2)};let i=()=>t==="truck"?Je(e):lt(e),a=i(),c=r.level||1;r.level=c+1;let b=i();return r.level=c,{before:a,after:b}}function au(e,t){let n=Qe(e);if(t.id==="upgradeEgg"){let o=dt(e,t),r=Math.min(3,Math.max(1,o[0]?.level||1));return`Choose one EGG. Level +1. Production interval ${Ea(r)} -> ${Ea(r+1)}.`}if(t.id==="upgradeAutoScanner"){let o=dt(e,t)[0]||{level:1},r=Bt(o,e),i=Bt({...o,level:(o.level||1)+1},e);return`Choose one AUTO SCANNER. Level +1. Cooldown ${r.toFixed(2)}s -> ${i.toFixed(2)}s.`}if(t.id==="upgradeMixer"){let o=ci(e,"mixer",Ie.income.sausage);return`Choose one MIXER. Meat quality +10%. Sausage sale value ${R(o.before)} -> ${R(o.after)}.`}if(t.id==="upgradeSausageMaker"){let o=ci(e,"sausageMaker",Ie.income.sausage);return`Choose one SAUSAGE MACHINE. Product value +10%. Sausage sale value ${R(o.before)} -> ${R(o.after)}.`}if(t.id==="upgradeTruck"){let o=ci(e,"truck",Ie.income.truck);return`Choose one TRUCK. Earning +10%. Correct shipment income ${R(o.before)} -> ${R(o.after)}.`}if(t.id==="upgradeTrash"){let o=At(e),r=Math.min(kn(),o+1),i=It(o),a=It(r),c=Math.round(tn(o)*100),b=Math.round(tn(r)*100);return`SHREDDER level +1. Expected value ${R(i)} -> ${R(a)} per poop; hit chance ${c}% -> ${b}%.`}if(t.id==="bearing"){let o=Math.min(yn,wo*Math.pow(mo,Math.max(0,n.bearing||0))),r=Math.min(yn,wo*Math.pow(mo,Math.max(0,(n.bearing||0)+1)));return`Conveyor speed +7.5%. After pick: ${o.toFixed(1)} -> ${r.toFixed(1)} px/s.`}if(t.id==="legalWork"){let o=Math.max(0,n.legalWork||0);return`Fairies tribute profit exemption +${R(250)}. After pick: exemption bonus ${R(250*(o+1))}.`}if(t.id==="crowdedFarming"){let o=Math.min(10,(n.crowdedFarming||0)+1);return`Held ${n.crowdedFarming||0}/10. After pick: EGG interval ${mt(Math.max(.5,1-.05*o))}, deterioration ${mt(Math.min(1.4,1+.04*o))}.`}if(t.id==="extraEggOutlet"){let o=dt(e,t),r=Math.max(0,Number(o[0]?.farm?.extraEggOutlet)||0);return`Choose one EGG. Output ports ${1+r} -> ${2+r}. Max 4 ports per EGG.`}if(t.id==="hatchingFeed")return`Held ${n.hatchingFeed||0}. After pick: EGG interval ${mt(Math.pow(.96,(n.hatchingFeed||0)+1))}, poop rate multiplier ${mt(Math.pow(1.03,(n.hatchingFeed||0)+1))}.`;if(t.id==="poopRateBooster")return`Held ${n.poopRateBooster||0}. After pick: base poop rate +${Math.round((n.poopRateBooster||0)+1)*4} percentage points.`;if(t.id==="autoScannerTuning")return`Held ${n.autoScannerTuning||0}. After pick: all AUTO SCANNER default cooldown ${mt(Math.pow(wr,(n.autoScannerTuning||0)+1))}.`;if(t.id==="safetyCover")return`Held ${n.safetyCover||0}. After pick: explosion damage ${mt(Math.pow(.95,(n.safetyCover||0)+1))}.`;if(t.id==="recyclingSubsidy")return`Held ${n.recyclingSubsidy||0}/3. After pick: normal SELL refund ${Math.round(Math.min(.8,.5+.1*((n.recyclingSubsidy||0)+1))*100)}%.`;if(t.id==="chemicalWeaponSubsidy")return`Held ${n.chemicalWeaponSubsidy||0}. After pick: ${R(1200*((n.chemicalWeaponSubsidy||0)+1))} per 70 truck-shipped poop each day.`;if(t.id==="preventiveMaintenance")return`Held ${n.preventiveMaintenance||0}. After pick: deterioration speed ${mt(Math.pow(.95,(n.preventiveMaintenance||0)+1))}.`;if(t.id==="dudFilter"){let o=Math.max(0,Math.min(1,qe.dudChancePerCard||0)),r=Math.max(0,Math.min(1,qe.dudChanceReductionPerFilter||.05)),i=Math.max(0,n.dudFilter||0),a=Math.max(0,o-r*i),c=Math.max(0,o-r*(i+1));return`Held ${i}. DUD chance per card ${mt(a)} -> ${mt(c)}.`}return t.id==="durabilityCoating"?`Held ${n.durabilityCoating||0}. After pick: maximum durability ${mt(Math.pow(1.03,(n.durabilityCoating||0)+1))}.`:t.id==="sparePartsBin"?`Held ${n.sparePartsBin||0}. Immediately restores 2% durability to every maintained machine. Common card weight.`:t.id==="dudRefund"?`Held ${n.dudRefund||0}. After pick: DUD clicks award ${R(50*((n.dudRefund||0)+1))}.`:t.id==="freeReroll"?`Held ${n.freeReroll||0}. After pick: each card screen starts with ${(n.freeReroll||0)+1} free reroll${(n.freeReroll||0)+1===1?"":"s"}.`:t.id==="composter"?`Held ${n.composter||0}. After pick: SHREDDER poop grants ${R(3*((n.composter||0)+1))}.`:t.id==="scannerQueueSpacing"?`Held ${n.scannerQueueSpacing||0}. After pick: Manual/Auto Scanner queue spacing ${mt(Math.pow(.85,(n.scannerQueueSpacing||0)+1))}.`:t.id==="flattery"?`Next Fairies tribute -50%. Held for next tribute: ${n.fairiesFlatteryNext||0}.`:t.id==="usedMachine"?"Enable Used Machines: future equipment costs 50%, has no SELL refund, and starts with 60% durability.":t.id==="newMachine"?"Cancel Used Machines. Future equipment returns to normal price, refund, and durability.":t.id==="laborExploitation"?"Repairman dispatch paperwork is streamlined. Repair rooms keep operating; one time only.":t.id==="rescueLoan"?`At day-end bankruptcy check, gain ${R(500)} if cash is below ${R(0)}. Held: ${n.rescueLoanCharges||0}.`:t.id==="dynamite"?"Choose any blocked tiles on the map and destroy up to 3. Empty-space clicks are ignored; press Esc to finish after at least one blast.":t.description}function ui(e,t){let n=e.cardDraft?.choices||[],o=n.findIndex(r=>r.id===t.id);o>=0&&n.splice(o,1)}function Ba({game:e,ui:t,onUpdatePanels:n}){function o(){n&&n()}function r(){Qe(e),e.cardTargetPick=null,e.cardDraft={pending:!0,choices:jo(e,sn),rerolls:0,freeRerolls:In(e,"freeReroll"),picksRemaining:1}}function i(){Qe(e),e.cardDraft.pending=!1,e.cardDraft.choices=[],e.cardDraft.picksRemaining=0,e.cardTargetPick=null,t.modal.classList.remove("visible","equipment-popover"),o()}function a(L=sn){Qe(e),e.cardDraft.choices=jo(e,L)}function c(){Qe(e),!e.cardDraft.choices.length&&e.cardDraft.picksRemaining>0&&a(sn)}function b(L){ui(e,L),e.cardDraft.picksRemaining=Math.max(0,(e.cardDraft.picksRemaining||1)-1),e.cardTargetPick=null,c(),e.cardDraft.picksRemaining<=0?i():ye()}function M(L){ui(e,L),e.cardDraft.picksRemaining=Math.max(0,(e.cardDraft.picksRemaining||1)-1)+qe.extraCardsAddedPicks,e.cardDraft.choices.push(...jo(e,2)),ye()}function C(L,V){let se=In(e,"dudRefund")*50;if(se>0){let O=tt(e,se);e.stats.dudRefundIncome=(e.stats.dudRefundIncome||0)+O,e.totals.dudRefundIncome=(e.totals.dudRefundIncome||0)+O,Y(e,p.x+p.cols*p.cell/2,p.y-30,`DUD REFUND +${R(O)}`,w.green)}nn(e,34,.62),document.body?.animate&&document.body.animate([{transform:"translate(0, 0)"},{transform:"translate(-10px, 7px)"},{transform:"translate(12px, -8px)"},{transform:"translate(-8px, -5px)"},{transform:"translate(9px, 6px)"},{transform:"translate(0, 0)"}],{duration:260,easing:"steps(5, end)"}),V&&(V.style.setProperty("--fling-x",`${260+Math.random()*260}px`),V.style.setProperty("--fling-y",`${-260-Math.random()*170}px`),V.style.setProperty("--fling-r",`${(Math.random()<.5?-1:1)*(52+Math.random()*38)}deg`),V.classList.add("flung")),window.setTimeout(()=>{ui(e,L),c(),ye()},340)}function $(L,V=null){if(L.type==="dud")return C(L,V);if(L.id==="extraCards")return M(L);if(L.type==="equipmentUpgrade"||L.type==="cellAction")return W(L);Oa(e,L),b(L)}function W(L){let V=dt(e,L);V.length&&(e.cardTargetPick={pending:!0,cardId:L.id,mode:L.target==="blockedCell"?"blockedCell":"equipment",targetKeys:V.map(Ot),remaining:L.id==="dynamite"?Math.min(10,V.length):1,used:0},t.modal.classList.remove("visible","equipment-popover"),o())}function K(L){if(!L||L.type!=="blockedCell")return!1;let V=E(L.col,L.row);if(!e.blockedCells?.has(V))return!1;e.blockedCells.delete(V);let se=B(L.col,L.row);return ct(e,se.x,se.y),gt(e,se.x,se.y,w.danger,62),$t(e,se.x,se.y,18,w.warn),Do(e,se.x,se.y,8),nn(e,16,.35),Y(e,se.x,se.y-18,"BOOM",w.danger),Ee(e),e.cardTargetPick.remaining=Math.max(0,(e.cardTargetPick.remaining||1)-1),e.cardTargetPick.used=Math.max(0,e.cardTargetPick.used||0)+1,e.cardTargetPick.targetKeys=dt(e,"dynamite").map(Ot),o(),!0}function G(L){if(!e.cardTargetPick?.pending)return!1;let V=an(e.cardTargetPick.cardId),se=su(e,L);return V?V.id==="dynamite"?(!se||!K(se)||((e.cardTargetPick.remaining||0)<=0||!dt(e,"dynamite").length)&&b(V),!0):se?(Fa(e,se),b(V),!0):(z(),!0):(z(),!0)}function z(){if(!e.cardTargetPick?.pending)return;let L=e.cardTargetPick,V=an(L.cardId);if(V?.id==="dynamite"&&(L.used||0)>0){b(V);return}e.cardTargetPick=null,ye()}function Q(){let L=Math.max(0,e.cardDraft?.freeRerolls||0);if(L>0){e.cardDraft.freeRerolls=L-1,e.cardDraft.rerolls+=1,a(sn),ye();return}let V=Ma(e);e.cash
Choose ${O} card${O===1?"":"s"} before Build phase. Dud cards can be flicked away without consuming a pick. Equipment cards target machines; Dynamite targets blocked cells.
`;let H=t.modalBody.querySelector("#cardChoices");L.forEach((Ve,xe)=>H.appendChild(ae(Ve,xe))),t.modalActions.innerHTML="";let oe=document.createElement("button");oe.type="button",oe.className="facility-action warn reroll-button",oe.textContent=se>0?`Reroll (FREE x${se})`:`Reroll ${R(V)}`,oe.disabled=se<=0&&e.cash0?`${se} free reroll${se===1?"":"s"} remaining.`:oe.disabled?"Not enough cash":"",oe.addEventListener("click",Q),t.modalActions.appendChild(oe);let ue=document.createElement("button");ue.type="button",ue.className="facility-action",ue.textContent="No Card",ue.title="Skip this upgrade pick and enter Build phase.",ue.addEventListener("click",i),t.modalActions.appendChild(ue),t.modal.classList.remove("equipment-popover"),t.modal.classList.add("visible")}return{prepareDraft:r,showDraft:ye,finishDraft:i,chooseTargetAtPoint:G,cancelTargetPick:z}}var lu=!0,cu={chickMale:"./assets/images/chick_male.png",chickFemale:"./assets/images/chick_female.png",poop:"./assets/images/poop.png",conveyorStraightH:"./assets/dark_factory/facilities/conveyor/conveyor_straight_h_16.png",conveyorStraightV:"./assets/dark_factory/facilities/conveyor/conveyor_straight_v_16.png",conveyorTurnNe:"./assets/dark_factory/facilities/conveyor/conveyor_turn_ne_16.png",conveyorTurnNw:"./assets/dark_factory/facilities/conveyor/conveyor_turn_nw_16.png",conveyorTurnSe:"./assets/dark_factory/facilities/conveyor/conveyor_turn_se_16.png",conveyorTurnSw:"./assets/dark_factory/facilities/conveyor/conveyor_turn_sw_16.png",boostConveyorStraightH:"./assets/dark_factory/facilities/conveyor/boost_conveyor_straight_h_16.png",boostConveyorStraightV:"./assets/dark_factory/facilities/conveyor/boost_conveyor_straight_v_16.png",boostConveyorTurnNe:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_ne_16.png",boostConveyorTurnNw:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_nw_16.png",boostConveyorTurnSe:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_se_16.png",boostConveyorTurnSw:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_sw_16.png",scannerManual:"./assets/dark_factory/facilities/machines/manual_scanner_32x48.png",scannerAuto:"./assets/dark_factory/facilities/machines/auto_scanner_32x48.png",eggFarm:"./assets/dark_factory/facilities/machines/egg_farm_16.png",mixer:"./assets/dark_factory/facilities/machines/mixer_32.png",shredder:"./assets/dark_factory/facilities/machines/shredder_32.png",truck:"./assets/dark_factory/facilities/vehicles/truck_32.png",maintenanceRoom:"./assets/dark_factory/facilities/utility/maintenance_room_32.png",repairman:"./assets/dark_factory/facilities/utility/repairman_16.png",obstacleCrate:"./assets/dark_factory/facilities/utility/obstacle_crate_16.png"},De={};for(let[e,t]of Object.entries(cu)){let n=new Image;n.loaded=!1,n.onerror=()=>{n.loaded=!1},lu&&t&&(n.onload=()=>{n.loaded=!0},n.src=t),De[e]=n}function bi(e){return e.frameCache||(e.frameCache={}),e.frameCache.draw||(e.frameCache.draw={}),e.frameCache.draw}function wi(e,t){let n=document.createElement("canvas");return n.width=Math.max(1,Math.ceil(e)),n.height=Math.max(1,Math.ceil(t)),n}function Ga(e,t,n,o){e.__gameRef=n,e.imageSmoothingEnabled=!1,e.clearRect(0,0,t.width,t.height),hu(e,t,n),e.save();let r=n.shake.time>0?ne(-n.shake.strength,n.shake.strength):0,i=n.shake.time>0?ne(-n.shake.strength,n.shake.strength):0,a=n.view?.scale||1;e.translate((n.view?.x||0)+r,(n.view?.y||0)+i),e.scale(a,a),vu(e,n),Su(e,n),Tu(e,n),Eu(e,n),Pu(e,n),Nu(e,n),Yu(e,n),Qu(e,n),Gu(e,n),Wu(e,n),du(e,n),od(e,n,o.activeQueuedChick),yd(e,n),ud(e,t,n),cd(e,n,o.selectedObject,o.selectedTitle),dd(e,n),fd(e,n),pd(e,n),e.restore(),bd(e,n,t)}function uu(e){if(e.type==="eggFarm"){let n=B(e.ref.col,e.ref.row);return{x:n.x-34,y:n.y-34,w:68,h:68,cx:n.x,cy:n.y}}let t=e.ref;return{x:t.x,y:t.y,w:t.w,h:t.h,cx:t.x+t.w/2,cy:t.y+t.h/2}}function du(e,t){if(t.phase!=="build")return;let n=vn(t);for(let o of n){let r=uu(o);e.save(),e.fillStyle="rgba(196,36,36,.22)",e.strokeStyle=w.danger,e.lineWidth=5,e.setLineDash([10,6]),ee(e,r.x,r.y,r.w,r.h,!0,!0),e.setLineDash([]),e.fillStyle=w.danger,e.strokeStyle=w.white,e.lineWidth=4,e.font="900 16px ui-monospace, monospace",e.textAlign="center",e.strokeText("!",r.cx,r.y+24),e.fillText("!",r.cx,r.y+24),e.font="900 11px ui-monospace, monospace",e.strokeText("NO ROUTE",r.cx,r.y+r.h-8),e.fillText("NO ROUTE",r.cx,r.y+r.h-8),e.restore()}}function ee(e,t,n,o,r,i=!0,a=!0){e.beginPath(),e.rect(t,n,o,r),i&&e.fill(),a&&e.stroke()}function oo(e,t,n,o,r=w.ink){e.save(),e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.lineWidth=4,e.strokeStyle=w.white,e.fillStyle=r,e.strokeText(o,t,n),e.fillText(o,t,n),e.restore()}function ln(e,t,n,o,r,i){if(!t?.loaded)return!1;let a=e.imageSmoothingEnabled;return e.imageSmoothingEnabled=!1,e.drawImage(t,Math.round(n),Math.round(o),Math.round(r),Math.round(i)),e.imageSmoothingEnabled=a,!0}function fu(e,t,n,o,r,i,a=null,c=1){e.fillStyle=i,e.fillRect(Math.round(t),Math.round(n),Math.round(o),Math.round(r)),a&&(e.strokeStyle=a,e.lineWidth=c,e.strokeRect(Math.round(t)+.5,Math.round(n)+.5,Math.round(o)-1,Math.round(r)-1))}function pu(e,t){let n=(Math.imul(e+37,73856093)^Math.imul(t+71,19349663))>>>0;return n^=n>>>13,n>>>0}function yu(e,t,n,o,r){let i=pu(o,r);if(i%67!==0)return;let a=10+(i>>>4)%Math.max(1,p.cell-22),c=10+(i>>>9)%Math.max(1,p.cell-22),b=(i>>>14)%16*Math.PI/16;e.save(),e.globalAlpha=.38,e.fillStyle="#4a8d37",e.strokeStyle="rgba(30,66,27,.34)",e.lineWidth=1,e.beginPath();for(let C=0;C<8;C+=1){let $=b+C*Math.PI/4,W=3.5+(i>>>C+2&3),K=t+a+Math.cos($)*W*1.35,G=n+c+Math.sin($)*W*.75;C===0?e.moveTo(K,G):e.lineTo(K,G)}e.closePath(),e.fill(),e.stroke();let M=4+(i>>>24)%5;for(let C=0;C>>C+8&3)*.18,W=10+(i>>>C+11&10),K=.9+(i>>>C+17&3)*.35;e.beginPath(),e.arc(t+a+Math.cos($)*W,n+c+Math.sin($)*W*.72,K,0,Math.PI*2),e.fill()}e.fillStyle="rgba(151,218,101,.26)",e.beginPath(),e.arc(t+a-2,n+c-2,1.7,0,Math.PI*2),e.fill(),e.restore()}function Da(e,t){e.fillStyle=w.bg,e.fillRect(0,0,t.width,t.height),e.save(),e.globalAlpha=.85;for(let n=0;na.col)),o=Math.max(...t.map(a=>a.col)),r=Math.min(...t.map(a=>a.row)),i=Math.max(...t.map(a=>a.row));return{x:p.x+n*p.cell-6,y:p.y+r*p.cell-6,w:(o-n+1)*p.cell+12,h:(i-r+1)*p.cell+12}}function vu(e,t){let n=bi(t),o=wu(t);if(!n.grid||n.grid.signature!==o){let a=mu(t),c=wi(a.w,a.h),b=c.getContext("2d");b.translate(-a.x,-a.y),bu(b,t),n.grid={signature:o,bounds:a,layer:c}}let{bounds:r,layer:i}=n.grid;e.drawImage(i,r.x,r.y)}function Su(e,t){if(t.phase!=="build"||t.cardDraft?.pending||t.cardTargetPick?.pending)return;let n=Co(t),o=t.cash>=n,r=i=>{let a=Et(i);return Object.values(t.facilities||{}).some(c=>{let b=c?.baseId||c?.id;return["mixer","trash","truck"].includes(b)?!(a.x+a.w<=c.x||c.x+c.w<=a.x||a.y+a.h<=c.y||c.y+c.h<=a.y):!1})};for(let i of jt(t)){let a=r(i),c=Et(i);e.save(),e.fillStyle=a?"rgba(112,130,118,.34)":o?"rgba(118,226,142,.36)":"rgba(255,255,255,.18)",e.strokeStyle=a?"#708278":o?"#6bd579":w.muted,e.lineWidth=5,e.setLineDash([16,10]),ee(e,c.x,c.y,c.w,c.h,!0,!0),e.setLineDash([]);let b=Tr(i),M=b.cx,C=b.cy;e.fillStyle="rgba(255,255,255,.94)",e.strokeStyle=w.ink,e.lineWidth=4,ee(e,b.x,b.y,b.w,b.h,!0,!0),e.fillStyle=a?"#7c9285":o?w.green:w.danger,e.font="900 16px ui-monospace, monospace",e.textAlign="center";let $=i.direction==="left"?"BUY LEFT LOT":i.direction==="right"?"BUY RIGHT LOT":i.direction==="down"?"BUY LOWER LOT":"BUY UPPER LOT";e.fillText($,M,C-12),e.fillStyle=w.ink,e.font="900 16px ui-monospace, monospace",e.fillText(`${R(n)} / 10\xD710`,M,C+15),e.restore()}}function Dt(e,t,n,o,r,i,a=0){let c=Pn(i);c<.5||(e.save(),e.globalAlpha=Math.min(.62,.12+c*.54),e.fillStyle="#6b4a23",a>0?(e.beginPath(),e.roundRect?.(t,n,o,r,a),e.roundRect?e.fill():ee(e,t,n,o,r,!0,!1)):ee(e,t,n,o,r,!0,!1),e.globalAlpha=Math.min(.9,.25+c*.6),e.strokeStyle="#3a2a16",e.lineWidth=Math.max(2,Math.floor(2+c*5)),e.setLineDash([5,6]),ee(e,t+3,n+3,o-6,r-6,!1,!0),e.restore())}function yi(e,t){let n=e.componentLookup?.get(t);return(n?e.congestion.get(n):null)?.ratio||0}function ku(e,t,n={}){let o=ro(e,t).sort(),i=n.kind==="boostConveyor"?"boostConveyor":"conveyor",a=c=>o.includes(c);if(o.length===2){if(a("left")&&a("right"))return De[`${i}StraightH`];if(a("up")&&a("down"))return De[`${i}StraightV`];if(a("up")&&a("right"))return De[`${i}TurnNe`];if(a("up")&&a("left"))return De[`${i}TurnNw`];if(a("down")&&a("right"))return De[`${i}TurnSe`];if(a("down")&&a("left"))return De[`${i}TurnSw`]}return o.length===1?a("up")||a("down")?De[`${i}StraightV`]:De[`${i}StraightH`]:a("up")||a("down")?De[`${i}StraightV`]:De[`${i}StraightH`]}function Mu(e){let t=Object.entries(De).filter(([o])=>o.includes("conveyor")||o.includes("Conveyor")).map(([o,r])=>`${o}:${r.loaded?1:0}`).join("|"),n=[...e.conveyorTiles].sort().map(o=>{let r=e.conveyorMeta.get(o)||{};return`${o}:${r.kind||""}:${r.dir||""}:${(r.outDirs||[]).join(",")}:${r.branchMode||""}`}).join("|");return`${e.routingVersion||0};${t};${n}`}function Cu(e){if(!e.conveyorTiles?.size)return{x:0,y:0,w:1,h:1};let t=[...e.conveyorTiles].map(X),n=Math.min(...t.map(a=>a.col)),o=Math.max(...t.map(a=>a.col)),r=Math.min(...t.map(a=>a.row)),i=Math.max(...t.map(a=>a.row));return{x:p.x+n*p.cell-36,y:p.y+r*p.cell-36,w:(o-n+1)*p.cell+72,h:(i-r+1)*p.cell+72}}function gu(e){let t=[],n=new Set;for(let i of e.conveyorTiles){let{col:a,row:c}=X(i);for(let b of fe){let M={col:a+b.dc,row:c+b.dr},C=E(M.col,M.row);if(!e.conveyorTiles.has(C))continue;let $=[i,C].sort().join("|");n.has($)||(n.add($),t.push({fromKey:i,toKey:C,a:B(a,c),b:B(M.col,M.row)}))}}let o=Bu(e),r=[...e.conveyorTiles].map(i=>{let a=X(i),c=B(a.col,a.row),b=e.conveyorMeta.get(i)||{},M=ro(e,i);return{k:i,c,meta:b,connectedDirs:M,branchDirs:Au(e,i,M),markers:o.get(i)||[],sprite:ku(e,i,b)}});return{edges:t,tiles:r}}function xu(e,t){e.save(),e.lineCap="round",e.lineJoin="round";for(let n of[{width:31,color:"#0b0c0f",alpha:1},{width:23,color:"#444b56",alpha:1},{width:15,color:"#171a1f",alpha:1}]){e.globalAlpha=n.alpha,e.strokeStyle=n.color,e.lineWidth=n.width;for(let o of t.edges)e.beginPath(),e.moveTo(o.a.x,o.a.y),e.lineTo(o.b.x,o.b.y),e.stroke()}e.globalAlpha=1;for(let n of t.tiles){let{c:o,meta:r,sprite:i}=n;e.fillStyle="rgba(0,0,0,.35)",e.strokeStyle="rgba(255,184,39,.34)",e.lineWidth=1,ee(e,o.x-20,o.y-20,40,40,!0,!0),ln(e,i,o.x-19,o.y-19,38,38)||(e.fillStyle=r.kind==="boostConveyor"?"#315e92":"#454b55",e.strokeStyle=w.ink,e.lineWidth=2,ee(e,o.x-18,o.y-18,36,36,!0,!0))}e.restore()}function Tu(e,t){let n=bi(t),o=Mu(t);if(!n.conveyors||n.conveyors.signature!==o){let c=gu(t),b=Cu(t),M=wi(b.w,b.h),C=M.getContext("2d");C.translate(-b.x,-b.y),xu(C,c),n.conveyors={signature:o,bounds:b,layer:M,data:c}}let{bounds:r,layer:i,data:a}=n.conveyors;e.drawImage(i,r.x,r.y),e.save(),e.lineCap="round",e.lineJoin="round";for(let c of a.edges){let b=Math.max(yi(t,c.fromKey),yi(t,c.toKey)),M=Math.max(0,(b-.5)/.5);e.strokeStyle=qn(w.green,w.danger,M),e.globalAlpha=b>.5?.35+M*.55:.8,e.lineWidth=6,e.beginPath(),e.moveTo(c.a.x,c.a.y),e.lineTo(c.b.x,c.b.y),e.stroke()}e.globalAlpha=1;for(let c of a.tiles){let{k:b,c:M,meta:C}=c,$=yi(t,b);$>.5&&(e.fillStyle="rgba(196,36,36,.28)",e.strokeStyle=w.danger,e.lineWidth=3,ee(e,M.x-20,M.y-20,40,40,!0,!0)),Ru(e,t,M,b,C,$),Dt(e,M.x-18,M.y-18,36,36,{meta:C}),ft(e,t,"conveyor",b,M.x,M.y,38,38),Du(e,M,c.markers),Fu(e,M,C,c.branchDirs,c.connectedDirs),$>.5&&oo(e,M.x,M.y-15,`${Math.floor($*100)}%`,w.danger)}e.restore()}function Eu(e,t){if(t.powerWires?.size){e.save();for(let[n,o]of t.powerWires){let r=X(n),i=B(r.col,r.row),a=o.kind==="insulatedPowerWire";e.globalAlpha=t.powerOverlay||t.phase==="build"?.95:.32,e.strokeStyle=a?"#d7eef7":"#1e252b",e.lineWidth=a?8:5,e.lineCap="round",e.beginPath(),e.moveTo(i.x-15,i.y),e.lineTo(i.x+15,i.y),e.moveTo(i.x,i.y-15),e.lineTo(i.x,i.y+15),e.stroke(),e.strokeStyle=a?"#2c8ec4":"#f3c33d",e.lineWidth=a?3:2,e.stroke(),t.powerOverlay&&oo(e,i.x,i.y-14,a?"I":"V",a?"#2c8ec4":w.warn)}e.restore()}}function Pu(e,t){if(t.footbridges?.size){e.save();for(let n of t.footbridges.keys()){let o=X(n),r=B(o.col,o.row);e.fillStyle="rgba(210,222,228,.52)",e.strokeStyle="#e6edf2",e.lineWidth=3,ee(e,r.x-20,r.y-14,40,28,!0,!0),e.strokeStyle="#34404a",e.lineWidth=2,e.beginPath(),e.moveTo(r.x-18,r.y-9),e.lineTo(r.x+18,r.y-9),e.moveTo(r.x-18,r.y+9),e.lineTo(r.x+18,r.y+9),e.stroke(),ft(e,t,"footbridge",n,r.x,r.y,44,34)}e.restore()}}function Ru(e,t,n,o,r={},i=0){let a=r.kind==="boostConveyor",b=[...new Set([...Array.isArray(r.outDirs)?r.outDirs:[],r.dir].filter(Boolean))][0]||"right",M=b==="up"||b==="down",C=b==="left"||b==="up",$=Vt(t,o)*eo(t,o),K=(typeof performance<"u"?performance.now()/1e3:0)*$,G=((C?-K:K)%10+10)%10;e.save(),e.beginPath(),e.rect(n.x-18,n.y-18,36,36),e.clip();let z=a?"rgba(20,126,124,.62)":"rgba(42,47,54,.72)";if(e.fillStyle=z,e.fillRect(n.x-18,n.y-18,36,36),e.strokeStyle=i>.5?"rgba(238,83,61,.90)":"rgba(184,190,198,.92)",e.lineWidth=4,M)for(let Q=n.y-28+G;Qe.conveyorTiles.has(E(n.col+o.dc,n.row+o.dr))).map(o=>o.name)}function Wa(e,t,n){let o=fe.find(a=>a.name===n);if(!o)return!1;let r=e.conveyorMeta?.get?.(E(t.col+o.dc,t.row+o.dr));return r?[...new Set([...Array.isArray(r.outDirs)?r.outDirs:[],r.dir].filter(Boolean))].includes(o.opposite):!1}function Ua(e,t,n,o=ro(e,t)){if(o.length<3)return n;let r=X(t),i=new Set(o.filter(b=>Wa(e,r,b))),a=o.filter(b=>!i.has(b));if(i.size)return a;let c=n.filter(b=>o.includes(b));return c.length>=2?[...new Set(c)]:o}function Iu(e,t,n,o=ro(e,t),r="random"){let i=Ua(e,t,n,o);return o.length>=3&&r&&r!=="random"&&i.includes(r)?[r]:i}function Au(e,t,n=ro(e,t)){let o=e.conveyorMeta?.get?.(t)||{},r=[...new Set([...Array.isArray(o.outDirs)?o.outDirs:[],o.dir].filter(Boolean))];return n.length<3?[]:Ua(e,t,r,n)}function $u(e,t,n){let o=X(t),r=fe.filter(c=>e.conveyorTiles.has(E(o.col+c.dc,o.row+c.dr))).map(c=>c.name),i=[...new Set([...Array.isArray(n.outDirs)?n.outDirs:[],n.dir].filter(Boolean))].filter(c=>r.includes(c));if(r.length===1&&(!i.length||i.includes(r[0]))&&Wa(e,o,r[0]))return[];let a=r;return i.length?i:a}function Fu(e,t,n,o,r=o){if(r.length<3||o.length<2)return;e.save();let i=o.includes(n.branchMode)?n.branchMode:"random",a=i!=="random";if(e.lineJoin="round",e.lineCap="round",e.lineWidth=2,e.fillStyle="rgba(18,21,26,.94)",e.strokeStyle=a?w.warn:w.green,e.lineWidth=4,ee(e,t.x-18,t.y-18,36,36,!0,!0),e.strokeStyle="#ffd36a",e.lineWidth=3,e.fillStyle="#020304",i!=="random"){let c=fe.find(b=>b.name===i);no(e,t.x,t.y-4,c?.angle||0,8,5)}else e.beginPath(),e.moveTo(t.x-10,t.y),e.lineTo(t.x-2,t.y),e.lineTo(t.x+8,t.y-8),e.moveTo(t.x-2,t.y),e.lineTo(t.x+8,t.y+8),e.stroke(),no(e,t.x+9,t.y-9,-Math.PI/4,4,3),no(e,t.x+9,t.y+9,Math.PI/4,4,3);i==="random"&&(e.font="900 9px ui-monospace, monospace",e.textAlign="center",e.textBaseline="middle",e.lineWidth=3,e.strokeStyle="#020304",e.fillStyle=w.warn,e.strokeText("RND",t.x,t.y+11),e.fillText("RND",t.x,t.y+11)),e.restore()}function Ou(e,t,n){if(!n)return[];let o=X(t),r=fe.filter(c=>e.conveyorTiles.has(E(o.col+c.dc,o.row+c.dr))).map(c=>c.name),i=[...new Set([...Array.isArray(n.outDirs)?n.outDirs:[],n.dir].filter(Boolean))].filter(c=>r.includes(c));return Iu(e,t,i.length?i:$u(e,t,n),r,n.branchMode||"random").map(c=>fe.find(b=>b.name===c)).filter(Boolean)}function Bu(e){let t=new Map;for(let[n,o]of e.conveyorMeta||[]){let r=Ou(e,n,o);r.length&&t.set(n,r)}return t}function Du(e,t,n){let o=n.slice(0,4);o.length&&(e.save(),e.globalAlpha=1,o.forEach(r=>{let i=t.x+r.dc*11,a=t.y+r.dr*11;e.fillStyle="rgba(255,205,83,.96)",no(e,i,a,r.angle,9,7),e.fillStyle="#020304",no(e,i,a,r.angle,6.5,4.6)}),e.restore())}function no(e,t,n,o,r=11,i=8){e.save(),e.translate(t,n),e.rotate(o),e.beginPath(),e.moveTo(r,0),e.lineTo(-r*.72,-i),e.lineTo(-r*.72,i),e.closePath(),e.fill(),e.restore()}function Lu(e,t,n,o,r){let i=ge(t),a=null;if(n==="inputA"&&(a={x:i.x,y:i.y-40}),n==="left"&&(a={x:i.x-42,y:i.y+10}),n==="right"&&(a={x:i.x+42,y:i.y+10}),!a)return;let c=n==="inputA"?{x:o.x,y:a.y}:{x:a.x,y:o.y};e.save(),e.lineCap="square",e.lineJoin="bevel",e.strokeStyle="#050609",e.lineWidth=15,e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(c.x,c.y),e.lineTo(a.x,a.y),e.stroke(),e.strokeStyle="#596473",e.lineWidth=9,e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(c.x,c.y),e.lineTo(a.x,a.y),e.stroke(),e.strokeStyle=r||"#7b8795",e.lineWidth=3,e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(c.x,c.y),e.lineTo(a.x,a.y),e.stroke(),e.fillStyle=r||"#7b8795",e.strokeStyle="#050609",e.lineWidth=3,ee(e,a.x-9,a.y-7,18,14,!0,!0),e.restore()}function Nu(e,t){e.save(),e.lineWidth=2,e.font="900 12px ui-monospace, monospace",e.textAlign="center";for(let n of t.scanners){let o=Br(n),r=[{type:"inputA",p:We(n,"inputA"),label:"IN",color:w.green},{type:"left",p:We(n,"left"),label:Lr(o.left),color:Nr(o.left)},{type:"right",p:We(n,"right"),label:Lr(o.right),color:Nr(o.right)}];for(let i of r){if(!i.p)continue;let a=B(i.p.col,i.p.row);Lu(e,n,i.type,a,i.color);let c=us(t,n,i.type||(i.label==="IN"?"inputA":null))||t.conveyorTiles.has(E(i.p.col,i.p.row));e.fillStyle=c?qn("#1a1d23",i.color,.24):"#3a1e22",e.strokeStyle=c?i.color:w.danger,ee(e,a.x-18,a.y-12,36,24,!0,!0),e.fillStyle=w.white,e.fillText(i.label,a.x,a.y+4)}}e.restore()}function Gu(e,t){for(let n of t.eggFarms)_u(e,n,t)}function _u(e,t,n){let o=B(t.col,t.row);e.save(),e.fillStyle="#5a6470",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,o.x-27,o.y-27,54,54,!0,!0),e.fillStyle="#6f5130",e.strokeStyle="#2f2112",e.lineWidth=3,e.beginPath(),e.ellipse(o.x,o.y+3,19,12,0,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle="#a77b4b",e.lineWidth=2;for(let c=-16;c<=16;c+=6)e.beginPath(),e.moveTo(o.x-18,o.y+c*.1),e.quadraticCurveTo(o.x+c,o.y-10+Math.abs(c)*.2,o.x+18,o.y+c*.08),e.stroke();let r=[{x:-8,y:1},{x:0,y:-3},{x:8,y:2}];for(let c of r)e.fillStyle="#e8e2cf",e.strokeStyle="#8d8475",e.lineWidth=1.5,e.beginPath(),e.ellipse(o.x+c.x,o.y+c.y,4.8,6.2,.2,0,Math.PI*2),e.fill(),e.stroke();let i=1+Math.max(0,Number(t.extraEggOutlet)||0);e.fillStyle="rgba(255,255,255,.92)",e.strokeStyle=w.ink,e.lineWidth=2,ee(e,o.x+8,o.y+11,30,18,!0,!0),e.fillStyle=w.ink,e.font="900 10px ui-monospace, monospace",e.textAlign="center",e.fillText(`O${i}`,o.x+23,o.y+23),e.fillStyle="#d5e35a",e.font="900 9px ui-monospace, monospace",e.fillText(`L${t.level}`,o.x-13,o.y-15);let a=Math.max(0,Math.min(1,t.shutterProgress||0));if(a>0){let c=54*a;e.fillStyle="rgba(10,12,15,.86)",ee(e,o.x-27,o.y-27,54,c,!0,!1),e.strokeStyle="rgba(230,237,242,.64)",e.lineWidth=2;for(let b=o.y-23;b=1&&(e.fillStyle=w.white,e.font="900 12px ui-monospace, monospace",e.fillText("SHUT",o.x,o.y+4))}Dt(e,o.x-28,o.y-28,56,56,t),ft(e,n,"eggFarm",t.id,o.x,o.y,68,68),e.restore()}function Wu(e,t){for(let n of t.scanners)Uu(e,n,t)}function Uu(e,t,n){let o=ge(t);if(e.save(),t.kind==="manual"&&(n.manualCombo?.count||0)>=10){let b=n.manualCombo.count;e.save(),e.globalAlpha=Math.min(.55,.16+b/120),e.strokeStyle=b>=30?w.warn:w.green,e.lineWidth=Math.min(12,4+Math.floor(b/10)),e.shadowColor=e.strokeStyle,e.shadowBlur=Math.min(24,8+b),ee(e,o.x-48,o.y-48,96,96,!1,!0),e.restore()}let r=t.kind==="auto"?De.scannerAuto:De.scannerManual;if(ln(e,r,o.x-44,o.y-44,88,88)){t.kind==="auto"?Dt(e,o.x-44,o.y-44,88,88,t):La(e,t,o),ft(e,n,"scanner",t.id,o.x,o.y,96,96),e.restore();return}e.fillStyle=t.kind==="auto"?"#d8ffe2":w.white,e.strokeStyle=w.ink,e.lineWidth=4,ee(e,o.x-44,o.y-44,88,88,!0,!0),e.fillStyle=t.kind==="auto"?w.green:w.ink,e.font="900 16px ui-monospace, monospace",e.textAlign="center",e.fillText(t.kind==="auto"?"AUTO":`S${(t.slot??0)+1}`,o.x,o.y-24),e.font="900 9px ui-monospace, monospace";let i=t.keys?.left?.label||(t.slot===0?"A":"Left"),a=t.keys?.right?.label||(t.slot===0?"D":"Right");e.fillText(t.kind==="auto"?"2.1 FARMS":`${i}/${a}`,o.x,o.y-8);let c=t.queue.length;t.kind==="manual"?La(e,t,o):(e.fillStyle=c>0?w.green:w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`Q:${c} CD:${t.cooldown.toFixed(1)}`,o.x,o.y+35),Dt(e,o.x-44,o.y-44,88,88,t)),ft(e,n,"scanner",t.id,o.x,o.y,96,96),e.restore()}function La(e,t,n){if(t.kind!=="manual")return;let r=(t.slot??0)===0?[{side:"left",text:"A"},{side:"right",text:"D"}]:[{side:"left",text:"\u2190"},{side:"right",text:"\u2192"}];r[0].text=t.keys?.left?.label||r[0].text,r[1].text=t.keys?.right?.label||r[1].text;let i=t.keyPressTime>0?t.keyPressSide:null,a=n.x-30,c=n.y+8;e.save(),e.lineWidth=3,e.fillStyle="#f7fff5",e.strokeStyle=w.ink,ee(e,a-4,c-4,68,25,!0,!0),e.font="900 19px ui-monospace, monospace",e.textAlign="center";for(let b=0;b MEAT","meat","connect OUT to sausage machine"),Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function ed(e,t,n=t.facilities.trash){e.save(),er(e,n),cn(e,n.x,n.y,n.w,n.h,"#29342d",w.ink,w.wasteGreen),$n(e,n,w.wasteGreen),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`SHREDDER L${n.level}`,n.x+14,n.y+18),e.fillStyle="#181d20",e.strokeStyle="#9fd473",e.lineWidth=4,ee(e,n.x+38,n.y+36,92,22,!0,!0),e.fillStyle="#262d30",e.strokeStyle="#0d1014",ee(e,n.x+46,n.y+58,76,18,!0,!0),e.fillStyle="#111418";for(let o=0;o<7;o+=1){let r=n.x+51+o*10;e.beginPath(),e.moveTo(r,n.y+58),e.lineTo(r+5,n.y+68),e.lineTo(r+10,n.y+58),e.closePath(),e.fill()}e.fillStyle="#6f7e8d",ee(e,n.x+54,n.y+27,16,9,!0,!0),ee(e,n.x+98,n.y+27,16,9,!0,!0),Jo(e,n.x+14,n.y+n.h-42,n.w-28,"SEND POOP","poop","shredder"),Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function td(e,t,n){e.save(),cn(e,n.x,n.y,n.w,n.h,"#3b3029",w.ink,w.sausageOrange),$n(e,n,w.sausageOrange),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`SAUSAGE L${n.level}`,n.x+14,n.y+18),e.fillStyle=w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`2 MEAT -> 1 | ${R(lt(t))}`,n.x+14,n.y+34),e.fillStyle="#211915",e.strokeStyle=w.sausageOrange,e.lineWidth=4,ee(e,n.x+20,n.y+43,n.w-40,38,!0,!0);for(let o=0;o<3;o+=1)tr(e,n.x+n.w/2-28+o*28,n.y+62,9);e.fillStyle=w.meatRed,e.fillRect(n.x,n.y+n.h/2-8,8,16),e.fillStyle=w.sausageOrange,e.fillRect(n.x+n.w-8,n.y+n.h/2-8,8,16),Jo(e,n.x+10,n.y+n.h-42,n.w-20,"2 MEAT -> SAUSAGE","sausage",`buffer ${n.meatBuffer||0}/2`),Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function nd(e,t,n=t.facilities.truck){e.save(),er(e,n),cn(e,n.x,n.y,n.w,n.h,"#343128",w.ink,w.truckPink),$n(e,n,w.truckPink),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`SHIP TRUCK L${n.level}`,n.x+14,n.y+18),e.fillStyle=w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`UNIT ${R(Je(t))}`,n.x+14,n.y+34),zu(e,De.truck,n,2);let o=hi(t);Jo(e,n.x+15,n.y+50,n.w-30,`SEND ${o.toUpperCase()}`,o,t.eventOffer&&!t.eventActive?"next event":"truck cargo"),e.fillStyle="rgba(39,60,36,.9)",ee(e,n.x+13,n.y+88,n.w-26,Math.max(18,n.h-103),!0,!1);for(let r of t.truckCargo)r.sex==="poop"?Va(e,n.x+r.x,n.y+r.y):r.sex==="sausage"?tr(e,n.x+r.x,n.y+r.y,7):Si(e,n.x+r.x,n.y+r.y,r.sex,r.sex==="male");Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function od(e,t,n){let o=n(0),r=n(1);for(let i of t.chicks){let a=o&&o.id===i.id||r&&r.id===i.id||i.queueIndex===0;rd(e,i,a,t)}}function rd(e,t,n,o){let r=o.componentLookup&&id(o,t)>.8,i=t.y+Math.sin(t.bob)*(r?5:1.5);if(e.save(),n&&(e.strokeStyle=w.green,e.lineWidth=5,e.beginPath(),e.arc(t.x,i,t.radius+8,0,Math.PI*2),e.stroke()),r&&(e.strokeStyle=w.danger,e.lineWidth=3,e.beginPath(),e.arc(t.x,i,t.radius+12+Math.sin(t.bob*2)*4,0,Math.PI*2),e.stroke()),t.sex==="poop")vi(e,t.x,i,t.radius);else if(t.sex==="meat")Ka(e,t.x,i,t.radius);else if(t.sex==="sausage")tr(e,t.x,i,t.radius);else if(t.sex==="coal")sd(e,t.x,i,t.radius);else if(t.sex==="zundaMochi")ad(e,t.x,i,t.radius);else{let a=t.sex==="male"?De.chickMale:De.chickFemale;if(!ln(e,a,t.x-t.radius,i-t.radius,t.radius*2,t.radius*2)){let M=t.sex==="male"?w.male:w.female,C=t.sex==="male"?"#164f8f":"#8b2252";e.fillStyle=M,e.strokeStyle=w.ink,e.lineWidth=5,e.beginPath(),e.arc(t.x,i,t.radius,0,Math.PI*2),e.fill(),e.stroke(),e.fillStyle="rgba(255,255,255,.24)",e.beginPath(),e.arc(t.x-5,i-7,t.radius*.36,0,Math.PI*2),e.fill(),e.fillStyle=w.ink,e.beginPath(),e.arc(t.x-6,i-5,2.5,0,Math.PI*2),e.arc(t.x+6,i-5,2.5,0,Math.PI*2),e.fill(),e.fillStyle="#ffaa2e",e.beginPath(),e.moveTo(t.x,i+2),e.lineTo(t.x+9,i+6),e.lineTo(t.x,i+10),e.closePath(),e.fill(),e.strokeStyle=C,e.lineWidth=3,t.sex==="male"?(e.beginPath(),e.moveTo(t.x-8,i-t.radius-2),e.lineTo(t.x+8,i-t.radius-2),e.stroke()):(e.beginPath(),e.moveTo(t.x-9,i-t.radius+2),e.lineTo(t.x,i-t.radius-6),e.lineTo(t.x+9,i-t.radius+2),e.stroke())}e.fillStyle=t.sex==="male"?"#dff1ff":"#fff0f7",e.strokeStyle="#050609",e.lineWidth=3,e.font=`900 ${Math.max(10,Math.round(t.radius*.72))}px ui-monospace, monospace`,e.textAlign="center";let b=t.sex==="male"?"\u2642":"\u2640";e.strokeText(b,t.x+t.radius*.54,i+t.radius*.7),e.fillText(b,t.x+t.radius*.54,i+t.radius*.7)}e.restore()}function id(e,t){let n=null,o=1/0;for(let[r,i]of e.componentLookup.entries()){let a=X(r),c=B(a.col,a.row),b=Math.hypot(t.x-c.x,t.y-c.y);bNa(o.type,o.id)===Na(t,n))}function ft(e,t,n,o,r,i,a,c){ld(t,n,o)&&(e.save(),e.fillStyle="rgba(34,185,79,.18)",e.strokeStyle=w.green,e.lineWidth=(t.multiSelected||[]).length>1?6:4,e.setLineDash((t.multiSelected||[]).length>1?[]:[8,5]),ee(e,r-a/2,i-c/2,a,c,!0,!0),e.restore())}function cd(e,t,n,o){if(t.phase==="build"&&(t.multiSelected||[]).length>1){e.save(),e.fillStyle="rgba(255,255,255,.96)",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,54-t.view.x,66-t.view.y,214,42,!0,!0),e.fillStyle=w.ink,e.font="900 11px ui-monospace, monospace",e.fillText(`${t.multiSelected.length} ITEMS SELECTED`,65-t.view.x,83-t.view.y),e.fillStyle=w.muted,e.font="900 11px ui-monospace, monospace",e.fillText("drag any selected item to move group",65-t.view.x,99-t.view.y),e.restore();return}}function ud(e,t,n){if(!n.cardTargetPick?.pending)return;let o=pi(n);e.save(),e.fillStyle="rgba(0,0,0,.66)",e.beginPath();let r=n.view?.scale||1;e.rect(-(n.view?.x||0)/r,-(n.view?.y||0)/r,t.width/r,t.height/r);for(let M of o){let C=M.bounds,$=8;e.rect(C.x-$,C.y-$,C.w+$*2,C.h+$*2)}e.fill("evenodd");let i=n.cardTargetPick?.mode==="blockedCell";if(!o.length){e.fillStyle="rgba(255,255,255,.95)",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,(260-(n.view?.x||0))/r,(96-(n.view?.y||0))/r,420/r,42/r,!0,!0),e.fillStyle=w.danger,e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.fillText(i?"NO BLOCKED CELL. PRESS ESC.":"NO VALID UPGRADE TARGET. PRESS ESC.",(470-(n.view?.x||0))/r,(122-(n.view?.y||0))/r),e.restore();return}e.fillStyle="rgba(255,255,255,.95)",e.strokeStyle=w.ink,e.lineWidth=3;let a=Math.max(1,n.cardTargetPick?.remaining||1),c=Math.max(0,n.cardTargetPick?.used||0),b=n.cardTargetPick?.mode==="autoScannerMenu"?"AUTO SCANNER ROUTE SETTINGS. CLICK EMPTY AREA TO CLOSE.":i?`DYNAMITE: CLICK ANY BLOCKED TILE (${a} LEFT). ESC ${c>0?"FINISHES":"CANCELS"}.`:"CLICK AN UPGRADEABLE MACHINE. PRESS ESC TO CANCEL.";ee(e,(216-(n.view?.x||0))/r,(96-(n.view?.y||0))/r,560/r,42/r,!0,!0),e.fillStyle=w.ink,e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.fillText(b,(496-(n.view?.x||0))/r,(122-(n.view?.y||0))/r),e.restore()}function dd(e,t){if(t.phase!=="build"||!t.selectionBox)return;let n=t.selectionBox,o=Math.min(n.x1,n.x2),r=Math.min(n.y1,n.y2),i=Math.abs(n.x2-n.x1),a=Math.abs(n.y2-n.y1);e.save(),e.fillStyle="rgba(34,185,79,.12)",e.strokeStyle=w.green,e.lineWidth=2,e.setLineDash([7,4]),ee(e,o,r,i,a,!0,!0),e.restore()}function fd(e,t){let n=[...t.effects].sort((o,r)=>(o.priority??_e.ambient)-(r.priority??_e.ambient));for(let o of n){let r=Math.max(0,o.life/o.maxLife);e.save(),e.globalAlpha=r,o.type==="meat"?(e.fillStyle=w.green,ee(e,o.x-o.size/2,o.y-o.size/2,o.size*1.5,o.size,!0,!1)):o.type==="sludge"?(e.fillStyle=w.poop,ee(e,o.x-o.size/2,o.y-o.size/2,o.size*1.4,o.size,!0,!1)):o.type==="spawn"?(e.strokeStyle=w.green,e.lineWidth=3,e.beginPath(),e.arc(o.x,o.y,o.size+(1-r)*20,0,Math.PI*2),e.stroke()):o.type==="spark"?(e.fillStyle=o.color||w.danger,ee(e,o.x-o.size/2,o.y-o.size/2,o.size,o.size,!0,!1)):o.type==="smoke"?(e.fillStyle="rgba(16,32,21,.24)",e.beginPath(),e.arc(o.x,o.y,o.size*(1.2-r*.2),0,Math.PI*2),e.fill()):o.type==="shockwave"?(e.strokeStyle=o.color||w.danger,e.lineWidth=4,e.beginPath(),e.arc(o.x,o.y,o.size+(1-r)*(o.maxSize||44),0,Math.PI*2),e.stroke()):o.type==="scannerPulse"?(e.strokeStyle=o.color||w.green,e.lineWidth=5,e.setLineDash([8,6]),e.beginPath(),e.arc(o.x,o.y,o.size+(1-r)*38,0,Math.PI*2),e.stroke()):o.type==="shred"?(e.fillStyle=o.color||w.ink,e.save(),e.translate(o.x,o.y),e.rotate(o.rot||0),ee(e,-o.w/2,-o.h/2,o.w,o.h,!0,!1),e.restore()):o.type==="load"?(e.strokeStyle=o.color||w.green,e.lineWidth=3,e.beginPath(),e.moveTo(o.x-14,o.y),e.lineTo(o.x+14,o.y),e.moveTo(o.x,o.y-14),e.lineTo(o.x,o.y+14),e.stroke()):o.type==="erase"?(e.strokeStyle=w.ink,e.lineWidth=3,e.setLineDash([4,4]),ee(e,o.x-o.size/2,o.y-o.size/2,o.size,o.size,!1,!0)):o.type==="rage"?(e.fillStyle=o.color||w.danger,e.font="900 16px ui-monospace, monospace",e.textAlign="center",e.fillText("!",o.x,o.y)):o.type==="flyingChick"&&(o.sex==="poop"?vi(e,o.x,o.y,o.radius||11):Si(e,o.x,o.y,o.sex,o.sex==="male")),e.restore()}}function pd(e,t){e.save(),e.font="900 19px ui-monospace, monospace",e.textAlign="center";for(let n of t.floatingTexts){let o=Math.max(0,n.life/n.maxLife);e.globalAlpha=o,e.lineWidth=5,e.strokeStyle=w.white,e.fillStyle=n.color,e.strokeText(n.text,n.x,n.y),e.fillText(n.text,n.x,n.y)}e.restore()}function yd(e,t){let n=t.repairmen&&t.repairmen.length?t.repairmen:t.repairman?[t.repairman]:[];for(let o of n)hd(e,t,o)}function hd(e,t,n){if(!!!n?.active)return;if(e.save(),ln(e,De.repairman,n.x-18,n.y-18,36,36)){n.target?.label&&oo(e,n.x,n.y-24,n.target.label,w.green),e.restore();return}e.lineWidth=3,e.fillStyle="#fff0d1",e.strokeStyle=w.ink,e.beginPath(),e.arc(n.x,n.y,17,0,Math.PI*2),e.fill(),e.stroke(),e.fillStyle="#ffd6e7",e.beginPath(),e.arc(n.x-6,n.y-2,3.2,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(n.x+6,n.y-2,3.2,0,Math.PI*2),e.fill();let r=!!t.cardEffects?.laborExploitation;e.fillStyle=r?w.danger:w.ink,e.beginPath(),e.arc(n.x-5,n.y-5,r?2.8:2.2,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(n.x+5,n.y-5,r?2.8:2.2,0,Math.PI*2),e.fill(),e.strokeStyle=w.ink,e.lineWidth=r?3:2,e.beginPath(),e.arc(n.x,n.y+(r?0:1),r?8:7,.1*Math.PI,.9*Math.PI),e.stroke(),e.fillStyle=w.green,ee(e,n.x-9,n.y+14,18,8,!0,!0),e.strokeStyle=w.ink,e.lineWidth=3,e.beginPath(),e.moveTo(n.x-11,n.y+18),e.lineTo(n.x-20,n.y+24),e.stroke(),e.beginPath(),e.moveTo(n.x+11,n.y+18),e.lineTo(n.x+20,n.y+24),e.stroke(),e.fillStyle=w.ink,e.font="900 11px ui-monospace, monospace",e.textAlign="center",e.fillText("FIX",n.x,n.y+33),n.target?.label&&oo(e,n.x,n.y-24,n.target.label,w.green),e.restore()}function bd(e,t,n){e.save(),e.font="900 19px ui-monospace, monospace",e.textAlign="left",e.fillStyle=w.ink,e.font="900 19px ui-monospace, monospace",e.fillStyle=w.ink;let o=[];t.phase==="running"&&o.push(t.timeLeft<=0?"TIME UP: FARMS SHUT. CLEAR LINE.":"A/D: S1 \u2190/\u2192: S2"),t.phase==="build"&&o.push(`BUILD: ${t.buildTool||"SELECT"} | connect 1 EGG route to any exit`);let r=76;for(let i of o)e.strokeStyle=w.white,e.lineWidth=4,e.strokeText(i,24,r),e.fillText(i,24,r),r+=20;e.restore()}function qa({game:e,canvasPoint:t,updatePanels:n,equipmentAtPoint:o,fail:r,pointInGrid:i,rectOfFacility:a,rectsOverlap:c}){function b(x){return x?x.type==="conveyor"?`conveyor:${x.id||x.oldKey}`:x.type==="facility"?`facility:${x.id||x.ref?.id}`:x.type==="maintenanceRoom"?`maintenanceRoom:${x.id||x.ref?.id}`:`${x.type}:${x.id||x.ref?.id}`:""}function M(x){return x?x.type==="conveyor"?{type:"conveyor",id:x.oldKey}:{type:x.type,id:x.ref.id}:null}function C(x){let g=b(M(x));return(e.multiSelected||[]).some(D=>b(D)===g)}function $(x){return x?x.type==="eggFarm"?e.eggFarms.find(g=>g.id===x.id)||null:x.type==="scanner"?e.scanners.find(g=>g.id===x.id)||null:x.type==="facility"?e.facilities[x.id]||null:x.type==="maintenanceRoom"?(e.maintenanceRooms||[]).find(g=>g.id===x.id)||null:x.type==="conveyor"?e.conveyorTiles.has(x.id)?{type:"conveyor",id:x.id}:null:x.type==="powerWire"?e.powerWires?.has(x.id)?{type:"powerWire",id:x.id}:null:x.type==="footbridge"&&e.footbridges?.has(x.id)?{type:"footbridge",id:x.id}:null:null}function W(){let x=[];for(let g of e.conveyorTiles){let D=X(g),Z=B(D.col,D.row);x.push({type:"conveyor",id:g,center:Z,cell:D})}if(e.powerOverlay)for(let[g]of e.powerWires||new Map){let D=X(g);x.push({type:"powerWire",id:g,center:B(D.col,D.row),cell:D})}for(let[g]of e.footbridges||new Map){let D=X(g);x.push({type:"footbridge",id:g,center:B(D.col,D.row),cell:D})}for(let g of e.eggFarms)x.push({type:"eggFarm",id:g.id,ref:g,center:B(g.col,g.row),cell:{col:g.col,row:g.row}});for(let g of e.scanners)x.push({type:"scanner",id:g.id,ref:g,center:ge(g),cell:{col:g.col,row:g.row}});for(let g of e.maintenanceRooms||[]){let D=B(g.col,g.row);x.push({type:"maintenanceRoom",id:g.id,ref:g,center:{x:D.x+p.cell/2,y:D.y+p.cell/2},cell:{col:g.col,row:g.row}})}for(let g of Object.values(e.facilities)){let D={x:g.x+g.w/2,y:g.y+g.h/2},Z=g.entry?B(g.entry.col,g.entry.row):D;x.push({type:"facility",id:g.id,ref:g,center:D,portCenter:Z})}return x}function K(x,g){let D=Math.min(g.x1,g.x2),Z=Math.max(g.x1,g.x2),j=Math.min(g.y1,g.y2),le=Math.max(g.y1,g.y2);return x.x>=D&&x.x<=Z&&x.y>=j&&x.y<=le}function G(x){let g=[];for(let D of W())(K(D.center,x)||D.portCenter&&K(D.portCenter,x))&&g.push({type:D.type,id:D.id});return e.multiSelected=g,e.selected=g[0]||null,n(),g.length}function z(){e.multiSelected=[],e.selected=null,n()}function Q(x){let g=t(x);return e.selectionBox={x1:g.x,y1:g.y,x2:g.x,y2:g.y},e.multiSelected=[],e.selected=null,n(),!0}function ie(x){if(!e.selectionBox)return;let g=t(x);e.selectionBox.x2=g.x,e.selectionBox.y2=g.y}function J(){if(!e.selectionBox)return 0;let x=e.selectionBox,g=Math.abs(x.x2-x.x1),D=Math.abs(x.y2-x.y1);return e.selectionBox=null,g<6&&D<6?(z(),0):G(x)}function ae(x){let g=M(x);return g?(e.multiSelected||[]).length&&C(x)?[...e.multiSelected]:[g]:[]}function ye(x){let g=$(x);if(!g)return null;if(x.type==="conveyor"){let D=X(x.id);return{...x,obj:g,oldKey:x.id,currentKey:x.id,meta:e.conveyorMeta.get(x.id)||{price:Le("conveyor"),builtSession:null},col:D.col,row:D.row}}if(x.type==="powerWire"){let D=X(x.id);return{...x,obj:g,oldKey:x.id,currentKey:x.id,meta:{...e.powerWires?.get(x.id)||{}},col:D.col,row:D.row}}if(x.type==="footbridge"){let D=X(x.id),Z=e.footbridges?.get(x.id)||{},j=[];for(let[le,ce]of e.footbridges||new Map)if(Z.bridgeId&&ce.bridgeId===Z.bridgeId||le===x.id){let ve=X(le);j.push({key:le,dc:ve.col-D.col,dr:ve.row-D.row,meta:{...ce}})}return{...x,obj:g,oldKey:x.id,currentKey:x.id,meta:{...Z},cells:j,dragToken:`footbridge:${Z.bridgeId||x.id}`,col:D.col,row:D.row}}return x.type==="eggFarm"||x.type==="scanner"||x.type==="maintenanceRoom"?{...x,obj:g,col:g.col,row:g.row}:x.type==="facility"?g.gridPlaced?{...x,obj:g,gridPlaced:!0,col:g.col,row:g.row,x:g.x,y:g.y,w:g.w,h:g.h,entry:g.entry?{...g.entry}:null,side:g.side,center:{x:g.x+g.w/2,y:g.y+g.h/2}}:{...x,obj:g,gridPlaced:!1,x:g.x,y:g.y,w:g.w,h:g.h,entry:g.entry?{...g.entry}:null,side:g.side,center:{x:g.x+g.w/2,y:g.y+g.h/2}}:null}function L(x){let g=t(x),D=o(g);if(!D)return!1;let Z=ae(D),j=[],le=new Set;for(let ce of Z.map(ye).filter(Boolean)){let ve=ce.dragToken||b(ce);le.has(ve)||(le.add(ve),j.push(ce))}return j.length?(e.groupDrag={start:g,selections:Z,origins:j,historySnapshot:Xn(e),committed:!1,lastDCol:0,lastDRow:0},e.multiSelected=Z,e.selected=Z[0]||null,n(),!0):!1}function V(){!e.groupDrag||e.groupDrag.committed||(e.undoStack.push(e.groupDrag.historySnapshot),e.redoStack=[],e.groupDrag.committed=!0)}function se(x,g,D){let Z=E(x,g),j=it(e,x,g);if(j&&!D.has(`eggFarm:${j.id}`))return!0;let le=st(e,x,g);if(le&&!D.has(`scanner:${le.id}`))return!0;let ce=(e.maintenanceRooms||[]).find(Me=>xt(Me).some(Se=>Se.col===x&&Se.row===g));if(ce&&!D.has(`maintenanceRoom:${ce.id}`))return!0;let ve=bt(e,x,g);return!!(ve&&!D.has(`facility:${ve.id}`)||e.conveyorTiles.has(Z)&&!D.has(`conveyor:${Z}`))}function O(x,g,D){for(let Z of Object.values(e.facilities||{})){if(D.has(`facility:${Z.id}`))continue;let j=wt(e,Z),le=He(e,Z);if(j&&j.col===x&&j.row===g||le&&le.col===x&&le.row===g)return!0}return!1}function H(x,g,D,Z){let j=it(e,g,D);if(j&&!Z.has(`eggFarm:${j.id}`))return!0;let le=st(e,g,D);if(le&&!Z.has(`scanner:${le.id}`))return!0;let ce=(e.maintenanceRooms||[]).find(Me=>xt(Me).some(Se=>Se.col===g&&Se.row===D));if(ce&&!Z.has(`maintenanceRoom:${ce.id}`))return!0;let ve=bt(e,g,D);if(ve&&ve.id!==x.id&&!Z.has(`facility:${ve.id}`))return!0;for(let Me of Object.values(e.facilities||{})){if(Me.id===x.id||Z.has(`facility:${Me.id}`))continue;let Se=wt(e,Me),Ke=He(e,Me);if(Se&&Se.col===g&&Se.row===D||Ke&&Ke.col===g&&Ke.row===D)return!0}return!1}function oe(x,g,D,Z){let j=E(g,D);if(!i(g,D)||e.blockedCells?.has?.(j))return"Selection hits blocked ground";if(it(e,g,D)||st(e,g,D))return"Cell occupied";let le=(e.maintenanceRooms||[]).find(Me=>xt(Me).some(Se=>Se.col===g&&Se.row===D));if(le&&!Z.has(`maintenanceRoom:${le.id}`))return"Cell occupied";let ce=bt(e,g,D);if(ce&&!Z.has(`facility:${ce.id}`))return"Cell occupied";let ve=x.cells?.some(Me=>Me.key===j);return x.type==="powerWire"&&e.powerWires?.has(j)&&!Z.has(`powerWire:${j}`)?"Power wire already covers that cell":x.type==="footbridge"&&e.footbridges?.has(j)&&!Z.has(`footbridge:${j}`)&&!ve?"Footbridge already covers that cell":""}function ue(x,g,D){let Z=[];for(let j of e.groupDrag.origins){if(j.type!=="facility"||j.gridPlaced)continue;let le={x:j.center.x+x,y:j.center.y+g},{entry:ce,side:ve}=Lo(le,e);if(!i(ce.col,ce.row)||e.blockedCells?.has?.(E(ce.col,ce.row)))return!0;let Me={...j.obj,entry:{...ce},side:ve};Go(Me,ce,ve),Z.push({id:j.id,rect:a(Me)})}for(let j of Z)for(let le of Object.values(e.facilities))if(!D.has(`facility:${le.id}`)&&c(j.rect,a(le),12))return!0;for(let j=0;jE(D.col,D.row)));for(let D of["left","right"]){let Z=We(x,D),j=E(Z.col,Z.row);if(!e.conveyorTiles.has(j))continue;let le=e.conveyorMeta.get(j);if(!le)continue;let ce=fe.find(Se=>Se.name===D),ve=fe.filter(Se=>{let Ke=E(Z.col+Se.dc,Z.row+Se.dr);return e.conveyorTiles.has(Ke)&&!g.has(Ke)}),Me=ve.find(Se=>Se.name===ce?.name)||ve[0]||ce;Me&&(le.dir=Me.name,le.outDirs=[Me.name],le.branchMode="random")}}function xe(x){if(!e.groupDrag)return;let g=t(x),D=g.x-e.groupDrag.start.x,Z=g.y-e.groupDrag.start.y;if(Math.hypot(D,Z)<3)return;let j=Math.round(D/p.cell),le=Math.round(Z/p.cell),ce=new Set(e.groupDrag.selections.map(b)),ve=new Set;for(let T of e.groupDrag.origins){if(T.type==="facility"&&!T.gridPlaced)continue;let ke=T.col+j,Ae=T.row+le;if(T.type==="powerWire"||T.type==="footbridge"){let Ce=T.type==="footbridge"&&T.cells?.length?T.cells.map(Ue=>({col:ke+Ue.dc,row:Ae+Ue.dr})):[{col:ke,row:Ae}];for(let Ue of Ce){let St=oe(T,Ue.col,Ue.row,ce);if(St)return r(St);let et=`${T.type}:${E(Ue.col,Ue.row)}`;if(ve.has(et))return r("Selection overlap");ve.add(et)}continue}let ot=T.type==="scanner"?Pt({col:ke,row:Ae}):T.type==="maintenanceRoom"?xt({col:ke,row:Ae}):T.type==="facility"?gn({...T.obj,col:ke,row:Ae}):[{col:ke,row:Ae}];for(let Ce of ot){if(!i(Ce.col,Ce.row))return r("Selection outside grid");if(e.blockedCells?.has?.(E(Ce.col,Ce.row)))return r("Selection hits blocked ground");let Ue=E(Ce.col,Ce.row);if(ve.has(Ue))return r("Selection overlap");if(se(Ce.col,Ce.row,ce))return r("Cell occupied");if(T.type!=="conveyor"&&O(Ce.col,Ce.row,ce))return r("Machine port must remain open");ve.add(Ue)}if(T.type==="facility"&&T.gridPlaced){let Ce={...T.obj,col:ke,row:Ae},Ue={col:ke-1,row:Ae+Math.floor((Ce.hCells||3)/2)},St={col:ke+(Ce.wCells||3),row:Ae+Math.floor((Ce.hCells||3)/2)};for(let et of[Ue,St]){if(!i(et.col,et.row)||e.blockedCells?.has?.(E(et.col,et.row)))return r("Machine port outside usable grid");if(H(T.obj,et.col,et.row,ce))return r("Machine port is occupied")}}}if(ue(D,Z,ce))return r("Facility overlap");V();let Me=e.groupDrag.origins.filter(T=>T.type==="conveyor");for(let T of Me){let ke=T.currentKey||T.oldKey;e.conveyorTiles.delete(ke),e.conveyorMeta.delete(ke)}for(let T of Me){let ke=E(T.col+j,T.row+le);e.conveyorTiles.add(ke),e.conveyorMeta.set(ke,T.meta||{price:Le("conveyor"),builtSession:null,uses:0}),T.currentKey=ke}let Se=e.groupDrag.origins.filter(T=>T.type==="powerWire");for(let T of Se)e.powerWires.delete(T.currentKey||T.oldKey);for(let T of Se){let ke=E(T.col+j,T.row+le);e.powerWires.set(ke,T.meta||{}),T.currentKey=ke}let Ke=e.groupDrag.origins.filter(T=>T.type==="footbridge");for(let T of Ke)for(let ke of T.cells||[{key:T.currentKey||T.oldKey}])e.footbridges.delete(ke.key);for(let T of Ke){let ke=E(T.col+j,T.row+le);for(let Ae of T.cells||[{dc:0,dr:0,meta:T.meta||{}}]){let ot=E(T.col+j+(Ae.dc||0),T.row+le+(Ae.dr||0));e.footbridges.set(ot,{...Ae.meta||T.meta||{}})}T.currentKey=ke}for(let T of e.groupDrag.origins)if(T.type==="eggFarm")T.obj.col=T.col+j,T.obj.row=T.row+le;else if(T.type==="scanner")T.obj.col=T.col+j,T.obj.row=T.row+le,Ve(T.obj);else if(T.type==="maintenanceRoom")T.obj.col=T.col+j,T.obj.row=T.row+le;else if(T.type==="facility"&&T.gridPlaced)T.obj.col=T.col+j,T.obj.row=T.row+le,Cn(T.obj);else if(T.type==="facility"){let ke={x:T.center.x+D,y:T.center.y+Z},{entry:Ae,side:ot}=Lo(ke,e);Go(T.obj,Ae,ot)}e.groupDrag.selections=e.groupDrag.origins.map(T=>["conveyor","powerWire","footbridge"].includes(T.type)?{type:T.type,id:T.currentKey||T.oldKey}:{type:T.type,id:T.id}),e.multiSelected=[...e.groupDrag.selections],e.selected=e.multiSelected[0]||null,Ee(e),e.groupDrag.origins.some(T=>T.type!=="powerWire")&&(e.walkabilityVersion=(e.walkabilityVersion||0)+1),e.groupDrag.origins.some(T=>T.type==="powerWire"||T.type!=="conveyor"&&T.type!=="footbridge")&&Ye(e),n()}function Ge(){e.groupDrag&&(Ee(e),e.groupDrag=null,n())}return{selectionFromHit:M,startSelectionBox:Q,updateSelectionBox:ie,finishSelectionBox:J,startGroupDrag:L,updateGroupDrag:xe,finishGroupDrag:Ge}}function Kt(e){return Vt(e)*(_.facilities.boostConveyor.speedMultiplier||2)/Math.max(1,_.conveyor.minimumItemSpacingPx||25)}function io(e,t,n){let o=Math.max(_.farmQuality.safeMinIntervalSeconds,Number(n)||1),r=(t.zundaBoostTime||0)>0?_.farmQuality.zundaIntervalMultiplier:1;return 1/Math.max(_.farmQuality.safeMinIntervalSeconds,o*r)}function so(e,t){let n=_.farmQuality,o=Math.max(1e-4,t),r=Math.max(0,e/o-1);return Math.max(n.minMultiplier,Math.min(n.maxMultiplier,1+n.overflowCoefficient*Math.pow(r,n.overflowExponent)))}function za(e,t){return 1/Math.max(1e-4,Math.min(e,t))}function Ha(e){return e>=1.75?"Luxury":e>=1.35?"Premium":e>=1.15?"Select":"Standard"}function Ya(e,t){let n=t.zundaBoostTime||0;t.zundaBoostTime=Math.min(_.farmQuality.zundaMaxSeconds,n+_.farmQuality.zundaSeconds);let o=Math.max(0,t.zundaBoostTime-n);e.stats.zundaConsumed=(e.stats.zundaConsumed||0)+1,e.stats.zundaBoostSeconds=(e.stats.zundaBoostSeconds||0)+o,e.totals.zundaConsumed=(e.totals.zundaConsumed||0)+1,e.totals.zundaBoostSeconds=(e.totals.zundaBoostSeconds||0)+o,e.stats.zundaBoostSecondsByFarm=e.stats.zundaBoostSecondsByFarm||{},e.stats.zundaBoostSecondsByFarm[t.id]=(e.stats.zundaBoostSecondsByFarm[t.id]||0)+o}function Qa({game:e,ui:t,canvas:n,canvasPoint:o,onUpdatePanels:r}){function i(){r&&r()}let a=null,c=!1,b=null,M=!1,C=["random","up","right","down","left"],$={random:"RND",up:"\u25B2",right:"\u25B6",down:"\u25BC",left:"\u25C0"},W={w:40,h:40,y:0};function K(){return Co(e)}function G(){e.gridCols=p.cols,e.gridRows=p.rows,e.gridOwnedCells=ji(e)}function z(s){if(s){p.y-=s*p.cell,p.rows+=s,e.gridChunkOriginY=(e.gridChunkOriginY||0)-Math.floor(s/10),e.ownedCells=go(e.ownedCells,s),e.blockedCells=go(e.blockedCells,s),e.conveyorTiles=go(e.conveyorTiles,s),e.conveyorMeta=xo(e.conveyorMeta,s),e.powerWires=xo(e.powerWires||new Map,s),e.footbridges=xo(e.footbridges||new Map,s);for(let l of e.eggFarms||[])l.row+=s;for(let l of e.scanners||[])l.row+=s;for(let l of Object.values(e.facilities||{}))l.gridPlaced?(l.row+=s,Cn(l)):l.entry&&(l.entry.row+=s)}}function Q(s){if(s){p.x-=s*p.cell,p.cols+=s,e.gridChunkOriginX=(e.gridChunkOriginX||0)-Math.floor(s/10),e.ownedCells=To(e.ownedCells,s),e.blockedCells=To(e.blockedCells,s),e.conveyorTiles=To(e.conveyorTiles,s),e.conveyorMeta=Eo(e.conveyorMeta,s),e.powerWires=Eo(e.powerWires||new Map,s),e.footbridges=Eo(e.footbridges||new Map,s);for(let l of e.eggFarms||[])l.col+=s;for(let l of e.scanners||[])l.col+=s;for(let l of e.maintenanceRooms||[])l.col+=s;for(let l of Object.values(e.facilities||{}))l.gridPlaced?(l.col+=s,Cn(l)):l.entry&&(l.entry.col+=s)}}function ie(s){e.ownedCells=e.ownedCells||new Set;for(let l of es(s))e.ownedCells.add(E(l.col,l.row))}function J(s){return e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending?null:jt(e).map(l=>L(l)).find(l=>l&&Zi(l,s))||null}function ae(s){let l=Et(s);return{x:l.x,y:l.y,w:l.w,h:l.h}}function ye(s){let l=ae(s);return Object.values(e.facilities||{}).some(y=>{let h=y?.baseId||y?.id;return!vo.includes(h)||y.gridPlaced?!1:ue(l,oe(y),0)})}function L(s){if(!s)return null;let l=ye(s);return{...s,disabled:l,disabledReason:l?"Move edge facilities before buying this lot.":""}}function V(s="right"){if(s&&typeof s=="object"&&Number.isFinite(s.chunkX)&&Number.isFinite(s.chunkY))return s;let l=["left","right","up","down"].includes(s)?s:"right";return Ji(e,l)}function se(s="right"){let l=V(s);if(e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending)return{ok:!1,reason:"Cannot expand now."};if(!l)return{ok:!1,reason:"Invalid expansion lot."};if(ye(l)){let $e="Move edge facilities before buying this lot.";return T($e),{ok:!1,reason:$e}}let y=l.direction||"right",h=K();if(e.cashp.cols&&(p.cols=F.colStart+F.cols),F.rowStart+F.rows>p.rows&&(p.rows=F.rowStart+F.rows),ie(F),ts(e,F.chunkX,F.chunkY),e.gridExpansionPurchases=(e.gridExpansionPurchases||0)+1,e.gridExpansionPurchasesByDirection[y]=(e.gridExpansionPurchasesByDirection[y]||0)+1,G();let q=Ki(e.gridExpansionPurchases,{base:_.map.blockedRatio??0,increment:_.map.blockedExpansionIncrement??.0075,max:_.map.blockedRatioMax??.12}),be=zi({seed:`${e.runSeed}:grid-expansion:${F.chunkX},${F.chunkY}:${e.gridExpansionPurchases}`,colStart:F.colStart,colEnd:F.colStart+F.cols,rowStart:F.rowStart,rowEnd:F.rowStart+F.rows,targetRatio:q});for(let $e of be)e.blockedCells.add($e);Ee(e);let Pe=F.cols*F.rows,we=Et(F);return Y(e,we.x+we.w/2,we.y+we.h/2,`${y.toUpperCase()} +${Pe} CELLS -${R(h)}`,w.green),i(),{ok:!0,direction:y,cost:h,addedCells:Pe,blocked:be.size,blockedRatio:q,chunkX:F.chunkX,chunkY:F.chunkY}}function O(s,l){return s>=0&&s=0&&l!l.has(h.id)&&ue(y,oe(h),12))}function xe(s,l,y=null){if(!O(s,l))return!1;if(H(s,l))return!0;let h=E(s,l),m=it(e,s,l);if(m&&!(y?.type==="eggFarm"&&y.ref?.id===m.id))return!0;let P=st(e,s,l);if(P&&!(y?.type==="scanner"&&y.ref?.id===P.id))return!0;let F=x(e,s,l);if(F&&!(y?.type==="maintenanceRoom"&&y.ref?.id===F.id))return!0;let q=bt(e,s,l);return!!(q&&!(y?.type==="facility"&&y.ref?.id===q.id)||e.conveyorTiles.has(h)&&!(y?.type==="conveyor"&&y.oldKey===h))}function Ge(s,l,y=null){return Object.values(e.facilities||{}).find(h=>{if(y?.type==="facility"&&y.ref?.id===h.id)return!1;let m=wt(e,h),P=He(e,h);return m&&m.col===s&&m.row===l||P&&P.col===s&&P.row===l})||null}function x(s,l,y){return(s.maintenanceRooms||[]).find(h=>xt(h).some(m=>m.col===l&&m.row===y))||null}function g(s,l,y=null){let h={col:s,row:l};for(let m of xt(h)){if(!O(m.col,m.row)||H(m.col,m.row))return!0;let P=E(m.col,m.row);if(it(e,m.col,m.row)||st(e,m.col,m.row))return!0;let be=x(e,m.col,m.row);if(be&&!(y?.type==="maintenanceRoom"&&y.ref?.id===be.id)||bt(e,m.col,m.row)||Ge(m.col,m.row,y)||e.conveyorTiles.has(P))return!0}return!1}function D(s,l,y=null){let h={col:s,row:l};for(let m of Pt(h)){if(!O(m.col,m.row)||H(m.col,m.row))return!0;let P=E(m.col,m.row);if(it(e,m.col,m.row))return!0;let q=st(e,m.col,m.row);if(q&&!(y?.type==="scanner"&&y.ref?.id===q.id)||bt(e,m.col,m.row)||Ge(m.col,m.row,y)||e.conveyorTiles.has(P))return!0}return!1}function Z(s,l,y,h=null){let m=_.facilities[s]||{},P={baseId:s,id:s,gridPlaced:!0,col:l,row:y,wCells:m.footprint?.cols||(s==="sausageMaker"?3:1),hCells:m.footprint?.rows||(s==="sausageMaker"?3:1)};for(let F of gn(P))if(!O(F.col,F.row)||H(F.col,F.row)||xe(F.col,F.row,h)||Ge(F.col,F.row,h))return!0;if(s==="sausageMaker"||s==="biomassGenerator"||s==="coalGenerator"){let F={col:l-1,row:y+1},q={col:l+(P.wCells||1),row:y+1},be=[F,{col:l+1,row:y-1},{col:l+1,row:y+(P.hCells||3)}],Pe=s==="sausageMaker"?[F,q]:s==="biomassGenerator"?be:[F];for(let we of Pe){if(!O(we.col,we.row)||H(we.col,we.row))return!0;let $e=bt(e,we.col,we.row);if($e&&$e.id!==h?.ref?.id||it(e,we.col,we.row)||st(e,we.col,we.row)||x(e,we.col,we.row)||Ge(we.col,we.row,h))return!0}}return!1}function j(){return e.selected?e.selected.type==="eggFarm"?e.eggFarms.find(s=>s.id===e.selected.id)||null:e.selected.type==="scanner"?e.scanners.find(s=>s.id===e.selected.id)||null:e.selected.type==="conveyor"?e.conveyorTiles.has(e.selected.id)?{type:"conveyor",id:e.selected.id}:null:e.selected.type==="powerWire"?e.powerWires?.has(e.selected.id)?{type:"powerWire",id:e.selected.id}:null:e.selected.type==="footbridge"?e.footbridges?.has(e.selected.id)?{type:"footbridge",id:e.selected.id}:null:e.selected.type==="facility"?e.facilities[e.selected.id]||null:e.selected.type==="maintenanceRoom"&&(e.maintenanceRooms||[]).find(s=>s.id===e.selected.id)||null:null}function le(s){return s?s.type==="eggFarm"?`${ht("eggFarm")} #${s.id}`:s.type==="scanner"?`${s.kind==="auto"?ht("autoScanner"):ht("manualScanner")} #${s.id}`:s.type==="conveyor"?e.conveyorMeta.get(s.id)?.kind==="boostConveyor"?ht("boostConveyor"):ht("conveyor"):s.type==="powerWire"?e.powerWires?.get(s.id)?.kind==="insulatedPowerWire"?ht("insulatedPowerWire"):ht("powerWire"):s.type==="footbridge"?ht("footbridge"):s.type==="facility"?s.name:s.type==="maintenanceRoom"?`${ht("maintenanceRoom")} #${s.id}`:"Equipment":"Equipment"}function ce(s){return s?.type==="conveyor"?e.conveyorMeta?.get(s.oldKey||s.ref?.id)?.price||Oo(s):s?.type==="powerWire"?e.powerWires?.get(s.oldKey||s.ref?.id)?.price||0:s?.type==="footbridge"?e.footbridges?.get(s.oldKey||s.ref?.id)?.price||_.facilities.footbridge.price:Oo(s)}function ve(){return!!e.cardEffects?.usedMachineActive}function Me(){return ve()?{usedMachine:!0,noRefund:!0,durabilityBaseMultiplier:.6}:{usedMachine:!1,noRefund:!1,durabilityBaseMultiplier:1}}function Se(s){let l=Me();return Object.assign(s,l),s}function Ke(s){let l=s?.ref||s||{};if(l.unsellable||(l.baseId||l.id)==="starterGenerator")return"Starter Generator cannot be sold.";if(s?.type==="eggFarm"||l.type==="eggFarm")return e.eggFarms.length<=1?"Cannot sell the last EGG FARM.":"";if((s?.type==="facility"||l.type==="facility")&&["mixer","trash","truck"].includes(l.baseId||l.id)){let y=l.baseId||l.id;if(Object.values(e.facilities).filter(m=>(m.baseId||m.id)===y).length<=1)return`Cannot sell the last ${l.shortName||l.name||l.id}.`}return""}function T(s){t.buildStatus.textContent=s,Y(e,n.width/2-e.view.x,86-e.view.y,s.toUpperCase(),w.danger)}function ke(s){if(!s)return null;let l=E(s.col,s.row);return e.conveyorMeta.get(l)||null}function Ae(s){return s?(Array.isArray(s.outDirs)||(s.outDirs=[]),s.outDirs=[...new Set(s.outDirs.filter(l=>["right","left","down","up"].includes(l)))],C.includes(s.branchMode)||(s.branchMode="random"),s.kind||(s.kind="conveyor"),s.speedMultiplier||(s.speedMultiplier=s.kind==="boostConveyor"?2:1),s.outDirs):[]}function ot(s){return s?fe.filter(l=>e.conveyorTiles.has(E(s.col+l.dc,s.row+l.dr))).map(l=>l.name):[]}function Ce(s){return ot(s).length>=3}function Ue(s,l){let y=fe.find(q=>q.name===l);if(!s||!y)return!1;let h=E(s.col+y.dc,s.row+y.dr),m=e.conveyorMeta.get(h);if(!m)return!1;let P=y.opposite;return[...new Set([...Array.isArray(m.outDirs)?m.outDirs:[],m.dir].filter(Boolean))].includes(P)}function St(s,l){let y=ot(s);if(y.length!==1)return null;let h=y[0];return l.includes(h)&&Ue(s,h)?h:null}function et(s){if(!e.conveyorTiles.has(s))return[];let l=X(s),y=e.conveyorMeta.get(s),h=Ae(y),m=ot(l),P=[...new Set([...h,y?.dir].filter(Boolean))].filter(we=>m.includes(we)),F=m,q=P.length?P:F,be=St(l,q),Pe=P.length?P.filter(we=>we!==be):F.filter(we=>we!==be);return y&&(y.outDirs=h.filter(we=>m.includes(we)),y.dir&&!m.includes(y.dir)&&(y.dir=y.outDirs[0]||null),y.branchMode!=="random"&&!m.includes(y.branchMode)&&(y.branchMode="random")),Pe}function Ln(s){if(!e.conveyorTiles.has(s))return[];let l=X(s),y=ot(l);return Ce(l)?y:et(s)}function Ht(s){let l=X(s),y=Ln(s);if(y.length<3)return[];let h=e.conveyorMeta.get(s)||{},m=new Set(y.filter(q=>Ue(l,q))),P=y.filter(q=>!m.has(q));if(m.size)return P.length>=2?P:[];let F=[...new Set([...Array.isArray(h.outDirs)?h.outDirs:[],h.dir].filter(Boolean))].filter(q=>y.includes(q));return F.length>=2?F:y}function lo(s,l){let y=Tt(s,l);if(!y)return!1;let h=E(s.col,s.row),m=E(l.col,l.row),P=e.conveyorMeta.get(h),F=e.conveyorMeta.get(m);if(!P||!F)return!1;let q=Ae(P),be=!q.includes(y)||P.dir!==y||!F.dir;return q.includes(y)||q.push(y),P.dir=y,F.dir||(F.dir=y),be}function co(s){if(pt(s).length===0)return Nn(s);let l=ir(s);return l.length<2?Nn(s):(Oe(e),sr(l),Ee(e),i(),!0)}function Nn(s){if(!s)return!1;let l=E(s.col,s.row),y=e.conveyorMeta.get(l);if(!y||Ce(s))return!1;let h=St(s,fe.map(q=>q.name)),m=fe.map(q=>q.name).filter(q=>q!==h),P=y.dir&&m.includes(y.dir)?y.dir:null,F=m[(Math.max(-1,m.indexOf(P))+1)%m.length];return Oe(e),y.dir=F,y.outDirs=[F],y.branchMode="random",Ee(e),i(),!0}function pt(s){return s?fe.map(l=>({col:s.col+l.dc,row:s.row+l.dr})).filter(l=>e.conveyorTiles.has(E(l.col,l.row))):[]}function ir(s){if(!s||!e.conveyorTiles.has(E(s.col,s.row))||Ce(s))return[];let l=pt(s);if(!l.length||l.length>2)return[];let y=P=>{let F=[],q=new Set([E(s.col,s.row)]),be=s,Pe=P,we=0;for(;Pe&&we<200;){we+=1;let $e=E(Pe.col,Pe.row);if(q.has($e)||(q.add($e),F.push(Pe),Ce(Pe)))break;let Ri=pt(Pe).filter(Ii=>!(Ii.col===be.col&&Ii.row===be.row));if(Ri.length!==1)break;be=Pe,Pe=Ri[0]}return F},h=l[0]?y(l[0]).reverse():[],m=l[1]?y(l[1]):[];return[...h,s,...m]}function uo(s,l){return!!s&&[...new Set([...Array.isArray(s.outDirs)?s.outDirs:[],s.dir].filter(Boolean))].includes(l)}function sr(s){let l=0,y=0;for(let m=0;my?[...s].reverse():s;for(let m=0;m=2){let m=h[h.length-2],P=h[h.length-1];if(!Ce(P)){let F=e.conveyorMeta.get(E(P.col,P.row)),q=Tt(m,P);F&&q&&(F.dir=q,F.outDirs=[q],F.branchMode="random")}}}function fo(){return _.facilities[e.buildTool==="boostConveyor"?"boostConveyor":"conveyor"]}function Gn(s,l=null){if(!s)return{ok:!1,reason:pe.fail.outOfGrid};let{col:y,row:h}=s,m=E(y,h);if(e.conveyorTiles.has(m))return{ok:!1,exists:!0};if(H(y,h))return{ok:!1,reason:"Cannot build on blocked ground."};if(xe(y,h))return{ok:!1,reason:pe.fail.cellOccupied};let P=fo(),F=P.id||"conveyor",q=Le(F,e);if(e.cash=Math.abs(h)?{col:s.col+Math.sign(y),row:s.row}:{col:s.col,row:s.row+Math.sign(h)}}function lr(s){c=!1,b=s?{col:s.col,row:s.row}:null,M=!1,a=null,Yt(s)}function cr(s){if(!s)return;if(!a)return Yt(s);let l=a,y=0;for(;(l.col!==s.col||l.row!==s.row)&&y<64;){let h=ar(l,s);if(Yt(h),l=a||h,y+=1,!a)break}}function Qt(){!M&&b&&e.conveyorTiles.has(E(b.col,b.row))&&co(b),b=null,M=!1,a=null,c=!1}function Xt(s,l){return!O(s,l)||H(s,l)||it(e,s,l)||st(e,s,l)||x(e,s,l)||bt(e,s,l)}function dn(s,l){if(!s)return{ok:!1,reason:pe.fail.outOfGrid};if(Xt(s.col,s.row))return{ok:!1,reason:"Power wire cannot cross equipment or blocked ground."};let y=E(s.col,s.row),h=_.power.wires[l]?.price||Le(l,e),m=e.powerWires?.get(y),P=m&&_.power.wires[m.kind]?.price||0,F=h-P;return F>0&&e.cash0&&Ct(e,F),F<0&&Qr(e,-F),e.powerWires=e.powerWires||new Map,e.powerWires.set(y,{kind:l,price:h,builtSession:e.buildSession}),Ye(e),e.selected={type:"powerWire",id:y},i(),{ok:!0})}function ur(s){if(!s)return T(pe.fail.outOfGrid);let l=(e.footbridgeOrientation||"vertical")!=="horizontal",y=l?[s.row-1,s.row,s.row+1].map(P=>({col:s.col,row:P})):[s.col-1,s.col,s.col+1].map(P=>({col:P,row:s.row}));if(y.some(P=>Xt(P.col,P.row)))return T("Footbridge cannot cross equipment or blocked ground.");if(y.some(P=>e.footbridges?.has(E(P.col,P.row))))return T("Footbridge already covers that cell.");let h=Le("footbridge",e);if(e.cashy!=="starterGenerator")].includes(e.buildTool))return po(l);if(vo.includes(e.buildTool))return v(s,e.buildTool)}function dr(s,l){let y=Le("eggFarm",e);if(e.cashP.kind==="manual").length>=8)return T("Manual Scanner limit reached (8 max).");let h=y==="auto"?Le("autoScanner",e):Le("manualScanner",e);if(e.cashm.id!==l.ref.id),ct(e,h.x,h.y),Ee(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="scanner"){let h=ge(l.ref);k(l,h.x,h.y),e.scanners=e.scanners.filter(m=>m.id!==l.ref.id),ct(e,h.x,h.y),Ee(e),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="facility"){let h=l.ref;k(l,h.x+h.w/2,h.y+h.h/2),delete e.facilities[h.id],ct(e,h.x+h.w/2,h.y+h.h/2),Ee(e),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="maintenanceRoom"){let h=l.ref,m=u(h);k(l,m.x,m.y),e.maintenanceRooms=(e.maintenanceRooms||[]).filter(P=>P.id!==h.id),ct(e,m.x,m.y),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}e.selected=null,e.multiSelected=[],i()}function I(s){let l=Object.values(e.facilities).find(q=>{if(s.x>=q.x&&s.x<=q.x+q.w&&s.y>=q.y&&s.y<=q.y+q.h)return!0;if(!q.entry)return!1;let Pe=B(q.entry.col,q.entry.row);return Math.abs(s.x-Pe.x)<=p.cell*.46&&Math.abs(s.y-Pe.y)<=p.cell*.46});if(l)return{type:"facility",ref:l};let y=rt(s.x,s.y);if(!y)return null;let h=it(e,y.col,y.row);if(h)return{type:"eggFarm",ref:h};let m=st(e,y.col,y.row);if(m)return{type:"scanner",ref:m};let P=x(e,y.col,y.row);if(P)return{type:"maintenanceRoom",ref:P};let F=E(y.col,y.row);return e.footbridges?.has(F)?{type:"footbridge",oldKey:F,ref:{type:"footbridge",id:F}}:e.powerOverlay&&e.powerWires?.has(F)?{type:"powerWire",oldKey:F,ref:{type:"powerWire",id:F}}:e.conveyorTiles.has(F)?{type:"conveyor",oldKey:F,ref:{type:"conveyor",id:F}}:null}let A=qa({game:e,canvasPoint:o,updatePanels:i,equipmentAtPoint:I,fail:T,pointInGrid:O,rectOfFacility:oe,rectsOverlap:ue});function U(s){return null}function he(){let s=j();if(s)if(s.type==="conveyor")S(B(...Object.values(X(s.id))));else if(s.type==="powerWire"){let l=X(s.id),y=e.powerWires?.get(s.id);if(!y)return;Oe(e);let h=B(l.col,l.row);k({type:"powerWire",oldKey:s.id,ref:{id:s.id,price:y.price||0,builtSession:y.builtSession}},h.x,h.y),e.powerWires.delete(s.id),Ye(e),ct(e,h.x,h.y),e.selected=null,e.multiSelected=[],i()}else if(s.type==="footbridge"){let l=X(s.id);S(B(l.col,l.row))}else s.type==="eggFarm"?S(B(s.col,s.row)):s.type==="scanner"?S(ge(s)):s.type==="facility"?S({x:s.x+s.w/2,y:s.y+s.h/2}):s.type==="maintenanceRoom"&&S(u(s))}function de(s,l,y="primary-button"){let h=document.createElement("button");return h.type="button",h.className=y,h.textContent=s,h.addEventListener("click",l),h}function Xe(){e.cardTargetPick?.mode==="autoScannerMenu"&&(e.cardTargetPick=null),t.modal.classList.remove("visible","equipment-popover"),t.modal.style.removeProperty("--popover-x"),t.modal.style.removeProperty("--popover-y")}function _n(s){t.modalTitle.textContent="Auto Scanner",e.cardTargetPick={pending:!0,mode:"autoScannerMenu",cardId:null,targetKeys:[`scanner:${s.id}`],remaining:1},t.modalBody.innerHTML=`
Left / right output routing for this AUTO scanner.
Current: ${s.role===0?"Male left / others right":"Poop left / others right"}
Cooldown: ${Bt(s).toFixed(1)}s.
`,t.modalActions.innerHTML="";let l=de("Male Left / Others Right",()=>{Oe(e),s.role=0,Xe(),i()},s.role===0?"facility-action warn":"facility-action"),y=de("Poop Left / Others Right",()=>{Oe(e),s.role=1,Xe(),i()},s.role===1?"facility-action warn":"facility-action");t.modalActions.append(l,y,de("Close",Xe,"facility-action")),ho(s),t.modal.classList.add("visible","equipment-popover"),i()}function yo(s){return s?.label||s?.key||"?"}function pr(s){let l=s.key===" "?"Space":s.key.length===1?s.key.toUpperCase():s.key.replace(/^Arrow/,"");return{key:s.key.toLowerCase(),code:s.code,label:l}}function wl(s,l,y){for(let h of e.scanners.filter(m=>m.kind==="manual"))for(let m of["left","right"]){if(h.id===s.id&&m===l)continue;let P=h.keys?.[m];if(P&&(P.code===y.code||P.key===y.key))return!0}return!1}function Wn(s,l=""){if(!s||s.kind!=="manual")return;t.modalTitle.textContent=`Manual Scanner #${s.id}`;let y=yo(s.keys?.left),h=yo(s.keys?.right),m=ml(s);t.modalBody.innerHTML=`
Left route key: ${y}
Right route key: ${h}
${l?`
${l}
`:""}
${m?`
${m}
`:""}
`,t.modalActions.innerHTML="",t.modalActions.appendChild(de("Set Left Key",()=>gi(s,"left"),"facility-action warn")),t.modalActions.appendChild(de("Set Right Key",()=>gi(s,"right"),"facility-action warn")),t.modalActions.appendChild(de("Close",Xe,"facility-action")),ho(s),t.modal.classList.add("visible","equipment-popover")}function Ci(s){if(!s||(s.baseId||s.id)!=="inboundTruck")return;s.inboundOrder=s.inboundOrder||{coalPerDay:0,zundaMochiPerDay:0};let l=_.imports.combinedLimitPerTruck,y=Math.max(0,Math.floor(s.inboundOrder.coalPerDay||0)),h=Math.max(0,Math.floor(s.inboundOrder.zundaMochiPerDay||0)),m=y*_.imports.prices.coal+h*_.imports.prices.zundaMochi,P=y+h,F=P>0?(_.time.daySeconds/P).toFixed(1):"none";t.modalTitle.textContent=`Inbound Truck #${s.id}`,t.modalBody.innerHTML=`
Combined total: ${P}/${l}
Daily purchase cost: ${R(m)}
Average release interval: ${F}${P>0?"s":""}
Output queue: ${s.inboundQueue?.length||0}
`,t.modalActions.innerHTML="";let q=de("Apply",()=>{if(e.phase!=="build")return;let be=Math.max(0,Math.floor(Number(document.getElementById("inboundCoalInput")?.value)||0)),Pe=Math.max(0,Math.floor(Number(document.getElementById("inboundZundaInput")?.value)||0)),we=be+Pe,$e=we>l?l/we:1;Oe(e),s.inboundOrder={coalPerDay:Math.floor(be*$e),zundaMochiPerDay:Math.floor(Pe*$e)},Ci(s),i()},"primary-button");q.disabled=e.phase!=="build",t.modalActions.appendChild(q),t.modalActions.appendChild(de("Close",Xe,"facility-action")),ho(s),t.modal.classList.add("visible","equipment-popover")}function ml(s){let l=[{side:"left",binding:s.keys?.left},{side:"right",binding:s.keys?.right}];if(l[0].binding&&l[1].binding&&(l[0].binding.code===l[1].binding.code||l[0].binding.key===l[1].binding.key))return"Left and right keys conflict.";for(let y of l)if(y.binding)for(let h of e.scanners.filter(m=>m.kind==="manual"&&m.id!==s.id)){if(h.keys?.left&&(h.keys.left.code===y.binding.code||h.keys.left.key===y.binding.key))return`Key conflicts with Manual Scanner #${h.id} left.`;if(h.keys?.right&&(h.keys.right.code===y.binding.code||h.keys.right.key===y.binding.key))return`Key conflicts with Manual Scanner #${h.id} right.`}return""}function gi(s,l){t.modalBody.innerHTML=`
Press a key for ${l.toUpperCase()} route.
Esc cancels.
`,t.modalActions.innerHTML="";let y=h=>{if(h.preventDefault(),h.stopPropagation(),window.removeEventListener("keydown",y,!0),h.key==="Escape")return Wn(s);let m=pr(h),P=wl(s,l,m);Oe(e),s.keys=s.keys||{left:null,right:null},s.keys[l]=m,i(),Wn(s,P?`${m.label} assigned, but another scanner already uses it.`:`${l.toUpperCase()} set to ${m.label}.`)};window.addEventListener("keydown",y,!0)}function vl(){let s=j();if(!(!s||s.type!=="scanner"))return s.kind==="auto"?_n(s):Wn(s)}function Sl(s){if(!s)return{x:80,y:80};if(s.type==="conveyor"){let l=X(s.id);return B(l.col,l.row)}return s.type==="eggFarm"?B(s.col,s.row):s.type==="scanner"?ge(s):s.type==="facility"?{x:s.x+s.w/2,y:s.y+10}:{x:80,y:80}}function ho(s){let l=n.getBoundingClientRect(),y=Sl(s),h=e.view?.scale||1,m=l.left+(y.x*h+(e.view?.x||0))/n.width*l.width+18,P=l.top+(y.y*h+(e.view?.y||0))/n.height*l.height-12,F=Math.max(12,window.innerWidth-274),q=Math.max(12,window.innerHeight-220);t.modal.style.setProperty("--popover-x",`${Math.max(12,Math.min(F,m))}px`),t.modal.style.setProperty("--popover-y",`${Math.max(12,Math.min(q,P))}px`)}function xi(){let s=j();if(!s)return;let l=Pi(s);if(t.modalTitle.textContent=le(s),t.modalBody.innerHTML=`
${l.map(m=>`
${m}
`).join("")}
${["mixer","truck"].includes(s.baseId||s.id)?'
Income/Fine = ceil(base x 1.10^upgrades)
':""}`,t.modalActions.innerHTML="",s.type==="scanner"&&s.kind==="auto"&&t.modalActions.appendChild(de("Auto Menu",()=>_n(s),"facility-action warn")),s.type==="scanner"&&s.kind==="manual"&&t.modalActions.appendChild(de("Set Keys",()=>Wn(s),"facility-action warn")),s.type==="conveyor"&&yr(s.id)&&Ht(s.id).length>=2){let m=e.conveyorMeta.get(s.id)?.branchMode||"random";t.modalActions.appendChild(de(`Branch: ${Ti(m)}`,()=>{hr(s.id),e.selected={type:"conveyor",id:s.id},xi()},"facility-action warn branch-action"))}let y=s.type==="conveyor"?{type:"conveyor",oldKey:s.id,ref:s}:{type:s.type,ref:s},h=Ke(y);if(h){let m=de(h,()=>{},"facility-action danger disabled");m.disabled=!0,t.modalActions.appendChild(m)}else{let m=Ut(y,e),P=m.sameBuild?`Remove / Refund ${R(m.amount)}`:`Sell ${R(m.amount)}`;t.modalActions.appendChild(de(P,()=>{he(),Xe()},"facility-action danger"))}ho(s),t.modal.classList.add("visible","equipment-popover")}function kl(s){e.phase==="build"&&(Qt(),e.buildTool=e.buildTool===s?null:s,e.selected=null,e.multiSelected=[],e.selectionBox=null,i())}function Ml(){let s=[];for(let[l,y]of Object.entries(e.facilities))if(s.push({id:`facility:${l}`,price:ce({type:"facility",ref:y}),x:y.x,y:y.y,w:y.w,h:y.h}),y.entry){let h=B(y.entry.col,y.entry.row);s.push({id:`facilityPort:${l}`,price:ce({type:"facility",ref:y}),x:h.x-18,y:h.y-18,w:36,h:36})}for(let l of e.maintenanceRooms||[]){let y=u(l);s.push({id:`maintenanceRoom:${l.id}`,price:ce({type:"maintenanceRoom",ref:l}),x:y.x-p.cell,y:y.y-p.cell,w:p.cell*2,h:p.cell*2})}for(let l of e.eggFarms){let y=B(l.col,l.row);s.push({id:`eggFarm:${l.id}`,price:ce({type:"eggFarm",ref:l}),x:y.x-24,y:y.y-24,w:48,h:48})}for(let l of e.scanners){let y=ge(l);s.push({id:`scanner:${l.id}`,price:ce({type:"scanner",ref:l}),x:y.x-50,y:y.y-73,w:100,h:146})}for(let l of e.conveyorTiles){let y=X(l),h=B(y.col,y.row),m=e.conveyorMeta.get(l)||{};s.push({id:`conveyor:${l}`,price:m.price||Le(m.kind==="boostConveyor"?"boostConveyor":"conveyor",e),x:h.x-22,y:h.y-22,w:44,h:44})}if(e.powerOverlay)for(let[l,y]of e.powerWires||new Map){let h=X(l),m=B(h.col,h.row);s.push({id:`powerWire:${l}`,price:y.price||0,x:m.x-18,y:m.y-18,w:36,h:36})}for(let[l,y]of e.footbridges||new Map){let h=X(l),m=B(h.col,h.row);s.push({id:`footbridge:${l}`,price:y.price||Le("footbridge",e),x:m.x-22,y:m.y-22,w:44,h:44})}return s}function Ti(s){return $[s]||$.random}function ef(s){return Ln(s)}function yr(s){return e.conveyorTiles.has(s)?Ce(X(s)):!1}function Ei(s){if(e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending)return null;for(let l of e.conveyorTiles){if(!yr(l)||Ht(l).length<2)continue;let y=X(l),h=B(y.col,y.row),m=h.x-W.w/2,P=h.y+W.y-W.h/2;if(s.x>=m&&s.x<=m+W.w&&s.y>=P&&s.y<=P+W.h)return l}return null}function Cl(s){let l=Ei(s);return l?hr(l):!1}function hr(s){let l=e.conveyorMeta.get(s);if(!l)return!1;let y=Ht(s);if(y.length<2)return!1;Oe(e);let h=C.includes(l.branchMode)?l.branchMode:"random",m=["random",...fe.map(P=>P.name).filter(P=>y.includes(P))];return l.branchMode=m[(Math.max(0,m.indexOf(h))+1)%m.length],Ee(e),e.selected=null,e.multiSelected=[],i(),!0}function Pi(s){Be(e);let l=[],y=s?.type==="facility"?s.baseId||s.id:"";if(s.type==="eggFarm"){let[h,m]=zn(s);l.push(`Price: ${R(ce(s))}`);{let be=Ke({type:s.type,ref:s});l.push(be?`Sale: blocked (${be})`:`Sale value: ${R(Ut({type:s.type,ref:s},e).amount)}`)}l.push(`Level: ${s.level}/4`),l.push(`Random interval: ${h.toFixed(2)}-${m.toFixed(2)}s`),l.push(`Durability: ${Zn(s)}% | Spawn delay x${Yo(s).toFixed(2)}`);let P=Kt(e),F=s.theoreticalRate||io(e,s,s.lastInterval||1),q=so(F,P);l.push(`Rate: ${F.toFixed(2)}/s theoretical | ${Math.min(F,P).toFixed(2)}/s actual`),l.push(`Boost cap: ${P.toFixed(2)}/s | Quality: x${q.toFixed(2)} ${Ha(q)}`),s.zundaBoostTime>0&&l.push(`Zunda boost: ${s.zundaBoostTime.toFixed(1)}s`)}else if(s.type==="scanner"){l.push(`Price: ${R(ce(s))}`),l.push(`Sale value: ${R(Ut({type:s.type,ref:s},e).amount)}`),l.push(`Type: ${s.kind.toUpperCase()} / Standard`),s.kind==="auto"&&l.push(`Role: ${s.role===0?"Male left / Others right":"Poop left / Others right"}`),l.push(`Queue: ${s.queue.length}`),s.kind==="auto"&&l.push(`Cooldown: ${s.cooldown.toFixed(1)}s / ${Bt(s,e).toFixed(1)}s`),s.kind==="auto"&&l.push(`Durability: ${Zn(s)}% | Delay x${Ho(s).toFixed(2)}`),s.kind==="manual"&&l.push("Durability: none | Always normal");let h=En(e,s);h&&br(l,h)}else if(s.type==="conveyor"){let h=e.conveyorMeta.get(s.id),m=e.componentLookup?.get(s.id),P=m?e.congestion.get(m):null;l.push(`Price: ${R(ce({type:"conveyor",oldKey:s.id,ref:s}))}`),l.push(`Cell: ${s.id}`),l.push(`Type: ${h?.kind==="boostConveyor"?"BOOST BELT":"Normal Belt"} | Speed x${Number(h?.speedMultiplier||1).toFixed(1)}`),l.push(`Congestion: ${P?Math.floor(P.ratio*100):0}%`),l.push(`Durability: ${Zn({meta:h})}% | Speed x${zo({meta:h}).toFixed(2)}`),yr(s.id)?Ht(s.id).length>=2?(l.push(`Branch mode: ${Ti(h?.branchMode||"random")}`),l.push("Click the Branch button or the on-belt triangle to cycle RANDOM / fixed exit.")):l.push("Branch mode: unavailable \u2014 fewer than two outgoing conveyors."):l.push("Branch mode: needs 3+ conveyor connections."),l.push(`Sale value: ${R(Ut({type:"conveyor",oldKey:s.id,ref:s},e).amount)}`)}else if(s.type==="powerWire"){let h=e.powerWires?.get(s.id),m=_.power.wires[h?.kind||"powerWire"];l.push(`Price: ${R(h?.price||m.price)}`),l.push(`Cell: ${s.id}`),l.push(`Type: ${m.name} | Loss ${m.lossV}V/tile`)}else if(s.type==="footbridge"){let h=e.footbridges?.get(s.id);l.push(`Price: ${R(h?.price||Le("footbridge",e))}`),l.push(`Cell: ${s.id}`),l.push(`Orientation: ${h?.orientation||"vertical"}`),l.push("Repair workers may cross this conveyor cell.")}else if(s.type==="maintenanceRoom"){l.push(`Price: ${R(ce({type:"maintenanceRoom",ref:s}))}`),l.push(`Sale value: ${R(Ut({type:"maintenanceRoom",ref:s},e).amount)}`),l.push("Size: 2\xD72 grid cells"),l.push("Dispatch: 1 repairman during each production day");let h=En(e,s);h&&br(l,h)}else if(s.type==="facility"){l.push(`Price: ${R(ce(s))}`);{let m=Ke({type:s.type,ref:s});l.push(m?`Sale: blocked (${m})`:`Sale value: ${R(Ut({type:s.type,ref:s},e).amount)}`)}if(l.push(["mixer","truck","trash","sausageMaker"].includes(y)?`Level: ${s.level} / no cap`:`Level: ${s.level}`),y==="truck"&&l.push("Durability: none | Always normal"),["mixer","trash","sausageMaker"].includes(y)&&l.push(`Durability: ${Zn(s)}% | Extra delay ${ii(e,s).toFixed(2)}s`),y==="mixer"){l.push(`Output: 1 meat per non-poop chick | meat buffer ${s.meatBuffer||0}`),l.push(`Meat quality: x${Rt(e,"mixer").toFixed(3)} to sausage value`);let m=He(e,s);l.push(`OUT: ${m?`${m.col},${m.row}`:"none"} | conveyor ${kt(e,s)?"connected":"missing"}`),l.push(`Fallback sale: ${R(Ie.income.mixer)} when OUT is missing or blocked`),l.push(`Poop fine: -${R(Yn(e))}`)}if(y==="truck"&&(l.push(`Income: ${R(Je(e))} per target cargo | upgrade x${Rt(e,"truck").toFixed(3)}`),l.push(`Poop shipment fine: -${R(Qn(e))}`)),y==="trash"){let m=At(e),P=It(m),F=tn(m);l.push(`Bonus cards: ${m}/${kn()}`),l.push(`Expected poop bonus: ${R(P)} | hit chance ${Math.round(F*100)}%`),l.push("Winning payouts roll 1x / 2x / 4x / 10x, with jackpot odds rising per card."),l.push("With enough upgrades, poop can out-earn male/female routes.")}if(y==="sausageMaker"){let m=wt(e,s),P=He(e,s);l.push("Size: 3\xD73 grid cells | IN left / OUT right"),l.push(`Recipe: 2 meat -> 1 sausage | meat buffer ${s.meatBuffer||0} | sausage buffer ${s.sausageBuffer||0}`),l.push(`Sausage sale value: ${R(lt(e))}`),l.push(`IN: ${m?`${m.col},${m.row}`:"none"} | OUT: ${P?`${P.col},${P.row}`:"none"} | conveyor ${kt(e,s)?"connected":"missing"}`)}s.entry&&l.push(`Receiver: edge cell ${s.entry.col},${s.entry.row} (${s.side})`);let h=En(e,s);h&&br(l,h)}return l}function br(s,l){s.push(`Power: ${l.receivedV.toFixed(1)}V / ${l.minVoltage}V`),s.push(`Source: ${l.sourceName} | Source bus: ${l.sourceBusV.toFixed(1)}V`),s.push(`Route loss: ${l.routeLossV.toFixed(1)}V | Voltage Load: ${l.drawV}V`),l.receivedVy.type===s.type&&y.id===s.id);return l?l.message||"Not connected to conveyor route":""}function xl(s){return s?s.type==="conveyor"&&e.conveyorMeta.get(s.id)?.kind==="boostConveyor"?"Moves chicks twice as fast. Wears down like a normal belt.":s.type==="conveyor"?"A stubborn belt tile. It only cares about the next cell.":s.type==="eggFarm"?"A tiny gatehouse producing questionable eggs on schedule.":s.type==="scanner"&&s.kind==="auto"?"A compact 2\xD72 scanner sized for roughly 2.1 level-1 farms.":s.type==="scanner"?"A manual checkpoint. The operator is the algorithm.":s.type==="facility"&&(s.baseId||s.id)==="mixer"?"Chicks become meat when OUT is clear; a blocked OUT falls back to direct sale.":s.type==="facility"&&(s.baseId||s.id)==="trash"?"Poop goes in. Sometimes coins come out, for reasons best left unaudited.":s.type==="facility"&&(s.baseId||s.id)==="truck"?"The shipping endpoint. Correct cargo and sausages pay; wrong cargo complains.":s.type==="facility"&&(s.baseId||s.id)==="sausageMaker"?"A 3\xD73 in-grid machine with one meat inlet on the left and one sausage outlet on the right.":s.type==="maintenanceRoom"?"A cramped 2\xD72 storage and break room with lockers, spare parts, a bench and one dispatched repairman.":"Factory equipment.":""}return{buildAtCell:po,buildAtPoint:fn,eraseAtPoint:S,equipmentAtPoint:I,startSelectionBox:A.startSelectionBox,updateSelectionBox:A.updateSelectionBox,finishSelectionBox:A.finishSelectionBox,startGroupDrag:A.startGroupDrag,updateGroupDrag:A.updateGroupDrag,finishGroupDrag:A.finishGroupDrag,selectedObject:j,selectedTitle:le,equipmentPrice:ce,selectedUpgradeCost:U,selectedInfoLines:Pi,flavorText:xl,disconnectedWarningFor:gl,gridExpansionCost:K,buyGridExpansion:se,expansionOfferAtPoint:J,beginConveyorDrag:lr,continueConveyorDrag:cr,endConveyorDrag:Qt,cycleSingleConveyorDirection:co,branchSwitcherAtPoint:Ei,cycleBranchModeAtPoint:Cl,cycleBranchModeForKey:hr,branchSelectableExitDirsForKey:Ht,removeSelected:he,switchScannerRole:vl,showManualScannerMenu:Wn,showInboundTruckMenu:Ci,showAutoScannerMenu:_n,showSelectedMenu:xi,setBuildTool:kl,fail:T,isEquipmentCell:xe,equipmentHitBoxes:Ml,routeFromFarmToScanner:en}}function Xa({game:e,ui:t,build:n,startGame:o,beginCardDraft:r,activeQueuedChick:i}){function a(O){return String(O).replace(/[&<>"']/g,H=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[H])}function c(){return Math.round(Vt(e))}function b(){if(e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending)return!1;let O=!1;for(let H of Mr)if(O=!0,e.cash>=Le(H,e))return!1;return O}function M(){C(),$(),K(),W()}function C(){for(let[H,oe]of Object.entries(t.buttons))oe?.classList?.contains("tool-button")&&oe.classList.toggle("active",e.buildTool===H);t.buttons.powerOverlay?.classList.toggle("active",!!e.powerOverlay),t.buttons.powerOverlay&&(t.buttons.powerOverlay.disabled=e.phase!=="build"||!!e.cardDraft?.pending||!!e.cardTargetPick?.pending);for(let H of Mr){let oe=t.buttons[H];if(!oe)continue;let ue=Le(H,e),Ve=oe.querySelector("span");Ve&&(Ve.textContent=H==="conveyor"||H==="boostConveyor"?`${R(ue)} / tile`:R(ue));let xe=H==="manualScanner"&&e.scanners.filter(x=>x.kind==="manual").length>=8,Ge=e.cashen(e,oe)?.scannerId).length,H=$o(e);t.turnSummary.innerHTML=[`Seed: ${a(e.runSeed||"none")} | Grid box: ${e.gridRows||10}x${e.gridCols||20} | Owned: ${e.gridOwnedCells||e.ownedCells?.size||(e.gridRows||10)*(e.gridCols||20)} cells | Blocked: ${e.blockedCells?.size||0} cells`,`Penalties: wrong shipment -${R(zr(e))} | Mixer poop -${R(Yn(e))} | Shipment poop -${R(Qn(e))}`,aa(e),`Maintenance: worst ${li(e).worst.percent}% dirty (${li(e).worst.label}) | Rooms: ${(e.maintenanceRooms||[]).length} | Repairmen: ${(e.repairmen||[]).length}`,`Card draft: ${e.cardDraft?.pending?Math.max(1,e.cardDraft.picksRemaining||1)+" pick(s) left":"ready after each day"} | Farms with scanner route: ${O}/${e.eggFarms.length}`,e.cardEffects?.usedMachineActive?'Procurement: USED MACHINE MODE / no refunds / 60% durability':"",H.length?`Blocked: ${H[0]}`:`${pe.status.allPortsConnected}`].filter(Boolean).join(" ")}function G(){C(),t.shell.classList.toggle("phase-running",e.phase==="running"),t.shell.classList.toggle("phase-build",e.phase==="build"),t.shell.classList.toggle("phase-gameover",e.phase==="gameover"),t.shell.classList.toggle("phase-title",e.phase==="title"),t.shell.classList.toggle("phase-loanDecision",e.phase==="loanDecision"),t.money.textContent=R(e.cash),t.money.classList.toggle("cash-negative",e.cash<0),t.money.classList.toggle("cash-positive",e.cash>Un),t.turn.textContent=e.turn,t.timeLeft.textContent=e.phase==="running"&&e.timeLeft<=0&&e.shutdownTimeLeft>0?`+${e.shutdownTimeLeft.toFixed(1)}s`:`${Math.max(0,e.timeLeft).toFixed(1)}s`,t.timeLeft.closest?.(".hud-card")?.classList.toggle("time-critical",e.phase==="running"&&(e.timeLeft<=10||e.timeLeft<=0&&e.shutdownTimeLeft>0)),t.phase.textContent=Q(),t.comboCount&&(t.comboCount.textContent=e.manualCombo?.count||0),z(),t.turnProfit.textContent=R(e.stats.profit),t.turnProfit.classList.toggle("cash-negative",e.stats.profit<0),t.turnProfit.classList.toggle("cash-positive",e.stats.profit>0),t.mixerCount.textContent=e.stats.mixerCount,t.truckFemaleCount.textContent=e.stats.truckFemale,t.truckMaleCount.textContent=e.stats.truckMale,t.poopCount.textContent=e.stats.poopSpawned,t.buttons.s1Left.disabled=e.phase!=="running"||!i(0),t.buttons.s1Right.disabled=e.phase!=="running"||!i(0),t.buttons.s2Left.disabled=e.phase!=="running"||!i(1),t.buttons.s2Right.disabled=e.phase!=="running"||!i(1);let O=e.scanners.find(xe=>xe.kind==="manual"&&xe.slot===0),H=e.scanners.find(xe=>xe.kind==="manual"&&xe.slot===1);O&&(t.buttons.s1Left.textContent=`S1 ${O.keys?.left?.label||"A"} -> Mixer`,t.buttons.s1Right.textContent=`S1 ${O.keys?.right?.label||"D"} -> S2`),H&&(t.buttons.s2Left.textContent=`S2 ${H.keys?.left?.label||"Left"} -> Waste`,t.buttons.s2Right.textContent=`S2 ${H.keys?.right?.label||"Right"} -> Truck`);let oe=Math.max(0,Math.floor(e.lastResult?.profit??e.stats?.profit??0)),ue=Yr(e,Math.max(1,Number(e.turn)||1),oe).amount,Ve=e.phase==="build"&&ue>0?`NEXT DAYFAIRIES -${R(ue)}`:`${pe.actions.nextDay}`;t.buttons.nextTurn.dataset.renderedHtml!==Ve&&(t.buttons.nextTurn.innerHTML=Ve,t.buttons.nextTurn.dataset.renderedHtml=Ve),t.buttons.nextTurn.disabled=e.phase!=="build"||!!e.cardDraft?.pending||!!e.cardTargetPick?.pending}function z(){if(!t.eventBrief||!t.speedBrief)return;t.speedBrief.textContent=`BELT SPEED: ${c()} px/s`,t.speedBrief.title=`Conveyor speed does not increase by day. Degraded belts reduce speed. Cap: ${yn}px/s.`;let O=e.eventActive,H=e.eventOffer;O?(t.eventBrief.textContent=`ACTIVE EVENT: ${O.title} | ${O.route}`,t.eventBrief.className="event-brief active"):e.phase==="build"&&H?(t.eventBrief.textContent=`NEXT DAY EVENT: ${H.title} | ${H.route}${H.targetAmount?` | Target ${H.targetAmount}`:""}${H.reward?` | Reward ${R(H.reward)}`:""}`,t.eventBrief.className="event-brief next"):e.phase==="build"&&e.turn+1
\u2642Male->Mixer -> MeatS1: A
\u2640Female->TruckS1: D, then S2: right
\u{1F4A9}Poop->ShredderS1: D, then S2: left
Build phase: connect at least one EGG through a scanner to Mixer, Shredder, or Truck before Next Day. One day is one run.