@betorigami/game-calculations 4.5.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var Yt=Object.create;var{getPrototypeOf:dt,defineProperty:L,getOwnPropertyNames:DE,getOwnPropertyDescriptor:Ft}=Object,_E=Object.prototype.hasOwnProperty;var w=(r,E,t)=>{t=r!=null?Yt(dt(r)):{};let A=E||!r||!r.__esModule?L(t,"default",{value:r,enumerable:!0}):t;for(let o of DE(r))if(!_E.call(A,o))L(A,o,{get:()=>r[o],enumerable:!0});return A},xE=new WeakMap,$t=(r)=>{var E=xE.get(r),t;if(E)return E;if(E=L({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")DE(r).map((A)=>!_E.call(E,A)&&L(E,A,{get:()=>r[A],enumerable:!(t=Ft(r,A))||t.enumerable}));return xE.set(r,E),E};var zt=(r,E)=>{for(var t in E)L(r,t,{get:E[t],enumerable:!0,configurable:!0,set:(A)=>E[t]=()=>A})};var bA={};zt(bA,{validateRouletteGameInputs:()=>_A,validateAdvancedDiceInputs:()=>it,rtp99Multipliers:()=>ct,rtp98Multipliers:()=>ut,rtp97Multipliers:()=>Bt,rtp96Multipliers:()=>St,rtp92Multipliers:()=>xt,plinkoMultipliers:()=>sr,nCr:()=>Rr,kenoMultipliers:()=>vr,isTileCount:()=>Kr,hasDiceWon:()=>ot,diamondsMultipliers:()=>rt,calculateRouletteBetAmount:()=>DA,calculateDiceWinChance:()=>At,calculateBaccaratBetAmount:()=>pE,calculateAdvancedDiceWinChance:()=>Yr,bigMin:()=>lr,bigMax:()=>gr,advancedDiceIsWithinBoundsInclusive:()=>TE,advancedDiceIsWithinBoundsExclusive:()=>fr,advancedDiceGetInclusiveBoundsRange:()=>UE,advancedDiceGetExclusiveBoundsRange:()=>Or,WheelSegments:()=>j,WheelRiskLevel:()=>H,Wheel:()=>Pt,WIN_MULTIPLIER:()=>IE,VALID_SUITS:()=>ME,VALID_RANKS:()=>RE,VALID_EUROPEAN_STREETS:()=>rE,VALID_EUROPEAN_STRAIGHTS:()=>hr,VALID_EUROPEAN_SPLITS:()=>kr,VALID_EUROPEAN_DOUBLE_STREETS:()=>fE,VALID_EUROPEAN_CORNERS:()=>tE,VALID_AMERICAN_STREETS:()=>EE,VALID_AMERICAN_STRAIGHTS:()=>nr,VALID_AMERICAN_SPLITS:()=>er,VALID_AMERICAN_DOUBLE_STREETS:()=>OE,VALID_AMERICAN_CORNERS:()=>AE,ThreeCardBonusType:()=>_r,TOP_COLUMN:()=>bt,TILE_COUNTS:()=>Ot,THREE_CARD_BONUS_PAYOUTS:()=>zr,SPLIT_BET_SIZE_FACTOR:()=>F,RouletteType:()=>wr,Roulette:()=>SE,RollType:()=>bE,RandomValuePool:()=>s,RED_NUMBERS:()=>Rt,RANDOM_MIN_VALUE:()=>cr,RANDOM_MAX_VALUE:()=>ur,PlinkoRiskLevel:()=>ar,Plinko:()=>Tt,Parity:()=>m,PairBonusType:()=>Dr,PUSH_MULTIPLIER:()=>PE,PLINKO_ROW_COUNTS:()=>kt,PAYOUT_MULTIPLIERS:()=>Ut,PAIR_BONUS_PAYOUTS:()=>$r,OrigamiGame:()=>b,MultiplierCalculator:()=>y,Mines:()=>Nt,MIN_WIN_CHANCE:()=>NE,MIDDLE_COLUMN:()=>Gt,MAX_WIN_CHANCE:()=>CE,MAX_CARDS_PER_ROUND:()=>Nr,Limbo:()=>Zt,LOSE_MULTIPLIER:()=>YE,KenoRiskLevel:()=>Lr,Keno:()=>_t,InsuranceOutcome:()=>Sr,INSURANCE_WIN_PAYOUT:()=>Cr,INSURANCE_BET_SIZE_FACTOR:()=>Q,INSURANCE_BET_MULTIPLIER:()=>Qt,Half:()=>X,GameErrorCode:()=>ZE,GameError:()=>B,Game:()=>_,FACE_CARD_VALUE:()=>Fr,EuropeanRoulette:()=>uE,EUROPEAN_HOUSE_EDGE:()=>wt,EFFECTIVE_RANGE:()=>Ir,Dozen:()=>q,DiceDirection:()=>tt,Dice:()=>ft,DiamondsResultType:()=>eE,Diamonds:()=>Et,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>V,DICE_EFFECTIVE_RANGE:()=>jr,DEALER_STAND_VALUE:()=>dr,Column:()=>i,Color:()=>J,CARDS_PER_SUIT:()=>Ht,BlackjackOutcome:()=>Br,BlackjackActionType:()=>xr,Blackjack:()=>nE,BaccaratOutcome:()=>hE,BaccaratBetType:()=>wE,Baccarat:()=>yE,BUST_VALUE:()=>Zr,BOTTOM_COLUMN:()=>Mt,BLACK_NUMBERS:()=>ht,BLACKJACK_VALUE:()=>G,BLACKJACK_MULTIPLIER:()=>VE,BASE_PAYOUT_MULTIPLIERS:()=>K,AmericanRoulette:()=>BE,AdvancedDice:()=>GE,AMERICAN_HOUSE_EDGE:()=>pt,AMERICAN_BASKET:()=>oE,ACE_SOFT_BONUS:()=>Tr});module.exports=$t(bA);var ZE;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(ZE||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,E){super(E);this.errorCode=r}}var b;((u)=>{u.DICE="DICE";u.MINES="MINES";u.KENO="KENO";u.LIMBO="LIMBO";u.ADVANCED_DICE="ADVANCED_DICE";u.BACCARAT="BACCARAT";u.DIAMONDS="DIAMONDS";u.PLINKO="PLINKO";u.ROULETTE="ROULETTE";u.WHEEL="WHEEL";u.BLACKJACK="BLACKJACK"})(b||={});class _{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var Pr=require("big.js");var Ar=w(require("big.js"));class y{static withMultiplier(r,E){return new Ar.default(r).times(new Ar.default(100-E).div(100))}static withWinChance(r,E){return Ar.default(100-r).div(E)}}var cr=0,ur=1e4,Ir=10001,NE=0.01,CE=98,mt=(r)=>{if(r<cr)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${cr}`)},Jt=(r)=>{if(r>ur)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${ur}`)},or=(r)=>{if(mt(r.lower),Jt(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},Xt=(r,E)=>{let[t,A]=r.lower<=E.lower?[r,E]:[E,r];if(t.upper>A.lower)throw B.createValidationError("Bounds must not overlap")},TE=(r,E)=>E>=r.lower&&E<=r.upper,UE=(r)=>r.upper-r.lower+1,fr=(r,E)=>E>r.lower&&E<r.upper,Or=(r)=>r.upper-r.lower-1,bE;((A)=>{A.ROLL_BETWEEN="ROLL_BETWEEN";A.ROLL_OUTSIDE="ROLL_OUTSIDE";A.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(bE||={});var Yr=(r)=>{let t=(()=>{switch(r.mode){case"ROLL_BETWEEN":return or(r.bounds),Or(r.bounds);case"ROLL_OUTSIDE":return or(r.bounds),Ir-UE(r.bounds);case"ROLL_BETWEEN_TWO":return or(r.firstBounds),or(r.secondBounds),Xt(r.firstBounds,r.secondBounds),Or(r.firstBounds)+Or(r.secondBounds)}})(),A=Pr.Big(t).div(Ir).mul(100);if(A.lt(NE))throw B.createValidationError("Win chance too low");if(A.gt(CE))throw B.createValidationError("Win chance too high");return A},it=(r)=>{Yr(r)};class GE extends _{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:t}){let A=Yr(t),o=r.getRandomInt({min:cr,max:ur}),f=o.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(t.mode){case"ROLL_BETWEEN":return fr(t.bounds,f);case"ROLL_OUTSIDE":return!TE(t.bounds,f);case"ROLL_BETWEEN_TWO":return fr(t.firstBounds,f)||fr(t.secondBounds,f)}})()?y.withWinChance(E,A):new Pr.Big(0),outputs:{result:o.values},randomValues:o}}}var d=w(require("big.js"));var ME=["Clubs","Diamonds","Hearts","Spades"],RE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],hE;((A)=>{A.PLAYER_WIN="PLAYER_WIN";A.TIE="TIE";A.BANKER_WIN="BANKER_WIN"})(hE||={});var wE;((A)=>{A.PLAYER="PLAYER";A.TIE="TIE";A.BANKER="BANKER"})(wE||={});var qt={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},pE=(r)=>{return new d.default(0).add(r.bets.reduce((t,A)=>t.add(A.amount),new d.default(0)))};class yE extends _{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:E,edge:t}){if(t!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(E);let A=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=A.values,f=o.slice(0,3),O=o.slice(3,6),c=[],S=0;for(let C of f.slice(0,2)){let h=this.mapRandomValueToCard(C),tr=this.mapRandomValueToCardValue(C);c.push(h),S=(S+tr)%10}let D=[],x=0;for(let C of O.slice(0,2)){let h=this.mapRandomValueToCard(C),tr=this.mapRandomValueToCardValue(C);D.push(h),x=(x+tr)%10}if(!this.isNaturalWin(S,x)){let C=this.shouldDrawThirdPlayerCard(S),h=null;if(C)h=this.mapRandomValueToCardValue(f[2]),c.push(this.mapRandomValueToCard(f[2])),S=(S+h)%10;if(this.shouldDrawThirdBankerCard(x,h))D.push(this.mapRandomValueToCard(O[2])),x=(x+this.mapRandomValueToCardValue(O[2]))%10}let u;if(S===x)u="TIE";else u=S>x?"PLAYER_WIN":"BANKER_WIN";let N=pE(E),{betType:Y,multiplier:Vr}=qt[u],W=new d.default(0);if(W=W.add(E.bets.filter((C)=>C.type===Y).reduce((C,h)=>C.add(h.amount.mul(Vr)),new d.default(0))),u==="TIE")W=W.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,h)=>C.add(h.amount),new d.default(0)));return{isFinished:!0,payoutMultiplier:N.gt(0)?W.div(N):new d.default(0),outputs:{playerCards:c,playerHandValue:S,bankerCards:D,bankerHandValue:x,gameOutcome:u,result:A.values},randomValues:A}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((E)=>E.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let E=ME[Math.floor(r/13)],t=RE[r%13];return{suit:E,rank:t}}isNaturalWin(r,E){let t=[8,9];return t.includes(r)||t.includes(E)}mapRandomValueToCardValue(r){let E=r%13;if(E===0)return 1;if(E>=10)return 10;return E+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,E){if(E===null)return r<=5;if(r<=2)return!0;if(r===3)return E!==8;if(r===4)return[2,3,4,5,6,7].includes(E);if(r===5)return[4,5,6,7].includes(E);if(r===6)return[6,7].includes(E);return!1}}var Br;((o)=>{o.WIN="WIN";o.LOSE="LOSE";o.PUSH="PUSH";o.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Br||={});var Sr;((t)=>{t.WON="WON";t.LOST="LOST"})(Sr||={});var xr;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";c.SPLIT="BLACKJACK_SPLIT"})(xr||={});var Dr;((o)=>{o.EXACT_PAIR="EXACT_PAIR";o.COLORED_PAIR="COLORED_PAIR";o.MIXED_PAIR="MIXED_PAIR";o.LOSS="LOSS"})(Dr||={});var _r;((O)=>{O.SUITED_TRIPS="SUITED_TRIPS";O.STRAIGHT_FLUSH="STRAIGHT_FLUSH";O.THREE_OF_A_KIND="THREE_OF_A_KIND";O.STRAIGHT="STRAIGHT";O.FLUSH="FLUSH";O.LOSS="LOSS"})(_r||={});var VE=2.5,IE=2,PE=1,YE=0,dr=17,Zr=21,G=21,Nr=63,Qt=1.5,Q=0.5,Cr=1.5,V=1,F=1,Ht=13,Tr=10,Fr=10,K={PLAYER_BLACKJACK:VE,WIN:IE,PUSH:PE,LOSE:YE},$r={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},zr={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};var P=w(require("big.js")),Z=require("@betorigami/guard"),aE=require("@xstate/store");var dE=0,FE=51,Ur=Array.from({length:52},(r,E)=>E),$E=["Spades","Hearts","Diamonds","Clubs"],br=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],zE=["Jack","Queen","King"],mr={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};var mE=require("@betorigami/guard");var Gr=require("@betorigami/guard");class Jr{value;constructor(r){let E=Ur[r];Gr.Guard.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=$E[r];return Gr.Guard.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=br[r];return Gr.Guard.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class T extends Jr{get numericRank(){if(zE.includes(this.rank))return Fr;return br.indexOf(this.rank)+1}static fromValue(r){return mE.Guard.against(!Ur.includes(r),`Invalid card value: ${r}`),new T(r)}}class v{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((t,A)=>t+A.numericRank,0),r.some((t)=>t.rank==="Ace")&&this.hardHandValue+Tr<=Zr)this.softHandValue=this.hardHandValue+Tr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Zr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===G}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class g{cards;value;constructor(r){this.cards=r.map((E)=>T.fromValue(E)),this.value=new v(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class l extends g{otherCards;upCard;holeCard;constructor(r,E,t=[]){super([r,E,...t]);this.otherCards=t;this.upCard=T.fromValue(r),this.holeCard=T.fromValue(E)}static withInitialDeal(r){return new l(r.upCard,r.holeCard)}addDrawnCards(r){return new l(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new v([this.upCard]).highestHandValue}}}class $ extends g{static withInitialDeal(r){return new $(r)}addDrawnCards(r){return new $([...this.rawValues,...r])}}var a=require("@betorigami/guard");class s{source;index=0;constructor(r){this.source=r}static from(r,E){return a.Guard.against(E<=0,`Count must be positive, got ${E}`),a.Guard.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new s(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return a.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){a.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let E=this.source.values.slice(this.index,this.index+r);return this.index+=r,E}}var JE=require("@betorigami/guard"),XE=w(require("fast-deep-equal"));class Xr{edge;constructor(r){this.edge=r}play(r,E,t=[]){let A=this.createGameStore(),o=this.generateRandomValues(r),f=o.toMultipleRandomValues();for(let S of t)A.send({...S.playerArgument,randomValuePool:o});let O=t[t.length-1];if(O)JE.Guard.against(!XE.default(O.state,this.toExternalState(A.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");A.send({...E,randomValuePool:o});let c=A.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}var M=w(require("big.js"));var Mr=require("@betorigami/guard");var iE=(r)=>{let E=r.pairBonus!==null?M.default(r.pairBonus.betAmount).mul(r.pairBonus.payoutMultiplier):M.default(0),t=r.threeCardBonus!==null?M.default(r.threeCardBonus.betAmount).mul(r.threeCardBonus.payoutMultiplier):M.default(0);return E.plus(t)},qE=(r)=>{let E=r.betAmounts.mainBetAmount,A=r.actionType==="BLACKJACK_DOUBLE_DOWN"?E.mul(V):M.default(0),o=r.insuranceOutcome!==void 0?E.mul(Q):M.default(0),f=E.plus(A).mul(K[r.outcome]),O=r.insuranceOutcome==="WON"?E.mul(Cr):M.default(0),c=iE(r.sideBetResults),S=f.plus(O).plus(c),D=E.plus(o).plus(A).plus(r.betAmounts.pairBonusAmount).plus(r.betAmounts.threeCardBonusAmount);Mr.Guard.against(D.eq(0),"Total bet amount cannot be zero");let x=S.div(D);Mr.Guard.against(r.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let u;switch(r.actionType){case"BLACKJACK_DOUBLE_DOWN":u=A;break;case"BLACKJACK_BUY_INSURANCE":u=o;break;case"BLACKJACK_SPLIT":u=E.mul(F);break}return{multiplier:x,additionalBetAmount:u}},QE=(r)=>{let E=r.betAmounts.mainBetAmount,t=r.mainHandDoubledDown?E.mul(V):M.default(0),A=r.splitHandDoubledDown?E.mul(V):M.default(0),o=r.insuranceOutcome!==void 0?E.mul(Q):M.default(0),f=E.plus(t).mul(K[r.mainOutcome]),O=E.plus(A).mul(K[r.splitOutcome]),c=r.insuranceOutcome==="WON"?E.mul(Cr):M.default(0),S=iE(r.sideBetResults),D=f.plus(O).plus(c).plus(S),x=E.plus(E).plus(o).plus(t).plus(A).plus(r.betAmounts.pairBonusAmount).plus(r.betAmounts.threeCardBonusAmount);Mr.Guard.against(x.eq(0),"Total bet amount cannot be zero");let u=D.div(x),N;switch(r.actionType){case"BLACKJACK_DOUBLE_DOWN":N=E.mul(V);break;case"BLACKJACK_SPLIT":N=E.mul(F);break}return{multiplier:u,additionalBetAmount:N}};var jE=require("@betorigami/guard"),ir=(r)=>r.every((E)=>E===r[0]),HE=(r)=>{let E=[...r].sort((t,A)=>t-A);return E.every((t,A)=>{let o=E[A-1];if(A===0)return!0;return jE.Guard.againstUndefined(o,"Previous value cannot be undefined"),t===o+1})},WE={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},jt={...WE,Ace:14},Wt=(r)=>HE(r.map((E)=>WE[E]))||HE(r.map((E)=>jt[E])),LE=(r,E)=>{let t=T.fromValue(r),A=T.fromValue(E);if(t.rank!==A.rank)return"LOSS";if(r===E)return"EXACT_PAIR";if(mr[t.suit]===mr[A.suit])return"COLORED_PAIR";return"MIXED_PAIR"},KE=(r,E)=>({betAmount:r,result:E,payoutMultiplier:$r[E]}),vE=(r,E,t)=>{let A=T.fromValue(r),o=T.fromValue(E),f=T.fromValue(t),O=[A.rank,o.rank,f.rank],c=ir([A.suit,o.suit,f.suit]),S=ir(O),D=Wt(O);if(ir([r,E,t]))return"SUITED_TRIPS";if(c&&D)return"STRAIGHT_FLUSH";if(S)return"THREE_OF_A_KIND";if(D)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},gE=(r,E)=>({betAmount:r,result:E,payoutMultiplier:zr[E]});var Lt={state:{isFinished:!1,phase:"uninitialised",multiplier:P.default(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},U=(r)=>T.fromValue(r).value;function Kt(r){Z.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function lE(r){Z.Guard.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function qr(r){Z.Guard.against(r.phase!=="in-progress"&&r.phase!=="playing-main-hand"&&r.phase!=="playing-split-hand","Expected a started, in-progress game state")}var sE=(r,E)=>{let t=E;while(t.highestHandValue<dr)t=t.addDrawnCards([U(r.takeOne())]);return t},Hr=(r,E)=>{if(r.isBusted)return"LOSE";if(E.isBusted)return"WIN";let t=r.highestHandValue,A=E.highestHandValue;if(t>A)return"WIN";if(t<A)return"LOSE";return"PUSH"},R=(r)=>{let{multiplier:E,additionalBetAmount:t}=qE({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,actionType:r.playerArgument.type,betAmounts:r.betAmounts,sideBetResults:r.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:E,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome,sideBetResults:r.sideBetResults},config:{},playerArgument:r.playerArgument,additionalBetAmount:t}},Qr=(r)=>{let E=sE(r.randomValuePool,r.dealerHand),t=Hr(r.playerHand,E);return R({...r,dealerHand:E,outcome:t})},I=(r)=>{let t=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:sE(r.randomValuePool,r.dealerHand),A=Hr(r.mainHand,t),o=Hr(r.splitHand,t),{multiplier:f,additionalBetAmount:O}=QE({hasSplit:!0,mainOutcome:A,splitOutcome:o,insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:r.mainHandDoubledDown,splitHandDoubledDown:r.splitHandDoubledDown,actionType:r.playerArgument.type,betAmounts:r.betAmounts,sideBetResults:r.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:r.mainHand,splitHand:r.splitHand,dealerHand:t,mainOutcome:A,splitOutcome:o,multiplier:f,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome,sideBetResults:r.sideBetResults},config:{},playerArgument:r.playerArgument,additionalBetAmount:O}};class nE extends Xr{generateRandomValues(r){return s.from(r.getRandomIntsWithReplacement({min:dE,max:FE,count:Nr}),Nr)}toExternalState(r){let E=r.phase;switch(E){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),sideBetResults:r.sideBetResults,...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,mainOutcome:r.mainOutcome,splitOutcome:r.splitOutcome,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!0),sideBetResults:r.sideBetResults,...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:Z.Guard.againstNever(E,"Invalid state received")}}createGameStore(){return aE.createStore({context:Lt,on:{START:(r,E)=>{let{state:t}=r;Z.Guard.against(t.phase!=="uninitialised","START action requires a fresh game");let A=U(E.randomValuePool.takeOne()),o=U(E.randomValuePool.takeOne()),f=U(E.randomValuePool.takeOne()),O=U(E.randomValuePool.takeOne()),c=$.withInitialDeal([A,o]),S=l.withInitialDeal({upCard:f,holeCard:O}),D={mainBetAmount:P.default(E.mainBetAmount),pairBonusAmount:P.default(E.pairBonusAmount),threeCardBonusAmount:P.default(E.threeCardBonusAmount)},x={pairBonus:P.default(E.pairBonusAmount).gt(0)?KE(E.pairBonusAmount,LE(A,o)):null,threeCardBonus:P.default(E.threeCardBonusAmount).gt(0)?gE(E.threeCardBonusAmount,vE(A,o,f)):null},u={type:"START",mainBetAmount:E.mainBetAmount,pairBonusAmount:E.pairBonusAmount,threeCardBonusAmount:E.threeCardBonusAmount};if(S.upCard.rank==="Ace")return{state:{...t,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:S,betAmounts:D,sideBetResults:x},config:{},playerArgument:u};let N={playerHand:c,dealerHand:S,randomValuePool:E.randomValuePool,playerArgument:u,betAmounts:D,sideBetResults:x};if(c.isBlackjack&&S.isBlackjack)return R({...N,outcome:"PUSH"});if(c.isBlackjack)return R({...N,outcome:"PLAYER_BLACKJACK"});if(S.isBlackjack)return R({...N,outcome:"LOSE"});return{state:{...t,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:S,insuranceOutcome:void 0,betAmounts:D,sideBetResults:x},config:{},playerArgument:u}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:t}=r;lE(t);let{playerHand:A,dealerHand:o,betAmounts:f,sideBetResults:O}=t,c={...t,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:f,sideBetResults:O};if(A.isBlackjack&&o.isBlackjack)return R({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(A.isBlackjack)return R({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(o.isBlackjack)return R({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...t,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:f.mainBetAmount.mul(Q)}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:t}=r;lE(t);let{playerHand:A,dealerHand:o,betAmounts:f,sideBetResults:O}=t,c={playerHand:A,dealerHand:o,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:f,sideBetResults:O};if(A.isBlackjack&&o.isBlackjack)return R({...c,outcome:"PUSH"});if(A.isBlackjack)return R({...c,outcome:"PLAYER_BLACKJACK"});if(o.isBlackjack)return R({...c,outcome:"LOSE"});return{state:{...t,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,E)=>{let{state:t}=r;switch(qr(t),t.phase){case"playing-main-hand":{let A=t.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted||A.highestHandValue===G){if(t.splitHand.highestHandValue===G)return I({...t,mainHand:A,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...t,phase:"playing-split-hand",mainHand:A,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...t,mainHand:A},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let A=t.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted||A.highestHandValue===G)return I({...t,splitHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...t,splitHand:A},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let A=t.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted)return R({...t,playerHand:A,outcome:"LOSE",randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(A.highestHandValue===G)return Qr({...t,playerHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...t,phase:"in-progress",playerHand:A},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:Z.Guard.againstNever(t,"Invalid phase for HIT action")}},BLACKJACK_STAND:(r,E)=>{let{state:t}=r;switch(qr(t),t.phase){case"playing-main-hand":{if(t.splitHand.highestHandValue===G)return I({...t,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...t,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return I({...t,splitHandDoubledDown:t.splitHandDoubledDown,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return Qr({...t,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:Z.Guard.againstNever(t,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(r,E)=>{let{state:t}=r;switch(qr(t),t.phase){case"playing-main-hand":{Z.Guard.against(t.mainHand.cards.length!==2,"Double down is only allowed as the first action");let A=t.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]),{betAmounts:o}=t;if(t.splitHand.highestHandValue===G)return I({...t,mainHand:A,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...t,phase:"playing-split-hand",mainHand:A,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:o.mainBetAmount.mul(V)}}case"playing-split-hand":{Z.Guard.against(t.splitHand.cards.length!==2,"Double down is only allowed as the first action");let A=t.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]);return I({...t,splitHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{Z.Guard.against(t.playerHand.cards.length!==2,"Double down is only allowed as the first action");let A=t.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted)return R({...t,playerHand:A,outcome:"LOSE",randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return Qr({...t,playerHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:Z.Guard.againstNever(t,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:t}=r;Kt(t);let{playerHand:A,betAmounts:o,sideBetResults:f}=t;Z.Guard.against(A.cards.length!==2,"Split is only allowed with exactly 2 cards");let O=A.cards[0],c=A.cards[1];Z.Guard.againstUndefined(O,"First card is missing"),Z.Guard.againstUndefined(c,"Second card is missing"),Z.Guard.against(O.rank!==c.rank,"Split requires two cards of the same rank");let S=U(E.randomValuePool.takeOne()),D=U(E.randomValuePool.takeOne()),x=$.withInitialDeal([O.value,S]),u=$.withInitialDeal([c.value,D]);if(O.rank==="Ace")return I({...t,mainHand:x,splitHand:u,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let Y=x.highestHandValue===G,Vr=u.highestHandValue===G;if(Y&&Vr)return I({mainHand:x,splitHand:u,dealerHand:t.dealerHand,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:o,sideBetResults:f});if(Y)return{state:{...t,phase:"playing-split-hand",mainHand:x,splitHand:u,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:o.mainBetAmount.mul(F)};return{state:{...t,phase:"playing-main-hand",multiplier:P.default(0),mainHand:x,splitHand:u,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:o.mainBetAmount.mul(F)}}}})}getValidNextActionTypes(r){if(r.isFinished)return[];switch(r.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.mainHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"playing-split-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.splitHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"player-turn":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.playerHand.cards.length===2){E.push("BLACKJACK_DOUBLE_DOWN");let t=r.playerHand.cards[0],A=r.playerHand.cards[1];if(Z.Guard.againstUndefined(t,"First player card is missing"),Z.Guard.againstUndefined(A,"Second player card is missing"),t.rank===A.rank)E.push("BLACKJACK_SPLIT")}return E}default:Z.Guard.againstNever(r,"Invalid phase for getting valid actions")}}}var kE=w(require("big.js"));class p{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let E=this.multipliers.get(r);if(E===void 0)throw new Error(`Multipliers for ${r} not found`);return E}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,E])=>({edge:r,multipliers:E}))}}var eE;((O)=>{O.PAIR="PAIR";O.TWO_PAIR="TWO_PAIR";O.THREE_OF_A_KIND="THREE_OF_A_KIND";O.FULL_HOUSE="FULL_HOUSE";O.FOUR_OF_A_KIND="FOUR_OF_A_KIND";O.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(eE||={});var vt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},gt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},lt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},at={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},st={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},rt=new p(new Map([[1,vt],[2,gt],[3,lt],[4,at],[8,st]])),nt={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Et extends _{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let t=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),A=rt.getMultipliers(E),o=t.values,f=this.calculatePayoutMultiplier(A,o);return{isFinished:!0,payoutMultiplier:kE.default(f),outputs:{result:t.values},randomValues:t}}calculatePayoutMultiplier(r,E){let t=new Map;for(let f of E){let O=t.get(f)||0;t.set(f,O+1)}let A=[...t.values()].filter((f)=>f>1),o=this.classifyResult(A);return o===null?0:r[o]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[E,t]=r;if(E===void 0)return null;if(t===void 0){let A=nt[E];if(A===void 0)throw new Error(`Unexpected single diamond repeat count: ${E}`);return A}return E===3||t===3?"FULL_HOUSE":"TWO_PAIR"}}var Wr=w(require("big.js"));var tt;((t)=>{t.ABOVE="ABOVE";t.BELOW="BELOW"})(tt||={});var jr=1e4,At=(r)=>{let E=r.direction==="ABOVE"?jr-r.selectedValue:r.selectedValue;return new Wr.default(E).div(jr).mul(100)},ot=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class ft extends _{constructor(){super("DICE")}determineGameResult({generator:r,edge:E,gameInputs:t}){let A=r.getRandomInt({min:0,max:1e4}),o=At(t);return{isFinished:!0,payoutMultiplier:ot(t,A.value)?y.withWinChance(E,o):new Wr.default(0),outputs:{result:A.values},randomValues:A}}}var Dt=w(require("big.js"));var n=require("@betorigami/guard");var Lr;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(Lr||={});var Ot=[1,2,3,4,5,6,7,8,9,10],Kr=(r)=>{return Ot.includes(r)};var ct={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},ut={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},Bt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},St={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},xt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},vr=new p(new Map([[1,ct],[2,ut],[3,Bt],[4,St],[8,xt]]));class _t extends _{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:t}){n.Guard.againstEmptyArray(t.selectedNumbers,()=>B.createValidationError("No numbers selected")),n.Guard.against(t.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let u of t.selectedNumbers)n.Guard.againstNonInteger(u,()=>B.createValidationError("Only integers can be selected")),n.Guard.against(u<0||u>39,()=>B.createValidationError("Invalid number selected"));let A=r.getUniqueRandomInts({min:0,max:39,count:10}),o=t.selectedNumbers.filter((u)=>A.values.includes(u)),f=t.selectedNumbers.length;if(!Kr(f))throw new Error(`Invalid tile count: ${f}`);let D=vr.getMultipliers(E)[f][t.riskLevel][o.length];if(D===void 0)throw new Error(`No multiplier found for matching tile count ${o.length}`);return{isFinished:!0,payoutMultiplier:new Dt.default(D),outputs:{result:A.values},randomValues:A}}}var z=w(require("big.js"));var gr=(r,E)=>{return r.gt(E)?r:E};var lr=(r,E)=>{return r.lt(E)?r:E};class Zt extends _{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:t}){let A=r.getRandomInt({min:1,max:4294967295}),o=A.max,f=new z.default(16777216),O=new z.default(1),c=new z.default(1e6),S=A.value,D=new z.default(S-1).div(o),x=(100-E)/100,u=f.div(D.mul(f).plus(1)).mul(x),N=gr(O,lr(u,c));return{isFinished:!0,payoutMultiplier:N.gte(t.targetMultiplier)?new z.default(t.targetMultiplier):new z.default(0),outputs:{randomMultiplier:N,result:A.values},randomValues:A}}}var k=w(require("big.js"));var Rr=(r,E)=>{if(E<0||r<0||E>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(E>r-E)E=r-E;let t=1;for(let A=1;A<=E;A++)t=t*(r-A+1)/A;return t};class Nt extends _{constructor(){super("MINES")}determineGameResult({generator:r,edge:E,gameInputs:t}){if(t.minesCount<=0||t.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(t.selectedTiles.length>25-t.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let O=r.getUniqueRandomInts({min:1,max:25,count:t.minesCount}),c=O.values.some((Y)=>t.selectedTiles.includes(Y)),S=t.hasCashedOut||c,D=(100-E)/100,x=new k.default(Rr(25-t.minesCount,t.selectedTiles.length)).div(new k.default(Rr(25,t.selectedTiles.length))),N=t.hasCashedOut&&!c?new k.default(D).div(x):new k.default(0);return{isFinished:S,payoutMultiplier:N,outputs:{result:O.values},randomValues:O}}}var Ct=require("big.js");var ar;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(ar||={});var kt=[8,9,10,11,12,13,14,15,16],et={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},rA={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},EA={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},tA={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},AA={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},sr=new p(new Map([[1,et],[2,rA],[3,EA],[4,tA],[8,AA]]));class Tt extends _{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:E,edge:t}){if(E.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(E.numberOfRows<8||E.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let A=E.numberOfRows,O=sr.getMultipliers(t)[E.riskLevel][A],c=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),D=c.values.reduce((u,N)=>u+N,0),x=O[D];if(x===void 0)throw new Error(`No payout found for end position ${D}`);return{isFinished:!0,payoutMultiplier:Ct.Big(x),outputs:{result:c.values},randomValues:c}}}var Er=require("big.js");var hr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],nr=[37,...hr],kr=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],er=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],rE=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],EE=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],tE=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],AE=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],oE=[0,1,2,3,37],fE=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],OE=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],m;((t)=>{t.EVEN="EVEN";t.ODD="ODD"})(m||={});var J;((t)=>{t.RED="RED";t.BLACK="BLACK"})(J||={});var X;((t)=>{t.LOW="LOW";t.HIGH="HIGH"})(X||={});var i;((A)=>{A.TOP="TOP";A.MIDDLE="MIDDLE";A.BOTTOM="BOTTOM"})(i||={});var q;((A)=>{A.FIRST="FIRST";A.SECOND="SECOND";A.THIRD="THIRD"})(q||={});var wr;((t)=>{t.AMERICAN="AMERICAN";t.EUROPEAN="EUROPEAN"})(wr||={});var pr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&e(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&oA(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&fA(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&OA(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&cA(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(m).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(i).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},e=(r)=>{return hr.includes(r)},oA=(r)=>{if(r.length!==2)return!1;if(!r.every(e))return!1;return kr.some(([E,t])=>E===r[0]&&t===r[1])},fA=(r)=>{if(r.length!==3)return!1;if(!r.every(e))return!1;return rE.some(([E,t,A])=>E===r[0]&&t===r[1]&&A===r[2])},OA=(r)=>{if(r.length!==4)return!1;if(!r.every(e))return!1;return tE.some(([E,t,A,o])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3])},cA=(r)=>{if(r.length!==6)return!1;if(!r.every(e))return!1;return fE.some(([E,t,A,o,f,O])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3]&&f===r[4]&&O===r[5])};var yr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&rr(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&uA(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&BA(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&SA(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&xA(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(m).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(i).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},rr=(r)=>{return nr.includes(r)};function uA(r){if(r.length!==2)return!1;if(!r.every(rr))return!1;return er.some(([E,t])=>E===r[0]&&t===r[1])}var BA=(r)=>{if(r.length!==3)return!1;if(!r.every(rr))return!1;return EE.some(([E,t,A])=>E===r[0]&&t===r[1]&&A===r[2])},SA=(r)=>{if(r.length!==4)return!1;if(!r.every(rr))return!1;return AE.some(([E,t,A,o])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3])},xA=(r)=>{if(r.length!==6)return!1;if(!r.every(rr))return!1;return OE.some(([E,t,A,o,f,O])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3]&&f===r[4]&&O===r[5])};var Ut={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},bt=[3,6,9,12,15,18,21,24,27,30,33,36],Gt=[2,5,8,11,14,17,20,23,26,29,32,35],Mt=[1,4,7,10,13,16,19,22,25,28,31,34],Rt=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],ht=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],wt=2.7,pt=5.3;class cE extends _{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:E}){this.validateInputs(E);let t=r.getRandomInt({min:0,max:this.maxNumber}),A=t.value,o=this.determineBetOutcomes(E,A),{payoutMultiplier:f}=this.getPayoutDetails(E,A);return{outputs:{betOutcomes:o,result:t.values},payoutMultiplier:f,isFinished:!0,randomValues:t}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,E){let t=this.determineBetOutcomes(r,E),A=this.getBetTotals(r),o=this.getBetTotals(t.winningBets),f=this.calculateTotalBetAmount(A),O=this.calculateTotalPayout(o);return{payoutMultiplier:f.gt(0)?O.div(f):new Er.Big(0),payoutAmount:O}}determineBetOutcomes(r,E){let t={},A={};for(let o of Object.keys(r)){let f=r[o],O=this.betPredicates[o],{winning:c,losing:S}=this.partitionBets(f,O,E);t[o]=c,A[o]=S}return{winningBets:t,losingBets:A}}calculateTotalAmount(r){return r.reduce((E,t)=>E.plus(t.amount),new Er.Big(0))}isWinningStraightBet(r,E){return r.value===E}isWinningSplitBet(r,E){return r.values.some((t)=>t===E)}isWinningStreetBet(r,E){return r.values.some((t)=>t===E)}isWinningCornerBet(r,E){return r.values.some((t)=>t===E)}isWinningDoubleStreetBet(r,E){return r.values.some((t)=>t===E)}isWinningColorBet(r,E){let t=r;return Rt.includes(E)&&t.color==="RED"||ht.includes(E)&&t.color==="BLACK"}isWinningHalfBet(r,E){let t=r;if(E>0&&E<=18&&t.half==="LOW")return!0;if(E>18&&E<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(r,E){let t=r;return bt.includes(E)&&t.column==="TOP"||Gt.includes(E)&&t.column==="MIDDLE"||Mt.includes(E)&&t.column==="BOTTOM"}isWinningDozenBet(r,E){let t=r;if(E>0&&E<=12&&t.dozen==="FIRST")return!0;if(E>12&&E<=24&&t.dozen==="SECOND")return!0;if(E>24&&E<=36&&t.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,E){let t=r;if(E===0||E===37)return!1;let A=E%2===0?"EVEN":"ODD";return t.parity===A}getBetTotals(r){let E={};for(let t of Object.keys(r))E[t]=this.calculateTotalAmount(r[t]);return E}calculateTotalBetAmount(r){return Object.values(r).reduce((E,t)=>E.plus(t),new Er.Big(0))}partitionBets(r,E,t){return{winning:r.filter((A)=>E(A,t)),losing:r.filter((A)=>!E(A,t))}}calculateTotalPayout(r){return Object.entries(r).reduce((E,[t,A])=>{let f=Ut[t];return E.plus(A.mul(f||0))},new Er.Big(0))}}class uE extends cE{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){pr(r)}}class BE extends cE{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){yr(r)}isWinningBasketBet(r,E){return oE.some((t)=>t===E)}}class SE extends _{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new uE,this.americanGame=new BE}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:E,...t}=r;if(r.edge===wt&&E.type==="EUROPEAN"){let A=this.europeanGame.determineGameResult({...t,gameInputs:E.inputs}),{betOutcomes:o}=A.outputs;return{...A,outputs:{type:"european",betOutcomes:o,result:A.outputs.result}}}if(r.edge===pt&&E.type==="AMERICAN"){let A=this.americanGame.determineGameResult({...t,gameInputs:E.inputs}),{betOutcomes:o}=A.outputs;return{...A,outputs:{type:"american",betOutcomes:o,result:A.outputs.result}}}throw B.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var DA=(r)=>{return new SE().getBetAmount(r)};var _A=(r)=>{if(r.type==="EUROPEAN")pr(r.inputs);else yr(r.inputs)};var It=require("big.js");var H;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(H||={});var j;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(j||={});var ZA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},NA={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},CA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},TA={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},UA={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},yt=new p(new Map([[1,ZA],[2,NA],[3,CA],[4,TA],[8,UA]]));var Vt={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Pt extends _{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:t}){if(!Object.values(j).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(H).includes(E.riskLevel))throw new Error("Invalid risk level");let o=yt.getMultipliers(t)[E.riskLevel];if(o===void 0)throw new Error(`No multipliers found for risk level ${E.riskLevel}`);let f=o[E.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${E.segments}`);let O=Vt[E.riskLevel];if(O===void 0)throw new Error(`No patterns found for risk level ${E.riskLevel}`);let c=O[E.segments];if(c===void 0)throw new Error(`No patterns found for segment ${E.segments}`);let S=r.getRandomInt({min:0,max:c.length-1}),D=c[S.value];if(D===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${S.value}`);let x=f[D];if(x===void 0)throw new Error(`No payout found for picked segment ${D}`);return{isFinished:!0,payoutMultiplier:new It.Big(x),outputs:{result:S.values},randomValues:S}}}
1
+ var Fr=Object.create;var{getPrototypeOf:Mr,defineProperty:q,getOwnPropertyNames:fa,getOwnPropertyDescriptor:Yr}=Object,Sa=Object.prototype.hasOwnProperty;var C=(t,a,r)=>{r=t!=null?Fr(Mr(t)):{};let e=a||!t||!t.__esModule?q(r,"default",{value:t,enumerable:!0}):r;for(let n of fa(t))if(!Sa.call(e,n))q(e,n,{get:()=>t[n],enumerable:!0});return e},Ea=new WeakMap,Jr=(t)=>{var a=Ea.get(t),r;if(a)return a;if(a=q({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")fa(t).map((e)=>!Sa.call(a,e)&&q(a,e,{get:()=>t[e],enumerable:!(r=Yr(t,e))||r.enumerable}));return Ea.set(t,a),a};var $r=(t,a)=>{for(var r in a)q(t,r,{get:a[r],enumerable:!0,configurable:!0,set:(e)=>a[r]=()=>e})};var _e={};$r(_e,{validateRouletteGameInputs:()=>he,validateAdvancedDiceInputs:()=>gr,rtp99Multipliers:()=>Er,rtp98Multipliers:()=>fr,rtp97Multipliers:()=>Sr,rtp96Multipliers:()=>Or,rtp92Multipliers:()=>Dr,plinkoMultipliers:()=>ra,nCr:()=>Pt,kenoMultipliers:()=>Kt,isTileCount:()=>Lt,hasDiceWon:()=>Br,hasBlitzWon:()=>or,diamondsMultipliers:()=>ur,calculateRouletteBetAmount:()=>He,calculateDiceWinChance:()=>Ar,calculateBlitzWinChance:()=>ir,calculateBaccaratBetAmount:()=>ja,calculateAdvancedDiceWinChance:()=>wt,bigMin:()=>ta,bigMax:()=>vt,advancedDiceIsWithinBoundsInclusive:()=>ha,advancedDiceIsWithinBoundsExclusive:()=>dt,advancedDiceGetInclusiveBoundsRange:()=>Ca,advancedDiceGetExclusiveBoundsRange:()=>ut,WheelSegments:()=>z,WheelRiskLevel:()=>$,Wheel:()=>kr,WIN_MULTIPLIER:()=>Va,VALID_SUITS:()=>Pa,VALID_RANKS:()=>Ra,VALID_EUROPEAN_STREETS:()=>ia,VALID_EUROPEAN_STRAIGHTS:()=>Rt,VALID_EUROPEAN_SPLITS:()=>na,VALID_EUROPEAN_DOUBLE_STREETS:()=>sa,VALID_EUROPEAN_CORNERS:()=>la,VALID_AMERICAN_STREETS:()=>ca,VALID_AMERICAN_STRAIGHTS:()=>ea,VALID_AMERICAN_SPLITS:()=>oa,VALID_AMERICAN_DOUBLE_STREETS:()=>pa,VALID_AMERICAN_CORNERS:()=>da,ThreeCardBonusType:()=>Et,TOP_COLUMN:()=>_r,TILE_COUNTS:()=>yr,THREE_CARD_BONUS_PAYOUTS:()=>kt,SingleActionGame:()=>B,SPLIT_BET_SIZE_FACTOR:()=>I,RouletteType:()=>_t,Roulette:()=>ya,RollType:()=>xa,RandomValuePool:()=>tt,RED_NUMBERS:()=>Ir,RANDOM_MIN_VALUE:()=>st,RANDOM_MAX_VALUE:()=>pt,PlinkoRiskLevel:()=>aa,Plinko:()=>Pr,Parity:()=>w,PairBonusType:()=>yt,PUSH_MULTIPLIER:()=>wa,PLINKO_ROW_COUNTS:()=>le,PAYOUT_MULTIPLIERS:()=>Rr,PAIR_BONUS_PAYOUTS:()=>Gt,OrigamiGame:()=>f,MultiplierCalculator:()=>x,MultiActionGame:()=>xt,Mines:()=>xr,MIN_WIN_CHANCE:()=>Da,MIDDLE_COLUMN:()=>br,MAX_WIN_CHANCE:()=>Ha,MAX_CARDS_PER_ROUND:()=>St,Limbo:()=>Cr,LOSE_MULTIPLIER:()=>Ua,KenoRiskLevel:()=>Wt,Keno:()=>hr,InsuranceOutcome:()=>Bt,INSURANCE_WIN_PAYOUT:()=>Ot,INSURANCE_BET_SIZE_FACTOR:()=>M,INSURANCE_BET_MULTIPLIER:()=>Wr,Half:()=>Z,GameErrorCode:()=>Oa,GameError:()=>l,Game:()=>F,FACE_CARD_VALUE:()=>Zt,EuropeanRoulette:()=>Ba,EUROPEAN_HOUSE_EDGE:()=>Vr,EFFECTIVE_RANGE:()=>Nt,Dozen:()=>k,DiceDirection:()=>pr,Dice:()=>mr,DiamondsResultType:()=>dr,Diamonds:()=>sr,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>P,DICE_EFFECTIVE_RANGE:()=>gt,DEALER_STAND_VALUE:()=>Ut,Column:()=>G,Color:()=>U,CARDS_PER_SUIT:()=>Lr,Blitz:()=>cr,BlackjackOutcome:()=>At,BlackjackActionType:()=>mt,Blackjack:()=>er,BaccaratOutcome:()=>_a,BaccaratBetType:()=>ba,Baccarat:()=>Ia,BUST_VALUE:()=>ft,BOTTOM_COLUMN:()=>jr,BLITZ_RANDOM_NUMBER_COUNT:()=>qt,BLITZ_MIN_CARD_RANGE:()=>zt,BLITZ_MAX_CARD_RANGE:()=>Xt,BLITZ_CARD_COUNT:()=>Y,BLACK_NUMBERS:()=>Nr,BLACKJACK_VALUE:()=>O,BLACKJACK_MULTIPLIER:()=>Na,BASE_PAYOUT_MULTIPLIERS:()=>g,AmericanRoulette:()=>ma,AdvancedDice:()=>Ta,AMERICAN_HOUSE_EDGE:()=>wr,AMERICAN_BASKET:()=>ua,ACE_SOFT_BONUS:()=>Dt});module.exports=Jr(_e);var Oa;((a)=>a.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Oa||={});class l extends Error{static createValidationError(t){return new l("INPUT_VALIDATION_ERROR",t)}static isGameError(t){return t instanceof l}errorCode;constructor(t,a){super(a);this.errorCode=t}}var f;((A)=>{A.DICE="DICE";A.MINES="MINES";A.KENO="KENO";A.LIMBO="LIMBO";A.ADVANCED_DICE="ADVANCED_DICE";A.BACCARAT="BACCARAT";A.DIAMONDS="DIAMONDS";A.PLINKO="PLINKO";A.ROULETTE="ROULETTE";A.WHEEL="WHEEL";A.BLACKJACK="BLACKJACK";A.BLITZ="BLITZ"})(f||={});class F{gameId;constructor(t){this.gameId=t}}class B extends F{constructor(t){super(t)}getGameResult(t){return this.determineGameResult(t)}}var Vt=require("big.js");var ct=C(require("big.js"));class x{static withMultiplier(t,a){return new ct.default(t).times(new ct.default(100-a).div(100))}static withWinChance(t,a){return ct.default(100-t).div(a)}}var st=0,pt=1e4,Nt=10001,Da=0.01,Ha=98,zr=(t)=>{if(t<st)throw l.createValidationError(`Lower bound ${t} is below minimum allowed value ${st}`)},Xr=(t)=>{if(t>pt)throw l.createValidationError(`Upper bound ${t} is above maximum allowed value ${pt}`)},lt=(t)=>{if(zr(t.lower),Xr(t.upper),t.lower>=t.upper)throw l.createValidationError(`Lower bound ${t.lower} must be less than ${t.upper}`)},qr=(t,a)=>{let[r,e]=t.lower<=a.lower?[t,a]:[a,t];if(r.upper>e.lower)throw l.createValidationError("Bounds must not overlap")},ha=(t,a)=>a>=t.lower&&a<=t.upper,Ca=(t)=>t.upper-t.lower+1,dt=(t,a)=>a>t.lower&&a<t.upper,ut=(t)=>t.upper-t.lower-1,xa;((e)=>{e.ROLL_BETWEEN="ROLL_BETWEEN";e.ROLL_OUTSIDE="ROLL_OUTSIDE";e.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(xa||={});var wt=(t)=>{let r=(()=>{switch(t.mode){case"ROLL_BETWEEN":return lt(t.bounds),ut(t.bounds);case"ROLL_OUTSIDE":return lt(t.bounds),Nt-Ca(t.bounds);case"ROLL_BETWEEN_TWO":return lt(t.firstBounds),lt(t.secondBounds),qr(t.firstBounds,t.secondBounds),ut(t.firstBounds)+ut(t.secondBounds)}})(),e=Vt.Big(r).div(Nt).mul(100);if(e.lt(Da))throw l.createValidationError("Win chance too low");if(e.gt(Ha))throw l.createValidationError("Win chance too high");return e},gr=(t)=>{wt(t)};class Ta extends B{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=wt(r),n=t.getRandomInt({min:st,max:pt}),o=n.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"ROLL_BETWEEN":return dt(r.bounds,o);case"ROLL_OUTSIDE":return!ha(r.bounds,o);case"ROLL_BETWEEN_TWO":return dt(r.firstBounds,o)||dt(r.secondBounds,o)}})()?x.withWinChance(a,e):new Vt.Big(0),outputs:{result:n.values},randomValues:n}}}var j=C(require("big.js"));var Pa=["Clubs","Diamonds","Hearts","Spades"],Ra=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],_a;((e)=>{e.PLAYER_WIN="PLAYER_WIN";e.TIE="TIE";e.BANKER_WIN="BANKER_WIN"})(_a||={});var ba;((e)=>{e.PLAYER="PLAYER";e.TIE="TIE";e.BANKER="BANKER"})(ba||={});var Qr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},ja=(t)=>{return new j.default(0).add(t.bets.reduce((r,e)=>r.add(e.amount),new j.default(0)))};class Ia extends B{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(a);let e=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=e.values,o=n.slice(0,3),i=n.slice(3,6),c=[],d=0;for(let y of o.slice(0,2)){let h=this.mapRandomValueToCard(y),it=this.mapRandomValueToCardValue(y);c.push(h),d=(d+it)%10}let p=[],u=0;for(let y of i.slice(0,2)){let h=this.mapRandomValueToCard(y),it=this.mapRandomValueToCardValue(y);p.push(h),u=(u+it)%10}if(!this.isNaturalWin(d,u)){let y=this.shouldDrawThirdPlayerCard(d),h=null;if(y)h=this.mapRandomValueToCardValue(o[2]),c.push(this.mapRandomValueToCard(o[2])),d=(d+h)%10;if(this.shouldDrawThirdBankerCard(u,h))p.push(this.mapRandomValueToCard(i[2])),u=(u+this.mapRandomValueToCardValue(i[2]))%10}let s;if(d===u)s="TIE";else s=d>u?"PLAYER_WIN":"BANKER_WIN";let A=ja(a),{betType:b,multiplier:It}=Qr[s],X=new j.default(0);if(X=X.add(a.bets.filter((y)=>y.type===b).reduce((y,h)=>y.add(h.amount.mul(It)),new j.default(0))),s==="TIE")X=X.add(a.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,h)=>y.add(h.amount),new j.default(0)));return{isFinished:!0,payoutMultiplier:A.gt(0)?X.div(A):new j.default(0),outputs:{playerCards:c,playerHandValue:d,bankerCards:p,bankerHandValue:u,gameOutcome:s,result:e.values},randomValues:e}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((a)=>a.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let a=Pa[Math.floor(t/13)],r=Ra[t%13];return{suit:a,rank:r}}isNaturalWin(t,a){let r=[8,9];return r.includes(t)||r.includes(a)}mapRandomValueToCardValue(t){let a=t%13;if(a===0)return 1;if(a>=10)return 10;return a+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,a){if(a===null)return t<=5;if(t<=2)return!0;if(t===3)return a!==8;if(t===4)return[2,3,4,5,6,7].includes(a);if(t===5)return[4,5,6,7].includes(a);if(t===6)return[6,7].includes(a);return!1}}var At;((n)=>{n.WIN="WIN";n.LOSE="LOSE";n.PUSH="PUSH";n.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(At||={});var Bt;((r)=>{r.WON="WON";r.LOST="LOST"})(Bt||={});var mt;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";c.SPLIT="BLACKJACK_SPLIT"})(mt||={});var yt;((n)=>{n.EXACT_PAIR="EXACT_PAIR";n.COLORED_PAIR="COLORED_PAIR";n.MIXED_PAIR="MIXED_PAIR";n.LOSS="LOSS"})(yt||={});var Et;((i)=>{i.SUITED_TRIPS="SUITED_TRIPS";i.STRAIGHT_FLUSH="STRAIGHT_FLUSH";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.STRAIGHT="STRAIGHT";i.FLUSH="FLUSH";i.LOSS="LOSS"})(Et||={});var Na=2.5,Va=2,wa=1,Ua=0,Ut=17,ft=21,O=21,St=63,Wr=1.5,M=0.5,Ot=1.5,P=1,I=1,Lr=13,Dt=10,Zt=10,g={PLAYER_BLACKJACK:Na,WIN:Va,PUSH:wa,LOSE:Ua},Gt={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},kt={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};var _=C(require("big.js")),m=require("@betorigami/guard"),ar=require("@xstate/store");var Za=0,Ga=51,Ht=Array.from({length:52},(t,a)=>a),ka=["Spades","Hearts","Diamonds","Clubs"],ht=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Fa=["Jack","Queen","King"],Ft={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};var Ma=require("@betorigami/guard");var Ct=require("@betorigami/guard");class Q{value;constructor(t){let a=Ht[t];Ct.Guard.againstNullOrUndefined(a,`Invalid card value: ${t}`),this.value=a}get suit(){let t=Math.floor(this.value/13),a=ka[t];return Ct.Guard.againstNullOrUndefined(a,`Invalid suit index: ${t}`),a}get rank(){let t=this.value%13,a=ht[t];return Ct.Guard.againstNullOrUndefined(a,`Invalid rank index: ${t}`),a}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class E extends Q{get numericRank(){if(Fa.includes(this.rank))return Zt;return ht.indexOf(this.rank)+1}static fromValue(t){return Ma.Guard.against(!Ht.includes(t),`Invalid card value: ${t}`),new E(t)}}class W{cards;hardHandValue;softHandValue=null;constructor(t){this.cards=t;if(this.hardHandValue=t.reduce((r,e)=>r+e.numericRank,0),t.some((r)=>r.rank==="Ace")&&this.hardHandValue+Dt<=ft)this.softHandValue=this.hardHandValue+Dt}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ft}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===O}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class L{cards;value;constructor(t){this.cards=t.map((a)=>E.fromValue(a)),this.value=new W(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((t)=>t.value)}toDto(){return{cards:this.cards.map((t)=>t.toDto()),value:this.highestHandValue}}}class K extends L{otherCards;upCard;holeCard;constructor(t,a,r=[]){super([t,a,...r]);this.otherCards=r;this.upCard=E.fromValue(t),this.holeCard=E.fromValue(a)}static withInitialDeal(t){return new K(t.upCard,t.holeCard)}addDrawnCards(t){return new K(this.upCard.value,this.holeCard.value,[...this.otherCards,...t])}toDto(t=!1){if(t)return super.toDto();return{cards:[this.upCard.toDto()],value:new W([this.upCard]).highestHandValue}}}class N extends L{static withInitialDeal(t){return new N(t)}addDrawnCards(t){return new N([...this.rawValues,...t])}}var v=require("@betorigami/guard");class tt{source;index=0;constructor(t){this.source=t}static from(t,a){return v.Guard.against(a<=0,`Count must be positive, got ${a}`),v.Guard.against(t.values.length!==a,`Expected ${a} values, got ${t.values.length}`),new tt(t)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let t=this.source.values[this.index];return v.Guard.againstUndefined(t,"RandomValuePool exhausted"),this.index+=1,t}take(t){v.Guard.against(this.index+t>this.source.values.length,`RandomValuePool exhausted: requested ${t} but only ${this.source.values.length-this.index} remain`);let a=this.source.values.slice(this.index,this.index+t);return this.index+=t,a}}var Ya=require("@betorigami/guard"),Ja=C(require("fast-deep-equal"));class xt extends F{edge;constructor(t,a){super(t);this.edge=a}play(t,a,r=[]){let e=this.createGameStore(),n=this.generateRandomValues(t),o=n.toMultipleRandomValues();for(let d of r)e.send({...d.playerArgument,randomValuePool:n});let i=r[r.length-1];if(i)Ya.Guard.against(!Ja.default(i.state,this.toExternalState(e.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");e.send({...a,randomValuePool:n});let c=e.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:o.proofHash,proofString:o.proofString}}}}var D=C(require("big.js"));var Tt=require("@betorigami/guard");var $a=(t)=>{let a=t.pairBonus!==null?D.default(t.pairBonus.betAmount).mul(t.pairBonus.payoutMultiplier):D.default(0),r=t.threeCardBonus!==null?D.default(t.threeCardBonus.betAmount).mul(t.threeCardBonus.payoutMultiplier):D.default(0);return a.plus(r)},za=(t)=>{let a=t.betAmounts.mainBetAmount,e=t.actionType==="BLACKJACK_DOUBLE_DOWN"?a.mul(P):D.default(0),n=t.insuranceOutcome!==void 0?a.mul(M):D.default(0),o=a.plus(e).mul(g[t.outcome]),i=t.insuranceOutcome==="WON"?a.mul(Ot):D.default(0),c=$a(t.sideBetResults),d=o.plus(i).plus(c),p=a.plus(n).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Tt.Guard.against(p.eq(0),"Total bet amount cannot be zero");let u=d.div(p);Tt.Guard.against(t.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let s;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":s=e;break;case"BLACKJACK_BUY_INSURANCE":s=n;break;case"BLACKJACK_SPLIT":s=a.mul(I);break}return{multiplier:u,additionalBetAmount:s}},Xa=(t)=>{let a=t.betAmounts.mainBetAmount,r=t.mainHandDoubledDown?a.mul(P):D.default(0),e=t.splitHandDoubledDown?a.mul(P):D.default(0),n=t.insuranceOutcome!==void 0?a.mul(M):D.default(0),o=a.plus(r).mul(g[t.mainOutcome]),i=a.plus(e).mul(g[t.splitOutcome]),c=t.insuranceOutcome==="WON"?a.mul(Ot):D.default(0),d=$a(t.sideBetResults),p=o.plus(i).plus(c).plus(d),u=a.plus(a).plus(n).plus(r).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Tt.Guard.against(u.eq(0),"Total bet amount cannot be zero");let s=p.div(u),A;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":A=a.mul(P);break;case"BLACKJACK_SPLIT":A=a.mul(I);break}return{multiplier:s,additionalBetAmount:A}};var ga=require("@betorigami/guard"),Mt=(t)=>t.every((a)=>a===t[0]),qa=(t)=>{let a=[...t].sort((r,e)=>r-e);return a.every((r,e)=>{let n=a[e-1];if(e===0)return!0;return ga.Guard.againstUndefined(n,"Previous value cannot be undefined"),r===n+1})},Qa={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},Kr={...Qa,Ace:14},vr=(t)=>qa(t.map((a)=>Qa[a]))||qa(t.map((a)=>Kr[a])),Wa=(t,a)=>{let r=E.fromValue(t),e=E.fromValue(a);if(r.rank!==e.rank)return"LOSS";if(t===a)return"EXACT_PAIR";if(Ft[r.suit]===Ft[e.suit])return"COLORED_PAIR";return"MIXED_PAIR"},La=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Gt[a]}),Ka=(t,a,r)=>{let e=E.fromValue(t),n=E.fromValue(a),o=E.fromValue(r),i=[e.rank,n.rank,o.rank],c=Mt([e.suit,n.suit,o.suit]),d=Mt(i),p=vr(i);if(Mt([t,a,r]))return"SUITED_TRIPS";if(c&&p)return"STRAIGHT_FLUSH";if(d)return"THREE_OF_A_KIND";if(p)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},va=(t,a)=>({betAmount:t,result:a,payoutMultiplier:kt[a]});var te={state:{isFinished:!1,phase:"uninitialised",multiplier:_.default(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},S=(t)=>E.fromValue(t).value;function ae(t){m.Guard.against(t.phase!=="in-progress","Expected a started, in-progress game state")}function tr(t){m.Guard.against(t.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Yt(t){m.Guard.against(t.phase!=="in-progress"&&t.phase!=="playing-main-hand"&&t.phase!=="playing-split-hand","Expected a started, in-progress game state")}var rr=(t,a)=>{let r=a;while(r.highestHandValue<Ut)r=r.addDrawnCards([S(t.takeOne())]);return r},$t=(t,a)=>{if(t.isBusted)return"LOSE";if(a.isBusted)return"WIN";let r=t.highestHandValue,e=a.highestHandValue;if(r>e)return"WIN";if(r<e)return"LOSE";return"PUSH"},H=(t)=>{let{multiplier:a,additionalBetAmount:r}=za({outcome:t.outcome,insuranceOutcome:t.insuranceOutcome,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:t.playerHand,dealerHand:t.dealerHand,outcome:t.outcome,multiplier:a,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:r}},Jt=(t)=>{let a=rr(t.randomValuePool,t.dealerHand),r=$t(t.playerHand,a);return H({...t,dealerHand:a,outcome:r})},R=(t)=>{let r=t.mainHand.isBusted&&t.splitHand.isBusted?t.dealerHand:rr(t.randomValuePool,t.dealerHand),e=$t(t.mainHand,r),n=$t(t.splitHand,r),{multiplier:o,additionalBetAmount:i}=Xa({hasSplit:!0,mainOutcome:e,splitOutcome:n,insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:t.mainHandDoubledDown,splitHandDoubledDown:t.splitHandDoubledDown,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:t.mainHand,splitHand:t.splitHand,dealerHand:r,mainOutcome:e,splitOutcome:n,multiplier:o,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:i}};class er extends xt{constructor(t){super("BLACKJACK",t)}generateRandomValues(t){return tt.from(t.getRandomIntsWithReplacement({min:Za,max:Ga,count:St}),St)}toExternalState(t){let a=t.phase;switch(a){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,outcome:t.outcome,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,mainOutcome:t.mainOutcome,splitOutcome:t.splitOutcome,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:m.Guard.againstNever(a,"Invalid state received")}}createGameStore(){return ar.createStore({context:te,on:{START:(t,a)=>{let{state:r}=t;m.Guard.against(r.phase!=="uninitialised","START action requires a fresh game");let e=S(a.randomValuePool.takeOne()),n=S(a.randomValuePool.takeOne()),o=S(a.randomValuePool.takeOne()),i=S(a.randomValuePool.takeOne()),c=N.withInitialDeal([e,n]),d=K.withInitialDeal({upCard:o,holeCard:i}),p={mainBetAmount:_.default(a.mainBetAmount),pairBonusAmount:_.default(a.pairBonusAmount),threeCardBonusAmount:_.default(a.threeCardBonusAmount)},u={pairBonus:_.default(a.pairBonusAmount).gt(0)?La(a.pairBonusAmount,Wa(e,n)):null,threeCardBonus:_.default(a.threeCardBonusAmount).gt(0)?va(a.threeCardBonusAmount,Ka(e,n,o)):null},s={type:"START",mainBetAmount:a.mainBetAmount,pairBonusAmount:a.pairBonusAmount,threeCardBonusAmount:a.threeCardBonusAmount};if(d.upCard.rank==="Ace")return{state:{...r,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:d,betAmounts:p,sideBetResults:u},config:{},playerArgument:s};let A={playerHand:c,dealerHand:d,randomValuePool:a.randomValuePool,playerArgument:s,betAmounts:p,sideBetResults:u};if(c.isBlackjack&&d.isBlackjack)return H({...A,outcome:"PUSH"});if(c.isBlackjack)return H({...A,outcome:"PLAYER_BLACKJACK"});if(d.isBlackjack)return H({...A,outcome:"LOSE"});return{state:{...r,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:d,insuranceOutcome:void 0,betAmounts:p,sideBetResults:u},config:{},playerArgument:s}},BLACKJACK_BUY_INSURANCE:(t,a)=>{let{state:r}=t;tr(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return H({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(e.isBlackjack)return H({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(n.isBlackjack)return H({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...r,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:o.mainBetAmount.mul(M)}},BLACKJACK_REJECT_INSURANCE:(t,a)=>{let{state:r}=t;tr(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={playerHand:e,dealerHand:n,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return H({...c,outcome:"PUSH"});if(e.isBlackjack)return H({...c,outcome:"PLAYER_BLACKJACK"});if(n.isBlackjack)return H({...c,outcome:"LOSE"});return{state:{...r,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(t,a)=>{let{state:r}=t;switch(Yt(r),r.phase){case"playing-main-hand":{let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===O){if(r.splitHand.highestHandValue===O)return R({...r,mainHand:e,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...r,mainHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===O)return R({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,splitHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return H({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(e.highestHandValue===O)return Jt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"in-progress",playerHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:m.Guard.againstNever(r,"Invalid phase for HIT action")}},BLACKJACK_STAND:(t,a)=>{let{state:r}=t;switch(Yt(r),r.phase){case"playing-main-hand":{if(r.splitHand.highestHandValue===O)return R({...r,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...r,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return R({...r,splitHandDoubledDown:r.splitHandDoubledDown,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return Jt({...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:m.Guard.againstNever(r,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(t,a)=>{let{state:r}=t;switch(Yt(r),r.phase){case"playing-main-hand":{m.Guard.against(r.mainHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]),{betAmounts:n}=r;if(r.splitHand.highestHandValue===O)return R({...r,mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:n.mainBetAmount.mul(P)}}case"playing-split-hand":{m.Guard.against(r.splitHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);return R({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{m.Guard.against(r.playerHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return H({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return Jt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:m.Guard.againstNever(r,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(t,a)=>{let{state:r}=t;ae(r);let{playerHand:e,betAmounts:n,sideBetResults:o}=r;m.Guard.against(e.cards.length!==2,"Split is only allowed with exactly 2 cards");let i=e.cards[0],c=e.cards[1];m.Guard.againstUndefined(i,"First card is missing"),m.Guard.againstUndefined(c,"Second card is missing"),m.Guard.against(i.rank!==c.rank,"Split requires two cards of the same rank");let d=S(a.randomValuePool.takeOne()),p=S(a.randomValuePool.takeOne()),u=N.withInitialDeal([i.value,d]),s=N.withInitialDeal([c.value,p]);if(i.rank==="Ace")return R({...r,mainHand:u,splitHand:s,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let b=u.highestHandValue===O,It=s.highestHandValue===O;if(b&&It)return R({mainHand:u,splitHand:s,dealerHand:r.dealerHand,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:n,sideBetResults:o});if(b)return{state:{...r,phase:"playing-split-hand",mainHand:u,splitHand:s,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(I)};return{state:{...r,phase:"playing-main-hand",multiplier:_.default(0),mainHand:u,splitHand:s,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(I)}}}})}getValidNextActionTypes(t){if(t.isFinished)return[];switch(t.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.mainHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"playing-split-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.splitHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"player-turn":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.playerHand.cards.length===2){a.push("BLACKJACK_DOUBLE_DOWN");let r=t.playerHand.cards[0],e=t.playerHand.cards[1];if(m.Guard.againstUndefined(r,"First player card is missing"),m.Guard.againstUndefined(e,"Second player card is missing"),r.rank===e.rank)a.push("BLACKJACK_SPLIT")}return a}default:m.Guard.againstNever(t,"Invalid phase for getting valid actions")}}}var J=C(require("big.js")),nr=require("@betorigami/guard");var zt=0,Xt=51,Y=52,qt=52;var or=(t)=>t.length===new Set(t).size,ir=(t)=>{let a=J.default(1),r=J.default(Y);for(let e=0;e<t;e+=1)a=a.mul(J.default(Y-e).div(r));return a};class cr extends B{constructor(){super("BLITZ")}determineGameResult({generator:t,gameInputs:a,edge:r}){nr.Guard.against(a.pickCount<1||a.pickCount>Y,`pickCount must be between 1 and ${Y}`);let e=t.getRandomIntsWithReplacement({min:zt,max:Xt,count:qt}),n=e.values.slice(0,a.pickCount),o=or(n),i=ir(a.pickCount);return{isFinished:!0,payoutMultiplier:o?x.withMultiplier(J.default(1).div(i),r):J.default(0),outputs:{result:e.values,cards:n.map((d)=>new Q(d).toDto())},randomValues:e}}}var lr=C(require("big.js"));class T{multipliers;constructor(t){this.multipliers=t}getMultipliers(t){let a=this.multipliers.get(t);if(a===void 0)throw new Error(`Multipliers for ${t} not found`);return a}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([t,a])=>({edge:t,multipliers:a}))}}var dr;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(dr||={});var re={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},ee={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ne={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},oe={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},ie={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},ur=new T(new Map([[1,re],[2,ee],[3,ne],[4,oe],[8,ie]])),ce={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class sr extends B{constructor(){super("DIAMONDS")}determineGameResult({generator:t,edge:a}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5}),e=ur.getMultipliers(a),n=r.values,o=this.calculatePayoutMultiplier(e,n);return{isFinished:!0,payoutMultiplier:lr.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t,a){let r=new Map;for(let o of a){let i=r.get(o)||0;r.set(o,i+1)}let e=[...r.values()].filter((o)=>o>1),n=this.classifyResult(e);return n===null?0:t[n]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[a,r]=t;if(a===void 0)return null;if(r===void 0){let e=ce[a];if(e===void 0)throw new Error(`Unexpected single diamond repeat count: ${a}`);return e}return a===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var Qt=C(require("big.js"));var pr;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(pr||={});var gt=1e4,Ar=(t)=>{let a=t.direction==="ABOVE"?gt-t.selectedValue:t.selectedValue;return new Qt.default(a).div(gt).mul(100)},Br=(t,a)=>t.direction==="ABOVE"?a>t.selectedValue:a<t.selectedValue;class mr extends B{constructor(){super("DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:0,max:1e4}),n=Ar(r);return{isFinished:!0,payoutMultiplier:Br(r,e.value)?x.withWinChance(a,n):new Qt.default(0),outputs:{result:e.values},randomValues:e}}}var Hr=C(require("big.js"));var at=require("@betorigami/guard");var Wt;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Wt||={});var yr=[1,2,3,4,5,6,7,8,9,10],Lt=(t)=>{return yr.includes(t)};var Er={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},fr={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},Sr={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Or={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Dr={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Kt=new T(new Map([[1,Er],[2,fr],[3,Sr],[4,Or],[8,Dr]]));class hr extends B{constructor(){super("KENO")}determineGameResult({generator:t,edge:a,gameInputs:r}){at.Guard.againstEmptyArray(r.selectedNumbers,()=>l.createValidationError("No numbers selected")),at.Guard.against(r.selectedNumbers.length>10,()=>l.createValidationError("Maximum of 10 numbers can be selected"));for(let s of r.selectedNumbers)at.Guard.againstNonInteger(s,()=>l.createValidationError("Only integers can be selected")),at.Guard.against(s<0||s>39,()=>l.createValidationError("Invalid number selected"));let e=t.getUniqueRandomInts({min:0,max:39,count:10}),n=r.selectedNumbers.filter((s)=>e.values.includes(s)),o=r.selectedNumbers.length;if(!Lt(o))throw new Error(`Invalid tile count: ${o}`);let p=Kt.getMultipliers(a)[o][r.riskLevel][n.length];if(p===void 0)throw new Error(`No multiplier found for matching tile count ${n.length}`);return{isFinished:!0,payoutMultiplier:new Hr.default(p),outputs:{result:e.values},randomValues:e}}}var V=C(require("big.js"));var vt=(t,a)=>{return t.gt(a)?t:a};var ta=(t,a)=>{return t.lt(a)?t:a};class Cr extends B{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:1,max:4294967295}),n=e.max,o=new V.default(16777216),i=new V.default(1),c=new V.default(1e6),d=e.value,p=new V.default(d-1).div(n),u=(100-a)/100,s=o.div(p.mul(o).plus(1)).mul(u),A=vt(i,ta(s,c));return{isFinished:!0,payoutMultiplier:A.gte(r.targetMultiplier)?new V.default(r.targetMultiplier):new V.default(0),outputs:{randomMultiplier:A,result:e.values},randomValues:e}}}var rt=C(require("big.js"));var Pt=(t,a)=>{if(a<0||t<0||a>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(a>t-a)a=t-a;let r=1;for(let e=1;e<=a;e++)r=r*(t-e+1)/e;return r};class xr extends B{constructor(){super("MINES")}determineGameResult({generator:t,edge:a,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=i.values.some((b)=>r.selectedTiles.includes(b)),d=r.hasCashedOut||c,p=(100-a)/100,u=new rt.default(Pt(25-r.minesCount,r.selectedTiles.length)).div(new rt.default(Pt(25,r.selectedTiles.length))),A=r.hasCashedOut&&!c?new rt.default(p).div(u):new rt.default(0);return{isFinished:d,payoutMultiplier:A,outputs:{result:i.values},randomValues:i}}}var Tr=require("big.js");var aa;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(aa||={});var le=[8,9,10,11,12,13,14,15,16],de={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},ue={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},se={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},pe={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},Ae={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},ra=new T(new Map([[1,de],[2,ue],[3,se],[4,pe],[8,Ae]]));class Pr extends B{constructor(){super("PLINKO")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(a.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(a.numberOfRows<8||a.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let e=a.numberOfRows,i=ra.getMultipliers(r)[a.riskLevel][e],c=t.getRandomIntsWithReplacement({min:0,max:1,count:a.numberOfRows}),p=c.values.reduce((s,A)=>s+A,0),u=i[p];if(u===void 0)throw new Error(`No payout found for end position ${p}`);return{isFinished:!0,payoutMultiplier:Tr.Big(u),outputs:{result:c.values},randomValues:c}}}var ot=require("big.js");var Rt=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],ea=[37,...Rt],na=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],oa=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],ia=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],ca=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],la=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],da=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],ua=[0,1,2,3,37],sa=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],pa=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],w;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(w||={});var U;((r)=>{r.RED="RED";r.BLACK="BLACK"})(U||={});var Z;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(Z||={});var G;((e)=>{e.TOP="TOP";e.MIDDLE="MIDDLE";e.BOTTOM="BOTTOM"})(G||={});var k;((e)=>{e.FIRST="FIRST";e.SECOND="SECOND";e.THIRD="THIRD"})(k||={});var _t;((r)=>{r.AMERICAN="AMERICAN";r.EUROPEAN="EUROPEAN"})(_t||={});var bt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw l.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&et(a.value)))throw l.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&Be(a.values)))throw l.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&me(a.values)))throw l.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&ye(a.values)))throw l.createValidationError("Invalid corner bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&Ee(a.values)))throw l.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.parity)))throw l.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.color)))throw l.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.half)))throw l.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.column)))throw l.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(k).includes(a.dozen)))throw l.createValidationError("Invalid dozen bet.")},et=(t)=>{return Rt.includes(t)},Be=(t)=>{if(t.length!==2)return!1;if(!t.every(et))return!1;return na.some(([a,r])=>a===t[0]&&r===t[1])},me=(t)=>{if(t.length!==3)return!1;if(!t.every(et))return!1;return ia.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},ye=(t)=>{if(t.length!==4)return!1;if(!t.every(et))return!1;return la.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},Ee=(t)=>{if(t.length!==6)return!1;if(!t.every(et))return!1;return sa.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var jt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw l.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&nt(a.value)))throw l.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&fe(a.values)))throw l.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&Se(a.values)))throw l.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Oe(a.values)))throw l.createValidationError("Invalid corner bet.");if(!t.basketBets.every((a)=>a.amount.gte(0)))throw l.createValidationError("Invalid basket bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&De(a.values)))throw l.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.parity)))throw l.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.color)))throw l.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.half)))throw l.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.column)))throw l.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(k).includes(a.dozen)))throw l.createValidationError("Invalid dozen bet.")},nt=(t)=>{return ea.includes(t)};function fe(t){if(t.length!==2)return!1;if(!t.every(nt))return!1;return oa.some(([a,r])=>a===t[0]&&r===t[1])}var Se=(t)=>{if(t.length!==3)return!1;if(!t.every(nt))return!1;return ca.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Oe=(t)=>{if(t.length!==4)return!1;if(!t.every(nt))return!1;return da.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},De=(t)=>{if(t.length!==6)return!1;if(!t.every(nt))return!1;return pa.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Rr={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},_r=[3,6,9,12,15,18,21,24,27,30,33,36],br=[2,5,8,11,14,17,20,23,26,29,32,35],jr=[1,4,7,10,13,16,19,22,25,28,31,34],Ir=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Nr=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Vr=2.7,wr=5.3;class Aa extends B{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:a}){this.validateInputs(a);let r=t.getRandomInt({min:0,max:this.maxNumber}),e=r.value,n=this.determineBetOutcomes(a,e),{payoutMultiplier:o}=this.getPayoutDetails(a,e);return{outputs:{betOutcomes:n,result:r.values},payoutMultiplier:o,isFinished:!0,randomValues:r}}getBetAmount(t){return this.calculateTotalBetAmount(this.getBetTotals(t))}getPayoutDetails(t,a){let r=this.determineBetOutcomes(t,a),e=this.getBetTotals(t),n=this.getBetTotals(r.winningBets),o=this.calculateTotalBetAmount(e),i=this.calculateTotalPayout(n);return{payoutMultiplier:o.gt(0)?i.div(o):new ot.Big(0),payoutAmount:i}}determineBetOutcomes(t,a){let r={},e={};for(let n of Object.keys(t)){let o=t[n],i=this.betPredicates[n],{winning:c,losing:d}=this.partitionBets(o,i,a);r[n]=c,e[n]=d}return{winningBets:r,losingBets:e}}calculateTotalAmount(t){return t.reduce((a,r)=>a.plus(r.amount),new ot.Big(0))}isWinningStraightBet(t,a){return t.value===a}isWinningSplitBet(t,a){return t.values.some((r)=>r===a)}isWinningStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningCornerBet(t,a){return t.values.some((r)=>r===a)}isWinningDoubleStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningColorBet(t,a){let r=t;return Ir.includes(a)&&r.color==="RED"||Nr.includes(a)&&r.color==="BLACK"}isWinningHalfBet(t,a){let r=t;if(a>0&&a<=18&&r.half==="LOW")return!0;if(a>18&&a<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(t,a){let r=t;return _r.includes(a)&&r.column==="TOP"||br.includes(a)&&r.column==="MIDDLE"||jr.includes(a)&&r.column==="BOTTOM"}isWinningDozenBet(t,a){let r=t;if(a>0&&a<=12&&r.dozen==="FIRST")return!0;if(a>12&&a<=24&&r.dozen==="SECOND")return!0;if(a>24&&a<=36&&r.dozen==="THIRD")return!0;return!1}isWinningParityBet(t,a){let r=t;if(a===0||a===37)return!1;let e=a%2===0?"EVEN":"ODD";return r.parity===e}getBetTotals(t){let a={};for(let r of Object.keys(t))a[r]=this.calculateTotalAmount(t[r]);return a}calculateTotalBetAmount(t){return Object.values(t).reduce((a,r)=>a.plus(r),new ot.Big(0))}partitionBets(t,a,r){return{winning:t.filter((e)=>a(e,r)),losing:t.filter((e)=>!a(e,r))}}calculateTotalPayout(t){return Object.entries(t).reduce((a,[r,e])=>{let o=Rr[r];return a.plus(e.mul(o||0))},new ot.Big(0))}}class Ba extends Aa{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(t){bt(t)}}class ma extends Aa{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(t){jt(t)}isWinningBasketBet(t,a){return ua.some((r)=>r===a)}}class ya extends B{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Ba,this.americanGame=new ma}getBetAmount(t){switch(t.type){case"AMERICAN":return this.americanGame.getBetAmount(t.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(t.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(t){let{gameInputs:a,...r}=t;if(t.edge===Vr&&a.type==="EUROPEAN"){let e=this.europeanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"european",betOutcomes:n,result:e.outputs.result}}}if(t.edge===wr&&a.type==="AMERICAN"){let e=this.americanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"american",betOutcomes:n,result:e.outputs.result}}}throw l.createValidationError(`Attempted to play ${a.type} roulette on edge ${t.edge}`)}}var He=(t)=>{return new ya().getBetAmount(t)};var he=(t)=>{if(t.type==="EUROPEAN")bt(t.inputs);else jt(t.inputs)};var Gr=require("big.js");var $;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})($||={});var z;((o)=>{o[o.TEN=10]="TEN";o[o.TWENTY=20]="TWENTY";o[o.THIRTY=30]="THIRTY";o[o.FORTY=40]="FORTY";o[o.FIFTY=50]="FIFTY"})(z||={});var Ce={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},xe={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},Te={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Pe={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Re={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Ur=new T(new Map([[1,Ce],[2,xe],[3,Te],[4,Pe],[8,Re]]));var Zr={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class kr extends B{constructor(){super("WHEEL")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(!Object.values(z).includes(a.segments))throw new Error("Invalid segments value");if(!Object.values($).includes(a.riskLevel))throw new Error("Invalid risk level");let n=Ur.getMultipliers(r)[a.riskLevel];if(n===void 0)throw new Error(`No multipliers found for risk level ${a.riskLevel}`);let o=n[a.segments];if(o===void 0)throw new Error(`No multipliers found for segment ${a.segments}`);let i=Zr[a.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${a.riskLevel}`);let c=i[a.segments];if(c===void 0)throw new Error(`No patterns found for segment ${a.segments}`);let d=t.getRandomInt({min:0,max:c.length-1}),p=c[d.value];if(p===void 0)throw new Error(`No pattern found for segment ${a.segments} and value ${d.value}`);let u=o[p];if(u===void 0)throw new Error(`No payout found for picked segment ${p}`);return{isFinished:!0,payoutMultiplier:new Gr.Big(u),outputs:{result:d.values},randomValues:d}}}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,24 @@ export declare class GameError extends Error {
13
13
  errorCode: GameErrorCode;
14
14
  constructor(errorCode: GameErrorCode, message?: string);
15
15
  }
