public void HandleFinishBonusGame(object[] data)
    {
        bonusResult = new SRSSlot20LineFinishBonusGame(data);

        UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineWin, _assetBundleConfig.name, (layer) =>
        {
            ((LGameSlot20LineWin)layer).Init(LGameSlot20LineWin.Slot20LineWinType.FINISH_BONUS, _config, () =>
            {
                bonusResult = null;
            }, bonusResult.bonusValue);
        });

        Database.Instance.UpdateUserMoney(bonusResult.moneyType, bonusResult.balance);
    }
    // quay spin
    IEnumerator WaitMachineFinish(SRSSlot20LineResultSpin result)
    {
        _machine.StartMachineLeftToRight(result.GetSlotData());

        if (!isSieuToc)
        {
            yield return(new WaitForSeconds(0.5f));

            AudioAssistant.Instance.PlaySoundGame(_config.gameId, _config.audioSpin);
        }

        lastResult = result;
        yield return(new WaitUntil(() => !_machine.isRunning));

        if (accountSpin.FreeSpin <= 0 || result.Balance > 0)
        {
            Database.Instance.UpdateUserMoney(moneyType, result.Balance);
        }

        if (result.PrizesData != null && result.PrizesData.Count > 0)
        {
            // show line win
            List <int> lineTemps = new List <int>();
            List <int> itemWins  = new List <int>();
            foreach (var lineWin in result.PrizesData)
            {
                lineTemps.Add(lineWin.LineID);
                itemWins.AddRange(lineWin.Items);
            }
            itemWins = itemWins.Distinct().ToList();
            _machine.ShowLineAndItemWin(lineTemps, itemWins);

            // free
            if (result.TotalFreeSpin > 0)
            {
                if (accountSpin.FreeSpin <= 0)
                {
                    bool isShowing = true;
                    UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineWin, _assetBundleConfig.name, (layer) =>
                    {
                        ((LGameSlot20LineWin)layer).Init(LGameSlot20LineWin.Slot20LineWinType.FREE, _config, () =>
                        {
                            isShowing = false;
                        }, accountSpin.FreeSpin);
                    });

                    yield return(new WaitUntil(() => !isShowing));

                    yield return(new WaitForSeconds(0.5f));
                }
            }

            // free
            accountSpin.FreeSpin = result.TotalFreeSpin;
            SetNotifyFree();

            if (result.IsJackpot)
            {
                if (result.TotalJackpot <= 0)
                {
                    result.TotalJackpot = 1;
                }
                var jackpoValues = result.PrizesData.OrderByDescending(a => a.PrizeValue).Select(b => b.PrizeValue).ToList();
                for (int i = 0; i < result.TotalJackpot; i++)
                {
                    bool isShowing = true;
                    UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineWin, _assetBundleConfig.name, (layer) =>
                    {
                        ((LGameSlot20LineWin)layer).Init(LGameSlot20LineWin.Slot20LineWinType.JACKPOT, _config, () =>
                        {
                            isShowing = false;
                        }, jackpoValues[i]);
                    });

                    yield return(new WaitUntil(() => !isShowing));

                    yield return(new WaitForSeconds(0.5f));
                }
            }
            else
            {
                int xBet = (int)(result.TotalPrizeValue / (roomBetValue * _machine.idLineSelecteds.Count));
                // bigwin
                if (xBet >= 25)
                {
                    bool isShowing = true;
                    UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineWin, _assetBundleConfig.name, (layer) =>
                    {
                        ((LGameSlot20LineWin)layer).Init(LGameSlot20LineWin.Slot20LineWinType.PERFECT, _config, () =>
                        {
                            isShowing = false;
                        }, result.TotalPrizeValue);
                    });

                    yield return(new WaitUntil(() => !isShowing));

                    yield return(new WaitForSeconds(0.5f));
                }
                else if (xBet >= 10)
                {
                    bool isShowing = true;
                    UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineWin, _assetBundleConfig.name, (layer) =>
                    {
                        ((LGameSlot20LineWin)layer).Init(LGameSlot20LineWin.Slot20LineWinType.BIGWIN, _config, () =>
                        {
                            isShowing = false;
                        }, result.TotalPrizeValue);
                    });

                    yield return(new WaitUntil(() => !isShowing));

                    yield return(new WaitForSeconds(0.5f));
                }
            }

            if (result.BonusGame != null && result.BonusGame.StartBonus > 0)
            {
                bonusResult = null;

                // show win bonus
                bool isShowing = true;
                UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineWin, _assetBundleConfig.name, (layer) =>
                {
                    ((LGameSlot20LineWin)layer).Init(LGameSlot20LineWin.Slot20LineWinType.BONUS, _config, () =>
                    {
                        isShowing = false;
                    });
                });

                yield return(new WaitUntil(() => !isShowing));

                // show game bonus
                isShowing = true;
                UILayerController.Instance.ShowLayer(UILayerKey.LGameSlot20LineBonus, _assetBundleConfig.name, (layer) =>
                {
                    ((LGameSlot20LineBonus)layer).Init(_config, result.BonusGame, roomBetValue, () =>
                    {
                        isShowing = false;
                        _server.HubCallFinishBonusGame(moneyType, result.SpinID);
                    });
                });

                yield return(new WaitUntil(() => !isShowing));

                yield return(new WaitUntil(() => bonusResult != null));

                yield return(new WaitUntil(() => bonusResult == null));
            }

            // Money
            if (result.TotalPrizeValue > 0)
            {
                AudioAssistant.Instance.PlaySoundGame(_config.gameId, _config.audioWin);
            }
            SetNotifyMoney(result.TotalPrizeValue > 0 ? VKCommon.ConvertStringMoney(result.TotalPrizeValue) : "");
            if (result.BonusGame != null && result.BonusGame.PrizeValue > 0)
            {
                vkTxtTotalWin.UpdateNumber(result.TotalPrizeValue + result.BonusGame.PrizeValue);
            }
            else
            {
                vkTxtTotalWin.UpdateNumber(result.TotalPrizeValue);
            }

            //yield return new WaitForSeconds(2f);
        }
        else
        {
            // ko trung gi
            // free
            accountSpin.FreeSpin = result.TotalFreeSpin;
            SetNotifyFree();
        }

        waitMachineFinish = null;

        if (isAutoSpin)
        {
            if (result.TotalPrizeValue > 0)
            {
                yield return(new WaitForSeconds(_config.timeWaitNextAuto / _machine.speed));
            }
            else
            {
                yield return(new WaitForSeconds(0.2f));
            }
            ButtonSpinClickListener();
        }
        else
        {
            EnableToPlay();
            StartAnimLastResult();
        }
    }