@betorigami/game-calculations 2.1.0 → 3.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 Wr=Object.create;var{getPrototypeOf:jr,defineProperty:K,getOwnPropertyNames:ir,getOwnPropertyDescriptor:qr}=Object,nr=Object.prototype.hasOwnProperty;var C=(e,r,o)=>{o=e!=null?Wr(jr(e)):{};let i=r||!e||!e.__esModule?K(o,"default",{value:e,enumerable:!0}):o;for(let n of ir(e))if(!nr.call(i,n))K(i,n,{get:()=>e[n],enumerable:!0});return i},or=new WeakMap,Fr=(e)=>{var r=or.get(e),o;if(r)return r;if(r=K({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")ir(e).map((i)=>!nr.call(r,i)&&K(r,i,{get:()=>e[i],enumerable:!(o=qr(e,i))||o.enumerable}));return or.set(e,r),r};var Yr=(e,r)=>{for(var o in r)K(e,o,{get:r[o],enumerable:!0,configurable:!0,set:(i)=>r[o]=()=>i})};var de={};Yr(de,{wheelMultipliers:()=>Pr,validateRouletteGameInputs:()=>le,plinkoMultipliers:()=>Mr,calculateRouletteBetAmount:()=>ce,calculateBaccaratBetAmount:()=>ar,WheelSegments:()=>er,WheelRiskLevel:()=>rr,Wheel:()=>Ur,VALID_SUITS:()=>lr,VALID_RANKS:()=>Er,VALID_EUROPEAN_STREETS:()=>Q,VALID_EUROPEAN_STRAIGHTS:()=>k,VALID_EUROPEAN_SPLITS:()=>z,VALID_EUROPEAN_DOUBLE_STREETS:()=>m,VALID_EUROPEAN_CORNERS:()=>Z,VALID_AMERICAN_STREETS:()=>X,VALID_AMERICAN_STRAIGHTS:()=>$,VALID_AMERICAN_SPLITS:()=>J,VALID_AMERICAN_DOUBLE_STREETS:()=>g,VALID_AMERICAN_CORNERS:()=>b,Roulette:()=>Or,RollType:()=>tr,PlinkoRiskLevel:()=>Rr,Plinko:()=>Cr,Parity:()=>s,OrigamiGame:()=>S,Mines:()=>Gr,Limbo:()=>sr,KenoRiskLevel:()=>hr,Keno:()=>yr,Half:()=>u,GameErrorCode:()=>Dr,GameError:()=>E,Game:()=>f,Dozen:()=>M,DiceDirection:()=>Lr,Dice:()=>_r,DiamondsResultType:()=>pr,Diamonds:()=>Ar,Column:()=>R,Color:()=>G,BaccaratOutcome:()=>dr,BaccaratBetType:()=>fr,Baccarat:()=>Br,AdvancedDice:()=>cr,AMERICAN_BASKET:()=>H});module.exports=Fr(de);var S;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL"})(S||={});class f{gameId;constructor(e){this.gameId=e}getGameResult(e){return this.determineGameResult(e)}}var L=require("big.js"),Ir=(e,r)=>r>=e.lower&&r<=e.upper,$r=(e)=>e.upper-e.lower+1,q=(e,r)=>r>e.lower&&r<e.upper,F=(e)=>e.upper-e.lower-1,tr;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(tr||={});var v={min:0,max:1e4,effectiveRange:10001};class cr extends f{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt(v),n=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(o.bounds,n,r);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(o.bounds,n,r);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(o.firstBounds,o.secondBounds,n,r)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(e,r,o){if(!q(e,r))return L.Big(0);let i=F(e),n=L.Big(i).div(v.effectiveRange).mul(100);return L.Big(100-o).div(n)}calculateRollOutsidePayoutMultiplier(e,r,o){if(Ir(e,r))return L.Big(0);let i=v.effectiveRange-$r(e),n=L.Big(i).div(v.effectiveRange).mul(100);return L.Big(100-o).div(n)}calculateRollBetweenTwoPayoutMultiplier(e,r,o,i){if(!q(e,o)&&!q(r,o))return L.Big(0);let n=F(e)+F(r),t=L.Big(n).div(v.effectiveRange).mul(100);return L.Big(100-i).div(t)}}var D=C(require("big.js"));var lr=["Clubs","Diamonds","Hearts","Spades"],Er=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],dr;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(dr||={});var fr;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(fr||={});var zr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},ar=(e)=>{return new D.default(0).add(e.bets.reduce((o,i)=>o.add(i.amount),new D.default(0)))};class Br extends f{constructor(){super("BACCARAT")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(r);let i=e.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=i.values,t=n.slice(0,3),l=n.slice(3,6),B=[],a=0;for(let A of t.slice(0,2)){let _=this.mapRandomValueToCard(A),P=this.mapRandomValueToCardValue(A);B.push(_),a=(a+P)%10}let p=[],d=0;for(let A of l.slice(0,2)){let _=this.mapRandomValueToCard(A),P=this.mapRandomValueToCardValue(A);p.push(_),d=(d+P)%10}if(!this.isNaturalWin(a,d)){let A=this.shouldDrawThirdPlayerCard(a),_=null;if(A)_=this.mapRandomValueToCardValue(t[2]),B.push(this.mapRandomValueToCard(t[2])),a=(a+_)%10;if(this.shouldDrawThirdBankerCard(d,_))p.push(this.mapRandomValueToCard(l[2])),d=(d+this.mapRandomValueToCardValue(l[2]))%10}let h;if(a===d)h="TIE";else h=a>d?"PLAYER_WIN":"BANKER_WIN";let y=ar(r),{betType:V,multiplier:kr}=zr[h],Hr=new D.default(0).add(r.bets.filter((A)=>A.type===V).reduce((A,_)=>A.add(_.amount.mul(kr)),new D.default(0)));return{isFinished:!0,payoutMultiplier:y.gt(0)?Hr.div(y):new D.default(0),outputs:{playerCards:B,playerHandValue:a,bankerCards:p,bankerHandValue:d,gameOutcome:h,result:i.values},randomValues:i}}validateGameInputs(e){if(e.bets.length===0)throw new Error("Must place at least a single bet.");if(!e.bets.every((r)=>r.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(e){let r=lr[Math.floor(e/13)],o=Er[e%13];return{suit:r,rank:o}}isNaturalWin(e,r){let o=[8,9];return o.includes(e)||o.includes(r)}mapRandomValueToCardValue(e){let r=e%13;if(r===0)return 1;if(r>=10)return 10;return r+1}shouldDrawThirdPlayerCard(e){return e<=5}shouldDrawThirdBankerCard(e,r){if(r===null)return e<=5;if(e<=2)return!0;if(e===3)return r!==8;if(e===4)return[2,3,4,5,6,7].includes(r);if(e===5)return[4,5,6,7].includes(r);if(e===6)return[6,7].includes(r);return!1}}var Sr=C(require("big.js"));class T{multipliers;constructor(e){this.multipliers=e}getMultipliers(e){let r=this.multipliers.get(e);if(r===void 0)throw new Error(`Multipliers for ${e} not found`);return r}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([e,r])=>({edge:e,multipliers:r}))}}var pr;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(pr||={});var Jr={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},Qr=new T(new Map([[2,Jr]])),Xr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Ar extends f{constructor(){super("DIAMONDS")}determineGameResult({generator:e,edge:r}){let o=e.getRandomIntsWithReplacement({min:0,max:6,count:5}),i=Qr.getMultipliers(r),n=o.values,t=this.calculatePayoutMultiplier(i,n);return{isFinished:!0,payoutMultiplier:Sr.default(t),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(e,r){let o=new Map;for(let t of r){let l=o.get(t)||0;o.set(t,l+1)}let i=[...o.values()].filter((t)=>t>1),n=this.classifyResult(i);return n===null?0:e[n]}classifyResult(e){if(e.length>2)throw new Error(`Unexpected number of repeats ${e.length}`);let[r,o]=e;if(r===void 0)return null;if(o===void 0){let i=Xr[r];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${r}`);return i}return r===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var U=C(require("big.js"));var Lr;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Lr||={});class _r extends f{constructor(){super("DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:0,max:1e4}),n=i.min,B=i.max-n+1-1,a=o.direction==="ABOVE"?B-o.selectedValue:o.selectedValue,p=new U.default(a).div(B).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?i.value>o.selectedValue:i.value<o.selectedValue)?new U.default(100-r).div(p):new U.default(0),outputs:{result:i.values},randomValues:i}}}var Y=C(require("big.js"));var hr;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(hr||={});var Zr={[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]}};class yr extends f{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Zr}constructor(e){super("KENO");this.multiplierOverrides=e;if(e)this.validateMultiplierOverrides(e)}determineGameResult({generator:e,edge:r,gameInputs:o}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(o.selectedNumbers.length===0)throw new Error("No numbers selected");if(o.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let l of o.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=e.getUniqueRandomInts({min:0,max:39,count:10}),n=o.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:n.length>0?new Y.default(this.multipliers[o.selectedNumbers.length][o.riskLevel][n.length]??0):new Y.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(e){for(let[r,o]of Object.entries(e)){let i=Number(r);for(let[n,t]of Object.entries(o))if(t.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${n}. Expected ${i+1}, but got ${t.length}`)}}}var x=C(require("big.js"));var Tr=(e,r)=>{return e.gt(r)?e:r};var xr=(e,r)=>{return e.lt(r)?e:r};class sr extends f{constructor(){super("LIMBO")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:1,max:4294967295}),n=i.max,t=new x.default(16777216),l=new x.default(1),B=new x.default(1e6),a=i.value,p=new x.default(a-1).div(n),d=(100-r)/100,h=t.div(p.mul(t).plus(1)).mul(d),y=Tr(l,xr(h,B));return{isFinished:!0,payoutMultiplier:y.gte(o.targetMultiplier)?new x.default(o.targetMultiplier):new x.default(0),outputs:{randomMultiplier:y,result:i.values},randomValues:i}}}var w=C(require("big.js"));var I=(e,r)=>{if(r<0||e<0||r>e)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(r>e-r)r=e-r;let o=1;for(let i=1;i<=r;i++)o=o*(e-i+1)/i;return o};class Gr extends f{constructor(){super("MINES")}determineGameResult({generator:e,edge:r,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let l=e.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),B=l.values.some((V)=>o.selectedTiles.includes(V)),a=o.hasCashedOut||B,p=(100-r)/100,d=new w.default(I(25-o.minesCount,o.selectedTiles.length)).div(new w.default(I(25,o.selectedTiles.length))),y=o.hasCashedOut&&!B?new w.default(p).div(d):new w.default(0);return{isFinished:a,payoutMultiplier:y,outputs:{result:l.values},randomValues:l}}}var ur=require("big.js");var Rr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(Rr||={});var br=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],Mr=new T(new Map([[1,br]]));class Cr extends f{constructor(){super("PLINKO")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(r.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(r.numberOfRows<8||r.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=Mr.getMultipliers(o),n=e.getRandomIntsWithReplacement({min:0,max:1,count:r.numberOfRows}),l=n.values.reduce((a,p)=>a+p,0);return{isFinished:!0,payoutMultiplier:new ur.Big(i.find((a)=>a.rows===r.numberOfRows)?.payout[r.riskLevel][l]??0),outputs:{result:n.values},randomValues:n}}}var c=require("big.js");var k=[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],$=[37,...k],z=[[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]],J=[[0,1],[0,3],[0,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]],Q=[[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]],X=[[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]],Z=[[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]],b=[[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]],H=[0,1,2,3,37],m=[[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]],g=[[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]],s;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(s||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var u;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(u||={});var R;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(R||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});var Dr;((r)=>r.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Dr||={});class E extends Error{static createValidationError(e){return new E("INPUT_VALIDATION_ERROR",e)}static isGameError(e){return e instanceof E}errorCode;constructor(e,r){super(r);this.errorCode=e}}var W=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&N(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&mr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&gr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&re(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&ee(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},N=(e)=>{return k.includes(e)},mr=(e)=>{if(e.length!==2)return!1;if(!e.every(N))return!1;return z.some(([r,o])=>r===e[0]&&o===e[1])},gr=(e)=>{if(e.length!==3)return!1;if(!e.every(N))return!1;return Q.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},re=(e)=>{if(e.length!==4)return!1;if(!e.every(N))return!1;return Z.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},ee=(e)=>{if(e.length!==6)return!1;if(!e.every(N))return!1;return m.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var j=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.basketBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&O(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&oe(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&ie(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&ne(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.basketBets.every((r)=>r.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&te(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},O=(e)=>{return $.includes(e)};function oe(e){if(e.length!==2)return!1;if(!e.every(O))return!1;return J.some(([r,o])=>r===e[0]&&o===e[1])}var ie=(e)=>{if(e.length!==3)return!1;if(!e.every(O))return!1;return X.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},ne=(e)=>{if(e.length!==4)return!1;if(!e.every(O))return!1;return b.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},te=(e)=>{if(e.length!==6)return!1;if(!e.every(O))return!1;return g.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var Kr=(e)=>{return new c.Big(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0)))},vr=(e)=>{return new c.Big(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.basketBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0)))},ce=(e)=>{return e.type==="european"?Kr(e.inputs):vr(e.inputs)};class wr extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){W(r);let o=e.getRandomInt({min:0,max:36}),i=o.value,n=this.determineBetOutcomes(r,i),t=Kr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c.Big(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c.Big(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c.Big(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c.Big(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c.Big(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c.Big(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c.Big(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0)))}}class Nr extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){j(r);let o=e.getRandomInt({min:0,max:37}),i=o.value,n=this.determineBetOutcomes(r,i),t=vr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c.Big(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>H.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>!H.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0||r===37)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c.Big(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c.Big(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c.Big(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c.Big(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c.Big(0))).add(e.winningBets.basketBets.reduce((r,o)=>r.plus(o.amount.mul(7)),new c.Big(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c.Big(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0)))}}class Or extends f{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new wr,this.americanGame=new Nr}determineGameResult(e){let{gameInputs:r,...o}=e;if(e.edge===2.7&&r.type==="european"){let i=this.europeanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:n,result:i.outputs.result}}}if(e.edge===5.3&&r.type==="american"){let i=this.americanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:n,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var le=(e)=>{if(e.type==="european")W(e.inputs);else j(e.inputs)};var Vr=require("big.js");var rr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(rr||={});var er;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(er||={});var Ee=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}],Pr=new T(new Map([[1,Ee]]));class Ur extends f{constructor(){super("WHEEL")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(!Object.values(er).includes(r.segments))throw new Error("Invalid segments value");if(!Object.values(rr).includes(r.riskLevel))throw new Error("Invalid risk level");let i=Pr.getMultipliers(o).find((B)=>B.segments===r.segments);if(i===void 0)throw new Error(`Multiplier not found for segment ${r.segments}`);let n=e.getRandomInt({min:0,max:r.segments-1}),t=i.payout[r.riskLevel][n.value];if(t===void 0)throw new Error(`Payout not found for risk ${r.riskLevel} and value ${n.value}`);return{isFinished:!0,payoutMultiplier:new Vr.Big(t),outputs:{result:n.values},randomValues:n}}}
1
+ var ur=Object.create;var{getPrototypeOf:Wr,defineProperty:w,getOwnPropertyNames:er,getOwnPropertyDescriptor:sr}=Object,tr=Object.prototype.hasOwnProperty;var D=(r,o,i)=>{i=r!=null?ur(Wr(r)):{};let E=o||!r||!r.__esModule?w(i,"default",{value:r,enumerable:!0}):i;for(let A of er(r))if(!tr.call(E,A))w(E,A,{get:()=>r[A],enumerable:!0});return E},nr=new WeakMap,br=(r)=>{var o=nr.get(r),i;if(o)return o;if(o=w({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")er(r).map((E)=>!tr.call(o,E)&&w(o,E,{get:()=>r[E],enumerable:!(i=sr(r,E))||i.enumerable}));return nr.set(r,o),o};var mr=(r,o)=>{for(var i in o)w(r,i,{get:o[i],enumerable:!0,configurable:!0,set:(E)=>o[i]=()=>E})};var wo={};mr(wo,{validateRouletteGameInputs:()=>Ko,validateAdvancedDiceInputs:()=>Ao,plinkoMultipliers:()=>kr,diamondsMultipliers:()=>Zr,calculateRouletteBetAmount:()=>Zo,calculateBaccaratBetAmount:()=>pr,WheelSegments:()=>M,WheelRiskLevel:()=>N,Wheel:()=>Qr,VALID_SUITS:()=>Lr,VALID_RANKS:()=>Sr,VALID_EUROPEAN_STREETS:()=>rr,VALID_EUROPEAN_STRAIGHTS:()=>$,VALID_EUROPEAN_SPLITS:()=>m,VALID_EUROPEAN_DOUBLE_STREETS:()=>Ar,VALID_EUROPEAN_CORNERS:()=>ir,VALID_AMERICAN_STREETS:()=>or,VALID_AMERICAN_STRAIGHTS:()=>b,VALID_AMERICAN_SPLITS:()=>g,VALID_AMERICAN_DOUBLE_STREETS:()=>cr,VALID_AMERICAN_CORNERS:()=>Er,RouletteType:()=>z,Roulette:()=>$r,RollType:()=>dr,RANDOM_MIN_VALUE:()=>F,RANDOM_MAX_VALUE:()=>Y,PlinkoRiskLevel:()=>Hr,Plinko:()=>Pr,Parity:()=>G,OrigamiGame:()=>T,Mines:()=>vr,MIN_WIN_CHANCE:()=>Rr,MAX_WIN_CHANCE:()=>Or,Limbo:()=>Vr,KenoRiskLevel:()=>ar,Keno:()=>Nr,Half:()=>Z,GameErrorCode:()=>fr,GameError:()=>t,Game:()=>O,EFFECTIVE_RANGE:()=>u,Dozen:()=>_,DiceDirection:()=>_r,Dice:()=>Dr,DiamondsResultType:()=>Cr,Diamonds:()=>Kr,Column:()=>K,Color:()=>C,BaccaratOutcome:()=>xr,BaccaratBetType:()=>lr,Baccarat:()=>yr,AdvancedDice:()=>Tr,AMERICAN_BASKET:()=>q});module.exports=br(wo);var T;((f)=>{f.DICE="DICE";f.MINES="MINES";f.KENO="KENO";f.LIMBO="LIMBO";f.ADVANCED_DICE="ADVANCED_DICE";f.BACCARAT="BACCARAT";f.DIAMONDS="DIAMONDS";f.PLINKO="PLINKO";f.ROULETTE="ROULETTE";f.WHEEL="WHEEL"})(T||={});class O{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var U=require("big.js");var fr;((o)=>o.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(fr||={});class t extends Error{static createValidationError(r){return new t("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof t}errorCode;constructor(r,o){super(o);this.errorCode=r}}var F=0,Y=1e4,u=10001,Rr=0.01,Or=98,gr=(r)=>{if(r<F)throw t.createValidationError(`Lower bound ${r} is below minimum allowed value ${F}`)},ro=(r)=>{if(r>Y)throw t.createValidationError(`Upper bound ${r} is above maximum allowed value ${Y}`)},P=(r)=>{if(gr(r.lower),ro(r.upper),r.lower>=r.upper)throw t.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},oo=(r,o)=>{let[i,E]=r.lower<=o.lower?[r,o]:[o,r];if(i.upper>E.lower)throw t.createValidationError("Bounds must not overlap")},io=(r,o)=>o>=r.lower&&o<=r.upper,Eo=(r)=>r.upper-r.lower+1,X=(r,o)=>o>r.lower&&o<r.upper,I=(r)=>r.upper-r.lower-1,dr;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(dr||={});var Br=(r)=>{let i=(()=>{switch(r.mode){case"ROLL_BETWEEN":return P(r.bounds),I(r.bounds);case"ROLL_OUTSIDE":return P(r.bounds),u-Eo(r.bounds);case"ROLL_BETWEEN_TWO":return P(r.firstBounds),P(r.secondBounds),oo(r.firstBounds,r.secondBounds),I(r.firstBounds)+I(r.secondBounds)}})(),E=U.Big(i).div(u).mul(100);if(E.lt(Rr))throw t.createValidationError("Win chance too low");if(E.gt(Or))throw t.createValidationError("Win chance too high");return E},Ao=(r)=>{Br(r)};class Tr extends O{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=Br(i),A=r.getRandomInt({min:F,max:Y}),c=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return X(i.bounds,c);case"ROLL_OUTSIDE":return!io(i.bounds,c);case"ROLL_BETWEEN_TWO":return X(i.firstBounds,c)||X(i.secondBounds,c)}})()?new U.Big(100-o).div(E):new U.Big(0),outputs:{result:A.values},randomValues:A}}}var a=D(require("big.js"));var Lr=["Clubs","Diamonds","Hearts","Spades"],Sr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],xr;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(xr||={});var lr;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(lr||={});var co={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},pr=(r)=>{return new a.default(0).add(r.bets.reduce((i,E)=>i.add(E.amount),new a.default(0)))};class yr extends O{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(o);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,c=A.slice(0,3),e=A.slice(3,6),d=[],R=0;for(let L of c.slice(0,2)){let x=this.mapRandomValueToCard(L),k=this.mapRandomValueToCardValue(L);d.push(x),R=(R+k)%10}let B=[],f=0;for(let L of e.slice(0,2)){let x=this.mapRandomValueToCard(L),k=this.mapRandomValueToCardValue(L);B.push(x),f=(f+k)%10}if(!this.isNaturalWin(R,f)){let L=this.shouldDrawThirdPlayerCard(R),x=null;if(L)x=this.mapRandomValueToCardValue(c[2]),d.push(this.mapRandomValueToCard(c[2])),R=(R+x)%10;if(this.shouldDrawThirdBankerCard(f,x))B.push(this.mapRandomValueToCard(e[2])),f=(f+this.mapRandomValueToCardValue(e[2]))%10}let S;if(R===f)S="TIE";else S=R>f?"PLAYER_WIN":"BANKER_WIN";let l=pr(o),{betType:H,multiplier:Xr}=co[S],Ir=new a.default(0).add(o.bets.filter((L)=>L.type===H).reduce((L,x)=>L.add(x.amount.mul(Xr)),new a.default(0)));return{isFinished:!0,payoutMultiplier:l.gt(0)?Ir.div(l):new a.default(0),outputs:{playerCards:d,playerHandValue:R,bankerCards:B,bankerHandValue:f,gameOutcome:S,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((o)=>o.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let o=Lr[Math.floor(r/13)],i=Sr[r%13];return{suit:o,rank:i}}isNaturalWin(r,o){let i=[8,9];return i.includes(r)||i.includes(o)}mapRandomValueToCardValue(r){let o=r%13;if(o===0)return 1;if(o>=10)return 10;return o+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,o){if(o===null)return r<=5;if(r<=2)return!0;if(r===3)return o!==8;if(r===4)return[2,3,4,5,6,7].includes(o);if(r===5)return[4,5,6,7].includes(o);if(r===6)return[6,7].includes(o);return!1}}var Gr=D(require("big.js"));class p{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let o=this.multipliers.get(r);if(o===void 0)throw new Error(`Multipliers for ${r} not found`);return o}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,o])=>({edge:r,multipliers:o}))}}var Cr;((e)=>{e.PAIR="PAIR";e.TWO_PAIR="TWO_PAIR";e.THREE_OF_A_KIND="THREE_OF_A_KIND";e.FULL_HOUSE="FULL_HOUSE";e.FOUR_OF_A_KIND="FOUR_OF_A_KIND";e.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Cr||={});var no={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},eo={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},to={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},fo={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},Ro={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},Zr=new p(new Map([[1,no],[2,eo],[3,to],[4,fo],[8,Ro]])),Oo={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Kr extends O{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:o}){let i=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Zr.getMultipliers(o),A=i.values,c=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Gr.default(c),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r,o){let i=new Map;for(let c of o){let e=i.get(c)||0;i.set(c,e+1)}let E=[...i.values()].filter((c)=>c>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[o,i]=r;if(o===void 0)return null;if(i===void 0){let E=Oo[o];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${o}`);return E}return o===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}var j=D(require("big.js"));var _r;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(_r||={});class Dr extends O{constructor(){super("DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:0,max:1e4}),A=E.min,d=E.max-A+1-1,R=i.direction==="ABOVE"?d-i.selectedValue:i.selectedValue,B=new j.default(R).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?E.value>i.selectedValue:E.value<i.selectedValue)?new j.default(100-o).div(B):new j.default(0),outputs:{result:E.values},randomValues:E}}}var W=D(require("big.js"));var ar;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(ar||={});var Bo={[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]}};class Nr extends O{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Bo}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:o,gameInputs:i}){if(o!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let e of i.selectedNumbers){if(e%1!==0)throw new Error("Only integers can be selected");if(e<0||e>39)throw new Error("Invalid number selected")}let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=i.selectedNumbers.filter((e)=>E.values.includes(e));return{isFinished:!0,payoutMultiplier:A.length>0?new W.default(this.multipliers[i.selectedNumbers.length][i.riskLevel][A.length]??0):new W.default(0),outputs:{result:E.values},randomValues:E}}validateMultiplierOverrides(r){for(let[o,i]of Object.entries(r)){let E=Number(o);for(let[A,c]of Object.entries(i))if(c.length!==E+1)throw new Error(`Invalid count of multipliers for tiles ${E} and risk level ${A}. Expected ${E+1}, but got ${c.length}`)}}}var y=D(require("big.js"));var Mr=(r,o)=>{return r.gt(o)?r:o};var wr=(r,o)=>{return r.lt(o)?r:o};class Vr extends O{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,c=new y.default(16777216),e=new y.default(1),d=new y.default(1e6),R=E.value,B=new y.default(R-1).div(A),f=(100-o)/100,S=c.div(B.mul(c).plus(1)).mul(f),l=Mr(e,wr(S,d));return{isFinished:!0,payoutMultiplier:l.gte(i.targetMultiplier)?new y.default(i.targetMultiplier):new y.default(0),outputs:{randomMultiplier:l,result:E.values},randomValues:E}}}var V=D(require("big.js"));var s=(r,o)=>{if(o<0||r<0||o>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(o>r-o)o=r-o;let i=1;for(let E=1;E<=o;E++)i=i*(r-E+1)/E;return i};class vr extends O{constructor(){super("MINES")}determineGameResult({generator:r,edge:o,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let e=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),d=e.values.some((H)=>i.selectedTiles.includes(H)),R=i.hasCashedOut||d,B=(100-o)/100,f=new V.default(s(25-i.minesCount,i.selectedTiles.length)).div(new V.default(s(25,i.selectedTiles.length))),l=i.hasCashedOut&&!d?new V.default(B).div(f):new V.default(0);return{isFinished:R,payoutMultiplier:l,outputs:{result:e.values},randomValues:e}}}var hr=require("big.js");var Hr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(Hr||={});var To=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],kr=new p(new Map([[1,To]]));class Pr extends O{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(o.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(o.numberOfRows<8||o.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=kr.getMultipliers(i),A=r.getRandomIntsWithReplacement({min:0,max:1,count:o.numberOfRows}),e=A.values.reduce((R,B)=>R+B,0);return{isFinished:!0,payoutMultiplier:new hr.Big(E.find((R)=>R.rows===o.numberOfRows)?.payout[o.riskLevel][e]??0),outputs:{result:A.values},randomValues:A}}}var n=require("big.js");var $=[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],b=[37,...$],m=[[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]],g=[[0,1],[0,3],[0,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]],rr=[[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]],or=[[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]],ir=[[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]],Er=[[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]],q=[0,1,2,3,37],Ar=[[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]],cr=[[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]],G;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(G||={});var C;((i)=>{i.RED="RED";i.BLACK="BLACK"})(C||={});var Z;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(Z||={});var K;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(K||={});var _;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(_||={});var z;((i)=>{i.AMERICAN="AMERICAN";i.EUROPEAN="EUROPEAN"})(z||={});var J=(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 t.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&v(o.value)))throw t.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&Lo(o.values)))throw t.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&So(o.values)))throw t.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&xo(o.values)))throw t.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&lo(o.values)))throw t.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(G).includes(o.parity)))throw t.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(C).includes(o.color)))throw t.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw t.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.column)))throw t.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.dozen)))throw t.createValidationError("Invalid dozen bet.")},v=(r)=>{return $.includes(r)},Lo=(r)=>{if(r.length!==2)return!1;if(!r.every(v))return!1;return m.some(([o,i])=>o===r[0]&&i===r[1])},So=(r)=>{if(r.length!==3)return!1;if(!r.every(v))return!1;return rr.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},xo=(r)=>{if(r.length!==4)return!1;if(!r.every(v))return!1;return ir.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},lo=(r)=>{if(r.length!==6)return!1;if(!r.every(v))return!1;return Ar.some(([o,i,E,A,c,e])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&e===r[5])};var Q=(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 t.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&h(o.value)))throw t.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&po(o.values)))throw t.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&yo(o.values)))throw t.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&Go(o.values)))throw t.createValidationError("Invalid corner bet.");if(!r.basketBets.every((o)=>o.amount.gte(0)))throw t.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&Co(o.values)))throw t.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(G).includes(o.parity)))throw t.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(C).includes(o.color)))throw t.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw t.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.column)))throw t.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.dozen)))throw t.createValidationError("Invalid dozen bet.")},h=(r)=>{return b.includes(r)};function po(r){if(r.length!==2)return!1;if(!r.every(h))return!1;return g.some(([o,i])=>o===r[0]&&i===r[1])}var yo=(r)=>{if(r.length!==3)return!1;if(!r.every(h))return!1;return or.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},Go=(r)=>{if(r.length!==4)return!1;if(!r.every(h))return!1;return Er.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},Co=(r)=>{if(r.length!==6)return!1;if(!r.every(h))return!1;return cr.some(([o,i,E,A,c,e])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&e===r[5])};var Ur=(r)=>{return new n.Big(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0)))},Fr=(r)=>{return new n.Big(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.basketBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n.Big(0)))},Zo=(r)=>{return r.type==="EUROPEAN"?Ur(r.inputs):Fr(r.inputs)};class Yr extends O{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){J(o);let i=r.getRandomInt({min:0,max:36}),E=i.value,A=this.determineBetOutcomes(o,E),c=Ur(o),e=this.calculateTotalPayoutAmount(A),d=c.gt(0)?e.div(c):new n.Big(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:d,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n.Big(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n.Big(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n.Big(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n.Big(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n.Big(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n.Big(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0)))}}class jr extends O{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){Q(o);let i=r.getRandomInt({min:0,max:37}),E=i.value,A=this.determineBetOutcomes(o,E),c=Fr(o),e=this.calculateTotalPayoutAmount(A),d=c.gt(0)?e.div(c):new n.Big(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:d,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>q.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>!q.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0||o===37)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n.Big(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n.Big(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n.Big(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n.Big(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n.Big(0))).add(r.winningBets.basketBets.reduce((o,i)=>o.plus(i.amount.mul(7)),new n.Big(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n.Big(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n.Big(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n.Big(0)))}}class $r extends O{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Yr,this.americanGame=new jr}determineGameResult(r){let{gameInputs:o,...i}=r;if(r.edge===2.7&&o.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===5.3&&o.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var Ko=(r)=>{if(r.type==="EUROPEAN")J(r.inputs);else Q(r.inputs)};var Jr=require("big.js");var N;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(N||={});var M;((c)=>{c[c.TEN=10]="TEN";c[c.TWENTY=20]="TWENTY";c[c.THIRTY=30]="THIRTY";c[c.FORTY=40]="FORTY";c[c.FIFTY=50]="FIFTY"})(M||={});var _o={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}}},Do={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}}},ao={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}}},No={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}}},Mo={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}}},qr=new p(new Map([[1,_o],[2,Do],[3,ao],[4,No],[8,Mo]]));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 Qr extends O{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(!Object.values(M).includes(o.segments))throw new Error("Invalid segments value");if(!Object.values(N).includes(o.riskLevel))throw new Error("Invalid risk level");let A=qr.getMultipliers(i)[o.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${o.riskLevel}`);let c=A[o.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${o.segments}`);let e=zr[o.riskLevel];if(e===void 0)throw new Error(`No patterns found for risk level ${o.riskLevel}`);let d=e[o.segments];if(d===void 0)throw new Error(`No patterns found for segment ${o.segments}`);let R=r.getRandomInt({min:0,max:d.length-1}),B=d[R.value];if(B===void 0)throw new Error(`No pattern found for segment ${o.segments} and value ${R.value}`);let f=c[B];if(f===void 0)throw new Error(`No payout found for picked segment ${B}`);return{isFinished:!0,payoutMultiplier:new Jr.Big(f),outputs:{result:R.values},randomValues:R}}}
package/dist/index.d.ts CHANGED
@@ -72,6 +72,11 @@ export type Bounds = {
72
72
  lower: number;
73
73
  upper: number;
74
74
  };
75
+ export declare const RANDOM_MIN_VALUE = 0;
76
+ export declare const RANDOM_MAX_VALUE = 10000;
77
+ export declare const EFFECTIVE_RANGE = 10001;
78
+ export declare const MIN_WIN_CHANCE = 0.01;
79
+ export declare const MAX_WIN_CHANCE = 98;
75
80
  export declare enum RollType {
76
81
  ROLL_BETWEEN = "ROLL_BETWEEN",
77
82
  ROLL_OUTSIDE = "ROLL_OUTSIDE",
@@ -91,12 +96,10 @@ export type RollBetweenTwo = {
91
96
  secondBounds: Bounds;
92
97
  };
93
98
  export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
99
+ export declare const validateAdvancedDiceInputs: (gameInputs: AdvancedDiceInputs) => void;
94
100
  export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
95
101
  constructor();
96
102
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
97
- private calculateRollBetweenPayoutMultiplier;
98
- private calculateRollOutsidePayoutMultiplier;
99
- private calculateRollBetweenTwoPayoutMultiplier;
100
103
  }
101
104
  export interface Bet {
102
105
  amount: Big$1;
@@ -160,6 +163,15 @@ export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutpu
160
163
  private shouldDrawThirdPlayerCard;
161
164
  private shouldDrawThirdBankerCard;
162
165
  }
166
+ declare class MultiplierContainer<TMultipliers> {
167
+ readonly multipliers: Map<number, TMultipliers>;
168
+ constructor(multipliers: Map<number, TMultipliers>);
169
+ getMultipliers(edge: number): TMultipliers;
170
+ getAllMultipliers(): {
171
+ edge: number;
172
+ multipliers: TMultipliers;
173
+ }[];
174
+ }
163
175
  export interface DiamondsGameInputs {
164
176
  }
165
177
  export declare enum DiamondsResultType {
@@ -171,6 +183,7 @@ export declare enum DiamondsResultType {
171
183
  FIVE_OF_A_KIND = "FIVE_OF_A_KIND"
172
184
  }
173
185
  export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
186
+ export declare const diamondsMultipliers: MultiplierContainer<DiamondsMultipliers>;
174
187
  export declare class Diamonds extends Game<DiamondsGameInputs> {
175
188
  constructor();
176
189
  protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
@@ -227,15 +240,6 @@ export declare class Mines extends Game<MinesGameInputs> {
227
240
  constructor();
228
241
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
229
242
  }
230
- declare class MultiplierContainer<TMultipliers> {
231
- readonly multipliers: Map<number, TMultipliers>;
232
- constructor(multipliers: Map<number, TMultipliers>);
233
- getMultipliers(edge: number): TMultipliers;
234
- getAllMultipliers(): {
235
- edge: number;
236
- multipliers: TMultipliers;
237
- }[];
238
- }
239
243
  export declare enum PlinkoRiskLevel {
240
244
  LOW_RISK = "LOW_RISK",
241
245
  MEDIUM_RISK = "MEDIUM_RISK",
@@ -1547,11 +1551,15 @@ export interface AmericanRouletteGameInputs {
1547
1551
  columnBets: ColumnBet[];
1548
1552
  dozenBets: DozenBet[];
1549
1553
  }
1554
+ export declare enum RouletteType {
1555
+ AMERICAN = "AMERICAN",
1556
+ EUROPEAN = "EUROPEAN"
1557
+ }
1550
1558
  export type RouletteGameInputs = {
1551
- type: "european";
1559
+ type: RouletteType.EUROPEAN;
1552
1560
  inputs: EuropeanRouletteGameInputs;
1553
1561
  } | {
1554
- type: "american";
1562
+ type: RouletteType.AMERICAN;
1555
1563
  inputs: AmericanRouletteGameInputs;
1556
1564
  };
1557
1565
  export interface EuropeanRouletteBetOutcomes {
@@ -1599,11 +1607,6 @@ export interface WheelGameInputs {
1599
1607
  segments: WheelSegments;
1600
1608
  riskLevel: WheelRiskLevel;
1601
1609
  }
1602
- export interface WheelMultipliers {
1603
- segments: WheelSegments;
1604
- payout: Record<WheelRiskLevel, number[]>;
1605
- }
1606
- export declare const wheelMultipliers: MultiplierContainer<WheelMultipliers[]>;
1607
1610
  export declare class Wheel extends Game<WheelGameInputs> {
1608
1611
  constructor();
1609
1612
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var A;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL"})(A||={});class f{gameId;constructor(e){this.gameId=e}getGameResult(e){return this.determineGameResult(e)}}import{Big as _}from"big.js";var Er=(e,r)=>r>=e.lower&&r<=e.upper,dr=(e)=>e.upper-e.lower+1,U=(e,r)=>r>e.lower&&r<e.upper,k=(e)=>e.upper-e.lower-1,fr;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(fr||={});var C={min:0,max:1e4,effectiveRange:10001};class ar extends f{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt(C),n=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(o.bounds,n,r);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(o.bounds,n,r);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(o.firstBounds,o.secondBounds,n,r)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(e,r,o){if(!U(e,r))return _(0);let i=k(e),n=_(i).div(C.effectiveRange).mul(100);return _(100-o).div(n)}calculateRollOutsidePayoutMultiplier(e,r,o){if(Er(e,r))return _(0);let i=C.effectiveRange-dr(e),n=_(i).div(C.effectiveRange).mul(100);return _(100-o).div(n)}calculateRollBetweenTwoPayoutMultiplier(e,r,o,i){if(!U(e,o)&&!U(r,o))return _(0);let n=k(e)+k(r),t=_(n).div(C.effectiveRange).mul(100);return _(100-i).div(t)}}import D from"big.js";var Br=["Clubs","Diamonds","Hearts","Spades"],Sr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],pr;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(pr||={});var Ar;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(Ar||={});var Lr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},_r=(e)=>{return new D(0).add(e.bets.reduce((o,i)=>o.add(i.amount),new D(0)))};class hr extends f{constructor(){super("BACCARAT")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(r);let i=e.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=i.values,t=n.slice(0,3),l=n.slice(3,6),B=[],a=0;for(let p of t.slice(0,2)){let L=this.mapRandomValueToCard(p),N=this.mapRandomValueToCardValue(p);B.push(L),a=(a+N)%10}let S=[],d=0;for(let p of l.slice(0,2)){let L=this.mapRandomValueToCard(p),N=this.mapRandomValueToCardValue(p);S.push(L),d=(d+N)%10}if(!this.isNaturalWin(a,d)){let p=this.shouldDrawThirdPlayerCard(a),L=null;if(p)L=this.mapRandomValueToCardValue(t[2]),B.push(this.mapRandomValueToCard(t[2])),a=(a+L)%10;if(this.shouldDrawThirdBankerCard(d,L))S.push(this.mapRandomValueToCard(l[2])),d=(d+this.mapRandomValueToCardValue(l[2]))%10}let h;if(a===d)h="TIE";else h=a>d?"PLAYER_WIN":"BANKER_WIN";let y=_r(r),{betType:w,multiplier:cr}=Lr[h],lr=new D(0).add(r.bets.filter((p)=>p.type===w).reduce((p,L)=>p.add(L.amount.mul(cr)),new D(0)));return{isFinished:!0,payoutMultiplier:y.gt(0)?lr.div(y):new D(0),outputs:{playerCards:B,playerHandValue:a,bankerCards:S,bankerHandValue:d,gameOutcome:h,result:i.values},randomValues:i}}validateGameInputs(e){if(e.bets.length===0)throw new Error("Must place at least a single bet.");if(!e.bets.every((r)=>r.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(e){let r=Br[Math.floor(e/13)],o=Sr[e%13];return{suit:r,rank:o}}isNaturalWin(e,r){let o=[8,9];return o.includes(e)||o.includes(r)}mapRandomValueToCardValue(e){let r=e%13;if(r===0)return 1;if(r>=10)return 10;return r+1}shouldDrawThirdPlayerCard(e){return e<=5}shouldDrawThirdBankerCard(e,r){if(r===null)return e<=5;if(e<=2)return!0;if(e===3)return r!==8;if(e===4)return[2,3,4,5,6,7].includes(r);if(e===5)return[4,5,6,7].includes(r);if(e===6)return[6,7].includes(r);return!1}}import yr from"big.js";class T{multipliers;constructor(e){this.multipliers=e}getMultipliers(e){let r=this.multipliers.get(e);if(r===void 0)throw new Error(`Multipliers for ${e} not found`);return r}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([e,r])=>({edge:e,multipliers:r}))}}var Tr;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Tr||={});var xr={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},sr=new T(new Map([[2,xr]])),Gr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ur extends f{constructor(){super("DIAMONDS")}determineGameResult({generator:e,edge:r}){let o=e.getRandomIntsWithReplacement({min:0,max:6,count:5}),i=sr.getMultipliers(r),n=o.values,t=this.calculatePayoutMultiplier(i,n);return{isFinished:!0,payoutMultiplier:yr(t),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(e,r){let o=new Map;for(let t of r){let l=o.get(t)||0;o.set(t,l+1)}let i=[...o.values()].filter((t)=>t>1),n=this.classifyResult(i);return n===null?0:e[n]}classifyResult(e){if(e.length>2)throw new Error(`Unexpected number of repeats ${e.length}`);let[r,o]=e;if(r===void 0)return null;if(o===void 0){let i=Gr[r];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${r}`);return i}return r===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import H from"big.js";var Rr;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Rr||={});class Mr extends f{constructor(){super("DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:0,max:1e4}),n=i.min,B=i.max-n+1-1,a=o.direction==="ABOVE"?B-o.selectedValue:o.selectedValue,S=new H(a).div(B).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?i.value>o.selectedValue:i.value<o.selectedValue)?new H(100-r).div(S):new H(0),outputs:{result:i.values},randomValues:i}}}import F from"big.js";var Cr;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Cr||={});var Dr={[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]}};class Kr extends f{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Dr}constructor(e){super("KENO");this.multiplierOverrides=e;if(e)this.validateMultiplierOverrides(e)}determineGameResult({generator:e,edge:r,gameInputs:o}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(o.selectedNumbers.length===0)throw new Error("No numbers selected");if(o.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let l of o.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=e.getUniqueRandomInts({min:0,max:39,count:10}),n=o.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:n.length>0?new F(this.multipliers[o.selectedNumbers.length][o.riskLevel][n.length]??0):new F(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(e){for(let[r,o]of Object.entries(e)){let i=Number(r);for(let[n,t]of Object.entries(o))if(t.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${n}. Expected ${i+1}, but got ${t.length}`)}}}import x from"big.js";var Y=(e,r)=>{return e.gt(r)?e:r};var I=(e,r)=>{return e.lt(r)?e:r};class vr extends f{constructor(){super("LIMBO")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:1,max:4294967295}),n=i.max,t=new x(16777216),l=new x(1),B=new x(1e6),a=i.value,S=new x(a-1).div(n),d=(100-r)/100,h=t.div(S.mul(t).plus(1)).mul(d),y=Y(l,I(h,B));return{isFinished:!0,payoutMultiplier:y.gte(o.targetMultiplier)?new x(o.targetMultiplier):new x(0),outputs:{randomMultiplier:y,result:i.values},randomValues:i}}}import O from"big.js";var W=(e,r)=>{if(r<0||e<0||r>e)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(r>e-r)r=e-r;let o=1;for(let i=1;i<=r;i++)o=o*(e-i+1)/i;return o};class wr extends f{constructor(){super("MINES")}determineGameResult({generator:e,edge:r,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let l=e.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),B=l.values.some((w)=>o.selectedTiles.includes(w)),a=o.hasCashedOut||B,S=(100-r)/100,d=new O(W(25-o.minesCount,o.selectedTiles.length)).div(new O(W(25,o.selectedTiles.length))),y=o.hasCashedOut&&!B?new O(S).div(d):new O(0);return{isFinished:a,payoutMultiplier:y,outputs:{result:l.values},randomValues:l}}}import{Big as Nr}from"big.js";var Or;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(Or||={});var Vr=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],Pr=new T(new Map([[1,Vr]]));class Ur extends f{constructor(){super("PLINKO")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(r.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(r.numberOfRows<8||r.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=Pr.getMultipliers(o),n=e.getRandomIntsWithReplacement({min:0,max:1,count:r.numberOfRows}),l=n.values.reduce((a,S)=>a+S,0);return{isFinished:!0,payoutMultiplier:new Nr(i.find((a)=>a.rows===r.numberOfRows)?.payout[r.riskLevel][l]??0),outputs:{result:n.values},randomValues:n}}}import{Big as c}from"big.js";var j=[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],$=[37,...j],z=[[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]],J=[[0,1],[0,3],[0,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]],Q=[[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]],X=[[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]],Z=[[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]],b=[[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]],q=[0,1,2,3,37],m=[[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]],g=[[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]],s;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(s||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var u;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(u||={});var R;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(R||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});var kr;((r)=>r.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(kr||={});class E extends Error{static createValidationError(e){return new E("INPUT_VALIDATION_ERROR",e)}static isGameError(e){return e instanceof E}errorCode;constructor(e,r){super(r);this.errorCode=e}}var V=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&K(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&Hr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&Wr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&jr(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&qr(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},K=(e)=>{return j.includes(e)},Hr=(e)=>{if(e.length!==2)return!1;if(!e.every(K))return!1;return z.some(([r,o])=>r===e[0]&&o===e[1])},Wr=(e)=>{if(e.length!==3)return!1;if(!e.every(K))return!1;return Q.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},jr=(e)=>{if(e.length!==4)return!1;if(!e.every(K))return!1;return Z.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},qr=(e)=>{if(e.length!==6)return!1;if(!e.every(K))return!1;return m.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var P=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.basketBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&v(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&Fr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&Yr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&Ir(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.basketBets.every((r)=>r.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&$r(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},v=(e)=>{return $.includes(e)};function Fr(e){if(e.length!==2)return!1;if(!e.every(v))return!1;return J.some(([r,o])=>r===e[0]&&o===e[1])}var Yr=(e)=>{if(e.length!==3)return!1;if(!e.every(v))return!1;return X.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},Ir=(e)=>{if(e.length!==4)return!1;if(!e.every(v))return!1;return b.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},$r=(e)=>{if(e.length!==6)return!1;if(!e.every(v))return!1;return g.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var rr=(e)=>{return new c(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c(0)))},er=(e)=>{return new c(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.basketBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c(0)))},$e=(e)=>{return e.type==="european"?rr(e.inputs):er(e.inputs)};class or extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){V(r);let o=e.getRandomInt({min:0,max:36}),i=o.value,n=this.determineBetOutcomes(r,i),t=rr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0)))}}class ir extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){P(r);let o=e.getRandomInt({min:0,max:37}),i=o.value,n=this.determineBetOutcomes(r,i),t=er(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>q.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>!q.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0||r===37)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c(0))).add(e.winningBets.basketBets.reduce((r,o)=>r.plus(o.amount.mul(7)),new c(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0)))}}class zr extends f{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new or,this.americanGame=new ir}determineGameResult(e){let{gameInputs:r,...o}=e;if(e.edge===2.7&&r.type==="european"){let i=this.europeanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:n,result:i.outputs.result}}}if(e.edge===5.3&&r.type==="american"){let i=this.americanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:n,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var Xe=(e)=>{if(e.type==="european")V(e.inputs);else P(e.inputs)};import{Big as Jr}from"big.js";var nr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(nr||={});var tr;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(tr||={});var Qr=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}],Xr=new T(new Map([[1,Qr]]));class Zr extends f{constructor(){super("WHEEL")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(!Object.values(tr).includes(r.segments))throw new Error("Invalid segments value");if(!Object.values(nr).includes(r.riskLevel))throw new Error("Invalid risk level");let i=Xr.getMultipliers(o).find((B)=>B.segments===r.segments);if(i===void 0)throw new Error(`Multiplier not found for segment ${r.segments}`);let n=e.getRandomInt({min:0,max:r.segments-1}),t=i.payout[r.riskLevel][n.value];if(t===void 0)throw new Error(`Payout not found for risk ${r.riskLevel} and value ${n.value}`);return{isFinished:!0,payoutMultiplier:new Jr(t),outputs:{result:n.values},randomValues:n}}}export{Xr as wheelMultipliers,Xe as validateRouletteGameInputs,Pr as plinkoMultipliers,$e as calculateRouletteBetAmount,_r as calculateBaccaratBetAmount,tr as WheelSegments,nr as WheelRiskLevel,Zr as Wheel,Br as VALID_SUITS,Sr as VALID_RANKS,Q as VALID_EUROPEAN_STREETS,j as VALID_EUROPEAN_STRAIGHTS,z as VALID_EUROPEAN_SPLITS,m as VALID_EUROPEAN_DOUBLE_STREETS,Z as VALID_EUROPEAN_CORNERS,X as VALID_AMERICAN_STREETS,$ as VALID_AMERICAN_STRAIGHTS,J as VALID_AMERICAN_SPLITS,g as VALID_AMERICAN_DOUBLE_STREETS,b as VALID_AMERICAN_CORNERS,zr as Roulette,fr as RollType,Or as PlinkoRiskLevel,Ur as Plinko,s as Parity,A as OrigamiGame,wr as Mines,vr as Limbo,Cr as KenoRiskLevel,Kr as Keno,u as Half,kr as GameErrorCode,E as GameError,f as Game,M as Dozen,Rr as DiceDirection,Mr as Dice,Tr as DiamondsResultType,ur as Diamonds,R as Column,G as Color,pr as BaccaratOutcome,Ar as BaccaratBetType,hr as Baccarat,ar as AdvancedDice,q as AMERICAN_BASKET};
1
+ var L;((f)=>{f.DICE="DICE";f.MINES="MINES";f.KENO="KENO";f.LIMBO="LIMBO";f.ADVANCED_DICE="ADVANCED_DICE";f.BACCARAT="BACCARAT";f.DIAMONDS="DIAMONDS";f.PLINKO="PLINKO";f.ROULETTE="ROULETTE";f.WHEEL="WHEEL"})(L||={});class O{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as Y}from"big.js";var Lr;((o)=>o.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Lr||={});class t extends Error{static createValidationError(r){return new t("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof t}errorCode;constructor(r,o){super(o);this.errorCode=r}}var j=0,$=1e4,I=10001,Sr=0.01,xr=98,lr=(r)=>{if(r<j)throw t.createValidationError(`Lower bound ${r} is below minimum allowed value ${j}`)},pr=(r)=>{if(r>$)throw t.createValidationError(`Upper bound ${r} is above maximum allowed value ${$}`)},h=(r)=>{if(lr(r.lower),pr(r.upper),r.lower>=r.upper)throw t.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},yr=(r,o)=>{let[i,E]=r.lower<=o.lower?[r,o]:[o,r];if(i.upper>E.lower)throw t.createValidationError("Bounds must not overlap")},Gr=(r,o)=>o>=r.lower&&o<=r.upper,Cr=(r)=>r.upper-r.lower+1,U=(r,o)=>o>r.lower&&o<r.upper,F=(r)=>r.upper-r.lower-1,Zr;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Zr||={});var u=(r)=>{let i=(()=>{switch(r.mode){case"ROLL_BETWEEN":return h(r.bounds),F(r.bounds);case"ROLL_OUTSIDE":return h(r.bounds),I-Cr(r.bounds);case"ROLL_BETWEEN_TWO":return h(r.firstBounds),h(r.secondBounds),yr(r.firstBounds,r.secondBounds),F(r.firstBounds)+F(r.secondBounds)}})(),E=Y(i).div(I).mul(100);if(E.lt(Sr))throw t.createValidationError("Win chance too low");if(E.gt(xr))throw t.createValidationError("Win chance too high");return E},_o=(r)=>{u(r)};class Kr extends O{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=u(i),A=r.getRandomInt({min:j,max:$}),c=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return U(i.bounds,c);case"ROLL_OUTSIDE":return!Gr(i.bounds,c);case"ROLL_BETWEEN_TWO":return U(i.firstBounds,c)||U(i.secondBounds,c)}})()?new Y(100-o).div(E):new Y(0),outputs:{result:A.values},randomValues:A}}}import D from"big.js";var _r=["Clubs","Diamonds","Hearts","Spades"],Dr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ar;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(ar||={});var Nr;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(Nr||={});var Mr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},wr=(r)=>{return new D(0).add(r.bets.reduce((i,E)=>i.add(E.amount),new D(0)))};class Vr extends O{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(o);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,c=A.slice(0,3),e=A.slice(3,6),d=[],R=0;for(let T of c.slice(0,2)){let x=this.mapRandomValueToCard(T),v=this.mapRandomValueToCardValue(T);d.push(x),R=(R+v)%10}let B=[],f=0;for(let T of e.slice(0,2)){let x=this.mapRandomValueToCard(T),v=this.mapRandomValueToCardValue(T);B.push(x),f=(f+v)%10}if(!this.isNaturalWin(R,f)){let T=this.shouldDrawThirdPlayerCard(R),x=null;if(T)x=this.mapRandomValueToCardValue(c[2]),d.push(this.mapRandomValueToCard(c[2])),R=(R+x)%10;if(this.shouldDrawThirdBankerCard(f,x))B.push(this.mapRandomValueToCard(e[2])),f=(f+this.mapRandomValueToCardValue(e[2]))%10}let S;if(R===f)S="TIE";else S=R>f?"PLAYER_WIN":"BANKER_WIN";let l=wr(o),{betType:V,multiplier:Br}=Mr[S],Tr=new D(0).add(o.bets.filter((T)=>T.type===V).reduce((T,x)=>T.add(x.amount.mul(Br)),new D(0)));return{isFinished:!0,payoutMultiplier:l.gt(0)?Tr.div(l):new D(0),outputs:{playerCards:d,playerHandValue:R,bankerCards:B,bankerHandValue:f,gameOutcome:S,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((o)=>o.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let o=_r[Math.floor(r/13)],i=Dr[r%13];return{suit:o,rank:i}}isNaturalWin(r,o){let i=[8,9];return i.includes(r)||i.includes(o)}mapRandomValueToCardValue(r){let o=r%13;if(o===0)return 1;if(o>=10)return 10;return o+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,o){if(o===null)return r<=5;if(r<=2)return!0;if(r===3)return o!==8;if(r===4)return[2,3,4,5,6,7].includes(o);if(r===5)return[4,5,6,7].includes(o);if(r===6)return[6,7].includes(o);return!1}}import vr from"big.js";class p{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let o=this.multipliers.get(r);if(o===void 0)throw new Error(`Multipliers for ${r} not found`);return o}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,o])=>({edge:r,multipliers:o}))}}var hr;((e)=>{e.PAIR="PAIR";e.TWO_PAIR="TWO_PAIR";e.THREE_OF_A_KIND="THREE_OF_A_KIND";e.FULL_HOUSE="FULL_HOUSE";e.FOUR_OF_A_KIND="FOUR_OF_A_KIND";e.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(hr||={});var Hr={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},kr={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},Pr={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},Ur={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},Fr={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},Yr=new p(new Map([[1,Hr],[2,kr],[3,Pr],[4,Ur],[8,Fr]])),jr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class $r extends O{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:o}){let i=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Yr.getMultipliers(o),A=i.values,c=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:vr(c),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r,o){let i=new Map;for(let c of o){let e=i.get(c)||0;i.set(c,e+1)}let E=[...i.values()].filter((c)=>c>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[o,i]=r;if(o===void 0)return null;if(i===void 0){let E=jr[o];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${o}`);return E}return o===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}import q from"big.js";var qr;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(qr||={});class zr extends O{constructor(){super("DICE")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:0,max:1e4}),A=E.min,d=E.max-A+1-1,R=i.direction==="ABOVE"?d-i.selectedValue:i.selectedValue,B=new q(R).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?E.value>i.selectedValue:E.value<i.selectedValue)?new q(100-o).div(B):new q(0),outputs:{result:E.values},randomValues:E}}}import W from"big.js";var Jr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Jr||={});var Qr={[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]}};class Xr extends O{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Qr}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:o,gameInputs:i}){if(o!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let e of i.selectedNumbers){if(e%1!==0)throw new Error("Only integers can be selected");if(e<0||e>39)throw new Error("Invalid number selected")}let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=i.selectedNumbers.filter((e)=>E.values.includes(e));return{isFinished:!0,payoutMultiplier:A.length>0?new W(this.multipliers[i.selectedNumbers.length][i.riskLevel][A.length]??0):new W(0),outputs:{result:E.values},randomValues:E}}validateMultiplierOverrides(r){for(let[o,i]of Object.entries(r)){let E=Number(o);for(let[A,c]of Object.entries(i))if(c.length!==E+1)throw new Error(`Invalid count of multipliers for tiles ${E} and risk level ${A}. Expected ${E+1}, but got ${c.length}`)}}}import y from"big.js";var s=(r,o)=>{return r.gt(o)?r:o};var b=(r,o)=>{return r.lt(o)?r:o};class Ir extends O{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:o,gameInputs:i}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,c=new y(16777216),e=new y(1),d=new y(1e6),R=E.value,B=new y(R-1).div(A),f=(100-o)/100,S=c.div(B.mul(c).plus(1)).mul(f),l=s(e,b(S,d));return{isFinished:!0,payoutMultiplier:l.gte(i.targetMultiplier)?new y(i.targetMultiplier):new y(0),outputs:{randomMultiplier:l,result:E.values},randomValues:E}}}import H from"big.js";var z=(r,o)=>{if(o<0||r<0||o>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(o>r-o)o=r-o;let i=1;for(let E=1;E<=o;E++)i=i*(r-E+1)/E;return i};class ur extends O{constructor(){super("MINES")}determineGameResult({generator:r,edge:o,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let e=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),d=e.values.some((V)=>i.selectedTiles.includes(V)),R=i.hasCashedOut||d,B=(100-o)/100,f=new H(z(25-i.minesCount,i.selectedTiles.length)).div(new H(z(25,i.selectedTiles.length))),l=i.hasCashedOut&&!d?new H(B).div(f):new H(0);return{isFinished:R,payoutMultiplier:l,outputs:{result:e.values},randomValues:e}}}import{Big as Wr}from"big.js";var sr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(sr||={});var br=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],mr=new p(new Map([[1,br]]));class gr extends O{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(o.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(o.numberOfRows<8||o.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=mr.getMultipliers(i),A=r.getRandomIntsWithReplacement({min:0,max:1,count:o.numberOfRows}),e=A.values.reduce((R,B)=>R+B,0);return{isFinished:!0,payoutMultiplier:new Wr(E.find((R)=>R.rows===o.numberOfRows)?.payout[o.riskLevel][e]??0),outputs:{result:A.values},randomValues:A}}}import{Big as n}from"big.js";var J=[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],m=[37,...J],g=[[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]],rr=[[0,1],[0,3],[0,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]],or=[[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]],ir=[[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]],Er=[[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]],Ar=[[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]],Q=[0,1,2,3,37],cr=[[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]],nr=[[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]],G;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(G||={});var C;((i)=>{i.RED="RED";i.BLACK="BLACK"})(C||={});var Z;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(Z||={});var K;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(K||={});var _;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(_||={});var X;((i)=>{i.AMERICAN="AMERICAN";i.EUROPEAN="EUROPEAN"})(X||={});var k=(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 t.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&a(o.value)))throw t.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&ro(o.values)))throw t.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&oo(o.values)))throw t.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&io(o.values)))throw t.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&Eo(o.values)))throw t.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(G).includes(o.parity)))throw t.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(C).includes(o.color)))throw t.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw t.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.column)))throw t.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.dozen)))throw t.createValidationError("Invalid dozen bet.")},a=(r)=>{return J.includes(r)},ro=(r)=>{if(r.length!==2)return!1;if(!r.every(a))return!1;return g.some(([o,i])=>o===r[0]&&i===r[1])},oo=(r)=>{if(r.length!==3)return!1;if(!r.every(a))return!1;return or.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},io=(r)=>{if(r.length!==4)return!1;if(!r.every(a))return!1;return Er.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},Eo=(r)=>{if(r.length!==6)return!1;if(!r.every(a))return!1;return cr.some(([o,i,E,A,c,e])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&e===r[5])};var P=(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 t.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((o)=>o.amount.gte(0)&&N(o.value)))throw t.createValidationError("Invalid straight bet.");if(!r.splitBets.every((o)=>o.amount.gte(0)&&Ao(o.values)))throw t.createValidationError("Invalid split bet.");if(!r.streetBets.every((o)=>o.amount.gte(0)&&co(o.values)))throw t.createValidationError("Invalid street bet.");if(!r.cornerBets.every((o)=>o.amount.gte(0)&&no(o.values)))throw t.createValidationError("Invalid corner bet.");if(!r.basketBets.every((o)=>o.amount.gte(0)))throw t.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((o)=>o.amount.gte(0)&&eo(o.values)))throw t.createValidationError("Invalid double street bet.");if(!r.parityBets.every((o)=>o.amount.gte(0)&&Object.values(G).includes(o.parity)))throw t.createValidationError("Invalid parity bet.");if(!r.colorBets.every((o)=>o.amount.gte(0)&&Object.values(C).includes(o.color)))throw t.createValidationError("Invalid color bet.");if(!r.halfBets.every((o)=>o.amount.gte(0)&&Object.values(Z).includes(o.half)))throw t.createValidationError("Invalid half bet.");if(!r.columnBets.every((o)=>o.amount.gte(0)&&Object.values(K).includes(o.column)))throw t.createValidationError("Invalid column bet.");if(!r.dozenBets.every((o)=>o.amount.gte(0)&&Object.values(_).includes(o.dozen)))throw t.createValidationError("Invalid dozen bet.")},N=(r)=>{return m.includes(r)};function Ao(r){if(r.length!==2)return!1;if(!r.every(N))return!1;return rr.some(([o,i])=>o===r[0]&&i===r[1])}var co=(r)=>{if(r.length!==3)return!1;if(!r.every(N))return!1;return ir.some(([o,i,E])=>o===r[0]&&i===r[1]&&E===r[2])},no=(r)=>{if(r.length!==4)return!1;if(!r.every(N))return!1;return Ar.some(([o,i,E,A])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3])},eo=(r)=>{if(r.length!==6)return!1;if(!r.every(N))return!1;return nr.some(([o,i,E,A,c,e])=>o===r[0]&&i===r[1]&&E===r[2]&&A===r[3]&&c===r[4]&&e===r[5])};var er=(r)=>{return new n(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n(0)))},tr=(r)=>{return new n(0).add(r.straightBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.splitBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.streetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.cornerBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.basketBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.doubleStreetBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.parityBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.colorBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.halfBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.columnBets.reduce((o,i)=>o.plus(i.amount),new n(0))).add(r.dozenBets.reduce((o,i)=>o.plus(i.amount),new n(0)))},Li=(r)=>{return r.type==="EUROPEAN"?er(r.inputs):tr(r.inputs)};class fr extends O{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){k(o);let i=r.getRandomInt({min:0,max:36}),E=i.value,A=this.determineBetOutcomes(o,E),c=er(o),e=this.calculateTotalPayoutAmount(A),d=c.gt(0)?e.div(c):new n(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:d,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0)))}}class Rr extends O{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:o}){P(o);let i=r.getRandomInt({min:0,max:37}),E=i.value,A=this.determineBetOutcomes(o,E),c=tr(o),e=this.calculateTotalPayoutAmount(A),d=c.gt(0)?e.div(c):new n(0);return{outputs:{betOutcomes:A,result:i.values},payoutMultiplier:d,isFinished:!0,randomValues:i}}determineBetOutcomes(r,o){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===o),splitBets:r.splitBets.filter((i)=>i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>Q.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,o))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==o),splitBets:r.splitBets.filter((i)=>!i.values.some((E)=>E===o)),streetBets:r.streetBets.filter((i)=>!i.values.some((E)=>E===o)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((E)=>E===o)),basketBets:r.basketBets.filter((i)=>!Q.some((E)=>E===o)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((E)=>E===o)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,o)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,o)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,o)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,o)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,o))}}}isWinningParityBet(r,o){if(o===0||o===37)return!1;let i=o%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,o){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],E=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(o)&&r.color==="RED")return!0;if(E.includes(o)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,o){if(o>0&&o<=18&&r.half==="LOW")return!0;if(o>18&&o<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,o){let i=[3,6,9,12,15,18,21,24,27,30,33,36],E=[2,5,8,11,14,17,20,23,26,29,32,35],A=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(o)&&r.column==="TOP")return!0;if(E.includes(o)&&r.column==="MIDDLE")return!0;if(A.includes(o)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,o){if(o>0&&o<=12&&r.dozen==="FIRST")return!0;if(o>12&&o<=24&&r.dozen==="SECOND")return!0;if(o>24&&o<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new n(0).add(r.winningBets.straightBets.reduce((o,i)=>o.plus(i.amount.mul(36)),new n(0))).add(r.winningBets.splitBets.reduce((o,i)=>o.plus(i.amount.mul(18)),new n(0))).add(r.winningBets.streetBets.reduce((o,i)=>o.plus(i.amount.mul(12)),new n(0))).add(r.winningBets.cornerBets.reduce((o,i)=>o.plus(i.amount.mul(9)),new n(0))).add(r.winningBets.basketBets.reduce((o,i)=>o.plus(i.amount.mul(7)),new n(0))).add(r.winningBets.doubleStreetBets.reduce((o,i)=>o.plus(i.amount.mul(6)),new n(0))).add(r.winningBets.parityBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.colorBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.halfBets.reduce((o,i)=>o.plus(i.amount.mul(2)),new n(0))).add(r.winningBets.columnBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0))).add(r.winningBets.dozenBets.reduce((o,i)=>o.plus(i.amount.mul(3)),new n(0)))}}class to extends O{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new fr,this.americanGame=new Rr}determineGameResult(r){let{gameInputs:o,...i}=r;if(r.edge===2.7&&o.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===5.3&&o.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...i,gameInputs:o.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var yi=(r)=>{if(r.type==="EUROPEAN")k(r.inputs);else P(r.inputs)};import{Big as Lo}from"big.js";var M;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(M||={});var w;((c)=>{c[c.TEN=10]="TEN";c[c.TWENTY=20]="TWENTY";c[c.THIRTY=30]="THIRTY";c[c.FORTY=40]="FORTY";c[c.FIFTY=50]="FIFTY"})(w||={});var fo={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}}},Ro={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}}},Oo={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}}},Bo={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}}},To={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}}},Or=new p(new Map([[1,fo],[2,Ro],[3,Oo],[4,Bo],[8,To]]));var dr={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 So extends O{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:o,edge:i}){if(!Object.values(w).includes(o.segments))throw new Error("Invalid segments value");if(!Object.values(M).includes(o.riskLevel))throw new Error("Invalid risk level");let A=Or.getMultipliers(i)[o.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${o.riskLevel}`);let c=A[o.segments];if(c===void 0)throw new Error(`No multipliers found for segment ${o.segments}`);let e=dr[o.riskLevel];if(e===void 0)throw new Error(`No patterns found for risk level ${o.riskLevel}`);let d=e[o.segments];if(d===void 0)throw new Error(`No patterns found for segment ${o.segments}`);let R=r.getRandomInt({min:0,max:d.length-1}),B=d[R.value];if(B===void 0)throw new Error(`No pattern found for segment ${o.segments} and value ${R.value}`);let f=c[B];if(f===void 0)throw new Error(`No payout found for picked segment ${B}`);return{isFinished:!0,payoutMultiplier:new Lo(f),outputs:{result:R.values},randomValues:R}}}export{yi as validateRouletteGameInputs,_o as validateAdvancedDiceInputs,mr as plinkoMultipliers,Yr as diamondsMultipliers,Li as calculateRouletteBetAmount,wr as calculateBaccaratBetAmount,w as WheelSegments,M as WheelRiskLevel,So as Wheel,_r as VALID_SUITS,Dr as VALID_RANKS,or as VALID_EUROPEAN_STREETS,J as VALID_EUROPEAN_STRAIGHTS,g as VALID_EUROPEAN_SPLITS,cr as VALID_EUROPEAN_DOUBLE_STREETS,Er as VALID_EUROPEAN_CORNERS,ir as VALID_AMERICAN_STREETS,m as VALID_AMERICAN_STRAIGHTS,rr as VALID_AMERICAN_SPLITS,nr as VALID_AMERICAN_DOUBLE_STREETS,Ar as VALID_AMERICAN_CORNERS,X as RouletteType,to as Roulette,Zr as RollType,j as RANDOM_MIN_VALUE,$ as RANDOM_MAX_VALUE,sr as PlinkoRiskLevel,gr as Plinko,G as Parity,L as OrigamiGame,ur as Mines,Sr as MIN_WIN_CHANCE,xr as MAX_WIN_CHANCE,Ir as Limbo,Jr as KenoRiskLevel,Xr as Keno,Z as Half,Lr as GameErrorCode,t as GameError,O as Game,I as EFFECTIVE_RANGE,_ as Dozen,qr as DiceDirection,zr as Dice,hr as DiamondsResultType,$r as Diamonds,K as Column,C as Color,ar as BaccaratOutcome,Nr as BaccaratBetType,Vr as Baccarat,Kr as AdvancedDice,Q as AMERICAN_BASKET};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "2.1.0",
3
+ "version": "3.0.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",