16
+ export declare enum OrigamiGame {
17
+ DICE = "DICE",
18
+ MINES = "MINES",
19
+ KENO = "KENO",
20
+ LIMBO = "LIMBO",
21
+ ADVANCED_DICE = "ADVANCED_DICE",
22
+ BACCARAT = "BACCARAT",
23
+ DIAMONDS = "DIAMONDS",
24
+ PLINKO = "PLINKO",
25
+ ROULETTE = "ROULETTE",
26
+ WHEEL = "WHEEL",
27
+ BLACKJACK = "BLACKJACK",
28
+ BLITZ = "BLITZ"
29
+ }
30
+ export declare abstract class Game {
31
+ readonly gameId: OrigamiGame;
32
+ protected constructor(gameId: OrigamiGame);
33
+ }
16
34
  export type Proof = {
17
35
  proofHash: string;
18
36
  proofString: string;
@@ -46,19 +64,6 @@ export interface RandomNumberGenerator {
46
64
  count: number;
47
65
  }): MultipleRandomValues;
48
66
  }
49
- export declare enum OrigamiGame {
50
- DICE = "DICE",
51
- MINES = "MINES",
52
- KENO = "KENO",
53
- LIMBO = "LIMBO",
54
- ADVANCED_DICE = "ADVANCED_DICE",
55
- BACCARAT = "BACCARAT",
56
- DIAMONDS = "DIAMONDS",
57
- PLINKO = "PLINKO",
58
- ROULETTE = "ROULETTE",
59
- WHEEL = "WHEEL",
60
- BLACKJACK = "BLACKJACK"
61
- }
62
67
  export type EmptyGameOutput = {};
