(()=>{CM.Cache.InitCache=function(){CM.Cache.CacheDragonAuras(),CM.Cache.CacheWrinklers(),CM.Cache.CacheStats(),CM.Cache.CacheGoldenAndWrathCookiesMults(),CM.Cache.CacheChain(),CM.Cache.CacheMissingUpgrades(),CM.Cache.CacheSeaSpec(),CM.Cache.InitCookiesDiff(),CM.Cache.HeavenlyChipsDiff=new e(5),CM.Cache.CacheHeavenlyChipsPS(),CM.Cache.CacheAvgCPS(),CM.Cache.CacheIncome(),CM.Cache.CacheBuildingsPrices(),CM.Cache.CachePP()},CM.Cache.LoopCache=function(){CM.Cache.CacheWrinklers(),CM.Cache.CachePP(),CM.Cache.CacheCurrWrinklerCPS(),CM.Cache.CacheAvgCPS(),CM.Cache.CacheHeavenlyChipsPS();const e=Game.HowManyCookiesReset(Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned))+1)-(Game.cookiesEarned+Game.cookiesReset);CM.Cache.TimeTillNextPrestige=CM.Disp.FormatTime(e/CM.Disp.GetCPS())};class e{constructor(e){this.maxLength=e,this.queue=[]}addLatest(e){this.queue.push(e)>this.maxLength&&this.queue.shift()}calcAverage(e){e>this.maxLength&&(e=this.maxLength),e>this.queue.length&&(e=this.queue.length);let a=0;for(let C=this.queue.length-1;C>=0&&C>this.queue.length-1-e;C--)a+=this.queue[C];return 0===a?0:a/e}}CM.Cache.CacheDragonAuras=function(){CM.Cache.dragonAura=Game.dragonAura,CM.Cache.dragonAura2=Game.dragonAura2},CM.Cache.CacheWrinklers=function(){CM.Cache.WrinklersTotal=0,CM.Cache.WrinklersNormal=0,CM.Cache.WrinklersFattest=[0,null];for(let e=0;eCM.Cache.WrinklersFattest[0]&&(CM.Cache.WrinklersFattest=[a,e]))}},CM.Cache.CacheStats=function(){CM.Cache.Lucky=900*CM.Cache.NoGoldSwitchCookiesPS/.15,CM.Cache.Lucky*=CM.Cache.DragonsFortuneMultAdjustment;const e=CM.Cache.getCPSBuffMult();e>0?CM.Cache.Lucky/=e:CM.Cache.Lucky=0,CM.Cache.LuckyReward=CM.Cache.GoldenCookiesMult*(.15*CM.Cache.Lucky)+13,CM.Cache.LuckyWrathReward=CM.Cache.WrathCookiesMult*(.15*CM.Cache.Lucky)+13,CM.Cache.LuckyFrenzy=7*CM.Cache.Lucky,CM.Cache.LuckyRewardFrenzy=CM.Cache.GoldenCookiesMult*(.15*CM.Cache.LuckyFrenzy)+13,CM.Cache.LuckyWrathRewardFrenzy=CM.Cache.WrathCookiesMult*(.15*CM.Cache.LuckyFrenzy)+13,CM.Cache.Conjure=2*CM.Cache.Lucky,CM.Cache.ConjureReward=.15*CM.Cache.Conjure,CM.Cache.Edifice=0;let a=0,C=0;for(const e of Object.keys(Game.Objects))Game.Objects[e].amount>a&&(a=Game.Objects[e].amount),Game.Objects[e].amount>0&&C++;for(const e of Object.keys(Game.Objects))(Game.Objects[e].amountCM.Cache.Edifice&&(CM.Cache.Edifice=2*Game.Objects[e].price,CM.Cache.EdificeBuilding=e)},CM.Cache.CacheGoldenAndWrathCookiesMults=function(){if(CM.Footer.isInitzializing)CM.Cache.GoldenCookiesMult=1,CM.Cache.WrathCookiesMult=1,CM.Cache.DragonsFortuneMultAdjustment=1;else{let e=1,a=1,C=1;CM.Sim.Has("Green yeast digestives")&&(C*=1.01),CM.Sim.Has("Dragon fang")&&(C*=1.03),e*=1+.1*Game.auraMult("Ancestral Metamorphosis"),e*=Game.eff("goldenCookieGain"),a*=1+.1*Game.auraMult("Unholy Dominion"),a*=Game.eff("wrathCookieGain"),CM.Cache.GoldenCookiesMult=C*e,CM.Cache.WrathCookiesMult=C*a,CM.Cache.DragonsFortuneMultAdjustment=1,0===Game.shimmerTypes.golden.n&&(CM.Cache.DragonsFortuneMultAdjustment*=1+1.23*Game.auraMult("Dragon's Fortune"))}},CM.Cache.MaxChainCookieReward=function(e,a,C){let c=0,o=0,i=0,s=0,t=1+Math.max(0,Math.ceil(Math.log(Game.cookies)/Math.LN10)-10);for(;i0?e/=a:e=0,CM.Cache.ChainMaxReward=CM.Cache.MaxChainCookieReward(7,e,CM.Cache.GoldenCookiesMult),CM.Cache.ChainRequired=2*CM.Cache.ChainMaxReward[1]/CM.Cache.GoldenCookiesMult,CM.Cache.ChainRequiredNext=CM.Cache.ChainMaxReward[2]/60/60/6/CM.Cache.DragonsFortuneMultAdjustment,CM.Cache.ChainMaxWrathReward=CM.Cache.MaxChainCookieReward(6,e,CM.Cache.WrathCookiesMult),CM.Cache.ChainWrathRequired=2*CM.Cache.ChainMaxWrathReward[1]/CM.Cache.WrathCookiesMult,CM.Cache.ChainWrathRequiredNext=CM.Cache.ChainMaxWrathReward[2]/60/60/6/CM.Cache.DragonsFortuneMultAdjustment,CM.Cache.ChainFrenzyMaxReward=CM.Cache.MaxChainCookieReward(7,7*e,CM.Cache.GoldenCookiesMult),CM.Cache.ChainFrenzyRequired=2*CM.Cache.ChainFrenzyMaxReward[1]/CM.Cache.GoldenCookiesMult,CM.Cache.ChainFrenzyRequiredNext=CM.Cache.ChainFrenzyMaxReward[2]/60/60/6/CM.Cache.DragonsFortuneMultAdjustment,CM.Cache.ChainFrenzyMaxWrathReward=CM.Cache.MaxChainCookieReward(6,7*e,CM.Cache.WrathCookiesMult),CM.Cache.ChainFrenzyWrathRequired=2*CM.Cache.ChainFrenzyMaxWrathReward[1]/CM.Cache.WrathCookiesMult,CM.Cache.ChainFrenzyWrathRequiredNext=CM.Cache.ChainFrenzyMaxWrathReward[2]/60/60/6/CM.Cache.DragonsFortuneMultAdjustment},CM.Cache.CacheMissingUpgrades=function(){CM.Cache.MissingUpgrades="",CM.Cache.MissingUpgradesCookies="",CM.Cache.MissingUpgradesPrestige="";const e=[];for(const a of Object.keys(Game.Upgrades))e.push(Game.Upgrades[a]);e.sort((function(e,a){return e.order>a.order?1:e.order0&&(a+=CM.Cache.WrinklersTotal),CM.Cache.RealCookiesEarned=Math.max(Game.cookiesEarned,a),a*=.05;const C=e-CM.Cache.lastCPSCheck,c=Math.max(0,Game.cookies-CM.Cache.lastCookies)/C,o=Math.max(0,CM.Cache.WrinklersTotal-CM.Cache.lastWrinkCookies)/C,i=Math.max(0,CM.Cache.WrinklersFattest[0]-CM.Cache.lastWrinkFattestCookies)/C,s=Math.max(0,a-CM.Cache.lastChoEgg)/C,t=(Game.cookieClicks-CM.Cache.lastClicks)/C;for(let e=0;eCM.Cache.max?CM.Disp.colorPurple:e.pp>CM.Cache.mid?CM.Disp.colorOrange:CM.Disp.colorYellow,0!==Number(CM.Options.PPSecondsLowerLimit)&&a/CM.Disp.GetCPS()0&&(C=CM.Disp.colorRed),C},CM.Cache.CacheBuildingsPP=function(){if(CM.Cache.min=1/0,CM.Cache.max=1,CM.Cache.ArrayOfPPs=[],void 0===CM.Options.PPExcludeTop&&(CM.Options.PPExcludeTop=0),0===CM.Options.ColorPPBulkMode&&Game.buyMode>0){for(const e of Object.keys(CM.Cache.Objects1))Game.cookiesPs?CM.Cache.Objects1[e].pp=Math.max(Game.Objects[e].getPrice()-(Game.cookies+CM.Disp.GetWrinkConfigBank()),0)/Game.cookiesPs+Game.Objects[e].getPrice()/CM.Cache.Objects1[e].bonus:CM.Cache.Objects1[e].pp=Game.Objects[e].getPrice()/CM.Cache.Objects1[e].bonus,CM.Cache.ArrayOfPPs.push([CM.Cache.Objects1[e].pp,Game.Objects[e].getPrice()]);if(CM.Cache.ArrayOfPPs.sort(((e,a)=>e[0]-a[0])),CM.Options.PPOnlyConsiderBuyable)for(;CM.Cache.ArrayOfPPs[0][1]>Game.cookies&&1!==CM.Cache.ArrayOfPPs.length;)CM.Cache.ArrayOfPPs.shift();CM.Cache.min=CM.Cache.ArrayOfPPs[CM.Options.PPExcludeTop][0],CM.Cache.max=CM.Cache.ArrayOfPPs[CM.Cache.ArrayOfPPs.length-1][0],CM.Cache.mid=(CM.Cache.max-CM.Cache.min)/2+CM.Cache.min;for(const e of Object.keys(CM.Cache.Objects1)){CM.Cache.Objects1[e].color=CM.Cache.ColourOfPP(CM.Cache.Objects1[e],Game.Objects[e].getPrice());for(let a=0;a0){const e=`Objects${Game.buyBulk}`;for(const a of Object.keys(CM.Cache[e]))Game.cookiesPs?CM.Cache[e][a].pp=Math.max(Game.Objects[a].bulkPrice-(Game.cookies+CM.Disp.GetWrinkConfigBank()),0)/Game.cookiesPs+Game.Objects[a].bulkPrice/CM.Cache[e][a].bonus:CM.Cache[e][a].pp=Game.Objects[a].bulkPrice/CM.Cache[e][a].bonus,CM.Cache.ArrayOfPPs.push([CM.Cache[e][a].pp,Game.Objects[a].bulkPrice]);if(CM.Cache.ArrayOfPPs.sort(((e,a)=>e[0]-a[0])),CM.Options.PPOnlyConsiderBuyable)for(;CM.Cache.ArrayOfPPs[0][1]>Game.cookies&&1!==CM.Cache.ArrayOfPPs.length;)CM.Cache.ArrayOfPPs.shift();CM.Cache.min=CM.Cache.ArrayOfPPs[CM.Options.PPExcludeTop][0],CM.Cache.max=CM.Cache.ArrayOfPPs[CM.Cache.ArrayOfPPs.length-1][0],CM.Cache.mid=(CM.Cache.max-CM.Cache.min)/2+CM.Cache.min;for(const a of Object.keys(CM.Cache.Objects1)){CM.Cache[e][a].color=CM.Cache.ColourOfPP(CM.Cache[e][a],Game.Objects[a].bulkPrice);for(let C=0;C