63
68
  export interface GetGameResultRequest<TGameInputs> {
64
69
  generator: RandomNumberGenerator;
@@ -73,8 +78,7 @@ export interface GameResult<TGameOutputs = EmptyGameOutput> {
73
78
  };
74
79
  randomValues: SingleRandomValue | MultipleRandomValues;
75
80
  }
76
- export declare abstract class Game<TGameInputs, TGameOutputs = EmptyGameOutput> {
77
- readonly gameId: OrigamiGame;
81
+ export declare abstract class SingleActionGame<TGameInputs, TGameOutputs = EmptyGameOutput> extends Game {
78
82
  protected constructor(gameId: OrigamiGame);
79
83
  getGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
80
84
  protected abstract determineGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
@@ -113,7 +117,7 @@ export type RollBetweenTwo = {
113
117
  export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
114
118
  export declare const calculateAdvancedDiceWinChance: (gameInputs: AdvancedDiceInputs) => Big$1.Big;
115
119
  export declare const validateAdvancedDiceInputs: (gameInputs: AdvancedDiceInputs) => void;
116
- export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
120
+ export declare class AdvancedDice extends SingleActionGame<AdvancedDiceInputs> {
117
121
  constructor();
118
122
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
119
123
  }
@@ -169,7 +173,7 @@ export interface BaccaratGameOutputs {
169
173
  gameOutcome: BaccaratOutcome;
170
174
  }
171
175
  export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
172
- export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
176
+ export declare class Baccarat extends SingleActionGame<BaccaratGameInputs, BaccaratGameOutputs> {
173
177
  constructor();
174
178
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
175
179
  private validateGameInputs;
@@ -379,11 +383,11 @@ export interface GameStore<TInternalState extends BaseGameState, TAction, TConfi
379
383
  readonly context: GameContext<TAction, TInternalState, TConfig>;
380
384
  };
381
385
  }
382
- declare abstract class NewGame<TInternalState extends BaseGameState, TExternalState extends BaseGameState, TAction extends {
386
+ export declare abstract class MultiActionGame<TInternalState extends BaseGameState, TExternalState extends BaseGameState, TAction extends {
383
387
  readonly type: string;
384
- }, TConfig> {
388
+ }, TConfig> extends Game {
385
389
  readonly edge: number;
386
- constructor(edge: number);
390
+ constructor(gameId: OrigamiGame, edge: number);
387
391
  abstract getValidNextActionTypes(state: TExternalState): ReadonlyArray<TAction["type"]>;
388
392
  protected abstract createGameStore(): GameStore<TInternalState, TAction, TConfig>;
389
393
  protected abstract generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
@@ -510,12 +514,31 @@ export type BlackjackInternalSplitFinishedState = BaseFinishedState & {
510
514
  };
511
515
  export type BlackjackInternalState = BlackjackInternalUninitialisedState | BlackjackInternalAwaitingInsuranceState | BlackjackInternalInProgressState | BlackjackInternalPlayingMainHandState | BlackjackInternalPlayingSplitHandState | BlackjackInternalFinishedState | BlackjackInternalSplitFinishedState;
512
516
  export type BlackjackGameContext = GameContext<BlackjackAction, BlackjackState, BlackjackConfig>;
513
- export declare class Blackjack extends NewGame<BlackjackInternalState, BlackjackState, BlackjackAction, BlackjackConfig> {
517
+ export declare class Blackjack extends MultiActionGame<BlackjackInternalState, BlackjackState, BlackjackAction, BlackjackConfig> {
518
+ constructor(edge: number);
514
519
  protected generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
515
520
  protected toExternalState(internal: BlackjackInternalState): BlackjackState;
516
521
  protected createGameStore(): GameStore<BlackjackInternalState, BlackjackAction, BlackjackConfig>;
517
522
  getValidNextActionTypes(state: BlackjackState): readonly BlackjackActionType[];
518
523
  }
524
+ export interface BlitzGameInputs {
525
+ pickCount: number;
526
+ }
527
+ export interface BlitzGameOutputs {
528
+ cards: CardDto[];
529
+ result: number[];
530
+ }
531
+ export declare const hasBlitzWon: (drawnCards: number[]) => boolean;
532
+ /** Returns the probability of winning a Blitz game with a given number of picks between 0-1 */
533
+ export declare const calculateBlitzWinChance: (picks: number) => Big$1;
534
+ export declare class Blitz extends SingleActionGame<BlitzGameInputs, BlitzGameOutputs> {
535
+ constructor();
536
+ protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BlitzGameInputs>): GameResult<BlitzGameOutputs>;
537
+ }
538
+ export declare const BLITZ_MIN_CARD_RANGE = 0;
539
+ export declare const BLITZ_MAX_CARD_RANGE = 51;
540
+ export declare const BLITZ_CARD_COUNT = 52;
541
+ export declare const BLITZ_RANDOM_NUMBER_COUNT = 52;
519
542
  declare class MultiplierContainer<TMultipliers> {
520
543
  readonly multipliers: Map<number, TMultipliers>;
521
544
  constructor(multipliers: Map<number, TMultipliers>);
@@ -537,7 +560,7 @@ export declare enum DiamondsResultType {
537
560
  }
538
561
  export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
539
562
  export declare const diamondsMultipliers: MultiplierContainer<DiamondsMultipliers>;
540
- export declare class Diamonds extends Game<DiamondsGameInputs> {
563
+ export declare class Diamonds extends SingleActionGame<DiamondsGameInputs> {
541
564
  constructor();
542
565
  protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
543
566
  private calculatePayoutMultiplier;
@@ -554,7 +577,7 @@ export interface DiceGameInputs {
554
577
  export declare const DICE_EFFECTIVE_RANGE = 10000;
555
578
  export declare const calculateDiceWinChance: (gameInputs: DiceGameInputs) => Big$1;
556
579
  export declare const hasDiceWon: (gameInputs: DiceGameInputs, rolledValue: number) => boolean;
557
- export declare class Dice extends Game<DiceGameInputs> {
580
+ export declare class Dice extends SingleActionGame<DiceGameInputs> {
558
581
  constructor();
559
582
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
560
583
  }
@@ -582,7 +605,7 @@ export interface KenoGameInputs {
582
605
  riskLevel: KenoRiskLevel;
583
606
  selectedNumbers: number[];
584
607
  }
585
- export declare class Keno extends Game<KenoGameInputs> {
608
+ export declare class Keno extends SingleActionGame<KenoGameInputs> {
586
609
  constructor();
587
610
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<KenoGameInputs>): GameResult;
588
611
  }
@@ -599,7 +622,7 @@ export interface LimboGameInputs {
599
622
  export interface LimboGameOutputs {
600
623
  randomMultiplier: Big$1;
601
624
  }
602
- export declare class Limbo extends Game<LimboGameInputs, LimboGameOutputs> {
625
+ export declare class Limbo extends SingleActionGame<LimboGameInputs, LimboGameOutputs> {
603
626
  constructor();
604
627
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<LimboGameInputs>): GameResult<LimboGameOutputs>;
605
628
  }
@@ -608,7 +631,7 @@ export interface MinesGameInputs {
608
631
  selectedTiles: number[];
609
632
  hasCashedOut: boolean;
610
633
  }
611
- export declare class Mines extends Game<MinesGameInputs> {
634
+ export declare class Mines extends SingleActionGame<MinesGameInputs> {
612
635
  constructor();
613
636
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
614
637
  }
@@ -621,7 +644,7 @@ export interface PlinkoGameInputs {
621
644
  numberOfRows: number;
622
645
  riskLevel: PlinkoRiskLevel;
623
646
  }
624
- export declare class Plinko extends Game<PlinkoGameInputs> {
647
+ export declare class Plinko extends SingleActionGame<PlinkoGameInputs> {
625
648
  constructor();
626
649
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
627
650
  }
@@ -1982,7 +2005,7 @@ declare abstract class BaseRoulette<TInputs extends {
1982
2005
  losingBets: TInputs;
1983
2006
  };
1984
2007
  result: number[];
1985
- }> extends Game<TInputs, TOutputs> {
2008
+ }> extends SingleActionGame<TInputs, TOutputs> {
1986
2009
  protected abstract readonly maxNumber: number;
1987
2010
  constructor();
1988
2011
  determineGameResult({ generator, gameInputs }: GetGameResultRequest<TInputs>): GameResult<TOutputs>;
@@ -2026,7 +2049,7 @@ export declare class AmericanRoulette extends BaseRoulette<AmericanRouletteGameI
2026
2049
  protected validateInputs(inputs: AmericanRouletteGameInputs): void;
2027
2050
  protected isWinningBasketBet(_bet: BaseBet, gameResult: number): boolean;
2028
2051
  }
2029
- export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
2052
+ export declare class Roulette extends SingleActionGame<RouletteGameInputs, RouletteGameOutputs> {
2030
2053
  private readonly europeanGame;
2031
2054
  private readonly americanGame;
2032
2055
  constructor();
@@ -2051,7 +2074,7 @@ export interface WheelGameInputs {
2051
2074
  segments: WheelSegments;
2052
2075
  riskLevel: WheelRiskLevel;
2053
2076
  }
2054
- export declare class Wheel extends Game<WheelGameInputs> {
2077
+ export declare class Wheel extends SingleActionGame<WheelGameInputs> {
2055
2078
  constructor();
2056
2079
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
2057
2080
  }
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var yE;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(yE||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,E){super(E);this.errorCode=r}}var M;((u)=>{u.DICE="DICE";u.MINES="MINES";u.KENO="KENO";u.LIMBO="LIMBO";u.ADVANCED_DICE="ADVANCED_DICE";u.BACCARAT="BACCARAT";u.DIAMONDS="DIAMONDS";u.PLINKO="PLINKO";u.ROULETTE="ROULETTE";u.WHEEL="WHEEL";u.BLACKJACK="BLACKJACK"})(M||={});class _{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as mr}from"big.js";import cr from"big.js";class V{static withMultiplier(r,E){return new cr(r).times(new cr(100-E).div(100))}static withWinChance(r,E){return cr(100-r).div(E)}}var Sr=0,xr=1e4,zr=10001,VE=0.01,IE=98,PE=(r)=>{if(r<Sr)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${Sr}`)},YE=(r)=>{if(r>xr)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${xr}`)},a=(r)=>{if(PE(r.lower),YE(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},dE=(r,E)=>{let[t,A]=r.lower<=E.lower?[r,E]:[E,r];if(t.upper>A.lower)throw B.createValidationError("Bounds must not overlap")},FE=(r,E)=>E>=r.lower&&E<=r.upper,$E=(r)=>r.upper-r.lower+1,ur=(r,E)=>E>r.lower&&E<r.upper,Br=(r)=>r.upper-r.lower-1,zE;((A)=>{A.ROLL_BETWEEN="ROLL_BETWEEN";A.ROLL_OUTSIDE="ROLL_OUTSIDE";A.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(zE||={});var Jr=(r)=>{let t=(()=>{switch(r.mode){case"ROLL_BETWEEN":return a(r.bounds),Br(r.bounds);case"ROLL_OUTSIDE":return a(r.bounds),zr-$E(r.bounds);case"ROLL_BETWEEN_TWO":return a(r.firstBounds),a(r.secondBounds),dE(r.firstBounds,r.secondBounds),Br(r.firstBounds)+Br(r.secondBounds)}})(),A=mr(t).div(zr).mul(100);if(A.lt(VE))throw B.createValidationError("Win chance too low");if(A.gt(IE))throw B.createValidationError("Win chance too high");return A},ZA=(r)=>{Jr(r)};class mE extends _{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:t}){let A=Jr(t),o=r.getRandomInt({min:Sr,max:xr}),f=o.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(t.mode){case"ROLL_BETWEEN":return ur(t.bounds,f);case"ROLL_OUTSIDE":return!FE(t.bounds,f);case"ROLL_BETWEEN_TWO":return ur(t.firstBounds,f)||ur(t.secondBounds,f)}})()?V.withWinChance(E,A):new mr(0),outputs:{result:o.values},randomValues:o}}}import d from"big.js";var JE=["Clubs","Diamonds","Hearts","Spades"],XE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],iE;((A)=>{A.PLAYER_WIN="PLAYER_WIN";A.TIE="TIE";A.BANKER_WIN="BANKER_WIN"})(iE||={});var qE;((A)=>{A.PLAYER="PLAYER";A.TIE="TIE";A.BANKER="BANKER"})(qE||={});var QE={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},HE=(r)=>{return new d(0).add(r.bets.reduce((t,A)=>t.add(A.amount),new d(0)))};class jE extends _{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:E,edge:t}){if(t!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(E);let A=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=A.values,f=o.slice(0,3),O=o.slice(3,6),c=[],S=0;for(let C of f.slice(0,2)){let G=this.mapRandomValueToCard(C),l=this.mapRandomValueToCardValue(C);c.push(G),S=(S+l)%10}let D=[],x=0;for(let C of O.slice(0,2)){let G=this.mapRandomValueToCard(C),l=this.mapRandomValueToCardValue(C);D.push(G),x=(x+l)%10}if(!this.isNaturalWin(S,x)){let C=this.shouldDrawThirdPlayerCard(S),G=null;if(C)G=this.mapRandomValueToCardValue(f[2]),c.push(this.mapRandomValueToCard(f[2])),S=(S+G)%10;if(this.shouldDrawThirdBankerCard(x,G))D.push(this.mapRandomValueToCard(O[2])),x=(x+this.mapRandomValueToCardValue(O[2]))%10}let u;if(S===x)u="TIE";else u=S>x?"PLAYER_WIN":"BANKER_WIN";let Z=HE(E),{betType:y,multiplier:Or}=QE[u],q=new d(0);if(q=q.add(E.bets.filter((C)=>C.type===y).reduce((C,G)=>C.add(G.amount.mul(Or)),new d(0))),u==="TIE")q=q.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,G)=>C.add(G.amount),new d(0)));return{isFinished:!0,payoutMultiplier:Z.gt(0)?q.div(Z):new d(0),outputs:{playerCards:c,playerHandValue:S,bankerCards:D,bankerHandValue:x,gameOutcome:u,result:A.values},randomValues:A}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((E)=>E.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let E=JE[Math.floor(r/13)],t=XE[r%13];return{suit:E,rank:t}}isNaturalWin(r,E){let t=[8,9];return t.includes(r)||t.includes(E)}mapRandomValueToCardValue(r){let E=r%13;if(E===0)return 1;if(E>=10)return 10;return E+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,E){if(E===null)return r<=5;if(r<=2)return!0;if(r===3)return E!==8;if(r===4)return[2,3,4,5,6,7].includes(E);if(r===5)return[4,5,6,7].includes(E);if(r===6)return[6,7].includes(E);return!1}}var Dr;((o)=>{o.WIN="WIN";o.LOSE="LOSE";o.PUSH="PUSH";o.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Dr||={});var _r;((t)=>{t.WON="WON";t.LOST="LOST"})(_r||={});var Zr;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";c.SPLIT="BLACKJACK_SPLIT"})(Zr||={});var Nr;((o)=>{o.EXACT_PAIR="EXACT_PAIR";o.COLORED_PAIR="COLORED_PAIR";o.MIXED_PAIR="MIXED_PAIR";o.LOSS="LOSS"})(Nr||={});var Cr;((O)=>{O.SUITED_TRIPS="SUITED_TRIPS";O.STRAIGHT_FLUSH="STRAIGHT_FLUSH";O.THREE_OF_A_KIND="THREE_OF_A_KIND";O.STRAIGHT="STRAIGHT";O.FLUSH="FLUSH";O.LOSS="LOSS"})(Cr||={});var WE=2.5,LE=2,KE=1,vE=0,Xr=17,Tr=21,R=21,Ur=63,MA=1.5,Q=0.5,br=1.5,I=1,F=1,RA=13,Gr=10,ir=10,s={PLAYER_BLACKJACK:WE,WIN:LE,PUSH:KE,LOSE:vE},qr={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},Qr={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};import Y from"big.js";import{Guard as N}from"@betorigami/guard";import{createStore as eE}from"@xstate/store";var Hr=0,jr=51,n=Array.from({length:52},(r,E)=>E),Wr=["Spades","Hearts","Diamonds","Clubs"],k=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Lr=["Jack","Queen","King"],Mr={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};import{Guard as gE}from"@betorigami/guard";import{Guard as Rr}from"@betorigami/guard";class hr{value;constructor(r){let E=n[r];Rr.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=Wr[r];return Rr.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=k[r];return Rr.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class T extends hr{get numericRank(){if(Lr.includes(this.rank))return ir;return k.indexOf(this.rank)+1}static fromValue(r){return gE.against(!n.includes(r),`Invalid card value: ${r}`),new T(r)}}class H{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((t,A)=>t+A.numericRank,0),r.some((t)=>t.rank==="Ace")&&this.hardHandValue+Gr<=Tr)this.softHandValue=this.hardHandValue+Gr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Tr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===R}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class j{cards;value;constructor(r){this.cards=r.map((E)=>T.fromValue(E)),this.value=new H(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class W extends j{otherCards;upCard;holeCard;constructor(r,E,t=[]){super([r,E,...t]);this.otherCards=t;this.upCard=T.fromValue(r),this.holeCard=T.fromValue(E)}static withInitialDeal(r){return new W(r.upCard,r.holeCard)}addDrawnCards(r){return new W(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new H([this.upCard]).highestHandValue}}}class P extends j{static withInitialDeal(r){return new P(r)}addDrawnCards(r){return new P([...this.rawValues,...r])}}import{Guard as e}from"@betorigami/guard";class rr{source;index=0;constructor(r){this.source=r}static from(r,E){return e.against(E<=0,`Count must be positive, got ${E}`),e.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new rr(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return e.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){e.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let E=this.source.values.slice(this.index,this.index+r);return this.index+=r,E}}import{Guard as lE}from"@betorigami/guard";import aE from"fast-deep-equal";class wr{edge;constructor(r){this.edge=r}play(r,E,t=[]){let A=this.createGameStore(),o=this.generateRandomValues(r),f=o.toMultipleRandomValues();for(let S of t)A.send({...S.playerArgument,randomValuePool:o});let O=t[t.length-1];if(O)lE.against(!aE(O.state,this.toExternalState(A.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");A.send({...E,randomValuePool:o});let c=A.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}import h from"big.js";import{Guard as pr}from"@betorigami/guard";var Kr=(r)=>{let E=r.pairBonus!==null?h(r.pairBonus.betAmount).mul(r.pairBonus.payoutMultiplier):h(0),t=r.threeCardBonus!==null?h(r.threeCardBonus.betAmount).mul(r.threeCardBonus.payoutMultiplier):h(0);return E.plus(t)},vr=(r)=>{let E=r.betAmounts.mainBetAmount,A=r.actionType==="BLACKJACK_DOUBLE_DOWN"?E.mul(I):h(0),o=r.insuranceOutcome!==void 0?E.mul(Q):h(0),f=E.plus(A).mul(s[r.outcome]),O=r.insuranceOutcome==="WON"?E.mul(br):h(0),c=Kr(r.sideBetResults),S=f.plus(O).plus(c),D=E.plus(o).plus(A).plus(r.betAmounts.pairBonusAmount).plus(r.betAmounts.threeCardBonusAmount);pr.against(D.eq(0),"Total bet amount cannot be zero");let x=S.div(D);pr.against(r.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let u;switch(r.actionType){case"BLACKJACK_DOUBLE_DOWN":u=A;break;case"BLACKJACK_BUY_INSURANCE":u=o;break;case"BLACKJACK_SPLIT":u=E.mul(F);break}return{multiplier:x,additionalBetAmount:u}},gr=(r)=>{let E=r.betAmounts.mainBetAmount,t=r.mainHandDoubledDown?E.mul(I):h(0),A=r.splitHandDoubledDown?E.mul(I):h(0),o=r.insuranceOutcome!==void 0?E.mul(Q):h(0),f=E.plus(t).mul(s[r.mainOutcome]),O=E.plus(A).mul(s[r.splitOutcome]),c=r.insuranceOutcome==="WON"?E.mul(br):h(0),S=Kr(r.sideBetResults),D=f.plus(O).plus(c).plus(S),x=E.plus(E).plus(o).plus(t).plus(A).plus(r.betAmounts.pairBonusAmount).plus(r.betAmounts.threeCardBonusAmount);pr.against(x.eq(0),"Total bet amount cannot be zero");let u=D.div(x),Z;switch(r.actionType){case"BLACKJACK_DOUBLE_DOWN":Z=E.mul(I);break;case"BLACKJACK_SPLIT":Z=E.mul(F);break}return{multiplier:u,additionalBetAmount:Z}};import{Guard as sE}from"@betorigami/guard";var yr=(r)=>r.every((E)=>E===r[0]),lr=(r)=>{let E=[...r].sort((t,A)=>t-A);return E.every((t,A)=>{let o=E[A-1];if(A===0)return!0;return sE.againstUndefined(o,"Previous value cannot be undefined"),t===o+1})},ar={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},nE={...ar,Ace:14},kE=(r)=>lr(r.map((E)=>ar[E]))||lr(r.map((E)=>nE[E])),sr=(r,E)=>{let t=T.fromValue(r),A=T.fromValue(E);if(t.rank!==A.rank)return"LOSS";if(r===E)return"EXACT_PAIR";if(Mr[t.suit]===Mr[A.suit])return"COLORED_PAIR";return"MIXED_PAIR"},nr=(r,E)=>({betAmount:r,result:E,payoutMultiplier:qr[E]}),kr=(r,E,t)=>{let A=T.fromValue(r),o=T.fromValue(E),f=T.fromValue(t),O=[A.rank,o.rank,f.rank],c=yr([A.suit,o.suit,f.suit]),S=yr(O),D=kE(O);if(yr([r,E,t]))return"SUITED_TRIPS";if(c&&D)return"STRAIGHT_FLUSH";if(S)return"THREE_OF_A_KIND";if(D)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},er=(r,E)=>({betAmount:r,result:E,payoutMultiplier:Qr[E]});var rt={state:{isFinished:!1,phase:"uninitialised",multiplier:Y(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},U=(r)=>T.fromValue(r).value;function Et(r){N.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function rE(r){N.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Vr(r){N.against(r.phase!=="in-progress"&&r.phase!=="playing-main-hand"&&r.phase!=="playing-split-hand","Expected a started, in-progress game state")}var EE=(r,E)=>{let t=E;while(t.highestHandValue<Xr)t=t.addDrawnCards([U(r.takeOne())]);return t},Pr=(r,E)=>{if(r.isBusted)return"LOSE";if(E.isBusted)return"WIN";let t=r.highestHandValue,A=E.highestHandValue;if(t>A)return"WIN";if(t<A)return"LOSE";return"PUSH"},b=(r)=>{let{multiplier:E,additionalBetAmount:t}=vr({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,actionType:r.playerArgument.type,betAmounts:r.betAmounts,sideBetResults:r.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:E,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome,sideBetResults:r.sideBetResults},config:{},playerArgument:r.playerArgument,additionalBetAmount:t}},Ir=(r)=>{let E=EE(r.randomValuePool,r.dealerHand),t=Pr(r.playerHand,E);return b({...r,dealerHand:E,outcome:t})},p=(r)=>{let t=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:EE(r.randomValuePool,r.dealerHand),A=Pr(r.mainHand,t),o=Pr(r.splitHand,t),{multiplier:f,additionalBetAmount:O}=gr({hasSplit:!0,mainOutcome:A,splitOutcome:o,insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:r.mainHandDoubledDown,splitHandDoubledDown:r.splitHandDoubledDown,actionType:r.playerArgument.type,betAmounts:r.betAmounts,sideBetResults:r.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:r.mainHand,splitHand:r.splitHand,dealerHand:t,mainOutcome:A,splitOutcome:o,multiplier:f,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome,sideBetResults:r.sideBetResults},config:{},playerArgument:r.playerArgument,additionalBetAmount:O}};class tt extends wr{generateRandomValues(r){return rr.from(r.getRandomIntsWithReplacement({min:Hr,max:jr,count:Ur}),Ur)}toExternalState(r){let E=r.phase;switch(E){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1),sideBetResults:r.sideBetResults};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),sideBetResults:r.sideBetResults,...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,mainOutcome:r.mainOutcome,splitOutcome:r.splitOutcome,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!0),sideBetResults:r.sideBetResults,...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:N.againstNever(E,"Invalid state received")}}createGameStore(){return eE({context:rt,on:{START:(r,E)=>{let{state:t}=r;N.against(t.phase!=="uninitialised","START action requires a fresh game");let A=U(E.randomValuePool.takeOne()),o=U(E.randomValuePool.takeOne()),f=U(E.randomValuePool.takeOne()),O=U(E.randomValuePool.takeOne()),c=P.withInitialDeal([A,o]),S=W.withInitialDeal({upCard:f,holeCard:O}),D={mainBetAmount:Y(E.mainBetAmount),pairBonusAmount:Y(E.pairBonusAmount),threeCardBonusAmount:Y(E.threeCardBonusAmount)},x={pairBonus:Y(E.pairBonusAmount).gt(0)?nr(E.pairBonusAmount,sr(A,o)):null,threeCardBonus:Y(E.threeCardBonusAmount).gt(0)?er(E.threeCardBonusAmount,kr(A,o,f)):null},u={type:"START",mainBetAmount:E.mainBetAmount,pairBonusAmount:E.pairBonusAmount,threeCardBonusAmount:E.threeCardBonusAmount};if(S.upCard.rank==="Ace")return{state:{...t,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:S,betAmounts:D,sideBetResults:x},config:{},playerArgument:u};let Z={playerHand:c,dealerHand:S,randomValuePool:E.randomValuePool,playerArgument:u,betAmounts:D,sideBetResults:x};if(c.isBlackjack&&S.isBlackjack)return b({...Z,outcome:"PUSH"});if(c.isBlackjack)return b({...Z,outcome:"PLAYER_BLACKJACK"});if(S.isBlackjack)return b({...Z,outcome:"LOSE"});return{state:{...t,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:S,insuranceOutcome:void 0,betAmounts:D,sideBetResults:x},config:{},playerArgument:u}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:t}=r;rE(t);let{playerHand:A,dealerHand:o,betAmounts:f,sideBetResults:O}=t,c={...t,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:f,sideBetResults:O};if(A.isBlackjack&&o.isBlackjack)return b({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(A.isBlackjack)return b({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(o.isBlackjack)return b({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...t,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:f.mainBetAmount.mul(Q)}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:t}=r;rE(t);let{playerHand:A,dealerHand:o,betAmounts:f,sideBetResults:O}=t,c={playerHand:A,dealerHand:o,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:f,sideBetResults:O};if(A.isBlackjack&&o.isBlackjack)return b({...c,outcome:"PUSH"});if(A.isBlackjack)return b({...c,outcome:"PLAYER_BLACKJACK"});if(o.isBlackjack)return b({...c,outcome:"LOSE"});return{state:{...t,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,E)=>{let{state:t}=r;switch(Vr(t),t.phase){case"playing-main-hand":{let A=t.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted||A.highestHandValue===R){if(t.splitHand.highestHandValue===R)return p({...t,mainHand:A,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...t,phase:"playing-split-hand",mainHand:A,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...t,mainHand:A},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let A=t.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted||A.highestHandValue===R)return p({...t,splitHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...t,splitHand:A},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let A=t.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted)return b({...t,playerHand:A,outcome:"LOSE",randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(A.highestHandValue===R)return Ir({...t,playerHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...t,phase:"in-progress",playerHand:A},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:N.againstNever(t,"Invalid phase for HIT action")}},BLACKJACK_STAND:(r,E)=>{let{state:t}=r;switch(Vr(t),t.phase){case"playing-main-hand":{if(t.splitHand.highestHandValue===R)return p({...t,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...t,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return p({...t,splitHandDoubledDown:t.splitHandDoubledDown,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return Ir({...t,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:N.againstNever(t,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(r,E)=>{let{state:t}=r;switch(Vr(t),t.phase){case"playing-main-hand":{N.against(t.mainHand.cards.length!==2,"Double down is only allowed as the first action");let A=t.mainHand.addDrawnCards([U(E.randomValuePool.takeOne())]),{betAmounts:o}=t;if(t.splitHand.highestHandValue===R)return p({...t,mainHand:A,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...t,phase:"playing-split-hand",mainHand:A,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:o.mainBetAmount.mul(I)}}case"playing-split-hand":{N.against(t.splitHand.cards.length!==2,"Double down is only allowed as the first action");let A=t.splitHand.addDrawnCards([U(E.randomValuePool.takeOne())]);return p({...t,splitHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{N.against(t.playerHand.cards.length!==2,"Double down is only allowed as the first action");let A=t.playerHand.addDrawnCards([U(E.randomValuePool.takeOne())]);if(A.isBusted)return b({...t,playerHand:A,outcome:"LOSE",randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return Ir({...t,playerHand:A,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:N.againstNever(t,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:t}=r;Et(t);let{playerHand:A,betAmounts:o,sideBetResults:f}=t;N.against(A.cards.length!==2,"Split is only allowed with exactly 2 cards");let O=A.cards[0],c=A.cards[1];N.againstUndefined(O,"First card is missing"),N.againstUndefined(c,"Second card is missing"),N.against(O.rank!==c.rank,"Split requires two cards of the same rank");let S=U(E.randomValuePool.takeOne()),D=U(E.randomValuePool.takeOne()),x=P.withInitialDeal([O.value,S]),u=P.withInitialDeal([c.value,D]);if(O.rank==="Ace")return p({...t,mainHand:x,splitHand:u,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let y=x.highestHandValue===R,Or=u.highestHandValue===R;if(y&&Or)return p({mainHand:x,splitHand:u,dealerHand:t.dealerHand,randomValuePool:E.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:o,sideBetResults:f});if(y)return{state:{...t,phase:"playing-split-hand",mainHand:x,splitHand:u,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:o.mainBetAmount.mul(F)};return{state:{...t,phase:"playing-main-hand",multiplier:Y(0),mainHand:x,splitHand:u,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:o.mainBetAmount.mul(F)}}}})}getValidNextActionTypes(r){if(r.isFinished)return[];switch(r.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.mainHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"playing-split-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.splitHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"player-turn":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.playerHand.cards.length===2){E.push("BLACKJACK_DOUBLE_DOWN");let t=r.playerHand.cards[0],A=r.playerHand.cards[1];if(N.againstUndefined(t,"First player card is missing"),N.againstUndefined(A,"Second player card is missing"),t.rank===A.rank)E.push("BLACKJACK_SPLIT")}return E}default:N.againstNever(r,"Invalid phase for getting valid actions")}}}import At from"big.js";class w{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let E=this.multipliers.get(r);if(E===void 0)throw new Error(`Multipliers for ${r} not found`);return E}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,E])=>({edge:r,multipliers:E}))}}var ot;((O)=>{O.PAIR="PAIR";O.TWO_PAIR="TWO_PAIR";O.THREE_OF_A_KIND="THREE_OF_A_KIND";O.FULL_HOUSE="FULL_HOUSE";O.FOUR_OF_A_KIND="FOUR_OF_A_KIND";O.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(ot||={});var ft={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Ot={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ct={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},ut={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Bt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},St=new w(new Map([[1,ft],[2,Ot],[3,ct],[4,ut],[8,Bt]])),xt={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Dt extends _{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let t=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),A=St.getMultipliers(E),o=t.values,f=this.calculatePayoutMultiplier(A,o);return{isFinished:!0,payoutMultiplier:At(f),outputs:{result:t.values},randomValues:t}}calculatePayoutMultiplier(r,E){let t=new Map;for(let f of E){let O=t.get(f)||0;t.set(f,O+1)}let A=[...t.values()].filter((f)=>f>1),o=this.classifyResult(A);return o===null?0:r[o]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[E,t]=r;if(E===void 0)return null;if(t===void 0){let A=xt[E];if(A===void 0)throw new Error(`Unexpected single diamond repeat count: ${E}`);return A}return E===3||t===3?"FULL_HOUSE":"TWO_PAIR"}}import AE from"big.js";var _t;((t)=>{t.ABOVE="ABOVE";t.BELOW="BELOW"})(_t||={});var tE=1e4,Zt=(r)=>{let E=r.direction==="ABOVE"?tE-r.selectedValue:r.selectedValue;return new AE(E).div(tE).mul(100)},Nt=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class Ct extends _{constructor(){super("DICE")}determineGameResult({generator:r,edge:E,gameInputs:t}){let A=r.getRandomInt({min:0,max:1e4}),o=Zt(t);return{isFinished:!0,payoutMultiplier:Nt(t,A.value)?V.withWinChance(E,o):new AE(0),outputs:{result:A.values},randomValues:A}}}import ht from"big.js";import{Guard as Er}from"@betorigami/guard";var oE;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(oE||={});var Tt=[1,2,3,4,5,6,7,8,9,10],fE=(r)=>{return Tt.includes(r)};var Ut={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},bt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},Gt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Mt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Rt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},OE=new w(new Map([[1,Ut],[2,bt],[3,Gt],[4,Mt],[8,Rt]]));class wt extends _{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:t}){Er.againstEmptyArray(t.selectedNumbers,()=>B.createValidationError("No numbers selected")),Er.against(t.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let u of t.selectedNumbers)Er.againstNonInteger(u,()=>B.createValidationError("Only integers can be selected")),Er.against(u<0||u>39,()=>B.createValidationError("Invalid number selected"));let A=r.getUniqueRandomInts({min:0,max:39,count:10}),o=t.selectedNumbers.filter((u)=>A.values.includes(u)),f=t.selectedNumbers.length;if(!fE(f))throw new Error(`Invalid tile count: ${f}`);let D=OE.getMultipliers(E)[f][t.riskLevel][o.length];if(D===void 0)throw new Error(`No multiplier found for matching tile count ${o.length}`);return{isFinished:!0,payoutMultiplier:new ht(D),outputs:{result:A.values},randomValues:A}}}import $ from"big.js";var cE=(r,E)=>{return r.gt(E)?r:E};var uE=(r,E)=>{return r.lt(E)?r:E};class pt extends _{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:t}){let A=r.getRandomInt({min:1,max:4294967295}),o=A.max,f=new $(16777216),O=new $(1),c=new $(1e6),S=A.value,D=new $(S-1).div(o),x=(100-E)/100,u=f.div(D.mul(f).plus(1)).mul(x),Z=cE(O,uE(u,c));return{isFinished:!0,payoutMultiplier:Z.gte(t.targetMultiplier)?new $(t.targetMultiplier):new $(0),outputs:{randomMultiplier:Z,result:A.values},randomValues:A}}}import tr from"big.js";var Yr=(r,E)=>{if(E<0||r<0||E>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(E>r-E)E=r-E;let t=1;for(let A=1;A<=E;A++)t=t*(r-A+1)/A;return t};class yt extends _{constructor(){super("MINES")}determineGameResult({generator:r,edge:E,gameInputs:t}){if(t.minesCount<=0||t.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(t.selectedTiles.length>25-t.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let O=r.getUniqueRandomInts({min:1,max:25,count:t.minesCount}),c=O.values.some((y)=>t.selectedTiles.includes(y)),S=t.hasCashedOut||c,D=(100-E)/100,x=new tr(Yr(25-t.minesCount,t.selectedTiles.length)).div(new tr(Yr(25,t.selectedTiles.length))),Z=t.hasCashedOut&&!c?new tr(D).div(x):new tr(0);return{isFinished:S,payoutMultiplier:Z,outputs:{result:O.values},randomValues:O}}}import{Big as Ft}from"big.js";var BE;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(BE||={});var B2=[8,9,10,11,12,13,14,15,16],Vt={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},It={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Pt={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Yt={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},dt={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},SE=new w(new Map([[1,Vt],[2,It],[3,Pt],[4,Yt],[8,dt]]));class $t extends _{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:E,edge:t}){if(E.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(E.numberOfRows<8||E.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let A=E.numberOfRows,O=SE.getMultipliers(t)[E.riskLevel][A],c=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),D=c.values.reduce((u,Z)=>u+Z,0),x=O[D];if(x===void 0)throw new Error(`No payout found for end position ${D}`);return{isFinished:!0,payoutMultiplier:Ft(x),outputs:{result:c.values},randomValues:c}}}import{Big as fr}from"big.js";var dr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],xE=[37,...dr],DE=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],_E=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],ZE=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],NE=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],CE=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],TE=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],UE=[0,1,2,3,37],bE=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],GE=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],z;((t)=>{t.EVEN="EVEN";t.ODD="ODD"})(z||={});var m;((t)=>{t.RED="RED";t.BLACK="BLACK"})(m||={});var J;((t)=>{t.LOW="LOW";t.HIGH="HIGH"})(J||={});var X;((A)=>{A.TOP="TOP";A.MIDDLE="MIDDLE";A.BOTTOM="BOTTOM"})(X||={});var i;((A)=>{A.FIRST="FIRST";A.SECOND="SECOND";A.THIRD="THIRD"})(i||={});var Fr;((t)=>{t.AMERICAN="AMERICAN";t.EUROPEAN="EUROPEAN"})(Fr||={});var Ar=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&L(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&zt(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&mt(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&Jt(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&Xt(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(z).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(m).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(i).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},L=(r)=>{return dr.includes(r)},zt=(r)=>{if(r.length!==2)return!1;if(!r.every(L))return!1;return DE.some(([E,t])=>E===r[0]&&t===r[1])},mt=(r)=>{if(r.length!==3)return!1;if(!r.every(L))return!1;return ZE.some(([E,t,A])=>E===r[0]&&t===r[1]&&A===r[2])},Jt=(r)=>{if(r.length!==4)return!1;if(!r.every(L))return!1;return CE.some(([E,t,A,o])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3])},Xt=(r)=>{if(r.length!==6)return!1;if(!r.every(L))return!1;return bE.some(([E,t,A,o,f,O])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3]&&f===r[4]&&O===r[5])};var or=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&K(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&it(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&qt(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&Qt(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&Ht(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(z).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(m).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(X).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(i).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},K=(r)=>{return xE.includes(r)};function it(r){if(r.length!==2)return!1;if(!r.every(K))return!1;return _E.some(([E,t])=>E===r[0]&&t===r[1])}var qt=(r)=>{if(r.length!==3)return!1;if(!r.every(K))return!1;return NE.some(([E,t,A])=>E===r[0]&&t===r[1]&&A===r[2])},Qt=(r)=>{if(r.length!==4)return!1;if(!r.every(K))return!1;return TE.some(([E,t,A,o])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3])},Ht=(r)=>{if(r.length!==6)return!1;if(!r.every(K))return!1;return GE.some(([E,t,A,o,f,O])=>E===r[0]&&t===r[1]&&A===r[2]&&o===r[3]&&f===r[4]&&O===r[5])};var jt={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Wt=[3,6,9,12,15,18,21,24,27,30,33,36],Lt=[2,5,8,11,14,17,20,23,26,29,32,35],Kt=[1,4,7,10,13,16,19,22,25,28,31,34],vt=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],gt=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],lt=2.7,at=5.3;class $r extends _{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:E}){this.validateInputs(E);let t=r.getRandomInt({min:0,max:this.maxNumber}),A=t.value,o=this.determineBetOutcomes(E,A),{payoutMultiplier:f}=this.getPayoutDetails(E,A);return{outputs:{betOutcomes:o,result:t.values},payoutMultiplier:f,isFinished:!0,randomValues:t}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,E){let t=this.determineBetOutcomes(r,E),A=this.getBetTotals(r),o=this.getBetTotals(t.winningBets),f=this.calculateTotalBetAmount(A),O=this.calculateTotalPayout(o);return{payoutMultiplier:f.gt(0)?O.div(f):new fr(0),payoutAmount:O}}determineBetOutcomes(r,E){let t={},A={};for(let o of Object.keys(r)){let f=r[o],O=this.betPredicates[o],{winning:c,losing:S}=this.partitionBets(f,O,E);t[o]=c,A[o]=S}return{winningBets:t,losingBets:A}}calculateTotalAmount(r){return r.reduce((E,t)=>E.plus(t.amount),new fr(0))}isWinningStraightBet(r,E){return r.value===E}isWinningSplitBet(r,E){return r.values.some((t)=>t===E)}isWinningStreetBet(r,E){return r.values.some((t)=>t===E)}isWinningCornerBet(r,E){return r.values.some((t)=>t===E)}isWinningDoubleStreetBet(r,E){return r.values.some((t)=>t===E)}isWinningColorBet(r,E){let t=r;return vt.includes(E)&&t.color==="RED"||gt.includes(E)&&t.color==="BLACK"}isWinningHalfBet(r,E){let t=r;if(E>0&&E<=18&&t.half==="LOW")return!0;if(E>18&&E<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(r,E){let t=r;return Wt.includes(E)&&t.column==="TOP"||Lt.includes(E)&&t.column==="MIDDLE"||Kt.includes(E)&&t.column==="BOTTOM"}isWinningDozenBet(r,E){let t=r;if(E>0&&E<=12&&t.dozen==="FIRST")return!0;if(E>12&&E<=24&&t.dozen==="SECOND")return!0;if(E>24&&E<=36&&t.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,E){let t=r;if(E===0||E===37)return!1;let A=E%2===0?"EVEN":"ODD";return t.parity===A}getBetTotals(r){let E={};for(let t of Object.keys(r))E[t]=this.calculateTotalAmount(r[t]);return E}calculateTotalBetAmount(r){return Object.values(r).reduce((E,t)=>E.plus(t),new fr(0))}partitionBets(r,E,t){return{winning:r.filter((A)=>E(A,t)),losing:r.filter((A)=>!E(A,t))}}calculateTotalPayout(r){return Object.entries(r).reduce((E,[t,A])=>{let f=jt[t];return E.plus(A.mul(f||0))},new fr(0))}}class ME extends $r{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Ar(r)}}class RE extends $r{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){or(r)}isWinningBasketBet(r,E){return UE.some((t)=>t===E)}}class hE extends _{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ME,this.americanGame=new RE}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:E,...t}=r;if(r.edge===lt&&E.type==="EUROPEAN"){let A=this.europeanGame.determineGameResult({...t,gameInputs:E.inputs}),{betOutcomes:o}=A.outputs;return{...A,outputs:{type:"european",betOutcomes:o,result:A.outputs.result}}}if(r.edge===at&&E.type==="AMERICAN"){let A=this.americanGame.determineGameResult({...t,gameInputs:E.inputs}),{betOutcomes:o}=A.outputs;return{...A,outputs:{type:"american",betOutcomes:o,result:A.outputs.result}}}throw B.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var F2=(r)=>{return new hE().getBetAmount(r)};var X2=(r)=>{if(r.type==="EUROPEAN")Ar(r.inputs);else or(r.inputs)};import{Big as EA}from"big.js";var v;((A)=>{A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(v||={});var g;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(g||={});var st={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},nt={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},kt={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},et={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},rA={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},wE=new w(new Map([[1,st],[2,nt],[3,kt],[4,et],[8,rA]]));var pE={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class tA extends _{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:t}){if(!Object.values(g).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(v).includes(E.riskLevel))throw new Error("Invalid risk level");let o=wE.getMultipliers(t)[E.riskLevel];if(o===void 0)throw new Error(`No multipliers found for risk level ${E.riskLevel}`);let f=o[E.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${E.segments}`);let O=pE[E.riskLevel];if(O===void 0)throw new Error(`No patterns found for risk level ${E.riskLevel}`);let c=O[E.segments];if(c===void 0)throw new Error(`No patterns found for segment ${E.segments}`);let S=r.getRandomInt({min:0,max:c.length-1}),D=c[S.value];if(D===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${S.value}`);let x=f[D];if(x===void 0)throw new Error(`No payout found for picked segment ${D}`);return{isFinished:!0,payoutMultiplier:new EA(x),outputs:{result:S.values},randomValues:S}}}export{X2 as validateRouletteGameInputs,ZA as validateAdvancedDiceInputs,Ut as rtp99Multipliers,bt as rtp98Multipliers,Gt as rtp97Multipliers,Mt as rtp96Multipliers,Rt as rtp92Multipliers,SE as plinkoMultipliers,Yr as nCr,OE as kenoMultipliers,fE as isTileCount,Nt as hasDiceWon,St as diamondsMultipliers,F2 as calculateRouletteBetAmount,Zt as calculateDiceWinChance,HE as calculateBaccaratBetAmount,Jr as calculateAdvancedDiceWinChance,uE as bigMin,cE as bigMax,FE as advancedDiceIsWithinBoundsInclusive,ur as advancedDiceIsWithinBoundsExclusive,$E as advancedDiceGetInclusiveBoundsRange,Br as advancedDiceGetExclusiveBoundsRange,g as WheelSegments,v as WheelRiskLevel,tA as Wheel,LE as WIN_MULTIPLIER,JE as VALID_SUITS,XE as VALID_RANKS,ZE as VALID_EUROPEAN_STREETS,dr as VALID_EUROPEAN_STRAIGHTS,DE as VALID_EUROPEAN_SPLITS,bE as VALID_EUROPEAN_DOUBLE_STREETS,CE as VALID_EUROPEAN_CORNERS,NE as VALID_AMERICAN_STREETS,xE as VALID_AMERICAN_STRAIGHTS,_E as VALID_AMERICAN_SPLITS,GE as VALID_AMERICAN_DOUBLE_STREETS,TE as VALID_AMERICAN_CORNERS,Cr as ThreeCardBonusType,Wt as TOP_COLUMN,Tt as TILE_COUNTS,Qr as THREE_CARD_BONUS_PAYOUTS,F as SPLIT_BET_SIZE_FACTOR,Fr as RouletteType,hE as Roulette,zE as RollType,rr as RandomValuePool,vt as RED_NUMBERS,Sr as RANDOM_MIN_VALUE,xr as RANDOM_MAX_VALUE,BE as PlinkoRiskLevel,$t as Plinko,z as Parity,Nr as PairBonusType,KE as PUSH_MULTIPLIER,B2 as PLINKO_ROW_COUNTS,jt as PAYOUT_MULTIPLIERS,qr as PAIR_BONUS_PAYOUTS,M as OrigamiGame,V as MultiplierCalculator,yt as Mines,VE as MIN_WIN_CHANCE,Lt as MIDDLE_COLUMN,IE as MAX_WIN_CHANCE,Ur as MAX_CARDS_PER_ROUND,pt as Limbo,vE as LOSE_MULTIPLIER,oE as KenoRiskLevel,wt as Keno,_r as InsuranceOutcome,br as INSURANCE_WIN_PAYOUT,Q as INSURANCE_BET_SIZE_FACTOR,MA as INSURANCE_BET_MULTIPLIER,J as Half,yE as GameErrorCode,B as GameError,_ as Game,ir as FACE_CARD_VALUE,ME as EuropeanRoulette,lt as EUROPEAN_HOUSE_EDGE,zr as EFFECTIVE_RANGE,i as Dozen,_t as DiceDirection,Ct as Dice,ot as DiamondsResultType,Dt as Diamonds,I as DOUBLE_DOWN_BET_SIZE_FACTOR,tE as DICE_EFFECTIVE_RANGE,Xr as DEALER_STAND_VALUE,X as Column,m as Color,RA as CARDS_PER_SUIT,Dr as BlackjackOutcome,Zr as BlackjackActionType,tt as Blackjack,iE as BaccaratOutcome,qE as BaccaratBetType,jE as Baccarat,Tr as BUST_VALUE,Kt as BOTTOM_COLUMN,gt as BLACK_NUMBERS,R as BLACKJACK_VALUE,WE as BLACKJACK_MULTIPLIER,s as BASE_PAYOUT_MULTIPLIERS,RE as AmericanRoulette,mE as AdvancedDice,at as AMERICAN_HOUSE_EDGE,UE as AMERICAN_BASKET,Gr as ACE_SOFT_BONUS};
1
+ var Ia;((a)=>a.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ia||={});class l extends Error{static createValidationError(t){return new l("INPUT_VALIDATION_ERROR",t)}static isGameError(t){return t instanceof l}errorCode;constructor(t,a){super(a);this.errorCode=t}}var f;((A)=>{A.DICE="DICE";A.MINES="MINES";A.KENO="KENO";A.LIMBO="LIMBO";A.ADVANCED_DICE="ADVANCED_DICE";A.BACCARAT="BACCARAT";A.DIAMONDS="DIAMONDS";A.PLINKO="PLINKO";A.ROULETTE="ROULETTE";A.WHEEL="WHEEL";A.BLACKJACK="BLACKJACK";A.BLITZ="BLITZ"})(f||={});class F{gameId;constructor(t){this.gameId=t}}class B extends F{constructor(t){super(t)}getGameResult(t){return this.determineGameResult(t)}}import{Big as Gt}from"big.js";import st from"big.js";class C{static withMultiplier(t,a){return new st(t).times(new st(100-a).div(100))}static withWinChance(t,a){return st(100-t).div(a)}}var Bt=0,mt=1e4,Zt=10001,Na=0.01,Va=98,wa=(t)=>{if(t<Bt)throw l.createValidationError(`Lower bound ${t} is below minimum allowed value ${Bt}`)},Ua=(t)=>{if(t>mt)throw l.createValidationError(`Upper bound ${t} is above maximum allowed value ${mt}`)},v=(t)=>{if(wa(t.lower),Ua(t.upper),t.lower>=t.upper)throw l.createValidationError(`Lower bound ${t.lower} must be less than ${t.upper}`)},Za=(t,a)=>{let[r,e]=t.lower<=a.lower?[t,a]:[a,t];if(r.upper>e.lower)throw l.createValidationError("Bounds must not overlap")},Ga=(t,a)=>a>=t.lower&&a<=t.upper,ka=(t)=>t.upper-t.lower+1,pt=(t,a)=>a>t.lower&&a<t.upper,At=(t)=>t.upper-t.lower-1,Fa;((e)=>{e.ROLL_BETWEEN="ROLL_BETWEEN";e.ROLL_OUTSIDE="ROLL_OUTSIDE";e.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Fa||={});var kt=(t)=>{let r=(()=>{switch(t.mode){case"ROLL_BETWEEN":return v(t.bounds),At(t.bounds);case"ROLL_OUTSIDE":return v(t.bounds),Zt-ka(t.bounds);case"ROLL_BETWEEN_TWO":return v(t.firstBounds),v(t.secondBounds),Za(t.firstBounds,t.secondBounds),At(t.firstBounds)+At(t.secondBounds)}})(),e=Gt(r).div(Zt).mul(100);if(e.lt(Na))throw l.createValidationError("Win chance too low");if(e.gt(Va))throw l.createValidationError("Win chance too high");return e},Pe=(t)=>{kt(t)};class Ma extends B{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=kt(r),n=t.getRandomInt({min:Bt,max:mt}),o=n.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"ROLL_BETWEEN":return pt(r.bounds,o);case"ROLL_OUTSIDE":return!Ga(r.bounds,o);case"ROLL_BETWEEN_TWO":return pt(r.firstBounds,o)||pt(r.secondBounds,o)}})()?C.withWinChance(a,e):new Gt(0),outputs:{result:n.values},randomValues:n}}}import j from"big.js";var Ya=["Clubs","Diamonds","Hearts","Spades"],Ja=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],$a;((e)=>{e.PLAYER_WIN="PLAYER_WIN";e.TIE="TIE";e.BANKER_WIN="BANKER_WIN"})($a||={});var za;((e)=>{e.PLAYER="PLAYER";e.TIE="TIE";e.BANKER="BANKER"})(za||={});var Xa={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},qa=(t)=>{return new j(0).add(t.bets.reduce((r,e)=>r.add(e.amount),new j(0)))};class ga extends B{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(a);let e=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=e.values,o=n.slice(0,3),i=n.slice(3,6),c=[],d=0;for(let y of o.slice(0,2)){let D=this.mapRandomValueToCard(y),K=this.mapRandomValueToCardValue(y);c.push(D),d=(d+K)%10}let p=[],u=0;for(let y of i.slice(0,2)){let D=this.mapRandomValueToCard(y),K=this.mapRandomValueToCardValue(y);p.push(D),u=(u+K)%10}if(!this.isNaturalWin(d,u)){let y=this.shouldDrawThirdPlayerCard(d),D=null;if(y)D=this.mapRandomValueToCardValue(o[2]),c.push(this.mapRandomValueToCard(o[2])),d=(d+D)%10;if(this.shouldDrawThirdBankerCard(u,D))p.push(this.mapRandomValueToCard(i[2])),u=(u+this.mapRandomValueToCardValue(i[2]))%10}let s;if(d===u)s="TIE";else s=d>u?"PLAYER_WIN":"BANKER_WIN";let A=qa(a),{betType:P,multiplier:ut}=Xa[s],k=new j(0);if(k=k.add(a.bets.filter((y)=>y.type===P).reduce((y,D)=>y.add(D.amount.mul(ut)),new j(0))),s==="TIE")k=k.add(a.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,D)=>y.add(D.amount),new j(0)));return{isFinished:!0,payoutMultiplier:A.gt(0)?k.div(A):new j(0),outputs:{playerCards:c,playerHandValue:d,bankerCards:p,bankerHandValue:u,gameOutcome:s,result:e.values},randomValues:e}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((a)=>a.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let a=Ya[Math.floor(t/13)],r=Ja[t%13];return{suit:a,rank:r}}isNaturalWin(t,a){let r=[8,9];return r.includes(t)||r.includes(a)}mapRandomValueToCardValue(t){let a=t%13;if(a===0)return 1;if(a>=10)return 10;return a+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,a){if(a===null)return t<=5;if(t<=2)return!0;if(t===3)return a!==8;if(t===4)return[2,3,4,5,6,7].includes(a);if(t===5)return[4,5,6,7].includes(a);if(t===6)return[6,7].includes(a);return!1}}var yt;((n)=>{n.WIN="WIN";n.LOSE="LOSE";n.PUSH="PUSH";n.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(yt||={});var Et;((r)=>{r.WON="WON";r.LOST="LOST"})(Et||={});var ft;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";c.SPLIT="BLACKJACK_SPLIT"})(ft||={});var St;((n)=>{n.EXACT_PAIR="EXACT_PAIR";n.COLORED_PAIR="COLORED_PAIR";n.MIXED_PAIR="MIXED_PAIR";n.LOSS="LOSS"})(St||={});var Ot;((i)=>{i.SUITED_TRIPS="SUITED_TRIPS";i.STRAIGHT_FLUSH="STRAIGHT_FLUSH";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.STRAIGHT="STRAIGHT";i.FLUSH="FLUSH";i.LOSS="LOSS"})(Ot||={});var Qa=2.5,Wa=2,La=1,Ka=0,Ft=17,Dt=21,H=21,Ht=63,ke=1.5,M=0.5,ht=1.5,R=1,I=1,Fe=13,Ct=10,Mt=10,tt={PLAYER_BLACKJACK:Qa,WIN:Wa,PUSH:La,LOSE:Ka},Yt={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},Jt={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};import b from"big.js";import{Guard as m}from"@betorigami/guard";import{createStore as or}from"@xstate/store";var $t=0,zt=51,at=Array.from({length:52},(t,a)=>a),Xt=["Spades","Hearts","Diamonds","Clubs"],rt=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],qt=["Jack","Queen","King"],xt={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};import{Guard as va}from"@betorigami/guard";import{Guard as Tt}from"@betorigami/guard";class Y{value;constructor(t){let a=at[t];Tt.againstNullOrUndefined(a,`Invalid card value: ${t}`),this.value=a}get suit(){let t=Math.floor(this.value/13),a=Xt[t];return Tt.againstNullOrUndefined(a,`Invalid suit index: ${t}`),a}get rank(){let t=this.value%13,a=rt[t];return Tt.againstNullOrUndefined(a,`Invalid rank index: ${t}`),a}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class E extends Y{get numericRank(){if(qt.includes(this.rank))return Mt;return rt.indexOf(this.rank)+1}static fromValue(t){return va.against(!at.includes(t),`Invalid card value: ${t}`),new E(t)}}class J{cards;hardHandValue;softHandValue=null;constructor(t){this.cards=t;if(this.hardHandValue=t.reduce((r,e)=>r+e.numericRank,0),t.some((r)=>r.rank==="Ace")&&this.hardHandValue+Ct<=Dt)this.softHandValue=this.hardHandValue+Ct}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Dt}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===H}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class ${cards;value;constructor(t){this.cards=t.map((a)=>E.fromValue(a)),this.value=new J(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((t)=>t.value)}toDto(){return{cards:this.cards.map((t)=>t.toDto()),value:this.highestHandValue}}}class z extends ${otherCards;upCard;holeCard;constructor(t,a,r=[]){super([t,a,...r]);this.otherCards=r;this.upCard=E.fromValue(t),this.holeCard=E.fromValue(a)}static withInitialDeal(t){return new z(t.upCard,t.holeCard)}addDrawnCards(t){return new z(this.upCard.value,this.holeCard.value,[...this.otherCards,...t])}toDto(t=!1){if(t)return super.toDto();return{cards:[this.upCard.toDto()],value:new J([this.upCard]).highestHandValue}}}class _ extends ${static withInitialDeal(t){return new _(t)}addDrawnCards(t){return new _([...this.rawValues,...t])}}import{Guard as et}from"@betorigami/guard";class nt{source;index=0;constructor(t){this.source=t}static from(t,a){return et.against(a<=0,`Count must be positive, got ${a}`),et.against(t.values.length!==a,`Expected ${a} values, got ${t.values.length}`),new nt(t)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let t=this.source.values[this.index];return et.againstUndefined(t,"RandomValuePool exhausted"),this.index+=1,t}take(t){et.against(this.index+t>this.source.values.length,`RandomValuePool exhausted: requested ${t} but only ${this.source.values.length-this.index} remain`);let a=this.source.values.slice(this.index,this.index+t);return this.index+=t,a}}import{Guard as tr}from"@betorigami/guard";import ar from"fast-deep-equal";class Pt extends F{edge;constructor(t,a){super(t);this.edge=a}play(t,a,r=[]){let e=this.createGameStore(),n=this.generateRandomValues(t),o=n.toMultipleRandomValues();for(let d of r)e.send({...d.playerArgument,randomValuePool:n});let i=r[r.length-1];if(i)tr.against(!ar(i.state,this.toExternalState(e.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");e.send({...a,randomValuePool:n});let c=e.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:o.proofHash,proofString:o.proofString}}}}import h from"big.js";import{Guard as Rt}from"@betorigami/guard";var gt=(t)=>{let a=t.pairBonus!==null?h(t.pairBonus.betAmount).mul(t.pairBonus.payoutMultiplier):h(0),r=t.threeCardBonus!==null?h(t.threeCardBonus.betAmount).mul(t.threeCardBonus.payoutMultiplier):h(0);return a.plus(r)},Qt=(t)=>{let a=t.betAmounts.mainBetAmount,e=t.actionType==="BLACKJACK_DOUBLE_DOWN"?a.mul(R):h(0),n=t.insuranceOutcome!==void 0?a.mul(M):h(0),o=a.plus(e).mul(tt[t.outcome]),i=t.insuranceOutcome==="WON"?a.mul(ht):h(0),c=gt(t.sideBetResults),d=o.plus(i).plus(c),p=a.plus(n).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Rt.against(p.eq(0),"Total bet amount cannot be zero");let u=d.div(p);Rt.against(t.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let s;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":s=e;break;case"BLACKJACK_BUY_INSURANCE":s=n;break;case"BLACKJACK_SPLIT":s=a.mul(I);break}return{multiplier:u,additionalBetAmount:s}},Wt=(t)=>{let a=t.betAmounts.mainBetAmount,r=t.mainHandDoubledDown?a.mul(R):h(0),e=t.splitHandDoubledDown?a.mul(R):h(0),n=t.insuranceOutcome!==void 0?a.mul(M):h(0),o=a.plus(r).mul(tt[t.mainOutcome]),i=a.plus(e).mul(tt[t.splitOutcome]),c=t.insuranceOutcome==="WON"?a.mul(ht):h(0),d=gt(t.sideBetResults),p=o.plus(i).plus(c).plus(d),u=a.plus(a).plus(n).plus(r).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Rt.against(u.eq(0),"Total bet amount cannot be zero");let s=p.div(u),A;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":A=a.mul(R);break;case"BLACKJACK_SPLIT":A=a.mul(I);break}return{multiplier:s,additionalBetAmount:A}};import{Guard as rr}from"@betorigami/guard";var _t=(t)=>t.every((a)=>a===t[0]),Lt=(t)=>{let a=[...t].sort((r,e)=>r-e);return a.every((r,e)=>{let n=a[e-1];if(e===0)return!0;return rr.againstUndefined(n,"Previous value cannot be undefined"),r===n+1})},Kt={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},er={...Kt,Ace:14},nr=(t)=>Lt(t.map((a)=>Kt[a]))||Lt(t.map((a)=>er[a])),vt=(t,a)=>{let r=E.fromValue(t),e=E.fromValue(a);if(r.rank!==e.rank)return"LOSS";if(t===a)return"EXACT_PAIR";if(xt[r.suit]===xt[e.suit])return"COLORED_PAIR";return"MIXED_PAIR"},ta=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Yt[a]}),aa=(t,a,r)=>{let e=E.fromValue(t),n=E.fromValue(a),o=E.fromValue(r),i=[e.rank,n.rank,o.rank],c=_t([e.suit,n.suit,o.suit]),d=_t(i),p=nr(i);if(_t([t,a,r]))return"SUITED_TRIPS";if(c&&p)return"STRAIGHT_FLUSH";if(d)return"THREE_OF_A_KIND";if(p)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},ra=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Jt[a]});var ir={state:{isFinished:!1,phase:"uninitialised",multiplier:b(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},S=(t)=>E.fromValue(t).value;function cr(t){m.against(t.phase!=="in-progress","Expected a started, in-progress game state")}function ea(t){m.against(t.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function bt(t){m.against(t.phase!=="in-progress"&&t.phase!=="playing-main-hand"&&t.phase!=="playing-split-hand","Expected a started, in-progress game state")}var na=(t,a)=>{let r=a;while(r.highestHandValue<Ft)r=r.addDrawnCards([S(t.takeOne())]);return r},It=(t,a)=>{if(t.isBusted)return"LOSE";if(a.isBusted)return"WIN";let r=t.highestHandValue,e=a.highestHandValue;if(r>e)return"WIN";if(r<e)return"LOSE";return"PUSH"},O=(t)=>{let{multiplier:a,additionalBetAmount:r}=Qt({outcome:t.outcome,insuranceOutcome:t.insuranceOutcome,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:t.playerHand,dealerHand:t.dealerHand,outcome:t.outcome,multiplier:a,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:r}},jt=(t)=>{let a=na(t.randomValuePool,t.dealerHand),r=It(t.playerHand,a);return O({...t,dealerHand:a,outcome:r})},T=(t)=>{let r=t.mainHand.isBusted&&t.splitHand.isBusted?t.dealerHand:na(t.randomValuePool,t.dealerHand),e=It(t.mainHand,r),n=It(t.splitHand,r),{multiplier:o,additionalBetAmount:i}=Wt({hasSplit:!0,mainOutcome:e,splitOutcome:n,insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:t.mainHandDoubledDown,splitHandDoubledDown:t.splitHandDoubledDown,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:t.mainHand,splitHand:t.splitHand,dealerHand:r,mainOutcome:e,splitOutcome:n,multiplier:o,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:i}};class lr extends Pt{constructor(t){super("BLACKJACK",t)}generateRandomValues(t){return nt.from(t.getRandomIntsWithReplacement({min:$t,max:zt,count:Ht}),Ht)}toExternalState(t){let a=t.phase;switch(a){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,outcome:t.outcome,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,mainOutcome:t.mainOutcome,splitOutcome:t.splitOutcome,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:m.againstNever(a,"Invalid state received")}}createGameStore(){return or({context:ir,on:{START:(t,a)=>{let{state:r}=t;m.against(r.phase!=="uninitialised","START action requires a fresh game");let e=S(a.randomValuePool.takeOne()),n=S(a.randomValuePool.takeOne()),o=S(a.randomValuePool.takeOne()),i=S(a.randomValuePool.takeOne()),c=_.withInitialDeal([e,n]),d=z.withInitialDeal({upCard:o,holeCard:i}),p={mainBetAmount:b(a.mainBetAmount),pairBonusAmount:b(a.pairBonusAmount),threeCardBonusAmount:b(a.threeCardBonusAmount)},u={pairBonus:b(a.pairBonusAmount).gt(0)?ta(a.pairBonusAmount,vt(e,n)):null,threeCardBonus:b(a.threeCardBonusAmount).gt(0)?ra(a.threeCardBonusAmount,aa(e,n,o)):null},s={type:"START",mainBetAmount:a.mainBetAmount,pairBonusAmount:a.pairBonusAmount,threeCardBonusAmount:a.threeCardBonusAmount};if(d.upCard.rank==="Ace")return{state:{...r,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:d,betAmounts:p,sideBetResults:u},config:{},playerArgument:s};let A={playerHand:c,dealerHand:d,randomValuePool:a.randomValuePool,playerArgument:s,betAmounts:p,sideBetResults:u};if(c.isBlackjack&&d.isBlackjack)return O({...A,outcome:"PUSH"});if(c.isBlackjack)return O({...A,outcome:"PLAYER_BLACKJACK"});if(d.isBlackjack)return O({...A,outcome:"LOSE"});return{state:{...r,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:d,insuranceOutcome:void 0,betAmounts:p,sideBetResults:u},config:{},playerArgument:s}},BLACKJACK_BUY_INSURANCE:(t,a)=>{let{state:r}=t;ea(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return O({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(e.isBlackjack)return O({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(n.isBlackjack)return O({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...r,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:o.mainBetAmount.mul(M)}},BLACKJACK_REJECT_INSURANCE:(t,a)=>{let{state:r}=t;ea(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={playerHand:e,dealerHand:n,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return O({...c,outcome:"PUSH"});if(e.isBlackjack)return O({...c,outcome:"PLAYER_BLACKJACK"});if(n.isBlackjack)return O({...c,outcome:"LOSE"});return{state:{...r,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(t,a)=>{let{state:r}=t;switch(bt(r),r.phase){case"playing-main-hand":{let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===H){if(r.splitHand.highestHandValue===H)return T({...r,mainHand:e,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...r,mainHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===H)return T({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,splitHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return O({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(e.highestHandValue===H)return jt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"in-progress",playerHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:m.againstNever(r,"Invalid phase for HIT action")}},BLACKJACK_STAND:(t,a)=>{let{state:r}=t;switch(bt(r),r.phase){case"playing-main-hand":{if(r.splitHand.highestHandValue===H)return T({...r,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...r,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return T({...r,splitHandDoubledDown:r.splitHandDoubledDown,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return jt({...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:m.againstNever(r,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(t,a)=>{let{state:r}=t;switch(bt(r),r.phase){case"playing-main-hand":{m.against(r.mainHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]),{betAmounts:n}=r;if(r.splitHand.highestHandValue===H)return T({...r,mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:n.mainBetAmount.mul(R)}}case"playing-split-hand":{m.against(r.splitHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);return T({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{m.against(r.playerHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return O({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return jt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:m.againstNever(r,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(t,a)=>{let{state:r}=t;cr(r);let{playerHand:e,betAmounts:n,sideBetResults:o}=r;m.against(e.cards.length!==2,"Split is only allowed with exactly 2 cards");let i=e.cards[0],c=e.cards[1];m.againstUndefined(i,"First card is missing"),m.againstUndefined(c,"Second card is missing"),m.against(i.rank!==c.rank,"Split requires two cards of the same rank");let d=S(a.randomValuePool.takeOne()),p=S(a.randomValuePool.takeOne()),u=_.withInitialDeal([i.value,d]),s=_.withInitialDeal([c.value,p]);if(i.rank==="Ace")return T({...r,mainHand:u,splitHand:s,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let P=u.highestHandValue===H,ut=s.highestHandValue===H;if(P&&ut)return T({mainHand:u,splitHand:s,dealerHand:r.dealerHand,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:n,sideBetResults:o});if(P)return{state:{...r,phase:"playing-split-hand",mainHand:u,splitHand:s,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(I)};return{state:{...r,phase:"playing-main-hand",multiplier:b(0),mainHand:u,splitHand:s,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(I)}}}})}getValidNextActionTypes(t){if(t.isFinished)return[];switch(t.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.mainHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"playing-split-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.splitHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"player-turn":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.playerHand.cards.length===2){a.push("BLACKJACK_DOUBLE_DOWN");let r=t.playerHand.cards[0],e=t.playerHand.cards[1];if(m.againstUndefined(r,"First player card is missing"),m.againstUndefined(e,"Second player card is missing"),r.rank===e.rank)a.push("BLACKJACK_SPLIT")}return a}default:m.againstNever(t,"Invalid phase for getting valid actions")}}}import q from"big.js";import{Guard as dr}from"@betorigami/guard";var oa=0,ia=51,X=52,ca=52;var ur=(t)=>t.length===new Set(t).size,sr=(t)=>{let a=q(1),r=q(X);for(let e=0;e<t;e+=1)a=a.mul(q(X-e).div(r));return a};class pr extends B{constructor(){super("BLITZ")}determineGameResult({generator:t,gameInputs:a,edge:r}){dr.against(a.pickCount<1||a.pickCount>X,`pickCount must be between 1 and ${X}`);let e=t.getRandomIntsWithReplacement({min:oa,max:ia,count:ca}),n=e.values.slice(0,a.pickCount),o=ur(n),i=sr(a.pickCount);return{isFinished:!0,payoutMultiplier:o?C.withMultiplier(q(1).div(i),r):q(0),outputs:{result:e.values,cards:n.map((d)=>new Y(d).toDto())},randomValues:e}}}import Ar from"big.js";class x{multipliers;constructor(t){this.multipliers=t}getMultipliers(t){let a=this.multipliers.get(t);if(a===void 0)throw new Error(`Multipliers for ${t} not found`);return a}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([t,a])=>({edge:t,multipliers:a}))}}var Br;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Br||={});var mr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},yr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Er={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},fr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Sr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Or=new x(new Map([[1,mr],[2,yr],[3,Er],[4,fr],[8,Sr]])),Dr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Hr extends B{constructor(){super("DIAMONDS")}determineGameResult({generator:t,edge:a}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5}),e=Or.getMultipliers(a),n=r.values,o=this.calculatePayoutMultiplier(e,n);return{isFinished:!0,payoutMultiplier:Ar(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t,a){let r=new Map;for(let o of a){let i=r.get(o)||0;r.set(o,i+1)}let e=[...r.values()].filter((o)=>o>1),n=this.classifyResult(e);return n===null?0:t[n]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[a,r]=t;if(a===void 0)return null;if(r===void 0){let e=Dr[a];if(e===void 0)throw new Error(`Unexpected single diamond repeat count: ${a}`);return e}return a===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import da from"big.js";var hr;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(hr||={});var la=1e4,Cr=(t)=>{let a=t.direction==="ABOVE"?la-t.selectedValue:t.selectedValue;return new da(a).div(la).mul(100)},xr=(t,a)=>t.direction==="ABOVE"?a>t.selectedValue:a<t.selectedValue;class Tr extends B{constructor(){super("DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:0,max:1e4}),n=Cr(r);return{isFinished:!0,payoutMultiplier:xr(r,e.value)?C.withWinChance(a,n):new da(0),outputs:{result:e.values},randomValues:e}}}import Nr from"big.js";import{Guard as ot}from"@betorigami/guard";var ua;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(ua||={});var Pr=[1,2,3,4,5,6,7,8,9,10],sa=(t)=>{return Pr.includes(t)};var Rr={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},_r={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},br={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},jr={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Ir={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},pa=new x(new Map([[1,Rr],[2,_r],[3,br],[4,jr],[8,Ir]]));class Vr extends B{constructor(){super("KENO")}determineGameResult({generator:t,edge:a,gameInputs:r}){ot.againstEmptyArray(r.selectedNumbers,()=>l.createValidationError("No numbers selected")),ot.against(r.selectedNumbers.length>10,()=>l.createValidationError("Maximum of 10 numbers can be selected"));for(let s of r.selectedNumbers)ot.againstNonInteger(s,()=>l.createValidationError("Only integers can be selected")),ot.against(s<0||s>39,()=>l.createValidationError("Invalid number selected"));let e=t.getUniqueRandomInts({min:0,max:39,count:10}),n=r.selectedNumbers.filter((s)=>e.values.includes(s)),o=r.selectedNumbers.length;if(!sa(o))throw new Error(`Invalid tile count: ${o}`);let p=pa.getMultipliers(a)[o][r.riskLevel][n.length];if(p===void 0)throw new Error(`No multiplier found for matching tile count ${n.length}`);return{isFinished:!0,payoutMultiplier:new Nr(p),outputs:{result:e.values},randomValues:e}}}import N from"big.js";var Aa=(t,a)=>{return t.gt(a)?t:a};var Ba=(t,a)=>{return t.lt(a)?t:a};class wr extends B{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:1,max:4294967295}),n=e.max,o=new N(16777216),i=new N(1),c=new N(1e6),d=e.value,p=new N(d-1).div(n),u=(100-a)/100,s=o.div(p.mul(o).plus(1)).mul(u),A=Aa(i,Ba(s,c));return{isFinished:!0,payoutMultiplier:A.gte(r.targetMultiplier)?new N(r.targetMultiplier):new N(0),outputs:{randomMultiplier:A,result:e.values},randomValues:e}}}import it from"big.js";var Nt=(t,a)=>{if(a<0||t<0||a>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(a>t-a)a=t-a;let r=1;for(let e=1;e<=a;e++)r=r*(t-e+1)/e;return r};class Ur extends B{constructor(){super("MINES")}determineGameResult({generator:t,edge:a,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=i.values.some((P)=>r.selectedTiles.includes(P)),d=r.hasCashedOut||c,p=(100-a)/100,u=new it(Nt(25-r.minesCount,r.selectedTiles.length)).div(new it(Nt(25,r.selectedTiles.length))),A=r.hasCashedOut&&!c?new it(p).div(u):new it(0);return{isFinished:d,payoutMultiplier:A,outputs:{result:i.values},randomValues:i}}}import{Big as Yr}from"big.js";var ma;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(ma||={});var ri=[8,9,10,11,12,13,14,15,16],Zr={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Gr={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},kr={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Fr={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},Mr={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},ya=new x(new Map([[1,Zr],[2,Gr],[3,kr],[4,Fr],[8,Mr]]));class Jr extends B{constructor(){super("PLINKO")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(a.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(a.numberOfRows<8||a.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let e=a.numberOfRows,i=ya.getMultipliers(r)[a.riskLevel][e],c=t.getRandomIntsWithReplacement({min:0,max:1,count:a.numberOfRows}),p=c.values.reduce((s,A)=>s+A,0),u=i[p];if(u===void 0)throw new Error(`No payout found for end position ${p}`);return{isFinished:!0,payoutMultiplier:Yr(u),outputs:{result:c.values},randomValues:c}}}import{Big as dt}from"big.js";var Vt=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Ea=[37,...Vt],fa=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Sa=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Oa=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Da=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Ha=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],ha=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Ca=[0,1,2,3,37],xa=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],Ta=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],V;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(V||={});var w;((r)=>{r.RED="RED";r.BLACK="BLACK"})(w||={});var U;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(U||={});var Z;((e)=>{e.TOP="TOP";e.MIDDLE="MIDDLE";e.BOTTOM="BOTTOM"})(Z||={});var G;((e)=>{e.FIRST="FIRST";e.SECOND="SECOND";e.THIRD="THIRD"})(G||={});var wt;((r)=>{r.AMERICAN="AMERICAN";r.EUROPEAN="EUROPEAN"})(wt||={});var ct=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw l.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&g(a.value)))throw l.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&$r(a.values)))throw l.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&zr(a.values)))throw l.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Xr(a.values)))throw l.createValidationError("Invalid corner bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&qr(a.values)))throw l.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(V).includes(a.parity)))throw l.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.color)))throw l.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.half)))throw l.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.column)))throw l.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.dozen)))throw l.createValidationError("Invalid dozen bet.")},g=(t)=>{return Vt.includes(t)},$r=(t)=>{if(t.length!==2)return!1;if(!t.every(g))return!1;return fa.some(([a,r])=>a===t[0]&&r===t[1])},zr=(t)=>{if(t.length!==3)return!1;if(!t.every(g))return!1;return Oa.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Xr=(t)=>{if(t.length!==4)return!1;if(!t.every(g))return!1;return Ha.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},qr=(t)=>{if(t.length!==6)return!1;if(!t.every(g))return!1;return xa.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var lt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw l.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&Q(a.value)))throw l.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&gr(a.values)))throw l.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&Qr(a.values)))throw l.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Wr(a.values)))throw l.createValidationError("Invalid corner bet.");if(!t.basketBets.every((a)=>a.amount.gte(0)))throw l.createValidationError("Invalid basket bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&Lr(a.values)))throw l.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(V).includes(a.parity)))throw l.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.color)))throw l.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.half)))throw l.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.column)))throw l.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.dozen)))throw l.createValidationError("Invalid dozen bet.")},Q=(t)=>{return Ea.includes(t)};function gr(t){if(t.length!==2)return!1;if(!t.every(Q))return!1;return Sa.some(([a,r])=>a===t[0]&&r===t[1])}var Qr=(t)=>{if(t.length!==3)return!1;if(!t.every(Q))return!1;return Da.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Wr=(t)=>{if(t.length!==4)return!1;if(!t.every(Q))return!1;return ha.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},Lr=(t)=>{if(t.length!==6)return!1;if(!t.every(Q))return!1;return Ta.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Kr={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},vr=[3,6,9,12,15,18,21,24,27,30,33,36],te=[2,5,8,11,14,17,20,23,26,29,32,35],ae=[1,4,7,10,13,16,19,22,25,28,31,34],re=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],ee=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],ne=2.7,oe=5.3;class Ut extends B{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:a}){this.validateInputs(a);let r=t.getRandomInt({min:0,max:this.maxNumber}),e=r.value,n=this.determineBetOutcomes(a,e),{payoutMultiplier:o}=this.getPayoutDetails(a,e);return{outputs:{betOutcomes:n,result:r.values},payoutMultiplier:o,isFinished:!0,randomValues:r}}getBetAmount(t){return this.calculateTotalBetAmount(this.getBetTotals(t))}getPayoutDetails(t,a){let r=this.determineBetOutcomes(t,a),e=this.getBetTotals(t),n=this.getBetTotals(r.winningBets),o=this.calculateTotalBetAmount(e),i=this.calculateTotalPayout(n);return{payoutMultiplier:o.gt(0)?i.div(o):new dt(0),payoutAmount:i}}determineBetOutcomes(t,a){let r={},e={};for(let n of Object.keys(t)){let o=t[n],i=this.betPredicates[n],{winning:c,losing:d}=this.partitionBets(o,i,a);r[n]=c,e[n]=d}return{winningBets:r,losingBets:e}}calculateTotalAmount(t){return t.reduce((a,r)=>a.plus(r.amount),new dt(0))}isWinningStraightBet(t,a){return t.value===a}isWinningSplitBet(t,a){return t.values.some((r)=>r===a)}isWinningStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningCornerBet(t,a){return t.values.some((r)=>r===a)}isWinningDoubleStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningColorBet(t,a){let r=t;return re.includes(a)&&r.color==="RED"||ee.includes(a)&&r.color==="BLACK"}isWinningHalfBet(t,a){let r=t;if(a>0&&a<=18&&r.half==="LOW")return!0;if(a>18&&a<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(t,a){let r=t;return vr.includes(a)&&r.column==="TOP"||te.includes(a)&&r.column==="MIDDLE"||ae.includes(a)&&r.column==="BOTTOM"}isWinningDozenBet(t,a){let r=t;if(a>0&&a<=12&&r.dozen==="FIRST")return!0;if(a>12&&a<=24&&r.dozen==="SECOND")return!0;if(a>24&&a<=36&&r.dozen==="THIRD")return!0;return!1}isWinningParityBet(t,a){let r=t;if(a===0||a===37)return!1;let e=a%2===0?"EVEN":"ODD";return r.parity===e}getBetTotals(t){let a={};for(let r of Object.keys(t))a[r]=this.calculateTotalAmount(t[r]);return a}calculateTotalBetAmount(t){return Object.values(t).reduce((a,r)=>a.plus(r),new dt(0))}partitionBets(t,a,r){return{winning:t.filter((e)=>a(e,r)),losing:t.filter((e)=>!a(e,r))}}calculateTotalPayout(t){return Object.entries(t).reduce((a,[r,e])=>{let o=Kr[r];return a.plus(e.mul(o||0))},new dt(0))}}class Pa extends Ut{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(t){ct(t)}}class Ra extends Ut{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(t){lt(t)}isWinningBasketBet(t,a){return Ca.some((r)=>r===a)}}class _a extends B{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Pa,this.americanGame=new Ra}getBetAmount(t){switch(t.type){case"AMERICAN":return this.americanGame.getBetAmount(t.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(t.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(t){let{gameInputs:a,...r}=t;if(t.edge===ne&&a.type==="EUROPEAN"){let e=this.europeanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"european",betOutcomes:n,result:e.outputs.result}}}if(t.edge===oe&&a.type==="AMERICAN"){let e=this.americanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"american",betOutcomes:n,result:e.outputs.result}}}throw l.createValidationError(`Attempted to play ${a.type} roulette on edge ${t.edge}`)}}var Pi=(t)=>{return new _a().getBetAmount(t)};var Ii=(t)=>{if(t.type==="EUROPEAN")ct(t.inputs);else lt(t.inputs)};import{Big as se}from"big.js";var W;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(W||={});var L;((o)=>{o[o.TEN=10]="TEN";o[o.TWENTY=20]="TWENTY";o[o.THIRTY=30]="THIRTY";o[o.FORTY=40]="FORTY";o[o.FIFTY=50]="FIFTY"})(L||={});var ie={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},ce={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},le={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},de={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},ue={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},ba=new x(new Map([[1,ie],[2,ce],[3,le],[4,de],[8,ue]]));var ja={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class pe extends B{constructor(){super("WHEEL")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(!Object.values(L).includes(a.segments))throw new Error("Invalid segments value");if(!Object.values(W).includes(a.riskLevel))throw new Error("Invalid risk level");let n=ba.getMultipliers(r)[a.riskLevel];if(n===void 0)throw new Error(`No multipliers found for risk level ${a.riskLevel}`);let o=n[a.segments];if(o===void 0)throw new Error(`No multipliers found for segment ${a.segments}`);let i=ja[a.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${a.riskLevel}`);let c=i[a.segments];if(c===void 0)throw new Error(`No patterns found for segment ${a.segments}`);let d=t.getRandomInt({min:0,max:c.length-1}),p=c[d.value];if(p===void 0)throw new Error(`No pattern found for segment ${a.segments} and value ${d.value}`);let u=o[p];if(u===void 0)throw new Error(`No payout found for picked segment ${p}`);return{isFinished:!0,payoutMultiplier:new se(u),outputs:{result:d.values},randomValues:d}}}export{Ii as validateRouletteGameInputs,Pe as validateAdvancedDiceInputs,Rr as rtp99Multipliers,_r as rtp98Multipliers,br as rtp97Multipliers,jr as rtp96Multipliers,Ir as rtp92Multipliers,ya as plinkoMultipliers,Nt as nCr,pa as kenoMultipliers,sa as isTileCount,xr as hasDiceWon,ur as hasBlitzWon,Or as diamondsMultipliers,Pi as calculateRouletteBetAmount,Cr as calculateDiceWinChance,sr as calculateBlitzWinChance,qa as calculateBaccaratBetAmount,kt as calculateAdvancedDiceWinChance,Ba as bigMin,Aa as bigMax,Ga as advancedDiceIsWithinBoundsInclusive,pt as advancedDiceIsWithinBoundsExclusive,ka as advancedDiceGetInclusiveBoundsRange,At as advancedDiceGetExclusiveBoundsRange,L as WheelSegments,W as WheelRiskLevel,pe as Wheel,Wa as WIN_MULTIPLIER,Ya as VALID_SUITS,Ja as VALID_RANKS,Oa as VALID_EUROPEAN_STREETS,Vt as VALID_EUROPEAN_STRAIGHTS,fa as VALID_EUROPEAN_SPLITS,xa as VALID_EUROPEAN_DOUBLE_STREETS,Ha as VALID_EUROPEAN_CORNERS,Da as VALID_AMERICAN_STREETS,Ea as VALID_AMERICAN_STRAIGHTS,Sa as VALID_AMERICAN_SPLITS,Ta as VALID_AMERICAN_DOUBLE_STREETS,ha as VALID_AMERICAN_CORNERS,Ot as ThreeCardBonusType,vr as TOP_COLUMN,Pr as TILE_COUNTS,Jt as THREE_CARD_BONUS_PAYOUTS,B as SingleActionGame,I as SPLIT_BET_SIZE_FACTOR,wt as RouletteType,_a as Roulette,Fa as RollType,nt as RandomValuePool,re as RED_NUMBERS,Bt as RANDOM_MIN_VALUE,mt as RANDOM_MAX_VALUE,ma as PlinkoRiskLevel,Jr as Plinko,V as Parity,St as PairBonusType,La as PUSH_MULTIPLIER,ri as PLINKO_ROW_COUNTS,Kr as PAYOUT_MULTIPLIERS,Yt as PAIR_BONUS_PAYOUTS,f as OrigamiGame,C as MultiplierCalculator,Pt as MultiActionGame,Ur as Mines,Na as MIN_WIN_CHANCE,te as MIDDLE_COLUMN,Va as MAX_WIN_CHANCE,Ht as MAX_CARDS_PER_ROUND,wr as Limbo,Ka as LOSE_MULTIPLIER,ua as KenoRiskLevel,Vr as Keno,Et as InsuranceOutcome,ht as INSURANCE_WIN_PAYOUT,M as INSURANCE_BET_SIZE_FACTOR,ke as INSURANCE_BET_MULTIPLIER,U as Half,Ia as GameErrorCode,l as GameError,F as Game,Mt as FACE_CARD_VALUE,Pa as EuropeanRoulette,ne as EUROPEAN_HOUSE_EDGE,Zt as EFFECTIVE_RANGE,G as Dozen,hr as DiceDirection,Tr as Dice,Br as DiamondsResultType,Hr as Diamonds,R as DOUBLE_DOWN_BET_SIZE_FACTOR,la as DICE_EFFECTIVE_RANGE,Ft as DEALER_STAND_VALUE,Z as Column,w as Color,Fe as CARDS_PER_SUIT,pr as Blitz,yt as BlackjackOutcome,ft as BlackjackActionType,lr as Blackjack,$a as BaccaratOutcome,za as BaccaratBetType,ga as Baccarat,Dt as BUST_VALUE,ae as BOTTOM_COLUMN,ca as BLITZ_RANDOM_NUMBER_COUNT,oa as BLITZ_MIN_CARD_RANGE,ia as BLITZ_MAX_CARD_RANGE,X as BLITZ_CARD_COUNT,ee as BLACK_NUMBERS,H as BLACKJACK_VALUE,Qa as BLACKJACK_MULTIPLIER,tt as BASE_PAYOUT_MULTIPLIERS,Ra as AmericanRoulette,Ma as AdvancedDice,oe as AMERICAN_HOUSE_EDGE,Ca as AMERICAN_BASKET,Ct as ACE_SOFT_BONUS};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "4.5.0",
3
+ "version": "5.0.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",